ソースを参照

Add 浏览器、设备相关信息

Zhu Jinhui 7 年 前
コミット
f2611f92f5
100 ファイル変更44582 行追加0 行削除
  1. 48 0
      Qii/Library/Third/WhichBrowser/Analyser.php
  2. 314 0
      Qii/Library/Third/WhichBrowser/Analyser/Camouflage.php
  3. 168 0
      Qii/Library/Third/WhichBrowser/Analyser/Corrections.php
  4. 478 0
      Qii/Library/Third/WhichBrowser/Analyser/Derive.php
  5. 148 0
      Qii/Library/Third/WhichBrowser/Analyser/Header.php
  6. 17 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Baidu.php
  7. 69 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/BrowserId.php
  8. 72 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/OperaMini.php
  9. 50 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Puffin.php
  10. 182 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/UCBrowserNew.php
  11. 39 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/UCBrowserOld.php
  12. 44 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent.php
  13. 497 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Application.php
  14. 47 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Bot.php
  15. 2387 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Browser.php
  16. 29 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device.php
  17. 31 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Appliance.php
  18. 35 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Cars.php
  19. 212 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Ereader.php
  20. 267 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Gaming.php
  21. 34 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Gps.php
  22. 119 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Media.php
  23. 1280 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Mobile.php
  24. 290 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Pda.php
  25. 32 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Phone.php
  26. 46 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Printer.php
  27. 41 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Signage.php
  28. 37 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Tablet.php
  29. 1168 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Television.php
  30. 170 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Engine.php
  31. 2414 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Os.php
  32. 59 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Using.php
  33. 41 0
      Qii/Library/Third/WhichBrowser/Analyser/Header/Wap.php
  34. 110 0
      Qii/Library/Third/WhichBrowser/Cache.php
  35. 28 0
      Qii/Library/Third/WhichBrowser/Constants/BrowserType.php
  36. 13 0
      Qii/Library/Third/WhichBrowser/Constants/DeviceSubType.php
  37. 32 0
      Qii/Library/Third/WhichBrowser/Constants/DeviceType.php
  38. 14 0
      Qii/Library/Third/WhichBrowser/Constants/EngineType.php
  39. 15 0
      Qii/Library/Third/WhichBrowser/Constants/Feature.php
  40. 17 0
      Qii/Library/Third/WhichBrowser/Constants/Flag.php
  41. 13 0
      Qii/Library/Third/WhichBrowser/Constants/Id.php
  42. 99 0
      Qii/Library/Third/WhichBrowser/Data/Applications.php
  43. 17 0
      Qii/Library/Third/WhichBrowser/Data/BrowserIds.php
  44. 23 0
      Qii/Library/Third/WhichBrowser/Data/BuildIds.php
  45. 27 0
      Qii/Library/Third/WhichBrowser/Data/CFNetwork.php
  46. 31 0
      Qii/Library/Third/WhichBrowser/Data/Chrome.php
  47. 29 0
      Qii/Library/Third/WhichBrowser/Data/Darwin.php
  48. 353 0
      Qii/Library/Third/WhichBrowser/Data/DeviceModels.php
  49. 19 0
      Qii/Library/Third/WhichBrowser/Data/DeviceProfiles.php
  50. 30 0
      Qii/Library/Third/WhichBrowser/Data/Manufacturers.php
  51. 181 0
      Qii/Library/Third/WhichBrowser/Model/Browser.php
  52. 251 0
      Qii/Library/Third/WhichBrowser/Model/Device.php
  53. 35 0
      Qii/Library/Third/WhichBrowser/Model/Engine.php
  54. 35 0
      Qii/Library/Third/WhichBrowser/Model/Family.php
  55. 373 0
      Qii/Library/Third/WhichBrowser/Model/Main.php
  56. 140 0
      Qii/Library/Third/WhichBrowser/Model/Os.php
  57. 81 0
      Qii/Library/Third/WhichBrowser/Model/Primitive/Base.php
  58. 121 0
      Qii/Library/Third/WhichBrowser/Model/Primitive/NameVersion.php
  59. 35 0
      Qii/Library/Third/WhichBrowser/Model/Using.php
  60. 301 0
      Qii/Library/Third/WhichBrowser/Model/Version.php
  61. 57 0
      Qii/Library/Third/WhichBrowser/Parser.php
  62. 510 0
      Qii/Library/Third/WhichBrowser/README.md
  63. 289 0
      Qii/Library/Third/data/applications-bots.php
  64. 244 0
      Qii/Library/Third/data/applications-browsers.php
  65. 138 0
      Qii/Library/Third/data/applications-others.php
  66. 107 0
      Qii/Library/Third/data/browsers-chrome.php
  67. 244 0
      Qii/Library/Third/data/build-android.php
  68. 323 0
      Qii/Library/Third/data/id-android.php
  69. 7617 0
      Qii/Library/Third/data/indices/models-android.php
  70. 24 0
      Qii/Library/Third/data/indices/models-asha.php
  71. 27 0
      Qii/Library/Third/data/indices/models-bada.php
  72. 118 0
      Qii/Library/Third/data/indices/models-brew.php
  73. 229 0
      Qii/Library/Third/data/indices/models-feature.php
  74. 55 0
      Qii/Library/Third/data/indices/models-firefoxos.php
  75. 393 0
      Qii/Library/Third/data/indices/models-kddi.php
  76. 115 0
      Qii/Library/Third/data/indices/models-palmos.php
  77. 20 0
      Qii/Library/Third/data/indices/models-s30plus.php
  78. 249 0
      Qii/Library/Third/data/indices/models-s40.php
  79. 344 0
      Qii/Library/Third/data/indices/models-symbian.php
  80. 98 0
      Qii/Library/Third/data/indices/models-tizen.php
  81. 55 0
      Qii/Library/Third/data/indices/models-touchwiz.php
  82. 534 0
      Qii/Library/Third/data/indices/models-wm.php
  83. 516 0
      Qii/Library/Third/data/indices/models-wp.php
  84. 40 0
      Qii/Library/Third/data/manufacturer-names.php
  85. 17380 0
      Qii/Library/Third/data/models-android.php
  86. 18 0
      Qii/Library/Third/data/models-asha.php
  87. 18 0
      Qii/Library/Third/data/models-bada.php
  88. 52 0
      Qii/Library/Third/data/models-blackberry.php
  89. 52 0
      Qii/Library/Third/data/models-brew.php
  90. 114 0
      Qii/Library/Third/data/models-feature.php
  91. 31 0
      Qii/Library/Third/data/models-firefoxos.php
  92. 86 0
      Qii/Library/Third/data/models-ios.php
  93. 353 0
      Qii/Library/Third/data/models-kddi.php
  94. 94 0
      Qii/Library/Third/data/models-palmos.php
  95. 13 0
      Qii/Library/Third/data/models-s30plus.php
  96. 135 0
      Qii/Library/Third/data/models-s40.php
  97. 182 0
      Qii/Library/Third/data/models-symbian.php
  98. 52 0
      Qii/Library/Third/data/models-tizen.php
  99. 46 0
      Qii/Library/Third/data/models-touchwiz.php
  100. 322 0
      Qii/Library/Third/data/models-wm.php

+ 48 - 0
Qii/Library/Third/WhichBrowser/Analyser.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace WhichBrowser;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Model\Main;
+
+class Analyser
+{
+    use Analyser\Header, Analyser\Derive, Analyser\Corrections, Analyser\Camouflage;
+
+    private $data;
+
+    private $options;
+
+    private $headers = [];
+
+    public function __construct($headers, $options = [])
+    {
+        $this->headers = $headers;
+        $this->options = (object) $options;
+    }
+
+    public function setData(&$data)
+    {
+        $this->data =& $data;
+    }
+
+    public function &getData()
+    {
+        return $this->data;
+    }
+
+    public function analyse()
+    {
+        if (!isset($this->data)) {
+            $this->data = new Main();
+        }
+
+        /* Start the actual analysing steps */
+
+        $this->analyseHeaders()
+             ->deriveInformation()
+             ->applyCorrections()
+             ->detectCamouflage()
+             ->deriveDeviceSubType();
+    }
+}

+ 314 - 0
Qii/Library/Third/WhichBrowser/Analyser/Camouflage.php

@@ -0,0 +1,314 @@
+<?php
+
+namespace WhichBrowser\Analyser;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Data;
+use WhichBrowser\Model\Version;
+
+trait Camouflage
+{
+    private function &detectCamouflage()
+    {
+        if ($ua = $this->getHeader('User-Agent')) {
+
+            $this
+                ->detectCamouflagedAndroidBrowser($ua)
+                ->detectCamouflagedAndroidAsusBrowser($ua)
+                ->detectCamouflagedAsSafari($ua)
+                ->detectCamouflagedAsChrome($ua);
+        }
+
+        if (!empty($this->options->useragent)) {
+            $this->detectCamouflagedUCBrowser($this->options->useragent);
+        }
+
+        if (isset($this->options->engine)) {
+            $this->detectCamouflagedBasedOnEngines();
+        }
+
+        if (isset($this->options->features)) {
+            $this->detectCamouflagedBasedOnFeatures();
+        }
+
+        return $this;
+    }
+
+    private function &detectCamouflagedAndroidBrowser($ua)
+    {
+        if (preg_match('/Mac OS X 10_6_3; ([^;]+); [a-z]{2}(?:-[a-z]{2})?\)/u', $ua, $match)) {
+            $this->data->browser->name = 'Android Browser';
+            $this->data->browser->version = null;
+            $this->data->browser->mode = 'desktop';
+
+            $this->data->os->name = 'Android';
+            $this->data->os->alias = null;
+            $this->data->os->version = null;
+
+            $this->data->engine->name = 'Webkit';
+            $this->data->engine->version = null;
+
+            $this->data->device->type = 'mobile';
+
+            $device = Data\DeviceModels::identify('android', $match[1]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+
+            $this->data->features[] = 'foundDevice';
+        }
+
+        if (preg_match('/Mac OS X 10_5_7; [^\/\);]+\/([^\/\);]+)\//u', $ua, $match)) {
+            $this->data->browser->name = 'Android Browser';
+            $this->data->browser->version = null;
+            $this->data->browser->mode = 'desktop';
+
+            $this->data->os->name = 'Android';
+            $this->data->os->alias = null;
+            $this->data->os->version = null;
+
+            $this->data->engine->name = 'Webkit';
+            $this->data->engine->version = null;
+
+            $this->data->device->type = 'mobile';
+
+            $device = Data\DeviceModels::identify('android', $match[1]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+
+            $this->data->features[] = 'foundDevice';
+        }
+
+        return $this;
+    }
+
+    private function &detectCamouflagedAndroidAsusBrowser($ua)
+    {
+        if (preg_match('/Linux Ventana; [a-z]{2}(?:-[a-z]{2})?; (.+) Build/u', $ua, $match)) {
+            $this->data->browser->name = 'Android Browser';
+            $this->data->browser->version = null;
+            $this->data->browser->channel = null;
+            $this->data->browser->mode = 'desktop';
+
+            $this->data->engine->name = 'Webkit';
+            $this->data->engine->version = null;
+
+            $this->data->features[] = 'foundDevice';
+        }
+
+        return $this;
+    }
+
+    private function &detectCamouflagedAsSafari($ua)
+    {
+        if ($this->data->isBrowser('Safari') && !preg_match('/Darwin/u', $ua)) {
+            if ($this->data->isOs('iOS') && !preg_match('/^Mozilla/u', $ua)) {
+                $this->data->features[] = 'noMozillaPrefix';
+                $this->data->camouflage = true;
+            }
+
+            if (!preg_match('/Version\/[0-9\.]+/u', $ua)) {
+                $this->data->features[] = 'noVersion';
+                $this->data->camouflage = true;
+            }
+        }
+
+        return $this;
+    }
+
+    private function &detectCamouflagedAsChrome($ua)
+    {
+        if ($this->data->isBrowser('Chrome')) {
+            if (preg_match('/(?:Chrome|CrMo|CriOS)\//u', $ua)
+                && !preg_match('/(?:Chrome|CrMo|CriOS)\/([0-9]{1,2}\.[0-9]\.[0-9]{3,4}\.[0-9]+)/u', $ua)
+            ) {
+
+                $this->data->features[] = 'wrongVersion';
+                $this->data->camouflage = true;
+            }
+        }
+
+        return $this;
+    }
+
+    private function &detectCamouflagedUCBrowser($ua)
+    {
+        if ($ua == 'Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.2.3.4) Gecko/') {
+
+            if (!$this->data->isBrowser('UC Browser')) {
+                $this->data->browser->name = 'UC Browser';
+                $this->data->browser->version = null;
+                $this->data->browser->stock = false;
+            }
+
+            if ($this->data->isOs('Windows')) {
+                $this->data->os->reset();
+            }
+
+            $this->data->engine->reset([ 'name' => 'Gecko' ]);
+            $this->data->device->type = 'mobile';
+        }
+
+        if ($this->data->isBrowser('Chrome')) {
+            if (preg_match('/UBrowser\/?([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->stock = false;
+                $this->data->browser->name = 'UC Browser';
+                $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+                $this->data->browser->type = Constants\BrowserType::BROWSER;
+                unset($this->data->browser->channel);
+            }
+        }
+
+        return $this;
+    }
+
+    private function &detectCamouflagedBasedOnEngines()
+    {
+        if (isset($this->data->engine->name) && $this->data->browser->mode != 'proxy') {
+
+            /* If it claims not to be Trident, but it is probably Trident running camouflage mode */
+            if ($this->options->engine & Constants\EngineType::TRIDENT) {
+                $this->data->features[] = 'trident';
+
+                if ($this->data->engine->name && $this->data->engine->name != 'Trident') {
+                    $this->data->camouflage = !isset($this->data->browser->name) || ($this->data->browser->name != 'Maxthon' && $this->data->browser->name != 'Motorola WebKit');
+                }
+            }
+
+            /* If it claims not to be Opera, but it is probably Opera running camouflage mode */
+            if ($this->options->engine & Constants\EngineType::PRESTO) {
+                $this->data->features[] = 'presto';
+
+                if ($this->data->engine->name && $this->data->engine->name != 'Presto') {
+                    $this->data->camouflage = true;
+                }
+
+                if (isset($this->data->browser->name) && $this->data->browser->name == 'Internet Explorer') {
+                    $this->data->camouflage = true;
+                }
+            }
+
+            /* If it claims not to be Gecko, but it is probably Gecko running camouflage mode */
+            if ($this->options->engine & Constants\EngineType::GECKO) {
+                $this->data->features[] = 'gecko';
+
+                if ($this->data->engine->name && $this->data->engine->name != 'Gecko') {
+                    $this->data->camouflage = true;
+                }
+
+                if (isset($this->data->browser->name) && $this->data->browser->name == 'Internet Explorer') {
+                    $this->data->camouflage = true;
+                }
+            }
+
+            /* If it claims not to be Webkit, but it is probably Webkit running camouflage mode */
+            if ($this->options->engine & Constants\EngineType::WEBKIT) {
+                $this->data->features[] = 'webkit';
+
+                if ($this->data->engine->name && ($this->data->engine->name != 'Blink' && $this->data->engine->name != 'Webkit')) {
+                    $this->data->camouflage = true;
+                }
+
+                if (isset($this->data->browser->name) && $this->data->browser->name == 'Internet Explorer') {
+                    $this->data->camouflage = true;
+                }
+
+                /* IE 11 on mobile now supports Webkit APIs */
+                if (isset($this->data->browser->name) && $this->data->browser->name == 'Mobile Internet Explorer'
+                    && isset($this->data->browser->version) && $this->data->browser->version->toFloat() >= 11
+                    && isset($this->data->os->name) && $this->data->os->name == 'Windows Phone'
+                ) {
+                    $this->data->camouflage = false;
+                }
+
+                /* IE 11 Developer Preview now supports  Webkit APIs */
+                if (isset($this->data->browser->name) && $this->data->browser->name == 'Internet Explorer'
+                    && isset($this->data->browser->version) && $this->data->browser->version->toFloat() >= 11
+                    && isset($this->data->os->name) && $this->data->os->name == 'Windows'
+                ) {
+                    $this->data->camouflage = false;
+                }
+
+                /* EdgeHTML rendering engine also appears to be WebKit */
+                if (isset($this->data->engine->name) && $this->data->engine->name == 'EdgeHTML') {
+                    $this->data->camouflage = false;
+                }
+
+                /* Firefox 48+ support certain Webkit features */
+                if ($this->options->engine & Constants\EngineType::GECKO) {
+                    $this->data->camouflage = false;
+                }
+            }
+
+            if ($this->options->engine & Constants\EngineType::CHROMIUM) {
+                $this->data->features[] = 'chrome';
+
+                if ($this->data->engine->name && ($this->data->engine->name != 'EdgeHTML' && $this->data->engine->name != 'Blink' && $this->data->engine->name != 'Webkit')) {
+                    $this->data->camouflage = true;
+                }
+            }
+
+            /* If it claims to be Safari and uses V8, it is probably an Android device running camouflage mode */
+            if ($this->data->engine->name == 'Webkit' && $this->options->engine & Constants\EngineType::V8) {
+                $this->data->features[] = 'v8';
+
+                if (isset($this->data->browser->name) && $this->data->browser->name == 'Safari') {
+                    $this->data->camouflage = true;
+                }
+            }
+        }
+
+        return $this;
+    }
+
+    private function &detectCamouflagedBasedOnFeatures()
+    {
+        if (isset($this->data->browser->name) && isset($this->data->os->name)) {
+            if ($this->data->os->name == 'iOS' && $this->data->browser->name != 'Opera Mini' && $this->data->browser->name != 'UC Browser' && isset($this->data->os->version)) {
+
+                if ($this->data->os->version->toFloat() < 4.0 && $this->options->features & Constants\Feature::SANDBOX) {
+                    $this->data->features[] = 'foundSandbox';
+                    $this->data->camouflage = true;
+                }
+
+                if ($this->data->os->version->toFloat() < 4.2 && $this->options->features & Constants\Feature::WEBSOCKET) {
+                    $this->data->features[] = 'foundSockets';
+                    $this->data->camouflage = true;
+                }
+
+                if ($this->data->os->version->toFloat() < 5.0 && $this->options->features & Constants\Feature::WORKER) {
+                    $this->data->features[] = 'foundWorker';
+                    $this->data->camouflage = true;
+                }
+            }
+
+            if ($this->data->os->name != 'iOS' && $this->data->browser->name == 'Safari' && isset($this->data->browser->version)) {
+
+                if ($this->data->browser->version->toFloat() < 4.0 && $this->options->features & Constants\Feature::APPCACHE) {
+                    $this->data->features[] = 'foundAppCache';
+                    $this->data->camouflage = true;
+                }
+
+                if ($this->data->browser->version->toFloat() < 4.1 && $this->options->features & Constants\Feature::HISTORY) {
+                    $this->data->features[] = 'foundHistory';
+                    $this->data->camouflage = true;
+                }
+
+                if ($this->data->browser->version->toFloat() < 5.1 && $this->options->features & Constants\Feature::FULLSCREEN) {
+                    $this->data->features[] = 'foundFullscreen';
+                    $this->data->camouflage = true;
+                }
+
+                if ($this->data->browser->version->toFloat() < 5.2 && $this->options->features & Constants\Feature::FILEREADER) {
+                    $this->data->features[] = 'foundFileReader';
+                    $this->data->camouflage = true;
+                }
+            }
+        }
+
+        return $this;
+    }
+}

+ 168 - 0
Qii/Library/Third/WhichBrowser/Analyser/Corrections.php

@@ -0,0 +1,168 @@
+<?php
+
+namespace WhichBrowser\Analyser;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Model\Version;
+
+trait Corrections
+{
+    private function &applyCorrections()
+    {
+        if (isset($this->data->browser->name) && isset($this->data->browser->using)) {
+            $this->hideBrowserBasedOnUsing();
+        }
+
+        if (isset($this->data->browser->name) && isset($this->data->os->name)) {
+            $this->hideBrowserBasedOnOperatingSystem();
+        }
+
+        if (isset($this->data->browser->name) && $this->data->device->type == Constants\DeviceType::TELEVISION) {
+            $this->hideBrowserOnDeviceTypeTelevision();
+        }
+
+        if (isset($this->data->browser->name) && $this->data->device->type == Constants\DeviceType::GAMING) {
+            $this->hideBrowserOnDeviceTypeGaming();
+        }
+
+        if ($this->data->device->type == Constants\DeviceType::TELEVISION) {
+            $this->hideOsOnDeviceTypeTelevision();
+        }
+
+        if (isset($this->data->browser->name) && isset($this->data->engine->name)) {
+            $this->fixMidoriEngineName();
+        }
+
+        if (isset($this->data->browser->name) && isset($this->data->engine->name)) {
+            $this->fixNineSkyEngineName();
+        }
+
+        if (isset($this->data->browser->name) && isset($this->data->browser->family)) {
+            $this->hideFamilyIfEqualToBrowser();
+        }
+
+        return $this;
+    }
+
+
+    private function hideFamilyIfEqualToBrowser()
+    {
+        if ($this->data->browser->name == $this->data->browser->family->name) {
+            unset($this->data->browser->family);
+        }
+    }
+
+    private function fixMidoriEngineName()
+    {
+        if ($this->data->browser->name == 'Midori' && $this->data->engine->name != 'Webkit') {
+            $this->data->engine->name = 'Webkit';
+            $this->data->engine->version = null;
+        }
+    }
+
+    private function fixNineSkyEngineName()
+    {
+        if ($this->data->browser->name == 'NineSky' && $this->data->engine->name != 'Webkit') {
+            $this->data->engine->name = 'Webkit';
+            $this->data->engine->version = null;
+        }
+    }
+
+    private function hideBrowserBasedOnUsing()
+    {
+        if ($this->data->browser->name == 'Chrome') {
+            if ($this->data->browser->isUsing('Electron') || $this->data->browser->isUsing('Qt')) {
+                unset($this->data->browser->name);
+                unset($this->data->browser->version);
+            }
+        }
+    }
+
+    private function hideBrowserBasedOnOperatingSystem()
+    {
+        if ($this->data->os->name == 'Series60' && $this->data->browser->name == 'Internet Explorer') {
+            $this->data->browser->reset();
+            $this->data->engine->reset();
+        }
+
+        if ($this->data->os->name == 'Series80' && $this->data->browser->name == 'Internet Explorer') {
+            $this->data->browser->reset();
+            $this->data->engine->reset();
+        }
+
+        if ($this->data->os->name == 'Lindows' && $this->data->browser->name == 'Internet Explorer') {
+            $this->data->browser->reset();
+            $this->data->engine->reset();
+        }
+
+        if ($this->data->os->name == 'Tizen' && $this->data->browser->name == 'Chrome') {
+            $this->data->browser->reset([
+                'family' => isset($this->data->browser->family) ? $this->data->browser->family : null
+            ]);
+        }
+
+        if ($this->data->os->name == 'Ubuntu Touch' && $this->data->browser->name == 'Chromium') {
+            $this->data->browser->reset([
+                'family' => isset($this->data->browser->family) ? $this->data->browser->family : null
+            ]);
+        }
+    }
+
+    private function hideBrowserOnDeviceTypeGaming()
+    {
+        if (isset($this->data->device->model) && $this->data->device->model == 'Playstation 2' && $this->data->browser->name == 'Internet Explorer') {
+            $this->data->browser->reset();
+        }
+    }
+
+    private function hideBrowserOnDeviceTypeTelevision()
+    {
+        switch ($this->data->browser->name) {
+            case 'Firefox':
+                if (!$this->data->isOs('Firefox OS')) {
+                    unset($this->data->browser->name);
+                    unset($this->data->browser->version);
+                }
+                break;
+
+            case 'Internet Explorer':
+                $valid = false;
+
+                if (isset($this->data->device->model) && in_array($this->data->device->model, [ 'WebTV' ])) {
+                    $valid = true;
+                }
+
+                if (!$valid) {
+                    unset($this->data->browser->name);
+                    unset($this->data->browser->version);
+                }
+
+                break;
+
+            case 'Chrome':
+            case 'Chromium':
+                $valid = false;
+
+                if (isset($this->data->os->name) && in_array($this->data->os->name, [ 'Google TV', 'Android' ])) {
+                    $valid = true;
+                }
+                if (isset($this->data->device->model) && in_array($this->data->device->model, [ 'Chromecast' ])) {
+                    $valid = true;
+                }
+
+                if (!$valid) {
+                    unset($this->data->browser->name);
+                    unset($this->data->browser->version);
+                }
+
+                break;
+        }
+    }
+
+    private function hideOsOnDeviceTypeTelevision()
+    {
+        if (isset($this->data->os->name) && !in_array($this->data->os->name, [ 'Aliyun OS', 'Tizen', 'Android', 'Android TV', 'FireOS', 'Google TV', 'Firefox OS', 'OpenTV', 'webOS' ])) {
+            $this->data->os->reset();
+        }
+    }
+}

+ 478 - 0
Qii/Library/Third/WhichBrowser/Analyser/Derive.php

@@ -0,0 +1,478 @@
+<?php
+
+namespace WhichBrowser\Analyser;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Model\Family;
+use WhichBrowser\Model\Using;
+use WhichBrowser\Model\Version;
+
+trait Derive
+{
+    private function &deriveInformation()
+    {
+        if (isset($this->data->device->flag)) {
+            $this->deriveBasedOnDeviceFlag();
+        }
+
+        if (isset($this->data->os->name)) {
+            $this->deriveBasedOnOperatingSystem();
+        }
+
+        if (isset($this->data->browser->name)) {
+            $this->deriveOperaDevices();
+        }
+
+        if (isset($this->data->browser->name)) {
+            $this->deriveFirefoxOS();
+        }
+
+        if (isset($this->data->browser->name)) {
+            $this->deriveTrident();
+            $this->deriveOperaRenderingEngine();
+            $this->deriveOmniWebRenderingEngine();
+            $this->deriveNetFrontRenderingEngine();
+        }
+
+        return $this;
+    }
+
+
+
+
+    private function &deriveDeviceSubType()
+    {
+        if ($this->data->device->type == 'mobile' && empty($this->data->device->subtype)) {
+            $this->data->device->subtype = 'feature';
+
+            if (in_array($this->data->os->getName(), [ 'Android', 'Bada', 'BlackBerry', 'BlackBerry OS', 'Firefox OS', 'iOS', 'iPhone OS', 'Kin OS', 'Maemo', 'MeeGo', 'Palm OS', 'Sailfish', 'Series60', 'Series80', 'Tizen', 'Ubuntu Touch', 'Windows Mobile', 'Windows Phone', 'webOS' ])) {
+                $this->data->device->subtype = 'smart';
+            }
+
+            if (isset($this->data->os->name) && in_array($this->data->os->name, [ 'Windows Phone' ])) {
+                $this->data->device->subtype = 'smart';
+            }
+
+            if (isset($this->data->os->family) && in_array($this->data->os->family->getName(), [ 'Android' ])) {
+                $this->data->device->subtype = 'smart';
+            }
+        }
+
+        return $this;
+    }
+
+
+    private function deriveOmniWebRenderingEngine()
+    {
+        if ($this->data->isBrowser('OmniWeb')) {
+            $version = $this->data->browser->getVersion();
+
+            if ($version < 5) {
+                $this->data->engine->reset();
+            }
+
+            if ($version >= 5 && $version < 5.5 && !$this->data->isEngine('WebCore')) {
+                $this->data->engine->reset([ 'name' => 'WebCore' ]);
+            }
+
+            if ($version >= 5.5 && !$this->data->isEngine('WebKit')) {
+                $this->data->engine->reset([ 'name' => 'WebKit' ]);
+            }
+        }
+    }
+
+
+    private function deriveOperaRenderingEngine()
+    {
+        if ($this->data->isBrowser('Opera') || $this->data->isBrowser('Opera Mobile')) {
+            $version = $this->data->browser->getVersion();
+
+            if ($version >= 3.5 && $version < 7 && !$this->data->isEngine('Electra')) {
+                $this->data->engine->reset([ 'name' => 'Electra' ]);
+            }
+
+            if ($version >= 7 && $version < 13 && !$this->data->isEngine('Presto')) {
+                $this->data->engine->reset([ 'name' => 'Presto' ]);
+            }
+        }
+
+        if ($this->data->isBrowser('Opera Mini') && !$this->data->isOs('iOS') && !$this->data->isEngine('Presto')) {
+            $this->data->engine->reset([ 'name' => 'Presto' ]);
+        }
+    }
+
+
+    private function deriveNetFrontRenderingEngine()
+    {
+        if ($this->data->isBrowser('NetFront') && !$this->data->isEngine('NetFront')) {
+            $this->data->engine->reset([ 'name' => 'NetFront' ]);
+        }
+    }
+
+    private function deriveTrident()
+    {
+        if ($this->data->isType('desktop') && $this->data->isBrowser('Internet Explorer') && !$this->data->engine->getName()) {
+            if ($this->data->isBrowser('Internet Explorer', '>=', 4)) {
+                $this->data->engine->set([ 'name' => 'Trident' ]);
+            }
+        }
+
+        if ($this->data->isMobile() && $this->data->isBrowser('Mobile Internet Explorer') && !$this->data->engine->getName()) {
+            if ($this->data->isBrowser('Mobile Internet Explorer', '=', 6)) {
+                $this->data->engine->set([ 'name' => 'Trident' ]);
+            }
+
+            if ($this->data->isBrowser('Mobile Internet Explorer', '=', 7)) {
+                $this->data->engine->set([ 'name' => 'Trident', 'version' => new Version([ 'value' => '3.1' ]) ]);
+            }
+        }
+    }
+
+
+    private function deriveFirefoxOS()
+    {
+        if (in_array($this->data->browser->name, [ 'Firefox Mobile', 'Servo Nightly Build' ]) && !isset($this->data->os->name)) {
+            $this->data->os->name = 'Firefox OS';
+        }
+
+        if (isset($this->data->os->name) && $this->data->os->name == 'Firefox OS' && $this->data->engine->name == 'Gecko') {
+            switch ($this->data->engine->getVersion()) {
+                case '18.0':
+                    $this->data->os->version = new Version([ 'value' => '1.0.1' ]);
+                    break;
+                case '18.1':
+                    $this->data->os->version = new Version([ 'value' => '1.1' ]);
+                    break;
+                case '26.0':
+                    $this->data->os->version = new Version([ 'value' => '1.2' ]);
+                    break;
+                case '28.0':
+                    $this->data->os->version = new Version([ 'value' => '1.3' ]);
+                    break;
+                case '30.0':
+                    $this->data->os->version = new Version([ 'value' => '1.4' ]);
+                    break;
+                case '32.0':
+                    $this->data->os->version = new Version([ 'value' => '2.0' ]);
+                    break;
+                case '34.0':
+                    $this->data->os->version = new Version([ 'value' => '2.1' ]);
+                    break;
+                case '37.0':
+                    $this->data->os->version = new Version([ 'value' => '2.2' ]);
+                    break;
+                case '44.0':
+                    $this->data->os->version = new Version([ 'value' => '2.5' ]);
+                    break;
+            }
+        }
+    }
+
+
+    private function deriveOperaDevices()
+    {
+        if ($this->data->browser->name == 'Opera' && $this->data->device->type == Constants\DeviceType::TELEVISION) {
+            $this->data->browser->name = 'Opera Devices';
+            $this->data->browser->version = null;
+
+            if ($this->data->engine->getName() == 'Presto') {
+                $data = [
+                    '2.12'  => '3.4',
+                    '2.11'  => '3.3',
+                    '2.10'  => '3.2',
+                    '2.9'   => '3.1',
+                    '2.8'   => '3.0',
+                    '2.7'   => '2.9',
+                    '2.6'   => '2.8',
+                    '2.4'   => '10.3',
+                    '2.3'   => '10',
+                    '2.2'   => '9.7',
+                    '2.1'   => '9.6'
+                ];
+
+                $key = implode('.', array_slice(explode('.', $this->data->engine->getVersion()), 0, 2));
+
+                if (isset($data[$key])) {
+                    $this->data->browser->version = new Version([ 'value' => $data[$key] ]);
+                } else {
+                    unset($this->data->browser->version);
+                }
+            }
+
+            $this->data->os->reset();
+        }
+    }
+
+
+
+    private function deriveBasedOnDeviceFlag()
+    {
+        $flag = $this->data->device->flag;
+
+        if ($flag == Constants\Flag::NOKIAX) {
+            $this->data->os->name = 'Nokia X Platform';
+            $this->data->os->family = new Family([ 'name' => 'Android' ]);
+
+            unset($this->data->os->version);
+            unset($this->data->device->flag);
+        }
+
+        if ($flag == Constants\Flag::FIREOS) {
+            $this->data->os->name = 'FireOS';
+            $this->data->os->family = new Family([ 'name' => 'Android' ]);
+
+            if (isset($this->data->os->version) && isset($this->data->os->version->value)) {
+                switch ($this->data->os->version->value) {
+                    case '2.3.3':
+                    case '2.3.4':
+                        $this->data->os->version = new Version([ 'value' => '1' ]);
+                        break;
+                    case '4.0.3':
+                        $this->data->os->version = new Version([ 'value' => '2' ]);
+                        break;
+                    case '4.2.2':
+                        $this->data->os->version = new Version([ 'value' => '3' ]);
+                        break;
+                    case '4.4.2':
+                        $this->data->os->version = new Version([ 'value' => '4' ]);
+                        break;
+                    case '4.4.3':
+                        $this->data->os->version = new Version([ 'value' => '4.5' ]);
+                        break;
+                    case '5.1.1':
+                        $this->data->os->version = new Version([ 'value' => '5' ]);
+                        break;
+                    default:
+                        unset($this->data->os->version);
+                        break;
+                }
+            }
+
+            if ($this->data->isBrowser('Chrome')) {
+                $this->data->browser->reset();
+                $this->data->browser->using = new Using([ 'name' => 'Amazon WebView' ]);
+            }
+
+            if ($this->data->browser->isUsing('Chromium WebView')) {
+                $this->data->browser->using = new Using([ 'name' => 'Amazon WebView' ]);
+            }
+
+            unset($this->data->device->flag);
+        }
+
+        if ($flag == Constants\Flag::GOOGLETV) {
+            $this->data->os->name = 'Google TV';
+            $this->data->os->family = new Family([ 'name' => 'Android' ]);
+
+            unset($this->data->os->version);
+            unset($this->data->device->flag);
+        }
+
+        if ($flag == Constants\Flag::ANDROIDTV) {
+            $this->data->os->name = 'Android TV';
+            $this->data->os->family = new Family([ 'name' => 'Android' ]);
+            unset($this->data->device->flag);
+            unset($this->data->device->series);
+        }
+
+        if ($flag == Constants\Flag::ANDROIDWEAR) {
+            $this->data->os->name = 'Android Wear';
+            $this->data->os->family = new Family([ 'name' => 'Android' ]);
+            unset($this->data->os->version);
+            unset($this->data->device->flag);
+
+            if ($this->data->browser->isUsing('Chrome Content Shell')) {
+                $this->data->browser->name = 'Wear Internet Browser';
+                $this->data->browser->using = null;
+            }
+        }
+
+        if ($flag == Constants\Flag::GOOGLEGLASS) {
+            $this->data->os->family = new Family([ 'name' => 'Android' ]);
+            unset($this->data->os->name);
+            unset($this->data->os->version);
+            unset($this->data->device->flag);
+        }
+
+        if ($flag == Constants\Flag::UIQ) {
+            unset($this->data->device->flag);
+
+            if (!$this->data->isOs('UIQ')) {
+                $this->data->os->name = 'UIQ';
+                unset($this->data->os->version);
+            }
+        }
+
+        if ($flag == Constants\Flag::S60) {
+            unset($this->data->device->flag);
+
+            if (!$this->data->isOs('Series60')) {
+                $this->data->os->name = 'Series60';
+                unset($this->data->os->version);
+            }
+        }
+
+        if ($flag == Constants\Flag::MOAPS) {
+            unset($this->data->device->flag);
+            $this->data->os->name = 'MOAP(S)';
+            unset($this->data->os->version);
+        }
+    }
+
+    private function deriveBasedOnOperatingSystem()
+    {
+        /* Derive the default browser on Windows Mobile */
+
+        if ($this->data->os->name == 'Windows Mobile' && $this->data->isBrowser('Internet Explorer')) {
+            $this->data->browser->name = 'Mobile Internet Explorer';
+        }
+
+        /* Derive the default browser on Android */
+
+        if ($this->data->os->name == 'Android' && !isset($this->data->browser->using) && !isset($this->data->browser->name) && $this->data->browser->stock) {
+            $this->data->browser->name = 'Android Browser';
+        }
+
+        /* Derive the default browser on Google TV */
+
+        if ($this->data->os->name == 'Google TV' && !isset($this->data->browser->name) && $this->data->browser->stock) {
+            $this->data->browser->name = 'Chrome';
+        }
+
+        /* Derive the default browser on BlackBerry */
+
+        if ($this->data->os->name == 'BlackBerry' && !isset($this->data->browser->name) && $this->data->browser->stock) {
+            $this->data->browser->name = 'BlackBerry Browser';
+            $this->data->browser->hidden = true;
+        }
+
+        if ($this->data->os->name == 'BlackBerry OS' && !isset($this->data->browser->name) && $this->data->browser->stock) {
+            $this->data->browser->name = 'BlackBerry Browser';
+            $this->data->browser->hidden = true;
+        }
+
+        if ($this->data->os->name == 'BlackBerry Tablet OS' && !isset($this->data->browser->name) && $this->data->browser->stock) {
+            $this->data->browser->name = 'BlackBerry Browser';
+            $this->data->browser->hidden = true;
+        }
+
+        /* Derive the default browser on Tizen */
+
+        if ($this->data->os->name == 'Tizen' && !isset($this->data->browser->name) && $this->data->browser->stock && in_array($this->data->device->type, [ Constants\DeviceType::MOBILE, Constants\DeviceType::APPLIANCE ])) {
+            $this->data->browser->name = 'Samsung Browser';
+        }
+
+        /* Derive the default browser on Aliyun OS */
+
+        if ($this->data->os->name == 'Aliyun OS' && !isset($this->data->browser->using) && !isset($this->data->browser->name) && $this->data->browser->stock) {
+            $this->data->browser->name = 'Aliyun Browser';
+        }
+
+        if ($this->data->os->name == 'Aliyun OS' && $this->data->browser->isUsing('Chrome Content Shell')) {
+            $this->data->browser->name = 'Aliyun Browser';
+            $this->data->browser->using = null;
+            $this->data->browser->stock = true;
+        }
+
+        if ($this->data->os->name == 'Aliyun OS' && $this->data->browser->stock) {
+            $this->data->browser->hidden = true;
+        }
+
+        /* Derive OS/2 nickname */
+
+        if ($this->data->os->name == 'OS/2') {
+            if (!empty($this->data->os->version)) {
+                if ($this->data->os->version->is('>', '2')) {
+                    $this->data->os->version->nickname = 'Warp';
+                }
+            }
+        }
+
+        /* Derive HP TouchPad based on webOS and tablet */
+
+        if ($this->data->os->name == 'webOS' && $this->data->device->type == Constants\DeviceType::TABLET) {
+            $this->data->device->manufacturer = 'HP';
+            $this->data->device->model = 'TouchPad';
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+
+        /* Derive Windows 10 Mobile edition */
+
+        if ($this->data->os->name == 'Windows Phone') {
+            if (!empty($this->data->os->version)) {
+                if ($this->data->os->version->is('=', '10')) {
+                    $this->data->os->alias = 'Windows';
+                    $this->data->os->edition = 'Mobile';
+                    $this->data->os->version->alias = '10';
+                }
+            }
+        }
+
+        /* Derive manufacturer and model based on MacOS or OS X */
+
+        if ($this->data->os->name == 'OS X' || $this->data->os->name == 'Mac OS') {
+            if (empty($this->data->device->model)) {
+                $this->data->device->manufacturer = 'Apple';
+                $this->data->device->model = 'Macintosh';
+                $this->data->device->identified |= Constants\Id::INFER;
+                $this->data->device->hidden = true;
+            }
+        }
+
+        /* Derive manufacturer and model based on MacOS or OS X */
+
+        if ($this->data->os->name == 'iOS') {
+            if (empty($this->data->device->model)) {
+                $this->data->device->manufacturer = 'Apple';
+                $this->data->device->identified |= Constants\Id::INFER;
+                $this->data->device->hidden = true;
+            }
+        }
+
+        /* Derive iOS and OS X aliases */
+
+        if ($this->data->os->name == 'iOS') {
+            if (!empty($this->data->os->version)) {
+                if ($this->data->os->version->is('<', '4')) {
+                    $this->data->os->alias = 'iPhone OS';
+                }
+            }
+        }
+
+        if ($this->data->os->name == 'OS X') {
+            if (!empty($this->data->os->version)) {
+                if ($this->data->os->version->is('<', '10.7')) {
+                    $this->data->os->alias = 'Mac OS X';
+                }
+
+                if ($this->data->os->version->is('>=', '10.12')) {
+                    $this->data->os->alias = 'macOS';
+                }
+
+                if ($this->data->os->version->is('10.7')) {
+                    $this->data->os->version->nickname = 'Lion';
+                }
+
+                if ($this->data->os->version->is('10.8')) {
+                    $this->data->os->version->nickname = 'Mountain Lion';
+                }
+
+                if ($this->data->os->version->is('10.9')) {
+                    $this->data->os->version->nickname = 'Mavericks';
+                }
+
+                if ($this->data->os->version->is('10.10')) {
+                    $this->data->os->version->nickname = 'Yosemite';
+                }
+
+                if ($this->data->os->version->is('10.11')) {
+                    $this->data->os->version->nickname = 'El Capitan';
+                }
+
+                if ($this->data->os->version->is('10.12')) {
+                    $this->data->os->version->nickname = 'Sierra';
+                }
+            }
+        }
+    }
+}

+ 148 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header.php

@@ -0,0 +1,148 @@
+<?php
+
+namespace WhichBrowser\Analyser;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Parser;
+
+trait Header
+{
+    private function &analyseHeaders()
+    {
+        /* Analyse the main useragent header */
+
+        if ($header = $this->getHeader('User-Agent')) {
+            $this->analyseUserAgent($header);
+        }
+
+
+        /* Analyse secondary useragent headers */
+
+        if ($header = $this->getHeader('X-Original-User-Agent')) {
+            $this->additionalUserAgent($header);
+        }
+        
+        if ($header = $this->getHeader('X-Device-User-Agent')) {
+            $this->additionalUserAgent($header);
+        }
+        
+        if ($header = $this->getHeader('Device-Stock-UA')) {
+            $this->additionalUserAgent($header);
+        }
+        
+        if ($header = $this->getHeader('X-OperaMini-Phone-UA')) {
+            $this->additionalUserAgent($header);
+        }
+
+        if ($header = $this->getHeader('X-UCBrowser-Device-UA')) {
+            $this->additionalUserAgent($header);
+        }
+        
+
+        /* Analyse browser specific headers */
+
+        if ($header = $this->getHeader('X-OperaMini-Phone')) {
+            $this->analyseOperaMiniPhone($header);
+        }
+        
+        if ($header = $this->getHeader('X-UCBrowser-Phone-UA')) {
+            $this->analyseOldUCUserAgent($header);
+        }
+        
+        if ($header = $this->getHeader('X-UCBrowser-UA')) {
+            $this->analyseNewUCUserAgent($header);
+        }
+        
+        if ($header = $this->getHeader('X-Puffin-UA')) {
+            $this->analysePuffinUserAgent($header);
+        }
+        
+        if ($header = $this->getHeader('Baidu-FlyFlow')) {
+            $this->analyseBaiduHeader($header);
+        }
+        
+
+        /* Analyse Android WebView browser ids */
+
+        if ($header = $this->getHeader('X-Requested-With')) {
+            $this->analyseBrowserId($header);
+        }
+        
+
+        /* Analyse WAP profile header */
+
+        if ($header = $this->getHeader('X-Wap-Profile')) {
+            $this->analyseWapProfile($header);
+        }
+
+        return $this;
+    }
+
+
+
+    private function analyseUserAgent($header)
+    {
+        new Header\Useragent($header, $this->data);
+    }
+
+    private function analyseBaiduHeader($header)
+    {
+        new Header\Baidu($header, $this->data);
+    }
+
+    private function analyseOperaMiniPhone($header)
+    {
+        new Header\OperaMini($header, $this->data);
+    }
+
+    private function analyseBrowserId($header)
+    {
+        new Header\BrowserId($header, $this->data);
+    }
+
+    private function analysePuffinUserAgent($header)
+    {
+        new Header\Puffin($header, $this->data);
+    }
+
+    private function analyseNewUCUserAgent($header)
+    {
+        new Header\UCBrowserNew($header, $this->data);
+    }
+
+    private function analyseOldUCUserAgent($header)
+    {
+        new Header\UCBrowserOld($header, $this->data);
+    }
+
+    private function analyseWapProfile($header)
+    {
+        new Header\Wap($header, $this->data);
+    }
+
+
+    private function additionalUserAgent($ua)
+    {
+        $extra = new Parser($ua);
+
+        if ($extra->device->type != Constants\DeviceType::DESKTOP) {
+            if (isset($extra->os->name)) {
+                $this->data->os = $extra->os;
+            }
+            
+            if ($extra->device->identified) {
+                $this->data->device = $extra->device;
+            }
+        }
+    }
+
+
+    private function getHeader($h)
+    {
+        foreach ($this->headers as $k => $v) {
+            if (strtolower($h) == strtolower($k)) {
+                return $v;
+            }
+        }
+    }
+}

+ 17 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Baidu.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header;
+
+class Baidu
+{
+    public function __construct($header, &$data)
+    {
+        $this->data =& $data;
+
+        if (!isset($this->data->browser->name) || $this->data->browser->name != 'Baidu Browser') {
+            $this->data->browser->name = 'Baidu Browser';
+            $this->data->browser->version = null;
+            $this->data->browser->stock = false;
+        }
+    }
+}

+ 69 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/BrowserId.php

@@ -0,0 +1,69 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Data;
+use WhichBrowser\Model\Using;
+use WhichBrowser\Model\Version;
+
+class BrowserId
+{
+    public function __construct($header, &$data)
+    {
+        if ($header == 'XMLHttpRequest') {
+            return;
+        }
+
+        $this->data =& $data;
+
+        /* The X-Requested-With header is send by the WebView, so our browser name is Chrome it is probably the Chromium WebView which is sometimes misidentified. */
+
+        if (isset($this->data->browser->name) && $this->data->browser->name == 'Chrome') {
+            $version = $this->data->browser->getVersion();
+
+            $this->data->browser->reset();
+            $this->data->browser->using = new Using([ 'name' => 'Chromium WebView', 'version' => new Version([ 'value' => explode('.', $version)[0] ]) ]);
+        }
+
+        /* Detect the correct browser based on the header */
+
+        $browser = Data\BrowserIds::identify($header);
+        if ($browser) {
+            if (!isset($this->data->browser->name)) {
+                $this->data->browser->name = $browser;
+            } else {
+                if (substr($this->data->browser->name, 0, strlen($browser)) != $browser) {
+                    $this->data->browser->name = $browser;
+                    $this->data->browser->version = null;
+                    $this->data->browser->stock = false;
+                } else {
+                    $this->data->browser->name = $browser;
+                }
+            }
+        }
+
+        /* The X-Requested-With header is only send from Android devices */
+
+        if (!isset($this->data->os->name) || ($this->data->os->name != 'Android' && (!isset($this->data->os->family) || $this->data->os->family->getName() != 'Android'))) {
+            $this->data->os->name = 'Android';
+            $this->data->os->alias = null;
+            $this->data->os->version = null;
+
+            $this->data->device->manufacturer = null;
+            $this->data->device->model = null;
+            $this->data->device->identified = Constants\Id::NONE;
+
+            if ($this->data->device->type != Constants\DeviceType::MOBILE && $this->data->device->type != Constants\DeviceType::TABLET) {
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+        }
+
+        /* The X-Requested-With header is send by the WebKit or Chromium Webview */
+        
+        if (!isset($this->data->engine->name) || ($this->data->engine->name != 'Webkit' && $this->data->engine->name != 'Blink')) {
+            $this->data->engine->name = 'Webkit';
+            $this->data->engine->version = null;
+        }
+    }
+}

+ 72 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/OperaMini.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header;
+
+use WhichBrowser\Data;
+use WhichBrowser\Constants;
+
+class OperaMini
+{
+    public function __construct($header, &$data)
+    {
+        $this->data =& $data;
+
+        $parts = explode(' # ', $header);
+        $manufacturer = isset($parts[0]) ? $parts[0] : '';
+        $model = isset($parts[1]) ? $parts[1] : '';
+
+        if ($manufacturer != '?' && $model != '?') {
+            if ($this->data->device->identified < Constants\Id::PATTERN) {
+                if ($this->identifyBasedOnModel($model)) {
+                    return;
+                }
+
+                $this->data->device->manufacturer = $manufacturer;
+                $this->data->device->model = $model;
+                $this->data->device->identified = true;
+            }
+        }
+    }
+
+    private function identifyBasedOnModel($model)
+    {
+        $device = Data\DeviceModels::identify('bada', $model);
+        if ($device->identified) {
+            $device->identified |= $this->data->device->identified;
+            $this->data->device = $device;
+
+            if (!isset($this->data->os->name) || $this->data->os->name != 'Bada') {
+                $this->data->os->name = 'Bada';
+                $this->data->os->version = null;
+            }
+
+            return true;
+        }
+
+        $device = Data\DeviceModels::identify('blackberry', $model);
+        if ($device->identified) {
+            $device->identified |= $this->data->device->identified;
+            $this->data->device = $device;
+
+            if (!isset($this->data->os->name) || $this->data->os->name != 'BlackBerry OS') {
+                $this->data->os->name = 'BlackBerry OS';
+                $this->data->os->version = null;
+            }
+
+            return true;
+        }
+
+        $device = Data\DeviceModels::identify('wm', $model);
+        if ($device->identified) {
+            $device->identified |= $this->data->device->identified;
+            $this->data->device = $device;
+
+            if (!isset($this->data->os->name) || $this->data->os->name != 'Windows Mobile') {
+                $this->data->os->name = 'Windows Mobile';
+                $this->data->os->version = null;
+            }
+
+            return true;
+        }
+    }
+}

+ 50 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Puffin.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header;
+
+use WhichBrowser\Data;
+
+class Puffin
+{
+    public function __construct($header, &$data)
+    {
+        $this->data =& $data;
+
+        $parts = explode('/', $header);
+
+        if ($this->data->browser->name != 'Puffin') {
+            $this->data->browser->name = 'Puffin';
+            $this->data->browser->version = null;
+            $this->data->browser->stock = false;
+        }
+
+        $this->data->device->type = 'mobile';
+
+        if (count($parts) > 1 && $parts[0] == 'Android') {
+            if (!isset($this->data->os->name) || $this->data->os->name != 'Android') {
+                $this->data->os->name = 'Android';
+                $this->data->os->version = null;
+            }
+
+            $device = Data\DeviceModels::identify('android', $parts[1]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+
+        if (count($parts) > 1 && $parts[0] == 'iPhone OS') {
+            if (!isset($this->data->os->name) || $this->data->os->name != 'iOS') {
+                $this->data->os->name = 'iOS';
+                $this->data->os->version = null;
+            }
+
+            $device = Data\DeviceModels::identify('ios', $parts[1]);
+
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+    }
+}

+ 182 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/UCBrowserNew.php

@@ -0,0 +1,182 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header;
+
+use WhichBrowser\Data;
+use WhichBrowser\Model\Family;
+use WhichBrowser\Model\Version;
+
+class UCBrowserNew
+{
+    public function __construct($header, &$data)
+    {
+        $this->data =& $data;
+
+        if (preg_match('/pr\(UCBrowser/u', $header)) {
+            if (!$this->data->isBrowser('UC Browser')) {
+                $this->data->browser->name = 'UC Browser';
+                $this->data->browser->stock = false;
+                $this->data->browser->version = null;
+
+                if (preg_match('/pr\(UCBrowser(?:\/([0-9\.]+))/u', $header, $match)) {
+                    $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+                }
+            }
+        }
+
+        /* Find os */
+        if (preg_match('/pf\(Java\)/u', $header)) {
+            if (preg_match('/dv\(([^\)]*)\)/u', $header, $match)) {
+                if ($this->identifyBasedOnModel($match[1])) {
+                    return;
+                }
+            }
+        }
+
+        if (preg_match('/pf\(Linux\)/u', $header) && preg_match('/ov\((?:Android )?([0-9\.]+)/u', $header, $match)) {
+            $this->data->os->name = 'Android';
+            $this->data->os->version = new Version([ 'value' => $match[1] ]);
+        }
+
+        if (preg_match('/pf\(Symbian\)/u', $header) && preg_match('/ov\(S60V([0-9])/u', $header, $match)) {
+            if (!$this->data->isOs('Series60')) {
+                $this->data->os->name = 'Series60';
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+        if (preg_match('/pf\(Windows\)/u', $header) && preg_match('/ov\(wds ([0-9]+\.[0-9]+)/u', $header, $match)) {
+            if (!$this->data->isOs('Windows Phone')) {
+                $this->data->os->name = 'Windows Phone';
+
+                switch ($match[1]) {
+                    case '7.1':
+                        $this->data->os->version = new Version([ 'value' => '7.5' ]);
+                        break;
+                    case '8.0':
+                        $this->data->os->version = new Version([ 'value' => '8.0' ]);
+                        break;
+                    case '8.1':
+                        $this->data->os->version = new Version([ 'value' => '8.1' ]);
+                        break;
+                    case '10.0':
+                        $this->data->os->version = new Version([ 'value' => '10.0' ]);
+                        break;
+                }
+            }
+        }
+
+        if (preg_match('/pf\((?:42|44)\)/u', $header) && preg_match('/ov\((?:iPh OS )?(?:iOS )?([0-9\_]+)/u', $header, $match)) {
+            if (!$this->data->isOs('iOS')) {
+                $this->data->os->name = 'iOS';
+                $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]) ]);
+            }
+        }
+
+        /* Find engine */
+        if (preg_match('/re\(AppleWebKit\/([0-9\.]+)/u', $header, $match)) {
+            $this->data->engine->name = 'Webkit';
+            $this->data->engine->version = new Version([ 'value' => $match[1] ]);
+        }
+
+        /* Find device */
+        if ($this->data->isOs('Android')) {
+            if (preg_match('/dv\((.*)\)/uU', $header, $match)) {
+                $match[1] = preg_replace("/\s+Build/u", '', $match[1]);
+                $device = Data\DeviceModels::identify('android', $match[1]);
+
+                if ($device) {
+                    $this->data->device = $device;
+                }
+            }
+        }
+
+        if ($this->data->isOs('Series60')) {
+            if (preg_match('/dv\((?:Nokia)?([^\)]*)\)/iu', $header, $match)) {
+                $device = Data\DeviceModels::identify('symbian', $match[1]);
+
+                if ($device) {
+                    $this->data->device = $device;
+                }
+            }
+        }
+
+        if ($this->data->isOs('Windows Phone')) {
+            if (preg_match('/dv\(([^\)]*)\)/u', $header, $match)) {
+                $device = Data\DeviceModels::identify('wp', substr(strstr($match[1], ' '), 1));
+
+                if ($device) {
+                    $this->data->device = $device;
+                }
+            }
+        }
+
+        if ($this->data->isOs('iOS')) {
+            if (preg_match('/dv\(([^\)]*)\)/u', $header, $match)) {
+                $device = Data\DeviceModels::identify('ios', $match[1]);
+
+                if ($device) {
+                    $this->data->device = $device;
+                }
+            }
+        }
+    }
+
+    private function identifyBasedOnModel($model)
+    {
+        $model = preg_replace('/^Nokia/iu', '', $model);
+
+        $device = Data\DeviceModels::identify('symbian', $model);
+        if ($device->identified) {
+            $device->identified |= $this->data->device->identified;
+            $this->data->device = $device;
+
+            if (!isset($this->data->os->name) || $this->data->os->name != 'Series60') {
+                $this->data->os->name = 'Series60';
+                $this->data->os->version = null;
+                $this->data->os->family = new Family([ 'name' => 'Symbian' ]);
+            }
+
+            return true;
+        }
+
+        $device = Data\DeviceModels::identify('s40', $model);
+        if ($device->identified) {
+            $device->identified |= $this->data->device->identified;
+            $this->data->device = $device;
+
+            if (!isset($this->data->os->name) || $this->data->os->name != 'Series40') {
+                $this->data->os->name = 'Series40';
+                $this->data->os->version = null;
+            }
+
+            return true;
+        }
+
+        $device = Data\DeviceModels::identify('bada', $model);
+        if ($device->identified) {
+            $device->identified |= $this->data->device->identified;
+            $this->data->device = $device;
+
+            if (!isset($this->data->os->name) || $this->data->os->name != 'Bada') {
+                $this->data->os->name = 'Bada';
+                $this->data->os->version = null;
+            }
+
+            return true;
+        }
+
+        $device = Data\DeviceModels::identify('touchwiz', $model);
+        if ($device->identified) {
+            $device->identified |= $this->data->device->identified;
+            $this->data->device = $device;
+
+            if (!isset($this->data->os->name) || $this->data->os->name != 'Touchwiz') {
+                $this->data->os->name = 'Touchwiz';
+                $this->data->os->version = null;
+            }
+
+            return true;
+        }
+    }
+}

+ 39 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/UCBrowserOld.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header;
+
+use WhichBrowser\Parser;
+use WhichBrowser\Constants;
+
+class UCBrowserOld
+{
+    public function __construct($header, &$data)
+    {
+        $this->data =& $data;
+
+        if ($this->data->device->type == Constants\DeviceType::DESKTOP) {
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $this->data->os->reset();
+        }
+
+        if (!isset($this->data->browser->name) || $this->data->browser->name != 'UC Browser') {
+            $this->data->browser->name = 'UC Browser';
+            $this->data->browser->version = null;
+        }
+
+        $this->data->browser->mode = 'proxy';
+        $this->data->engine->reset([ 'name' => 'Gecko' ]);
+
+        $extra = new Parser([ 'headers' => [ 'User-Agent' => $header ]]);
+        
+        if ($extra->device->type != Constants\DeviceType::DESKTOP) {
+            if ($extra->os->getName() !== '' && ($this->data->os->getName() === '' || $extra->os->getVersion() !== '')) {
+                $this->data->os = $extra->os;
+            }
+            if ($extra->device->identified) {
+                $this->data->device = $extra->device;
+            }
+        }
+    }
+}

+ 44 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header;
+
+class Useragent
+{
+    use Useragent\Os, Useragent\Device, Useragent\Browser, Useragent\Application, Useragent\Using, Useragent\Engine, Useragent\Bot;
+
+    public function __construct($header, &$data)
+    {
+        $this->data =& $data;
+
+        /* Make sure we do not have a duplicate concatenated useragent string */
+  
+        $header = preg_replace("/^(Mozilla\/[0-9]\.[0-9].{20,})\s+Mozilla\/[0-9]\.[0-9].*$/iu", '$1', $header);
+
+        /* Detect the basic information */
+
+        $this->detectOperatingSystem($header)
+             ->detectDevice($header)
+             ->detectBrowser($header)
+             ->detectApplication($header)
+             ->detectUsing($header)
+             ->detectEngine($header);
+
+         /* Detect bots */
+
+        if (!isset($this->options->detectBots) || $this->options->detectBots === true) {
+            $this->detectBot($header);
+        }
+
+        /* Refine some of the information */
+
+        $this->refineBrowser($header)
+             ->refineOperatingSystem($header);
+    }
+
+    private function removeKnownPrefixes($ua)
+    {
+        $ua = preg_replace('/^OneBrowser\/[0-9.]+\//', '', $ua);
+        $ua = preg_replace('/^MQQBrowser\/[0-9.]+\//', '', $ua);
+        return $ua;
+    }
+}

+ 497 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Application.php

@@ -0,0 +1,497 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Data;
+use WhichBrowser\Model\Family;
+use WhichBrowser\Model\Using;
+use WhichBrowser\Model\Version;
+
+trait Application
+{
+    private function &detectApplication($ua)
+    {
+        /* Detect applications */
+        $this->detectSpecificApplications($ua);
+        $this->detectRemainingApplications($ua);
+
+        return $this;
+    }
+
+
+
+    private function detectSpecificApplications($ua)
+    {
+        /* Sony Updatecenter */
+
+        if (preg_match('/^(.*) Build\/.* (?:com.sonyericsson.updatecenter|UpdateCenter)\/[A-Z0-9\.]+$/iu', $ua, $match)) {
+            $this->data->browser->name = 'Sony Update Center';
+            $this->data->browser->version = null;
+            $this->data->browser->type = Constants\BrowserType::APP;
+
+            $this->data->os->reset([
+                'name'      => 'Android'
+            ]);
+
+            $this->data->device->model = $match[1];
+            $this->data->device->identified |= Constants\Id::PATTERN;
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $device = Data\DeviceModels::identify('android', $match[1]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+
+        /* Sony Select SDK */
+
+        if (preg_match('/Android [0-9\.]+; (.*) Sony\/.*SonySelectSDK\/([0-9\.]+)/iu', $ua, $match)) {
+            $this->data->browser->reset();
+            $this->data->browser->type = Constants\BrowserType::APP;
+            $this->data->browser->using = new \WhichBrowser\Model\Using([
+                'name' => 'Sony Select SDK',
+                'version' => new Version([ 'value' => $match[2], 'details' => 2 ])
+            ]);
+
+            $this->data->device->model = $match[1];
+            $this->data->device->identified |= Constants\Id::PATTERN;
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $device = Data\DeviceModels::identify('android', $match[1]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+
+        /* Samsung Mediahub */
+
+        if (preg_match('/^Stamhub [^\/]+\/([^;]+);.*:([0-9\.]+)\/[^\/]+\/[^:]+:user\/release-keys$/iu', $ua, $match)) {
+            $this->data->browser->name = 'Mediahub';
+            $this->data->browser->version = null;
+            $this->data->browser->type = Constants\BrowserType::APP_MEDIAPLAYER;
+
+            $this->data->os->reset([
+                'name'      => 'Android',
+                'version'   => new Version([ 'value' => $match[2] ])
+            ]);
+
+            $this->data->device->model = $match[1];
+            $this->data->device->identified |= Constants\Id::PATTERN;
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $device = Data\DeviceModels::identify('android', $match[1]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+
+        /* "Android Application" */
+
+        if (preg_match('/Android Application/iu', $ua)) {
+            if (preg_match('/^(.+) Android Application \([0-9]+, .+ v[0-9\.]+\) - [a-z-]+ (.*) [a-z_-]+ - [0-9A-F]{8,8}-[0-9A-F]{4,4}-[0-9A-F]{4,4}-[0-9A-F]{4,4}-[0-9A-F]{12,12}$/iu', $ua, $match)) {
+                $this->data->browser->name = $match[1];
+                $this->data->browser->version = null;
+                $this->data->browser->type = Constants\BrowserType::APP;
+
+                $this->data->os->reset([
+                    'name'      => 'Android'
+                ]);
+
+                $this->data->device->model = $match[2];
+                $this->data->device->identified |= Constants\Id::PATTERN;
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                $device = Data\DeviceModels::identify('android', $match[2]);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if (preg_match('/^(.+) Android Application - (.*) Build\/(.+)  - [0-9A-F]{8,8}-[0-9A-F]{4,4}-[0-9A-F]{4,4}-[0-9A-F]{4,4}-[0-9A-F]{12,12}$/iu', $ua, $match)) {
+                $this->data->browser->name = $match[1];
+                $this->data->browser->version = null;
+                $this->data->browser->type = Constants\BrowserType::APP;
+
+                $this->data->os->reset([
+                    'name'      => 'Android'
+                ]);
+
+                $version = Data\BuildIds::identify($match[3]);
+                if ($version) {
+                    $this->data->os->version = $version;
+                }
+
+                $this->data->device->model = $match[2];
+                $this->data->device->identified |= Constants\Id::PATTERN;
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                $device = Data\DeviceModels::identify('android', $match[2]);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if (preg_match('/^(.+) Android Application - [a-z-]+ (.*) [a-z_-]+$/iu', $ua, $match)) {
+                $this->data->browser->name = $match[1];
+                $this->data->browser->version = null;
+                $this->data->browser->type = Constants\BrowserType::APP;
+
+                $this->data->os->reset([
+                    'name'      => 'Android'
+                ]);
+
+                $this->data->device->model = $match[2];
+                $this->data->device->identified |= Constants\Id::PATTERN;
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                $device = Data\DeviceModels::identify('android', $match[2]);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+        }
+
+        /* AiMeiTuan */
+
+        if (preg_match('/^AiMeiTuan \/[^\-]+\-([0-9\.]+)\-(.*)\-[0-9]+x[0-9]+\-/iu', $ua, $match)) {
+            $this->data->browser->name = 'AiMeiTuan';
+            $this->data->browser->version = null;
+            $this->data->browser->type = Constants\BrowserType::APP;
+
+            $this->data->os->reset([
+                'name'      => 'Android',
+                'version'   => new Version([ 'value' => $match[1] ])
+            ]);
+
+            $this->data->device->model = $match[2];
+            $this->data->device->identified |= Constants\Id::PATTERN;
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $device = Data\DeviceModels::identify('android', $match[2]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+
+        /* Instagram */
+
+        if (preg_match('/^Instagram ([0-9\.]+) Android (?:IC )?\([0-9]+\/([0-9\.]+); [0-9]+dpi; [0-9]+x[0-9]+; [^;]+; ([^;]*);/iu', $ua, $match)) {
+            $this->data->browser->name = 'Instagram';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::APP_SOCIAL;
+
+            $this->data->os->reset([
+                'name'      => 'Android',
+                'version'   => new Version([ 'value' => $match[2] ])
+            ]);
+
+            $this->data->device->model = $match[3];
+            $this->data->device->identified |= Constants\Id::PATTERN;
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $device = Data\DeviceModels::identify('android', $match[3]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+
+        /* Pinterest */
+
+        if (preg_match('/^Pinterest for Android( Tablet)?\/([0-9\.]+) \(([^;]+); ([0-9\.]+)\)/iu', $ua, $match)) {
+            $this->data->browser->name = 'Pinterest';
+            $this->data->browser->version = new Version([ 'value' => $match[2] ]);
+            $this->data->browser->type = Constants\BrowserType::APP_SOCIAL;
+
+            $this->data->os->reset([
+                'name'      => 'Android',
+                'version'   => new Version([ 'value' => $match[4] ])
+            ]);
+
+            $this->data->device->model = $match[3];
+            $this->data->device->identified |= Constants\Id::PATTERN;
+            $this->data->device->type = $match[1] == ' Tablet' ? Constants\DeviceType::TABLET : Constants\DeviceType::MOBILE;
+
+            $device = Data\DeviceModels::identify('android', $match[3]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+
+        /* Dr. Web Anti-Virus */
+
+        if (preg_match('/Dr\.Web anti\-virus Light Version: ([0-9\.]+) Device model: (.*) Firmware version: ([0-9\.]+)/u', $ua, $match)) {
+            $this->data->browser->name = 'Dr. Web Light';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::APP_ANTIVIRUS;
+
+            $this->data->os->reset([
+                'name'      => 'Android',
+                'version'   => new Version([ 'value' => $match[3] ])
+            ]);
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $device = Data\DeviceModels::identify('android', $match[2]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+
+        /* Google Earth */
+
+        if (preg_match('/GoogleEarth\/([0-9\.]+)\(Android;Android \((.+)\-[^\-]+\-user-([0-9\.]+)\);/u', $ua, $match)) {
+            $this->data->browser->name = 'Google Earth';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::APP;
+
+            $this->data->os->reset([
+                'name'      => 'Android',
+                'version'   => new Version([ 'value' => $match[3] ])
+            ]);
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $device = Data\DeviceModels::identify('android', $match[2]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+
+        /* Groupon */
+
+        if (preg_match('/Groupon\/([0-9\.]+) \(Android ([0-9\.]+); [^\/]+ \/ [A-Z][a-z]+ ([^;]*);/u', $ua, $match)) {
+            $this->data->browser->name = 'Groupon';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::APP_SHOPPING;
+
+            $this->data->os->reset([
+                'name'      => 'Android',
+                'version'   => new Version([ 'value' => $match[2] ])
+            ]);
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+            $this->data->device->model = $match[3];
+
+            $device = Data\DeviceModels::identify('android', $match[3]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+
+        /* Whatsapp */
+
+        if (preg_match('/WhatsApp\+?\/([0-9\.]+) (Android|S60Version|WP7)\/([0-9\.\_]+) Device\/([^\-]+)\-(.*)(?:-\([0-9]+\.[0-9]+\))?(?:\-H[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)?$/uU', $ua, $match)) {
+            $this->data->browser->name = 'WhatsApp';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::APP_CHAT;
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+            $this->data->device->manufacturer = $match[4];
+            $this->data->device->model = $match[5];
+            $this->data->device->identified |= Constants\Id::PATTERN;
+
+            if ($match[2] == 'Android') {
+                $this->data->os->reset([
+                    'name'      => 'Android',
+                    'version'   => new Version([ 'value' => str_replace('_', '.', $match[3]) ])
+                ]);
+
+                $device = Data\DeviceModels::identify('android', $match[5]);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if ($match[2] == 'WP7') {
+                $this->data->os->reset([
+                    'name'      => 'Windows Phone',
+                    'version'   => new Version([ 'value' => $match[3], 'details' => 2 ])
+                ]);
+
+                $device = Data\DeviceModels::identify('wp', $match[5]);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if ($match[2] == 'S60Version') {
+                $this->data->os->reset([
+                    'name'      => 'Series60',
+                    'version'   => new Version([ 'value' => $match[3] ]),
+                    'family'    => new Family([ 'name' => 'Symbian' ])
+                ]);
+
+                $device = Data\DeviceModels::identify('symbian', $match[5]);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if ($match[2] == 'WP7') {
+                $this->data->os->reset([
+                    'name'      => 'Windows Phone',
+                    'version'   => new Version([ 'value' => $match[3], 'details' => 2 ])
+                ]);
+
+                $device = Data\DeviceModels::identify('wp', $match[5]);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+        }
+
+        /* Yahoo */
+
+        if (preg_match('/YahooMobile(?:Messenger|Mail|Weather)\/1.0 \(Android (Messenger|Mail|Weather); ([0-9\.]+)\) \([^;]+; ?[^;]+; ?([^;]+); ?([0-9\.]+)\/[^\;\)\/]+\)/u', $ua, $match)) {
+            $this->data->browser->name = 'Yahoo ' . $match[1];
+            $this->data->browser->version = new Version([ 'value' => $match[2], 'details' => 3 ]);
+
+            switch ($match[1]) {
+                case 'Messenger':
+                    $this->data->browser->type = Constants\BrowserType::APP_CHAT;
+                    break;
+                case 'Mail':
+                    $this->data->browser->type = Constants\BrowserType::APP_EMAIL;
+                    break;
+                case 'Weather':
+                    $this->data->browser->type = Constants\BrowserType::APP_NEWS;
+                    break;
+            }
+
+            $this->data->os->reset([
+                'name'      => 'Android',
+                'version'   => new Version([ 'value' => $match[4] ])
+            ]);
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $device = Data\DeviceModels::identify('android', $match[3]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+
+        /* Yahoo Mobile App */
+
+        if (preg_match('/YahooJMobileApp\/[0-9\.]+ \(Android [a-z]+; ([0-9\.]+)\) \([^;]+; ?[^;]+; ?[^;]+; ?([^;]+); ?([0-9\.]+)\/[^\;\)\/]+\)/u', $ua, $match)) {
+            $this->data->browser->name = 'Yahoo Mobile';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            $this->data->browser->type = Constants\BrowserType::APP_SEARCH;
+
+            $this->data->os->reset([
+                'name'      => 'Android',
+                'version'   => new Version([ 'value' => $match[3] ])
+            ]);
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $device = Data\DeviceModels::identify('android', $match[2]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+
+        /* ICQ */
+
+        if (preg_match('/ICQ_Android\/([0-9\.]+) \(Android; [0-9]+; ([0-9\.]+); [^;]+; ([^;]+);/u', $ua, $match)) {
+            $this->data->browser->name = 'ICQ';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            $this->data->browser->type = Constants\BrowserType::APP_CHAT;
+
+            $this->data->os->reset([
+                'name'      => 'Android',
+                'version'   => new Version([ 'value' => $match[2] ])
+            ]);
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $device = Data\DeviceModels::identify('android', $match[3]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+
+        /* Facebook for Android */
+
+        if (preg_match('/^\[FBAN\/(FB4A|PAAA);.*FBDV\/([^;]+);.*FBSV\/([0-9\.]+);/u', $ua, $match)) {
+            if ($match[1] == 'FB4A') {
+                $this->data->browser->name = 'Facebook';
+                $this->data->browser->version = null;
+                $this->data->browser->type = Constants\BrowserType::APP_SOCIAL;
+            }
+
+            if ($match[1] == 'PAAA') {
+                $this->data->browser->name = 'Facebook Pages';
+                $this->data->browser->version = null;
+                $this->data->browser->type = Constants\BrowserType::APP_SOCIAL;
+            }
+
+            $this->data->os->reset([
+                'name'      => 'Android',
+                'version'   => new Version([ 'value' => $match[3] ])
+            ]);
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $device = Data\DeviceModels::identify('android', $match[2]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+
+        /* VK */
+
+        if (preg_match('/^VKAndroidApp\/([0-9\.]+)-[0-9]+ \(Android ([^;]+); SDK [^;]+; [^;]+; [a-z]+ ([^;]+);/iu', $ua, $match)) {
+            $this->data->browser->name = 'VK';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::APP_SOCIAL;
+
+            $this->data->os->reset([
+                'name'      => 'Android',
+                'version'   => new Version([ 'value' => $match[2] ])
+            ]);
+
+            $this->data->device->model = $match[3];
+            $this->data->device->identified |= Constants\Id::PATTERN;
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $device = Data\DeviceModels::identify('android', $match[3]);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+    }
+
+    private function detectRemainingApplications($ua)
+    {
+        if ($data = Data\Applications::identifyOther($ua)) {
+            $this->data->browser->set($data['browser']);
+
+            if (!empty($data['device'])) {
+                $this->data->device->set($data['device']);
+            }
+        }
+    }
+}

+ 47 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Bot.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Data;
+
+trait Bot
+{
+    private function &detectBot($ua)
+    {
+        /* Detect bots based on url in the UA string */
+
+        if (preg_match('/\+https?:\/\//iu', $ua)) {
+            $this->data->browser->reset();
+            $this->data->os->reset();
+            $this->data->engine->reset();
+            $this->data->device->reset();
+
+            $this->data->device->type = Constants\DeviceType::BOT;
+        }
+
+        /* Detect bots based on common markers */
+
+        if (preg_match('/(?:Bot|Robot|Spider|Crawler)([\/\);]|$)/iu', $ua) && !preg_match('/CUBOT/iu', $ua)) {
+            $this->data->browser->reset();
+            $this->data->os->reset();
+            $this->data->engine->reset();
+            $this->data->device->reset();
+
+            $this->data->device->type = Constants\DeviceType::BOT;
+        }
+
+        /* Detect based on a predefined list or markers */
+
+        if ($bot = Data\Applications::identifyBot($ua)) {
+            $this->data->browser = $bot;
+            $this->data->os->reset();
+            $this->data->engine->reset();
+            $this->data->device->reset();
+
+            $this->data->device->type = Constants\DeviceType::BOT;
+        }
+
+        return $this;
+    }
+}

+ 2387 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Browser.php

@@ -0,0 +1,2387 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Data;
+use WhichBrowser\Model\Family;
+use WhichBrowser\Model\Using;
+use WhichBrowser\Model\Version;
+
+trait Browser
+{
+    private function &detectBrowser($ua)
+    {
+        /* Detect major browsers */
+        $this->detectSafari($ua);
+        $this->detectExplorer($ua);
+        $this->detectFirefox($ua);
+        $this->detectChrome($ua);
+        $this->detectEdge($ua);
+        $this->detectOpera($ua);
+
+        /* Detect WAP browsers */
+        $this->detectWapBrowsers($ua);
+
+        /* Detect other various mobile browsers */
+        $this->detectNokiaBrowser($ua);
+        $this->detectSilk($ua);
+        $this->detectSailfishBrowser($ua);
+        $this->detectWebOSBrowser($ua);
+        $this->detectDolfin($ua);
+        $this->detectIris($ua);
+
+        /* Detect other browsers */
+        $this->detectUC($ua);
+        $this->detectObigo($ua);
+        $this->detectNetfront($ua);
+
+        /* Detect other specific desktop browsers */
+        $this->detectSeamonkey($ua);
+        $this->detectModernNetscape($ua);
+        $this->detectMosaic($ua);
+        $this->detectKonqueror($ua);
+        $this->detectOmniWeb($ua);
+
+        /* Detect other various television browsers */
+        $this->detectEspial($ua);
+        $this->detectMachBlue($ua);
+        $this->detectAnt($ua);
+        $this->detectSraf($ua);
+
+        /* Detect other browsers */
+        $this->detectDesktopBrowsers($ua);
+        $this->detectMobileBrowsers($ua);
+        $this->detectTelevisionBrowsers($ua);
+        $this->detectRemainingBrowsers($ua);
+
+        return $this;
+    }
+
+    private function &refineBrowser($ua)
+    {
+        $this->detectUCEngine($ua);
+        $this->detectLegacyNetscape($ua);
+
+        return $this;
+    }
+
+
+
+
+    /* Safari */
+
+    private function detectSafari($ua)
+    {
+        if (preg_match('/Safari/u', $ua)) {
+            $falsepositive = false;
+
+            if (preg_match('/Qt/u', $ua)) {
+                $falsepositive = true;
+            }
+
+            if (!$falsepositive) {
+                if (isset($this->data->os->name) && $this->data->os->name == 'iOS') {
+                    $this->data->browser->name = 'Safari';
+                    $this->data->browser->type = Constants\BrowserType::BROWSER;
+                    $this->data->browser->version = null;
+                    $this->data->browser->stock = true;
+
+                    if (preg_match('/Version\/([0-9\.]+)/u', $ua, $match)) {
+                        $this->data->browser->version = new Version([ 'value' => $match[1], 'hidden' => true ]);
+                    }
+                }
+
+                if (isset($this->data->os->name) && ($this->data->os->name == 'OS X' || $this->data->os->name == 'Windows')) {
+                    $this->data->browser->name = 'Safari';
+                    $this->data->browser->type = Constants\BrowserType::BROWSER;
+                    $this->data->browser->stock = $this->data->os->name == 'OS X';
+
+                    if (preg_match('/Version\/([0-9\.]+)/u', $ua, $match)) {
+                        $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+                    }
+
+                    if (preg_match('/AppleWebKit\/[0-9\.]+\+/u', $ua)) {
+                        $this->data->browser->name = 'WebKit Nightly Build';
+                        $this->data->browser->version = null;
+                    }
+                }
+            }
+        }
+
+        if (preg_match('/(?:Apple-PubSub|AppleSyndication)\//u', $ua)) {
+            $this->data->browser->name = 'Safari RSS';
+            $this->data->browser->type = Constants\BrowserType::APP_FEEDREADER;
+            $this->data->browser->version = null;
+            $this->data->browser->stock = true;
+
+            $this->data->os->name = 'OS X';
+            $this->data->os->version = null;
+
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+    }
+
+
+    /* Chrome */
+
+    private function detectChrome($ua)
+    {
+        if (preg_match('/(?:Chrome|CrMo|CriOS)\/[0-9]/u', $ua) || preg_match('/Browser\/Chrome[0-9]/u', $ua)) {
+            $this->data->browser->name = 'Chrome';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->stock = false;
+
+            $version = '';
+            if (preg_match('/(?:Chrome|CrMo|CriOS)\/([0-9.]*)/u', $ua, $match)) {
+                $version = $match[1];
+            }
+            if (preg_match('/Browser\/Chrome([0-9.]*)/u', $ua, $match)) {
+                $version = $match[1];
+            }
+            $this->data->browser->version = new Version([ 'value' => $version ]);
+
+            if (isset($this->data->os->name) && $this->data->os->name == 'Android') {
+                $channel = Data\Chrome::getChannel('mobile', $this->data->browser->version->value);
+
+                if ($channel == 'stable') {
+                    $this->data->browser->version->details = 1;
+                } elseif ($channel == 'beta') {
+                    $this->data->browser->channel = 'Beta';
+                } else {
+                    $this->data->browser->channel = 'Dev';
+                }
+
+
+                /* Webview for Android 4.4 and higher */
+                if (implode('.', array_slice(explode('.', $version), 1, 2)) == '0.0' && (preg_match('/Version\//u', $ua) || preg_match('/Release\//u', $ua))) {
+                    $this->data->browser->using = new Using([ 'name' => 'Chromium WebView', 'version' => new Version([ 'value' => explode('.', $version)[0] ]) ]);
+                    $this->data->browser->type = Constants\BrowserType::UNKNOWN;
+                    $this->data->browser->stock = true;
+                    $this->data->browser->name = null;
+                    $this->data->browser->version = null;
+                    $this->data->browser->channel = null;
+                }
+
+                /* Webview for Android 5 */
+                if (preg_match('/; wv\)/u', $ua)) {
+                    $this->data->browser->using = new Using([ 'name' => 'Chromium WebView', 'version' => new Version([ 'value' => explode('.', $version)[0] ]) ]);
+                    $this->data->browser->type = Constants\BrowserType::UNKNOWN;
+                    $this->data->browser->stock = true;
+                    $this->data->browser->name = null;
+                    $this->data->browser->version = null;
+                    $this->data->browser->channel = null;
+                }
+
+                /* LG Chromium based browsers */
+                if (isset($this->data->device->manufacturer) && $this->data->device->manufacturer == 'LG') {
+                    if (in_array($version, [ '30.0.1599.103', '34.0.1847.118', '38.0.2125.0', '38.0.2125.102' ]) && preg_match('/Version\/4/u', $ua) && !preg_match('/; wv\)/u', $ua)) {
+                        $this->data->browser->name = "LG Browser";
+                        $this->data->browser->channel = null;
+                        $this->data->browser->stock = true;
+                        $this->data->browser->version = null;
+                    }
+                }
+
+                /* Samsung Chromium based browsers */
+                if (isset($this->data->device->manufacturer) && $this->data->device->manufacturer == 'Samsung') {
+
+                    /* Version 1.0 */
+                    if ($version == '18.0.1025.308' && preg_match('/Version\/1.0/u', $ua)) {
+                        $this->data->browser->name = "Samsung Internet";
+                        $this->data->browser->channel = null;
+                        $this->data->browser->stock = true;
+                        $this->data->browser->version = new Version([ 'value' => '1.0' ]);
+                    }
+
+                    /* Version 1.5 */
+                    if ($version == '28.0.1500.94' && preg_match('/Version\/1.5/u', $ua)) {
+                        $this->data->browser->name = "Samsung Internet";
+                        $this->data->browser->channel = null;
+                        $this->data->browser->stock = true;
+                        $this->data->browser->version = new Version([ 'value' => '1.5' ]);
+                    }
+
+                    /* Version 1.6 */
+                    if ($version == '28.0.1500.94' && preg_match('/Version\/1.6/u', $ua)) {
+                        $this->data->browser->name = "Samsung Internet";
+                        $this->data->browser->channel = null;
+                        $this->data->browser->stock = true;
+                        $this->data->browser->version = new Version([ 'value' => '1.6' ]);
+                    }
+
+                    /* Version 2.0 */
+                    if ($version == '34.0.1847.76' && preg_match('/Version\/2.0/u', $ua)) {
+                        $this->data->browser->name = "Samsung Internet";
+                        $this->data->browser->channel = null;
+                        $this->data->browser->stock = true;
+                        $this->data->browser->version = new Version([ 'value' => '2.0' ]);
+                    }
+
+                    /* Version 2.1 */
+                    if ($version == '34.0.1847.76' && preg_match('/Version\/2.1/u', $ua)) {
+                        $this->data->browser->name = "Samsung Internet";
+                        $this->data->browser->channel = null;
+                        $this->data->browser->stock = true;
+                        $this->data->browser->version = new Version([ 'value' => '2.1' ]);
+                    }
+                }
+
+                /* Samsung Chromium based browsers */
+                if (preg_match('/SamsungBrowser\/([0-9.]*)/u', $ua, $match)) {
+                    $this->data->browser->name = "Samsung Internet";
+                    $this->data->browser->channel = null;
+                    $this->data->browser->stock = true;
+                    $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+
+                    if (preg_match('/Mobile VR/', $ua)) {
+                        $this->data->device->manufacturer = 'Samsung';
+                        $this->data->device->model = 'Gear VR';
+                        $this->data->device->type = Constants\DeviceType::HEADSET;
+                    }
+                }
+
+                /* Oculus Chromium based browsers */
+                if (preg_match('/OculusBrowser\/([0-9.]*)/u', $ua, $match)) {
+                    $this->data->browser->name = "Oculus Internet";
+                    $this->data->browser->channel = null;
+                    $this->data->browser->stock = true;
+                    $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+
+                    if (preg_match('/Mobile VR/', $ua)) {
+                        $this->data->device->manufacturer = 'Samsung';
+                        $this->data->device->model = 'Gear VR';
+                        $this->data->device->type = Constants\DeviceType::HEADSET;
+                    }
+                }
+            } elseif (isset($this->data->os->name) && $this->data->os->name == 'Linux' && preg_match('/SamsungBrowser\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->name = "Samsung Internet";
+                $this->data->browser->channel = null;
+                $this->data->browser->stock = true;
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+
+                $this->data->os->name = 'Android';
+                $this->data->os->version = null;
+
+                $this->data->device->manufacturer = 'Samsung';
+                $this->data->device->model = 'DeX';
+                $this->data->device->identifier = '';
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            } else {
+                $channel = Data\Chrome::getChannel('desktop', $version);
+
+                if ($channel == 'stable') {
+                    if (explode('.', $version)[1] == '0') {
+                        $this->data->browser->version->details = 1;
+                    } else {
+                        $this->data->browser->version->details = 2;
+                    }
+                } elseif ($channel == 'beta') {
+                    $this->data->browser->channel = 'Beta';
+                } else {
+                    $this->data->browser->channel = 'Dev';
+                }
+            }
+
+            if ($this->data->device->type == '') {
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+        }
+
+        /* Google Chromium */
+
+        if (preg_match('/Chromium/u', $ua)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->channel = '';
+            $this->data->browser->name = 'Chromium';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/Chromium\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if ($this->data->device->type == '') {
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+        }
+
+        /* Chrome Content Shell */
+
+        if (preg_match('/Chrome\/[0-9]+\.77\.34\.5/u', $ua)) {
+            $this->data->browser->using = new Using([ 'name' => 'Chrome Content Shell' ]);
+
+            $this->data->browser->type = Constants\BrowserType::UNKNOWN;
+            $this->data->browser->stock = false;
+            $this->data->browser->name = null;
+            $this->data->browser->version = null;
+            $this->data->browser->channel = null;
+        }
+
+        /* Chromium WebView by Amazon */
+
+        if (preg_match('/AmazonWebAppPlatform\//u', $ua)) {
+            $this->data->browser->using = new Using([ 'name' => 'Amazon WebView' ]);
+
+            $this->data->browser->type = Constants\BrowserType::UNKNOWN;
+            $this->data->browser->stock = false;
+            $this->data->browser->name = null;
+            $this->data->browser->version = null;
+            $this->data->browser->channel = null;
+        }
+
+        /* Chromium WebView by Crosswalk */
+
+        if (preg_match('/Crosswalk\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->using = new Using([ 'name' => 'Crosswalk WebView', 'version' => new Version([ 'value' => $match[1], 'details' => 1 ]) ]);
+
+            $this->data->browser->type = Constants\BrowserType::UNKNOWN;
+            $this->data->browser->stock = false;
+            $this->data->browser->name = null;
+            $this->data->browser->version = null;
+            $this->data->browser->channel = null;
+        }
+
+        /* Set the browser family */
+
+        if ($this->data->isBrowser('Chrome') || $this->data->isBrowser('Chromium')) {
+            $this->data->browser->family = new Family([
+                'name'      => 'Chrome',
+                'version'   => !empty($this->data->browser->version) ? new Version([ 'value' => $this->data->browser->version->getMajor() ]) : null
+            ]);
+        }
+    }
+
+
+    /* Internet Explorer */
+
+    private function detectExplorer($ua)
+    {
+        if (preg_match('/\(IE ([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Internet Explorer';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        if (preg_match('/Browser\/IE([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Internet Explorer';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        if (preg_match('/MSIE/u', $ua)) {
+            $this->data->browser->name = 'Internet Explorer';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/IEMobile/u', $ua) || preg_match('/Windows CE/u', $ua) || preg_match('/Windows Phone/u', $ua) || preg_match('/WP7/u', $ua) || preg_match('/WPDesktop/u', $ua)) {
+                $this->data->browser->name = 'Mobile Internet Explorer';
+
+                if (isset($this->data->device->model) && ($this->data->device->model == 'Xbox 360' || $this->data->device->model == 'Xbox One')) {
+                    $this->data->browser->name = 'Internet Explorer';
+                }
+            }
+
+            if (preg_match('/MSIE ([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => preg_replace("/\.([0-9])([0-9])/", '.$1.$2', $match[1]) ]);
+            }
+
+            if (preg_match('/Mac_/u', $ua)) {
+                $this->data->os->name = 'Mac OS';
+                $this->data->engine->name = 'Tasman';
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+
+                if (!empty($this->data->browser->version)) {
+                    if ($this->data->browser->version->is('>=', '5.1.1') && $this->data->browser->version->is('<=', '5.1.3')) {
+                        $this->data->os->name = 'OS X';
+                    }
+
+                    if ($this->data->browser->version->is('>=', '5.2')) {
+                        $this->data->os->name = 'OS X';
+                    }
+                }
+            }
+        }
+
+        if (preg_match('/Trident\/[789][^\)]+; rv:([0-9.]*)\)/u', $ua, $match)) {
+            $this->data->browser->name = 'Internet Explorer';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        if (preg_match('/Trident\/[789][^\)]+; Touch; rv:([0-9.]*);\s+IEMobile\//u', $ua, $match)) {
+            $this->data->browser->name = 'Mobile Internet Explorer';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        if (preg_match('/Trident\/[789][^\)]+; Touch; rv:([0-9.]*); WPDesktop/u', $ua, $match)) {
+            $this->data->browser->mode = 'desktop';
+            $this->data->browser->name = 'Mobile Internet Explorer';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        /* Old versions of Pocket Internet Explorer */
+
+        if ($this->data->isBrowser('Mobile Internet Explorer', '<', 6)) {
+            $this->data->browser->name = 'Pocket Internet Explorer';
+        }
+
+        if (preg_match('/Microsoft Pocket Internet Explorer\//u', $ua)) {
+            $this->data->browser->name = 'Pocket Internet Explorer';
+            $this->data->browser->version = new Version([ 'value' => '1.0' ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+
+        if (preg_match('/MSPIE ([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Pocket Internet Explorer2';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+
+        /* Microsoft Mobile Explorer */
+
+        if (preg_match('/MMEF([0-9])([0-9])/u', $ua, $match)) {
+            $this->data->browser->name = 'Microsoft Mobile Explorer';
+            $this->data->browser->version = new Version([ 'value' => $match[1] . '.' . $match[2] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            if (preg_match('/MMEF[0-9]+; ([^;]+); ([^\)\/]+)/u', $ua, $match)) {
+                $device = Data\DeviceModels::identify('feature', $match[1] == 'CellPhone' ? $match[2] : $match[1] . ' ' . $match[2]);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+        }
+
+
+        /* Set the browser family */
+
+        if ($this->data->isBrowser('Internet Explorer') || $this->data->isBrowser('Mobile Internet Explorer') || $this->data->isBrowser('Pocket Internet Explorer')) {
+            unset($this->data->browser->family);
+        }
+    }
+
+
+    /* Edge */
+
+    private function detectEdge($ua)
+    {
+        if (preg_match('/Edge\/([0-9]+)/u', $ua, $match)) {
+            $this->data->browser->name = 'Edge';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->channel = '';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 1 ]);
+        }
+
+
+        /* Set the browser family */
+
+        if ($this->data->isBrowser('Edge')) {
+            unset($this->data->browser->family);
+        }
+    }
+
+
+    /* Opera */
+
+    private function detectOpera($ua)
+    {
+        if (!preg_match('/(OPR|OMI|Opera|OPiOS|Coast|Oupeng)/ui', $ua)) {
+            return;
+        }
+
+        if (preg_match('/OPR\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->channel = '';
+            $this->data->browser->name = 'Opera';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/Edition Developer/iu', $ua)) {
+                $this->data->browser->channel = 'Developer';
+            }
+
+            if (preg_match('/Edition Next/iu', $ua)) {
+                $this->data->browser->channel = 'Next';
+            }
+
+            if (preg_match('/Edition Beta/iu', $ua)) {
+                $this->data->browser->channel = 'Beta';
+            }
+
+            if ($this->data->device->type == Constants\DeviceType::MOBILE) {
+                $this->data->browser->name = 'Opera Mobile';
+            }
+        }
+
+        if (preg_match('/OMI\/([0-9]+\.[0-9]+)/u', $ua, $match)) {
+            $this->data->browser->name = 'Opera Devices';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+
+            if (!$this->data->isOs('Android')) {
+                unset($this->data->os->name);
+                unset($this->data->os->version);
+            }
+        }
+
+        if ((preg_match('/Opera[\/\-\s]/iu', $ua) || preg_match('/Browser\/Opera/iu', $ua)) && !preg_match('/Opera Software/iu', $ua)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'Opera';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/Opera[\/| ]?([0-9.]+)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if (preg_match('/Version\/([0-9.]+)/u', $ua, $match)) {
+                if (floatval($match[1]) >= 10) {
+                    $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+                }
+            }
+
+            if (isset($this->data->browser->version) && preg_match('/Edition Labs/u', $ua)) {
+                $this->data->browser->channel = 'Labs';
+            }
+
+            if (isset($this->data->browser->version) && preg_match('/Edition Next/u', $ua)) {
+                $this->data->browser->channel = 'Next';
+            }
+
+            if (preg_match('/Opera Tablet/u', $ua)) {
+                $this->data->browser->name = 'Opera Mobile';
+                $this->data->device->type = Constants\DeviceType::TABLET;
+            }
+
+            if (preg_match('/Opera Mobi/u', $ua)) {
+                $this->data->browser->name = 'Opera Mobile';
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+
+            if (preg_match('/Opera Mini;/u', $ua)) {
+                $this->data->browser->name = 'Opera Mini';
+                $this->data->browser->version = null;
+                $this->data->browser->mode = 'proxy';
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+
+            if (preg_match('/Opera Mini\/(?:att\/)?([0-9.]+)/u', $ua, $match)) {
+                $this->data->browser->name = 'Opera Mini';
+                $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => (intval(substr(strrchr($match[1], '.'), 1)) > 99 ? -1 : null) ]);
+                $this->data->browser->mode = 'proxy';
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+
+            if ($this->data->browser->name == 'Opera' && $this->data->device->type == Constants\DeviceType::MOBILE) {
+                $this->data->browser->name = 'Opera Mobile';
+            }
+
+            if (preg_match('/InettvBrowser/u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::TELEVISION;
+            }
+
+            if (preg_match('/Opera[ -]TV/u', $ua)) {
+                $this->data->browser->name = 'Opera';
+                $this->data->device->type = Constants\DeviceType::TELEVISION;
+            }
+
+            if (preg_match('/Linux zbov/u', $ua)) {
+                $this->data->browser->name = 'Opera Mobile';
+                $this->data->browser->mode = 'desktop';
+
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                $this->data->os->name = null;
+                $this->data->os->version = null;
+            }
+
+            if (preg_match('/Linux zvav/u', $ua)) {
+                $this->data->browser->name = 'Opera Mini';
+                $this->data->browser->version = null;
+                $this->data->browser->mode = 'desktop';
+
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                $this->data->os->name = null;
+                $this->data->os->version = null;
+            }
+
+            if ($this->data->device->type == '') {
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (isset($this->data->browser->family)) {
+                unset($this->data->browser->family);
+            }
+        }
+
+        if (preg_match('/OPiOS\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'Opera Mini';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        if (preg_match('/Coast\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'Coast by Opera';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        if (preg_match('/Oupeng(?:HD)?[\/-]([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'Opera Oupeng';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+    }
+
+
+    /* Firefox */
+
+    private function detectFirefox($ua)
+    {
+        if (!preg_match('/(Firefox|GranParadiso|Namoroka|Shiretoko|Minefield|BonEcho|Fennec|Phoenix|Firebird|Minimo|FxiOS)/ui', $ua)) {
+            return;
+        }
+
+        if (preg_match('/Firefox/u', $ua)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'Firefox';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/Firefox\/([0-9ab.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+
+                if (preg_match('/a/u', $match[1])) {
+                    $this->data->browser->channel = 'Aurora';
+                }
+
+                if (preg_match('/b/u', $match[1])) {
+                    $this->data->browser->channel = 'Beta';
+                }
+            }
+
+            if (preg_match('/Aurora\/([0-9ab.]*)/u', $ua, $match)) {
+                $this->data->browser->channel = 'Aurora';
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if (preg_match('/Fennec/u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+
+            if (preg_match('/Mobile;(?: ([^;]+);)? rv/u', $ua, $match)) {
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                if (isset($match[1])) {
+                    $device = Data\DeviceModels::identify('firefoxos', $match[1]);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->os->reset([ 'name' => 'Firefox OS' ]);
+                        $this->data->device = $device;
+                    }
+                }
+            }
+
+            if (preg_match('/Tablet;(?: ([^;]+);)? rv/u', $ua, $match)) {
+                $this->data->device->type = Constants\DeviceType::TABLET;
+            }
+
+            if (preg_match('/Viera;(?: ([^;]+);)? rv/u', $ua, $match)) {
+                $this->data->device->type = Constants\DeviceType::TELEVISION;
+                $this->data->os->reset([ 'name' => 'Firefox OS' ]);
+            }
+
+            if ($this->data->device->type == Constants\DeviceType::MOBILE || $this->data->device->type == Constants\DeviceType::TABLET) {
+                $this->data->browser->name = 'Firefox Mobile';
+            }
+
+            if ($this->data->device->type == '') {
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+        }
+
+
+        if (preg_match('/(GranParadiso|Namoroka|Shiretoko|Minefield|BonEcho)/u', $ua, $match)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'Firefox';
+            $this->data->browser->channel = str_replace('GranParadiso', 'Gran Paradiso', $match[1]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/' . $match[1] . '\/([0-9ab.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+        if (preg_match('/Fennec/u', $ua)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'Firefox Mobile';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/Fennec\/([0-9ab.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            $this->data->browser->channel = 'Fennec';
+        }
+
+        if (preg_match('/(Phoenix|Firebird|Minimo)/u', $ua, $match)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = $match[1];
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/' . $match[1] . '\/([0-9ab.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+        if (preg_match('/FxiOS\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Firefox';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        if (preg_match('/Servo\/1.0 Firefox\/37.0/u', $ua)) {
+            $this->data->browser->name = 'Servo Nightly Build';
+            $this->data->browser->version = null;
+        }
+
+
+        /* Set the browser family */
+
+        if ($this->data->isBrowser('Firefox') || $this->data->isBrowser('Firefox Mobile') || $this->data->isBrowser('Firebird')) {
+            $this->data->browser->family = new Family([ 'name' => 'Firefox', 'version' => $this->data->browser->version ]);
+        }
+
+        if ($this->data->isBrowser('Minimo')) {
+            $this->data->browser->family = new Family([ 'name' => 'Firefox' ]);
+        }
+    }
+
+
+    /* Seamonkey */
+
+    private function detectSeamonkey($ua)
+    {
+        if (preg_match('/SeaMonkey/u', $ua)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'SeaMonkey';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/SeaMonkey\/([0-9ab.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+        if (preg_match('/PmWFx\/([0-9ab.]*)/u', $ua, $match)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'SeaMonkey';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+    }
+
+
+    /* Netscape */
+
+    private function detectLegacyNetscape($ua)
+    {
+        if ($this->data->device->type == Constants\DeviceType::DESKTOP && $this->data->browser->getName() == '') {
+            if (!preg_match('/compatible;/u', $ua)) {
+                if (preg_match('/Mozilla\/([123].[0-9]+)/u', $ua, $match)) {
+                    $this->data->browser->name = 'Netscape Navigator';
+                    $this->data->browser->version = new Version([ 'value' => preg_replace("/([0-9])([0-9])/", '$1.$2', $match[1]) ]);
+                    $this->data->browser->type = Constants\BrowserType::BROWSER;
+                }
+
+                if (preg_match('/Mozilla\/(4.[0-9]+)/u', $ua, $match)) {
+                    $this->data->browser->name = 'Netscape Communicator';
+                    $this->data->browser->version = new Version([ 'value' => preg_replace("/([0-9])([0-9])/", '$1.$2', $match[1]) ]);
+                    $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+                    if (preg_match('/Nav\)/u', $ua)) {
+                        $this->data->browser->name = 'Netscape Navigator';
+                    }
+                }
+            }
+        }
+    }
+
+    private function detectModernNetscape($ua)
+    {
+        if (preg_match('/Netscape/u', $ua)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'Netscape';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/Netscape[0-9]?\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+        if (preg_match('/ Navigator\/(9\.[0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'Netscape Navigator';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+        }
+    }
+
+
+    /* Mosaic */
+
+    private function detectMosaic($ua)
+    {
+        if (!preg_match('/Mosaic/ui', $ua)) {
+            return;
+        }
+
+        if (preg_match('/(?:NCSA[ _])?Mosaic(?:\(tm\))?(?: for the X Window System| for Windows)?\/(?:Version )?([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'NCSA Mosaic';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->family = new Family([ 'name' => 'Mosaic' ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->stock = false;
+        }
+
+        if (preg_match('/AIR_Mosaic(?:\(16bit\))?\/v([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'AIR Mosaic';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->family = new Family([ 'name' => 'Mosaic' ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->stock = false;
+        }
+
+        if (preg_match('/(?:MosaicView|Spyglass[ _]Mosaic)\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Spyglass Mosaic';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->family = new Family([ 'name' => 'Mosaic' ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->stock = false;
+        }
+
+        if (preg_match('/SPRY_Mosaic(?:\(16bit\))?\/v([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'SPRY Mosaic';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->family = new Family([ 'name' => 'Mosaic' ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->stock = false;
+        }
+
+        if (preg_match('/DCL SuperMosaic\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'SuperMosaic';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->family = new Family([ 'name' => 'Mosaic' ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->stock = false;
+        }
+
+        if (preg_match('/VMS_Mosaic\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'VMS Mosaic';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->family = new Family([ 'name' => 'Mosaic' ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->stock = false;
+        }
+
+        if (preg_match('/mMosaic\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'mMosaic';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->family = new Family([ 'name' => 'Mosaic' ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->stock = false;
+        }
+
+        if (preg_match('/Quarterdeck Mosaic Version ([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Quarterdeck Mosaic';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->family = new Family([ 'name' => 'Mosaic' ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->stock = false;
+        }
+
+        if (preg_match('/WinMosaic\/Version ([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'WinMosaic';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->family = new Family([ 'name' => 'Mosaic' ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->stock = false;
+        }
+
+        if (preg_match('/Device Mosaic ([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Device Mosaic';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->family = new Family([ 'name' => 'Mosaic' ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->stock = false;
+
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+        }
+    }
+
+
+    /* UC Browser */
+
+    private function detectUC($ua)
+    {
+        if (!preg_match('/(UC|UBrowser)/ui', $ua)) {
+            return;
+        }
+
+        if (preg_match('/UCWEB/u', $ua)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'UC Browser';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            unset($this->data->browser->channel);
+
+            if (preg_match('/UCWEB\/?([0-9]*[.][0-9]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+
+            if (!$this->data->device->type) {
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+
+            if (isset($this->data->os->name) && $this->data->os->name == 'Linux') {
+                $this->data->os->reset();
+            }
+
+            if (preg_match('/^IUC ?\(U; ?iOS ([0-9\._]+);/u', $ua, $match)) {
+                $this->data->os->name = 'iOS';
+                $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]) ]);
+            }
+
+            if (preg_match('/^JUC ?\(Linux; ?U; ?(?:Android)? ?([0-9\.]+)[^;]*; ?[^;]+; ?([^;]*[^\s])\s*; ?[0-9]+\*[0-9]+;?\)/u', $ua, $match)) {
+                $this->data->os->name = 'Android';
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+
+                $this->data->device = Data\DeviceModels::identify('android', $match[2]);
+            }
+
+            if (preg_match('/\(MIDP-2.0; U; [^;]+; ([^;]*[^\s])\)/u', $ua, $match)) {
+                $this->data->os->name = 'Android';
+
+                $this->data->device->model = $match[1];
+                $this->data->device->identified |= Constants\Id::PATTERN;
+
+                $device = Data\DeviceModels::identify('android', $match[1]);
+
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if (preg_match('/\((?:Linux|MIDP-2.0); U; Adr ([0-9\.]+)(?:-update[0-9])?; [^;]+; ([^;]*[^\s])\)/u', $ua, $match)) {
+                $this->data->os->name = 'Android';
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+
+                $this->data->device->model = $match[2];
+                $this->data->device->identified |= Constants\Id::PATTERN;
+
+                $device = Data\DeviceModels::identify('android', $match[2]);
+
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if (preg_match('/\((?:iOS|iPhone);/u', $ua)) {
+                $this->data->os->name = 'iOS';
+                $this->data->os->version = new Version([ 'value' => '1.0' ]);
+
+                if (preg_match('/OS[_ ]([0-9_]*);/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]) ]);
+                }
+
+                if (preg_match('/; ([^;]+)\)/u', $ua, $match)) {
+                    $device = Data\DeviceModels::identify('ios', $match[1]);
+
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+            }
+
+            if (preg_match('/\(Symbian;/u', $ua)) {
+                $this->data->os->name = 'Series60';
+                $this->data->os->version = null;
+                $this->data->os->family = new Family([ 'name' => 'Symbian' ]);
+
+                if (preg_match('/S60 V([0-9])/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                if (preg_match('/; Nokia([^;]+)\)/iu', $ua, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('symbian', $match[1]);
+
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+            }
+
+            if (preg_match('/\(Windows;/u', $ua)) {
+                $this->data->os->name = 'Windows Phone';
+                $this->data->os->version = null;
+
+                if (preg_match('/wds ([0-9]+\.[0-9])/u', $ua, $match)) {
+                    switch ($match[1]) {
+                        case '7.1':
+                            $this->data->os->version = new Version([ 'value' => '7.5' ]);
+                            break;
+                        case '8.0':
+                            $this->data->os->version = new Version([ 'value' => '8.0' ]);
+                            break;
+                        case '8.1':
+                            $this->data->os->version = new Version([ 'value' => '8.1' ]);
+                            break;
+                        case '10.0':
+                            $this->data->os->version = new Version([ 'value' => '10.0' ]);
+                            break;
+                    }
+                }
+
+                if (preg_match('/; ([^;]+); ([^;]+)\)/u', $ua, $match)) {
+                    $this->data->device->manufacturer = $match[1];
+                    $this->data->device->model = $match[2];
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('wp', $match[2]);
+
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+            }
+        }
+
+        if (preg_match('/Ucweb\/([0-9]*[.][0-9]*)/u', $ua, $match)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'UC Browser';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        if (preg_match('/ucweb-squid/u', $ua)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'UC Browser';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            unset($this->data->browser->channel);
+        }
+
+        if (preg_match('/\) ?UC /u', $ua)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'UC Browser';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            unset($this->data->browser->version);
+            unset($this->data->browser->channel);
+            unset($this->data->browser->mode);
+
+            if ($this->data->device->type == Constants\DeviceType::DESKTOP) {
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+                $this->data->browser->mode = 'desktop';
+            }
+        }
+
+        if (preg_match('/UC ?Browser\/?([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'UC Browser';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            unset($this->data->browser->channel);
+
+            if (!$this->data->device->type) {
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+        }
+
+        if (preg_match('/UBrowser\/?([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'UC Browser';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            unset($this->data->browser->channel);
+        }
+
+        /* U2 is the Proxy service used by UC Browser on low-end phones */
+        if (preg_match('/U2\//u', $ua)) {
+            $this->data->browser->stock = false;
+            $this->data->browser->name = 'UC Browser';
+            $this->data->browser->mode = 'proxy';
+
+            $this->data->engine->name = 'Gecko';
+
+            /* UC Browser running on Windows 8 is identifing itself as U2, but instead its a Trident Webview */
+            if (isset($this->data->os->name) && isset($this->data->os->version)) {
+                if ($this->data->os->name == 'Windows Phone' && $this->data->os->version->toFloat() >= 8) {
+                    $this->data->engine->name = 'Trident';
+                    $this->data->browser->mode = '';
+                }
+            }
+
+            if ($this->data->device->identified < Constants\Id::MATCH_UA && preg_match('/; ([^;]*)\) U2\//u', $ua, $match)) {
+                $device = Data\DeviceModels::identify('android', $match[1]);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+
+                    if (!isset($this->data->os->name) || ($this->data->os->name != 'Android' && (!isset($this->data->os->family) || $this->data->os->family->getName() != 'Android'))) {
+                        $this->data->os->name = 'Android';
+                    }
+                }
+            }
+        }
+
+        /* U3 is the Webkit based Webview used on Android phones */
+        if (preg_match('/U3\//u', $ua)) {
+            $this->data->engine->name = 'Webkit';
+        }
+    }
+
+    private function detectUCEngine($ua)
+    {
+        if (isset($this->data->browser->name)) {
+            if ($this->data->browser->name == 'UC Browser') {
+                if (!preg_match("/UBrowser\//", $ua) && ($this->data->device->type == 'desktop' || (isset($this->data->os->name) && ($this->data->os->name == 'Windows' || $this->data->os->name == 'OS X')))) {
+                    $this->data->device->type = Constants\DeviceType::MOBILE;
+                    $this->data->browser->mode = 'desktop';
+                    $this->data->engine->reset();
+                    $this->data->os->reset();
+                } elseif (!isset($this->data->os->name) || ($this->data->os->name != 'iOS' && $this->data->os->name != 'Windows Phone' && $this->data->os->name != 'Windows' && $this->data->os->name != 'Android' && (!isset($this->data->os->family) || $this->data->os->family->getName() != 'Android'))) {
+                    $this->data->engine->name = 'Gecko';
+                    unset($this->data->engine->version);
+                    $this->data->browser->mode = 'proxy';
+                }
+
+                if (isset($this->data->engine->name) && $this->data->engine->name == 'Presto') {
+                    $this->data->engine->name = 'Webkit';
+                    unset($this->data->engine->version);
+                }
+            }
+        }
+    }
+
+
+    /* Netfront */
+
+    private function detectNetfront($ua)
+    {
+        if (!preg_match('/(CNF|NF|NetFront|NX|Ave|COM2)/ui', $ua)) {
+            return;
+        }
+
+        /* Compact NetFront */
+
+        if (preg_match('/CNF\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Compact NetFront';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+
+        /* NetFront */
+
+        if (preg_match('/Net[fF]ront/u', $ua) && !preg_match('/NetFrontNX/u', $ua)) {
+            $this->data->browser->name = 'NetFront';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            unset($this->data->browser->channel);
+
+            if (preg_match('/NetFront[ \/]?([0-9.]*)/ui', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            /* Detect device type based on NetFront identifier */
+
+            if (preg_match('/MobilePhone/u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+
+            if (preg_match('/DigitalMediaPlayer/u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::MEDIA;
+            }
+
+            if (preg_match('/PDA/u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::PDA;
+            }
+
+            if (preg_match('/MFP/u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::PRINTER;
+            }
+
+            if (preg_match('/(InettvBrowser|HbbTV|DTV|NetworkAVTV|BDPlayer)/u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::TELEVISION;
+            }
+
+            if (preg_match('/VCC/u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::CAR;
+            }
+
+            if (preg_match('/Kindle/u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::EREADER;
+            }
+
+            if (empty($this->data->device->type)) {
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+
+            /* Detect OS based on NetFront identifier */
+
+            if (preg_match('/NF[0-9][0-9](?:WMPRO|PPC)\//ui', $ua, $match)) {
+                if (!$this->data->isOs('Windows Mobile')) {
+                    $this->data->os->reset([
+                        'name' => 'Windows Mobile'
+                    ]);
+                }
+            }
+        }
+
+        if (preg_match('/(?:Browser\/(?:NF|NetFr?ont-)|NF-Browser\/|ACS-NF\/|NetFront FullBrowser\/)([0-9.]*)/ui', $ua, $match)) {
+            $this->data->browser->name = 'NetFront';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            unset($this->data->browser->channel);
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+
+        /* AVE-Front */
+
+        if (preg_match('/(?:AVE-Front|AveFront)\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'NetFront';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/Category=([^\);]+)[\);]/u', $ua, $match)) {
+                switch ($match[1]) {
+                    case 'WebPhone':
+                        $this->data->device->type = Constants\DeviceType::MOBILE;
+                        $this->data->device->subtype = Constants\DeviceSubType::DESKTOP;
+                        break;
+                    case 'WP':
+                    case 'Home Mail Tool':
+                    case 'PDA':
+                        $this->data->device->type = Constants\DeviceType::PDA;
+                        break;
+                    case 'STB':
+                        $this->data->device->type = Constants\DeviceType::TELEVISION;
+                        break;
+                    case 'GAME':
+                        $this->data->device->type = Constants\DeviceType::GAMING;
+                        $this->data->device->subtype = Constants\DeviceSubType::CONSOLE;
+                        break;
+                }
+            }
+
+            if (preg_match('/Product=([^\);]+)[\);]/u', $ua, $match)) {
+                if (in_array($match[1], [ 'ACCESS/NFPS', 'SUNSOFT/EnjoyMagic' ])) {
+                    $this->data->device->setIdentification([
+                        'manufacturer'  =>  'Sony',
+                        'model'         =>  'Playstation 2',
+                        'type'          =>  Constants\DeviceType::GAMING,
+                        'subtype'       =>  Constants\DeviceSubType::CONSOLE
+                    ]);
+                }
+            }
+        }
+
+        /* Netfront NX */
+
+        if (preg_match('/NX\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'NetFront NX';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            unset($this->data->browser->channel);
+
+            if (empty($this->data->device->type) || $this->data->isType('desktop')) {
+                if (preg_match('/(DTV|HbbTV)/iu', $ua)) {
+                    $this->data->device->type = Constants\DeviceType::TELEVISION;
+                } else {
+                    $this->data->device->type = Constants\DeviceType::DESKTOP;
+                }
+            }
+
+            $this->data->os->reset();
+        }
+
+        /* The Sony Mylo 2 identifies as Firefox 2, but is NetFront */
+
+        if (preg_match('/Sony\/COM2/u', $ua, $match)) {
+            $this->data->browser->reset([
+                'name' => 'NetFront',
+                'type' => Constants\BrowserType::BROWSER
+            ]);
+        }
+    }
+
+
+    /* Obigo */
+
+    private function detectObigo($ua)
+    {
+        $processObigoVersion = function ($version) {
+            $result = [
+                'value' => $version
+            ];
+
+            if (preg_match('/[0-9.]+/', $version, $match)) {
+                $result['details'] = 2;
+            }
+
+            if (preg_match('/([0-9])[A-Z]/', $version, $match)) {
+                $result['value'] = intval($match[1]);
+                $result['alias'] = $version;
+            }
+
+            return $result;
+        };
+
+        if (preg_match('/(?:Obigo|Teleca|AU-MIC|MIC\/)/ui', $ua)) {
+            $this->data->browser->name = 'Obigo';
+            $this->data->browser->version = null;
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/Obigo\/0?([0-9.]+)/iu', $ua, $match)) {
+                $this->data->browser->version = new Version($processObigoVersion($match[1]));
+            } elseif (preg_match('/(?:MIC|TelecaBrowser)\/(WAP|[A-Z])?0?([0-9.]+[A-Z]?)/iu', $ua, $match)) {
+                $this->data->browser->version = new Version($processObigoVersion($match[2]));
+                if (!empty($match[1])) {
+                    $this->data->browser->name = 'Obigo ' . strtoupper($match[1]);
+                }
+            } elseif (preg_match('/(?:Obigo(?:InternetBrowser|[- ]Browser)?|Teleca)\/(WAP|[A-Z])?[0O]?([0-9.]+[A-Z]?)/ui', $ua, $match)) {
+                $this->data->browser->version = new Version($processObigoVersion($match[2]));
+                if (!empty($match[1])) {
+                    $this->data->browser->name = 'Obigo ' . strtoupper($match[1]);
+                }
+            } elseif (preg_match('/(?:Obigo|Teleca)[- ]([WAP|[A-Z])?0?([0-9.]+[A-Z]?)(?:[0-9])?(?:[\/;]|$)/ui', $ua, $match)) {
+                $this->data->browser->version = new Version($processObigoVersion($match[2]));
+                if (!empty($match[1])) {
+                    $this->data->browser->name = 'Obigo ' . strtoupper($match[1]);
+                }
+            } elseif (preg_match('/Browser\/(?:Obigo|Teleca)[_-]?(?:Browser\/)?(WAP|[A-Z])?0?([0-9.]+[A-Z]?)/ui', $ua, $match)) {
+                $this->data->browser->version = new Version($processObigoVersion($match[2]));
+                if (!empty($match[1])) {
+                    $this->data->browser->name = 'Obigo ' . strtoupper($match[1]);
+                }
+            } elseif (preg_match('/Obigo Browser (WAP|[A-Z])?0?([0-9.]+[A-Z]?)/ui', $ua, $match)) {
+                $this->data->browser->version = new Version($processObigoVersion($match[2]));
+                if (!empty($match[1])) {
+                    $this->data->browser->name = 'Obigo ' . strtoupper($match[1]);
+                }
+            }
+        }
+
+        if (preg_match('/(Q)0?([0-9][A-Z])/u', $ua, $match)) {
+            $this->data->browser->name = 'Obigo ' . $match[1];
+            $this->data->browser->version = new Version($processObigoVersion($match[2]));
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+    }
+
+
+    /* ANT Galio and ANT Fresco */
+
+    private function detectAnt($ua)
+    {
+        if (preg_match('/ANTFresco\/([0-9.]+)/iu', $ua, $match)) {
+            $this->data->browser->name = 'ANT Fresco';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        if (preg_match('/ANTGalio\/([0-9.]+)/iu', $ua, $match)) {
+            $this->data->browser->name = 'ANT Galio';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+    }
+
+
+    /* Seraphic Sraf */
+
+    private function detectSraf($ua)
+    {
+        if (preg_match('/sraf_tv_browser/u', $ua)) {
+            $this->data->browser->name = 'Seraphic Sraf';
+            $this->data->browser->version = null;
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+        }
+
+        if (preg_match('/SRAF\/([0-9.]+)/iu', $ua, $match)) {
+            $this->data->browser->name = 'Seraphic Sraf';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+        }
+    }
+
+
+    /* MachBlue */
+
+    private function detectMachBlue($ua)
+    {
+        if (preg_match('/mbxtWebKit\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->os->name = '';
+            $this->data->browser->name = 'MachBlue XT';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+        }
+
+        if ($ua == 'MachBlue') {
+            $this->data->os->name = '';
+            $this->data->browser->name = 'MachBlue XT';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+    }
+
+
+    /* Espial */
+
+    private function detectEspial($ua)
+    {
+        if (preg_match('/Espial/u', $ua)) {
+            $this->data->browser->name = 'Espial';
+            $this->data->browser->channel = null;
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            $this->data->os->name = '';
+            $this->data->os->version = null;
+
+            if ($this->data->device->type != Constants\DeviceType::TELEVISION) {
+                $this->data->device->type = Constants\DeviceType::TELEVISION;
+                $this->data->device->manufacturer = null;
+                $this->data->device->model = null;
+            }
+
+            if (preg_match('/Espial(?: Browser|TVBrowser)?\/(?:sig)?([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if (preg_match('/;(L6200|L7200)/u', $ua, $match)) {
+                $this->data->device->manufacturer = 'Toshiba';
+                $this->data->device->model = 'Regza ' . $match[1];
+                $this->data->device->series = 'Smart TV';
+                $this->data->device->identified |= Constants\Id::MATCH_UA;
+                $this->data->device->generic = false;
+            }
+        }
+    }
+
+
+    /* Iris */
+
+    private function detectIris($ua)
+    {
+        if (preg_match('/Iris\//u', $ua)) {
+            $this->data->browser->name = 'Iris';
+            $this->data->browser->hidden = false;
+            $this->data->browser->stock = false;
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/Iris\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if (preg_match('/ WM([0-9]) /u', $ua, $match)) {
+                $this->data->device->reset();
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                $this->data->os->reset();
+                $this->data->os->name = 'Windows Mobile';
+                $this->data->os->version = new Version([ 'value' => $match[1] . '.0' ]);
+            }
+
+            if (preg_match('/Windows NT/u', $ua, $match)) {
+                $this->data->browser->mode = 'desktop';
+
+                $this->data->device->reset();
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                $this->data->os->reset();
+                $this->data->os->name = 'Windows Mobile';
+            }
+        }
+    }
+
+
+    /* Dolfin */
+
+    private function detectDolfin($ua)
+    {
+        if (preg_match('/(Dolfin|Jasmine)/u', $ua)) {
+            $this->data->browser->name = 'Dolfin';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/(?:Dolfin|Jasmine)\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if (preg_match('/Browser\/Dolfin([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+    }
+
+
+    /* WebOS */
+
+    private function detectWebOSBrowser($ua)
+    {
+        if (preg_match('/wOSBrowser/u', $ua)) {
+            $this->data->browser->name = 'webOS Browser';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if ($this->data->os->name != 'webOS') {
+                $this->data->os->name = 'webOS';
+            }
+
+            if (isset($this->data->device->manufacturer) && $this->data->device->manufacturer == 'Apple') {
+                unset($this->data->device->manufacturer);
+                unset($this->data->device->model);
+                unset($this->data->device->identifier);
+                $this->data->device->identified = Constants\Id::NONE;
+            }
+        }
+    }
+
+
+    /* Sailfish */
+
+    private function detectSailfishBrowser($ua)
+    {
+        if (preg_match('/Sailfish ?Browser/u', $ua)) {
+            $this->data->browser->name = 'Sailfish Browser';
+            $this->data->browser->stock = true;
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/Sailfish ?Browser\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            }
+        }
+    }
+
+
+    /* Silk */
+
+    private function detectSilk($ua)
+    {
+        if (preg_match('/Silk/u', $ua)) {
+            if (preg_match('/Silk-Accelerated/u', $ua) || !preg_match('/PlayStation/u', $ua)) {
+                $this->data->browser->name = 'Silk';
+                $this->data->browser->channel = null;
+                $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+                if (preg_match('/Silk\/([0-9.]*)/u', $ua, $match)) {
+                    $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+                }
+
+                if (preg_match('/; ([^;]*[^;\s])\s+Build/u', $ua, $match)) {
+                    $this->data->device = Data\DeviceModels::identify('android', $match[1]);
+                }
+
+                if (!$this->data->device->identified) {
+                    $this->data->device->manufacturer = 'Amazon';
+                    $this->data->device->model = 'Kindle Fire';
+                    $this->data->device->type = Constants\DeviceType::TABLET;
+                    $this->data->device->identified |= Constants\Id::INFER;
+
+                    if (isset($this->data->os->name) && ($this->data->os->name != 'Android' || $this->data->os->name != 'FireOS')) {
+                        $this->data->os->name = 'FireOS';
+                        $this->data->os->family = new Family([ 'name' => 'Android' ]);
+                        $this->data->os->alias = null;
+                        $this->data->os->version = null;
+                    }
+                }
+            }
+        }
+    }
+
+
+    /* Nokia */
+
+    private function detectNokiaBrowser($ua)
+    {
+        if (!preg_match('/(BrowserNG|Nokia|OSRE|Ovi|Maemo)/ui', $ua)) {
+            return;
+        }
+
+        /* Nokia Browser */
+
+        if (preg_match('/BrowserNG/u', $ua)) {
+            $this->data->browser->name = 'Nokia Browser';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/BrowserNG\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3, 'builds' => false ]);
+            }
+        }
+
+        if (preg_match('/NokiaBrowser/u', $ua)) {
+            $this->data->browser->name = 'Nokia Browser';
+            $this->data->browser->channel = null;
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/NokiaBrowser\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+        }
+
+        if (preg_match('/Nokia-Communicator-WWW-Browser/u', $ua)) {
+            $this->data->browser->name = 'Nokia Browser';
+            $this->data->browser->channel = null;
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/Nokia-Communicator-WWW-Browser\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+        }
+
+
+        /* Nokia Xpress for S30+, S40 and Windows Phone */
+
+        if (preg_match('/OSRE/u', $ua)) {
+            $this->data->browser->name = 'Nokia Xpress';
+            $this->data->browser->mode = 'proxy';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $this->data->os->name = null;
+            $this->data->os->version = null;
+        }
+
+        if (preg_match('/S40OviBrowser/u', $ua)) {
+            $this->data->browser->name = 'Nokia Xpress';
+            $this->data->browser->mode = 'proxy';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/S40OviBrowser\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+
+            if (preg_match('/Nokia([^\/]+)\//u', $ua, $match)) {
+                $this->data->device->manufacturer = 'Nokia';
+                $this->data->device->model = $match[1];
+                $this->data->device->identified |= Constants\Id::PATTERN;
+
+                if (isset($this->data->device->model)) {
+                    $device = Data\DeviceModels::identify('s40', $this->data->device->model);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+
+                if (isset($this->data->device->model)) {
+                    $device = Data\DeviceModels::identify('asha', $this->data->device->model);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->os->name = 'Nokia Asha Platform';
+                        $this->data->os->version = new Version([ 'value' => '1.0' ]);
+                        $this->data->device = $device;
+
+
+                        if (preg_match('/java_runtime_version=Nokia_Asha_([0-9_]+);/u', $ua, $match)) {
+                            $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]) ]);
+                        }
+                    }
+                }
+            }
+
+            if (preg_match('/NOKIALumia([0-9]+)/u', $ua, $match)) {
+                $this->data->device->manufacturer = 'Nokia';
+                $this->data->device->model = $match[1];
+                $this->data->device->identified |= Constants\Id::PATTERN;
+
+                $device = Data\DeviceModels::identify('wp', $this->data->device->model);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                    $this->data->os->name = 'Windows Phone';
+                }
+            }
+        }
+
+
+        /* MicroB - the default browser for maemo */
+
+        if (preg_match('/Maemo[ |_]Browser/u', $ua)) {
+            $this->data->browser->name = 'MicroB';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/Maemo[ |_]Browser[ |_]([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+        }
+    }
+
+
+    /* Konqueror */
+
+    private function detectKonqueror($ua)
+    {
+        if (preg_match('/[k|K]onqueror\//u', $ua)) {
+            $this->data->browser->name = 'Konqueror';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/[k|K]onqueror\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if ($this->data->device->type == '') {
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+        }
+    }
+
+
+    /* OmniWeb */
+
+    private function detectOmniWeb($ua)
+    {
+        if (preg_match('/OmniWeb/u', $ua)) {
+            $this->data->browser->name = 'OmniWeb';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->version = null;
+
+            if (preg_match('/OmniWeb\/v?([0-9])[0-9][0-9]/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 1 ]);
+            }
+
+            if (preg_match('/OmniWeb\/([0-9]\.[0-9\.]+)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+
+            $this->data->device->reset([
+                'type' => Constants\DeviceType::DESKTOP
+            ]);
+
+            if (!empty($this->data->browser->version)) {
+                if ($this->data->browser->version->is('<', 3)) {
+                    $this->data->os->name = 'NextStep';
+                    $this->data->os->version = null;
+                }
+
+                if ($this->data->browser->version->is('>=', 4)) {
+                    if (empty($this->data->os->name) || $this->data->os->name != 'OS X') {
+                        $this->data->os->name = 'OS X';
+                        $this->data->os->version = null;
+                    }
+                }
+            }
+        }
+    }
+
+
+    /* Other browsers */
+
+    private function detectDesktopBrowsers($ua)
+    {
+        if (!preg_match('/(WebPositive|WebExplorer|WorldWideweb|Midori|Maxthon|Browse)/ui', $ua)) {
+            return;
+        }
+
+        /* WebPositive */
+
+        if (preg_match('/WebPositive/u', $ua, $match)) {
+            $this->data->browser->name = 'WebPositive';
+            $this->data->browser->channel = '';
+            $this->data->browser->version = null;
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/WebPositive\/([0-9]\.[0-9.]+)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+        }
+
+        /* IBM WebExplorer */
+
+        if (preg_match('/IBM[- ]WebExplorer[ -]?(DLL ?|Window API ?)?/u', $ua)) {
+            $this->data->browser->name = 'IBM WebExplorer';
+            $this->data->browser->channel = '';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/IBM[- ]WebExplorer[ -]?(?:DLL ?|Window API ?)?\/v([0-9]\.[0-9\.]+)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            $this->data->os->name = 'OS/2';
+            $this->data->device->type = 'desktop';
+        }
+
+        /* WorldWideweb */
+
+        if (preg_match('/WorldWideweb \(NEXT\)/u', $ua, $match)) {
+            $this->data->browser->name = 'WorldWideWeb';
+            $this->data->browser->channel = '';
+            $this->data->browser->version = null;
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            $this->data->os->name = 'NextStep';
+            $this->data->device->type = 'desktop';
+        }
+
+        /* Midori */
+
+        if (preg_match('/Midori\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Midori';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            $this->data->device->manufacturer = null;
+            $this->data->device->model = null;
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+
+            if (isset($this->data->os->name) && $this->data->os->name == 'OS X') {
+                $this->data->os->name = null;
+                $this->data->os->version = null;
+            }
+        }
+
+        if (preg_match('/midori(?:\/[0-9.]*)?$/u', $ua)) {
+            $this->data->browser->name = 'Midori';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+
+            if (preg_match('/midori\/([0-9.]*)$/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+        /* Maxthon */
+
+        if (preg_match('/Maxthon/iu', $ua, $match)) {
+            $this->data->browser->name = 'Maxthon';
+            $this->data->browser->channel = '';
+            $this->data->browser->version = null;
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/Maxthon[\/\' ]\(?([0-9.]*)\)?/iu', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+
+            if (isset($this->data->os->name) && $this->data->browser->version && $this->data->os->name == 'Windows' && $this->data->browser->version->toFloat() < 4) {
+                $this->data->browser->version->details = 1;
+            }
+        }
+
+        /* Browse for Remix OS */
+
+        if (preg_match('/^Browse\/([0-9.]+)/u', $ua, $match)) {
+            $this->data->browser->name = 'Browse';
+            $this->data->browser->channel = '';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+    }
+
+    private function detectMobileBrowsers($ua)
+    {
+        if (!preg_match('/(Ninesky|Skyfire|Dolphin|QQ|360|QHBrowser|Mercury|iBrowser|Puffin|MiniB|MxNitro|Sogou|Xiino|Palmscape|WebPro|Vision)/ui', $ua)) {
+            return;
+        }
+
+        /* NineSky */
+
+        if (preg_match('/Ninesky(?:-android-mobile(?:-cn)?)?\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->reset();
+            $this->data->browser->name = 'NineSky';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (isset($this->data->device->manufacturer) && $this->data->device->manufacturer == 'Apple') {
+                $this->data->device->reset();
+            }
+
+            if (!$this->data->os->isFamily('Android')) {
+                $this->data->os->reset();
+                $this->data->os->name = 'Android';
+            }
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+
+        /* Skyfire */
+
+        if (preg_match('/Skyfire\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Skyfire';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            $this->data->os->name = 'Android';
+            $this->data->os->version = null;
+        }
+
+        /* Dolphin HD */
+
+        if (preg_match('/Dolphin(?:HDCN)?\/(?:INT|CN)?-?([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Dolphin';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+
+        /* QQ Browser */
+
+        if (preg_match('/(M?QQBrowser)\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'QQ Browser';
+
+            $version = $match[2];
+            if (preg_match('/^[0-9][0-9]$/u', $version)) {
+                $version = $version[0] . '.' . $version[1];
+            }
+
+            $this->data->browser->version = new Version([ 'value' => $version, 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->channel = '';
+
+            if (!isset($this->data->os->name) && $match[1] == 'QQBrowser') {
+                $this->data->os->name = 'Windows';
+            }
+
+            if (preg_match('/MQQBrowser\/[0-9\.]+\/Adr \(Linux; U; ([0-9\.]+); [^;]+; (.+) Build/u', $ua, $match)) {
+                $this->data->os->reset([
+                    'name'      => 'Android',
+                    'version'   => new Version([ 'value' => $match[1] ])
+                ]);
+
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+                $this->data->device->model = $match[2];
+                $this->data->device->identified |= Constants\Id::PATTERN;
+
+                $device = Data\DeviceModels::identify('android', $match[2]);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if (preg_match('/MQQBrowser\/[0-9\.]+\/WP7 \([^;]+;WPOS:([0-9]\.[0-9])[0-9\.]*;([^;]+); ([^\)]+)\)/u', $ua, $match)) {
+                $this->data->os->reset([
+                    'name'      => 'Windows Phone',
+                    'version'   => new Version([ 'value' => $match[1] ])
+                ]);
+
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+                $this->data->device->manufacturer = $match[2];
+                $this->data->device->model = $match[3];
+                $this->data->device->identified |= Constants\Id::PATTERN;
+
+                $device = Data\DeviceModels::identify('wp', $match[3]);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+        }
+
+        if (preg_match('/MQQBrowser\/Mini([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'QQ Browser Mini';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->channel = '';
+        }
+
+        if (preg_match('/QQ\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'QQ Browser';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->channel = '';
+        }
+
+        /* 360 Phone Browser */
+
+        if (preg_match('/360 (?:Aphone|Android Phone) Browser \((?:Version |V)?([0-9.]*)(?:beta)?\)/u', $ua, $match)) {
+            $this->data->browser->name = 'Qihoo 360 Browser';
+            $this->data->browser->family = null;
+            $this->data->browser->channel = '';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (!$this->data->os->isFamily('Android')) {
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+                $this->data->os->reset([
+                    'name' => 'Android'
+                ]);
+            }
+        }
+
+        if (preg_match('/360%20(?:Browser|Lite)\/([0-9\.]+)/u', $ua, $match)) {
+            $this->data->browser->name = 'Qihoo 360 Browser';
+            $this->data->browser->family = null;
+            $this->data->browser->channel = '';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        if (preg_match('/QHBrowser\/([0-9\.]+)/u', $ua, $match)) {
+            $version = $match[1];
+            if (preg_match('/^[0-9][0-9][0-9]$/u', $version)) {
+                $version = $version[0] . '.' . $version[1] . '.' . $version[2];
+            }
+
+            $this->data->browser->name = 'Qihoo 360 Browser';
+            $this->data->browser->channel = '';
+            $this->data->browser->version = new Version([ 'value' => $version ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (!$this->data->isOs('iOS')) {
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+                $this->data->os->reset([
+                    'name' => 'iOS'
+                ]);
+            }
+        }
+
+        /* Mercury */
+
+        if (preg_match('/(?:^| )Mercury\/([0-9\.]+)/u', $ua, $match)) {
+            $version = $match[1];
+            if (preg_match('/^[0-9][0-9][0-9]$/u', $version)) {
+                $version = $version[0] . '.' . $version[1] . '.' . $version[2];
+            }
+
+            $this->data->browser->name = 'Mercury Browser';
+            $this->data->browser->channel = '';
+            $this->data->browser->version = new Version([ 'value' => $version ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        /* iBrowser */
+
+        if (preg_match('/(?:^| )iBrowser\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'iBrowser';
+
+            $version = $match[1];
+            if (preg_match('/^[0-9][0-9]$/u', $version)) {
+                $version = $version[0] . '.' . $version[1];
+            }
+
+            $this->data->browser->version = new Version([ 'value' => $version, 'details' => 2 ]);
+            $this->data->browser->channel = '';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        if (preg_match('/iBrowser\/Mini([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'iBrowser Mini';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->channel = '';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        /* Puffin */
+
+        if (preg_match('/Puffin\/([0-9.]+)([IA])?([PT])?/u', $ua, $match)) {
+            $this->data->browser->name = 'Puffin';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => (intval(substr(strrchr($match[1], '.'), 1)) > 99 ? -1 : null) ]);
+            $this->data->browser->mode = 'proxy';
+            $this->data->browser->channel = '';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (isset($match[2])) {
+                switch ($match[2]) {
+                    case 'A':
+                        if (!$this->data->isOs('Android')) {
+                            $this->data->os->reset([ 'name' => 'Android' ]);
+                        }
+                        break;
+
+                    case 'I':
+                        if (!$this->data->isOs('iOS')) {
+                            $this->data->os->reset([ 'name' => 'iOS' ]);
+                        }
+                        break;
+                }
+            }
+
+            if (isset($match[3])) {
+                switch ($match[3]) {
+                    case 'P':
+                        $this->data->device->type = Constants\DeviceType::MOBILE;
+                        if ($this->data->os->name == 'iOS' && empty($this->data->device->model)) {
+                            $this->data->device->manufacturer = 'Apple';
+                            $this->data->device->model = 'iPhone';
+                            $this->data->device->identified = Constants\Id::MATCH_UA;
+                        }
+                        break;
+
+                    case 'T':
+                        $this->data->device->type = Constants\DeviceType::TABLET;
+                        if ($this->data->os->name == 'iOS' && empty($this->data->device->model)) {
+                            $this->data->device->manufacturer = 'Apple';
+                            $this->data->device->model = 'iPad';
+                            $this->data->device->identified = Constants\Id::MATCH_UA;
+                        }
+                        break;
+                }
+            }
+        }
+
+        /* MiniBrowser Mobile */
+
+        if (preg_match('/MiniBr?owserM(?:obile)?\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'MiniBrowser';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            if (!$this->data->isOs('Series60')) {
+                $this->data->os->name = 'Series60';
+                $this->data->os->version = null;
+            }
+        }
+
+        /* Maxthon */
+
+        if (preg_match('/MxNitro/iu', $ua, $match)) {
+            $this->data->browser->name = 'Maxthon Nitro';
+            $this->data->browser->channel = '';
+            $this->data->browser->version = null;
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/MxNitro\/([0-9.]*)/iu', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+        }
+
+        /* Sogou Mobile */
+
+        if (preg_match('/SogouAndroidBrowser\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Sogou Mobile';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (isset($this->data->device->manufacturer) && $this->data->device->manufacturer == 'Apple') {
+                unset($this->data->device->manufacturer);
+                unset($this->data->device->model);
+                unset($this->data->device->identifier);
+                $this->data->device->identified = Constants\Id::NONE;
+            }
+        }
+
+        /* Xiino */
+
+        if (preg_match('/Xiino\/([0-9.]+)/u', $ua, $match)) {
+            $this->data->browser->name = 'Xiino';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            $this->data->device->type = Constants\DeviceType::PDA;
+
+            $this->data->os->name = 'Palm OS';
+
+            if (preg_match('/\(v. ([0-9.]+)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+        /* Palmscape */
+
+        if (preg_match('/Palmscape\/(?:PR)?([0-9.]+)/u', $ua, $match)) {
+            $this->data->browser->name = 'Palmscape';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            $this->data->device->type = Constants\DeviceType::PDA;
+
+            $this->data->os->name = 'Palm OS';
+
+            if (preg_match('/\(v. ([0-9.]+)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+        /* Novarra WebPro */
+
+        if (preg_match('/WebPro/u', $ua) && preg_match('/PalmOS/u', $ua)) {
+            $this->data->browser->name = 'WebPro';
+            $this->data->browser->version = null;
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/WebPro\/?([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+        /* Novarra Vision */
+
+        if (preg_match('/(?:Vision-Browser|Novarra-Vision)\/?([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Novarra Vision';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->family = null;
+            $this->data->browser->mode = 'proxy';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if ($this->data->device->type != Constants\DeviceType::MOBILE) {
+                $this->data->os->reset();
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+        }
+    }
+
+    private function detectTelevisionBrowsers($ua)
+    {
+        if (!preg_match('/(Roku|LG Browser|NetCast|SonyBrowserCore|Dream|Planetweb)/ui', $ua)) {
+            return;
+        }
+
+        /* Web on Roku */
+
+        if (preg_match('/Roku/u', $ua) && preg_match('/Web\/([0-9.]+)/u', $ua, $match)) {
+            $this->data->browser->name = 'Web';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+
+        /* LG Browser */
+
+        if (preg_match('/LG Browser\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'LG Browser';
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+        }
+
+        if (preg_match('/NetCast/u', $ua) && preg_match('/SmartTV\//u', $ua)) {
+            unset($this->data->browser->name);
+            unset($this->data->browser->version);
+        }
+
+        /* Sony Browser */
+
+        if (preg_match('/SonyBrowserCore\/([0-9.]*)/u', $ua, $match)) {
+            unset($this->data->browser->name);
+            unset($this->data->browser->version);
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+        }
+
+        /* Dreamkey */
+
+        if (preg_match('/DreamKey\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Dreamkey';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Sega',
+                'model'         =>  'Dreamcast',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::CONSOLE
+            ]);
+        }
+
+        /* Dream Passport */
+
+        if (preg_match('/DreamPassport\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Dream Passport';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Sega',
+                'model'         =>  'Dreamcast',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::CONSOLE
+            ]);
+        }
+
+        /* Planetweb */
+
+        if (preg_match('/Planetweb\/v?([0-9.]*)/u', $ua, $match)) {
+            $this->data->browser->name = 'Planetweb';
+            $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (preg_match('/Dreamcast/u', $ua, $match)) {
+                $this->data->device->setIdentification([
+                    'manufacturer'  =>  'Sega',
+                    'model'         =>  'Dreamcast',
+                    'type'          =>  Constants\DeviceType::GAMING,
+                    'subtype'       =>  Constants\DeviceSubType::CONSOLE
+                ]);
+            }
+
+            if (preg_match('/SPS/u', $ua, $match)) {
+                $this->data->device->setIdentification([
+                    'manufacturer'  =>  'Sony',
+                    'model'         =>  'Playstation 2',
+                    'type'          =>  Constants\DeviceType::GAMING,
+                    'subtype'       =>  Constants\DeviceSubType::CONSOLE
+                ]);
+            }
+        }
+    }
+
+    private function detectRemainingBrowsers($ua)
+    {
+        if ($data = Data\Applications::identifyBrowser($ua)) {
+            $this->data->browser->set($data['browser']);
+
+            if (!empty($data['device'])) {
+                $this->data->device->set($data['device']);
+            }
+        }
+    }
+
+    private function detectWapBrowsers($ua)
+    {
+        if (!preg_match('/(Dorado|MAUI)/ui', $ua, $match)) {
+            return;
+        }
+
+        if (preg_match('/Browser\/Dorado([0-9.]*)/ui', $ua, $match)) {
+            $this->data->browser->name = 'Dorado WAP';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+        }
+
+        if (preg_match('/Dorado WAP-Browser\/([0-9.]*)/ui', $ua, $match)) {
+            $this->data->browser->name = 'Dorado WAP';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+            $this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+        }
+
+        if (preg_match('/MAUI[ _]WAP[ _]Browser(?:\/([0-9.]*))?/ui', $ua, $match)) {
+            $this->data->browser->name = 'MAUI WAP';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            if (isset($match[1])) {
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+            }
+
+        }
+
+        if (preg_match('/WAP Browser\/MAUI/ui', $ua, $match)) {
+            $this->data->browser->name = 'MAUI WAP';
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+        }
+    }
+}

+ 29 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent;
+
+trait Device
+{
+    use Device\Appliance, Device\Cars, Device\Gps, Device\Gaming, Device\Ereader,
+        Device\Mobile, Device\Media, Device\Television, Device\Signage,
+        Device\Printer, Device\Tablet, Device\Phone, Device\Pda;
+
+    private function &detectDevice($ua)
+    {
+        $this->detectAppliance($ua);
+        $this->detectCars($ua);
+        $this->detectGps($ua);
+        $this->detectEreader($ua);
+        $this->detectGaming($ua);
+        $this->detectTelevision($ua);
+        $this->detectSignage($ua);
+        $this->detectMedia($ua);
+        $this->detectPda($ua);
+        $this->detectPrinter($ua);
+        $this->detectTablet($ua);
+        $this->detectPhone($ua);
+        $this->detectMobile($ua);
+
+        return $this;
+    }
+}

+ 31 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Appliance.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent\Device;
+
+use WhichBrowser\Constants;
+
+trait Appliance
+{
+    private function detectAppliance($ua)
+    {
+        $this->detectIOpener($ua);
+    }
+
+
+
+
+
+    /* Netpliance i-Opener */
+
+    private function detectIOpener($ua)
+    {
+        if (preg_match('/I-Opener [0-9.]+; Netpliance/u', $ua)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Netpliance',
+                'model'         =>  'i-Opener',
+                'type'          =>  Constants\DeviceType::DESKTOP
+            ]);
+        }
+    }
+}

+ 35 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Cars.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent\Device;
+
+use WhichBrowser\Constants;
+
+trait Cars
+{
+    private function detectCars($ua)
+    {
+        if (!preg_match('/Car/ui', $ua)) {
+            return;
+        }
+
+        $this->detectTesla($ua);
+    }
+
+
+
+
+
+    /* Tesla S */
+
+    private function detectTesla($ua)
+    {
+        if (preg_match('/QtCarBrowser/u', $ua)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Tesla',
+                'model'         =>  'Model S',
+                'type'          =>  Constants\DeviceType::CAR
+            ]);
+        }
+    }
+}

+ 212 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Ereader.php

@@ -0,0 +1,212 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent\Device;
+
+use WhichBrowser\Constants;
+
+trait Ereader
+{
+    private function detectEreader($ua)
+    {
+        if (!preg_match('/(Kindle|Nook|Bookeen|Kobo|EBRD|PocketBook|Iriver)/ui', $ua)) {
+            return;
+        }
+
+        $this->detectKindle($ua);
+        $this->detectNook($ua);
+        $this->detectBookeen($ua);
+        $this->detectKobo($ua);
+        $this->detectSonyreader($ua);
+        $this->detectPocketbook($ua);
+        $this->detectIriver($ua);
+    }
+
+
+
+
+    /* Amazon Kindle */
+
+    private function detectKindle($ua)
+    {
+        if (preg_match('/Kindle/u', $ua) && !preg_match('/Fire/u', $ua)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Amazon',
+                'series'        =>  'Kindle',
+                'type'          =>  Constants\DeviceType::EREADER
+            ]);
+
+            if (preg_match('/Kindle SkipStone/u', $ua)) {
+                $this->data->device->model = 'Kindle Touch or later';
+            } elseif (preg_match('/Kindle\/3.0\+/u', $ua)) {
+                $this->data->device->model = 'Kindle 3 or later';
+            } elseif (preg_match('/Kindle\/3.0/u', $ua)) {
+                $this->data->device->model = 'Kindle 3';
+            } elseif (preg_match('/Kindle\/2.5/u', $ua)) {
+                $this->data->device->model = 'Kindle 2';
+            } elseif (preg_match('/Kindle\/2.0/u', $ua)) {
+                $this->data->device->model = 'Kindle 2';
+            } elseif (preg_match('/Kindle\/1.0/u', $ua)) {
+                $this->data->device->model = 'Kindle 1';
+            }
+
+            if (!empty($this->data->device->model)) {
+                $this->data->device->generic = false;
+                $this->data->device->series = null;
+            }
+        }
+    }
+
+
+    /* Barnes & Noble Nook */
+
+    private function detectNook($ua)
+    {
+        if (preg_match('/nook browser/u', $ua)) {
+            $this->data->os->reset([ 'name' => 'Android' ]);
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Barnes & Noble',
+                'series'        =>  'NOOK',
+                'type'          =>  Constants\DeviceType::EREADER
+            ]);
+        }
+    }
+
+
+    /* Bookeen */
+
+    private function detectBookeen($ua)
+    {
+        if (preg_match('/bookeen\/cybook/u', $ua)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Bookeen',
+                'series'        =>  'Cybook',
+                'type'          =>  Constants\DeviceType::EREADER
+            ]);
+        }
+    }
+
+
+    /* Kobo */
+
+    private function detectKobo($ua)
+    {
+        if (preg_match('/Kobo (eReader|Touch)/u', $ua, $match)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Kobo',
+                'series'        =>  'eReader',
+                'type'          =>  Constants\DeviceType::EREADER
+            ]);
+        }
+    }
+
+
+    /* Sony Reader */
+
+    private function detectSonyreader($ua)
+    {
+        if (preg_match('/EBRD([0-9]+)/u', $ua, $match)) {
+            $model = null;
+
+            switch ($match[1]) {
+                case '1101':
+                    $model = 'PRS-T1';
+                    break;
+                case '1102':
+                    $model = 'PRS-G1';
+                    break;
+                case '1201':
+                    $model = 'PRS-T2';
+                    break;
+                case '1301':
+                    $model = 'PRS-T3';
+                    break;
+            }
+
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Sony',
+                'model'         =>  $model,
+                'series'        =>  'Reader',
+                'type'          =>  Constants\DeviceType::EREADER
+            ]);
+
+        }
+    }
+
+
+    /* PocketBook */
+
+    private function detectPocketbook($ua)
+    {
+        if (preg_match('/PocketBook\/([0-9]+)/u', $ua, $match)) {
+            $model = null;
+
+            switch ($match[1]) {
+                case '515':
+                    $model = 'Mini';
+                    break;
+                case '614':
+                    $model = 'Basic 2';
+                    break;
+                case '622':
+                    $model = 'Touch';
+                    break;
+                case '623':
+                    $model = 'Touch Lux';
+                    break;
+                case '624':
+                    $model = 'Basic Touch';
+                    break;
+                case '626':
+                    $model = 'Touch Lux 2';
+                    break;
+                case '630':
+                    $model = 'Sense';
+                    break;
+                case '640':
+                    $model = 'Aqua';
+                    break;
+                case '650':
+                    $model = 'Ultra';
+                    break;
+                case '801':
+                    $model = 'Color Lux';
+                    break;
+                case '840':
+                    $model = 'InkPad';
+                    break;
+            }
+
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'PocketBook',
+                'model'         =>  $model,
+                'type'          =>  Constants\DeviceType::EREADER
+            ]);
+        }
+    }
+
+
+    /* iRiver */
+
+    private function detectIriver($ua)
+    {
+        if (preg_match('/Iriver ;/u', $ua)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'iRiver',
+                'series'        =>  'Story',
+                'type'          =>  Constants\DeviceType::EREADER
+            ]);
+
+            if (preg_match('/EB07/u', $ua)) {
+                $this->data->device->model = 'Story HD EB07';
+                $this->data->device->series = null;
+                $this->data->device->generic = false;
+            }
+        }
+    }
+}

+ 267 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Gaming.php

@@ -0,0 +1,267 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent\Device;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Model\Version;
+
+trait Gaming
+{
+    private function detectGaming($ua)
+    {
+        if (!preg_match('/(Nintendo|Nitro|PlayStation|PS[0-9]|Sega|Dreamcast|Xbox)/ui', $ua)) {
+            return;
+        }
+
+        $this->detectNintendo($ua);
+        $this->detectPlaystation($ua);
+        $this->detectXbox($ua);
+        $this->detectSega($ua);
+    }
+
+
+
+
+
+    /* Nintendo Wii and DS */
+
+    private function detectNintendo($ua)
+    {
+        /* Wii */
+
+        if (preg_match('/Nintendo Wii/u', $ua)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Nintendo',
+                'model'         =>  'Wii',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::CONSOLE
+            ]);
+        }
+
+        /* Wii U */
+
+        if (preg_match('/Nintendo Wii ?U/u', $ua)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Nintendo',
+                'model'         =>  'Wii U',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::CONSOLE
+            ]);
+        }
+
+        /* DS */
+
+        if (preg_match('/Nintendo DS/u', $ua) || preg_match('/Nitro.*Opera/u', $ua)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Nintendo',
+                'model'         =>  'DS',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::PORTABLE
+            ]);
+        }
+
+        /* DSi */
+
+        if (preg_match('/Nintendo DSi/u', $ua)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Nintendo',
+                'model'         =>  'DSi',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::PORTABLE
+            ]);
+        }
+
+        /* 3DS */
+
+        if (preg_match('/Nintendo 3DS/u', $ua)) {
+            $this->data->os->reset();
+            $this->data->os->identifyVersion('/Version\/([0-9.]*[0-9])/u', $ua);
+
+            $this->data->engine->set([
+                'name'          => 'WebKit'
+            ]);
+
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Nintendo',
+                'model'         =>  '3DS',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::PORTABLE
+            ]);
+        }
+
+        /* New 3DS */
+
+        if (preg_match('/New Nintendo 3DS/u', $ua)) {
+            $this->data->os->reset();
+            $this->data->os->identifyVersion('/Version\/([0-9.]*[0-9])/u', $ua);
+
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Nintendo',
+                'model'         =>  'New 3DS',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::PORTABLE
+            ]);
+        }
+    }
+
+
+    /* Sony PlayStation */
+
+    private function detectPlaystation($ua)
+    {
+        /* PlayStation Portable */
+
+        if (preg_match('/PlayStation Portable/u', $ua)) {
+            $this->data->os->reset();
+
+            $this->data->engine->set([
+                'name'          => 'NetFront'
+            ]);
+
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Sony',
+                'model'         =>  'Playstation Portable',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::PORTABLE
+            ]);
+        }
+
+        /* PlayStation Vita */
+
+        if (preg_match('/PlayStation Vita/iu', $ua)) {
+            $this->data->os->reset();
+            $this->data->os->identifyVersion('/PlayStation Vita ([0-9.]*)/u', $ua);
+
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Sony',
+                'model'         =>  'Playstation Vita',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::PORTABLE
+            ]);
+
+            if (preg_match('/VTE\//u', $ua)) {
+                $this->data->device->model = 'Playstation TV';
+                $this->data->device->subtype = Constants\DeviceSubType::CONSOLE;
+            }
+        }
+
+        /* PlayStation 2 */
+
+        if (preg_match('/Playstation2/u', $ua) || preg_match('/\(PS2/u', $ua)) {
+            $this->data->os->reset();
+
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Sony',
+                'model'         =>  'Playstation 2',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::CONSOLE
+            ]);
+        }
+
+        /* PlayStation 3 */
+
+        if (preg_match('/PlayStation 3/ui', $ua) || preg_match('/\(PS3/u', $ua)) {
+            $this->data->os->reset();
+            $this->data->os->identifyVersion('/PLAYSTATION 3;? ([0-9.]*)/u', $ua);
+
+            if (preg_match('/PLAYSTATION 3; [123]/', $ua)) {
+                $this->data->engine->set([
+                    'name'          => 'NetFront'
+                ]);
+            }
+
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Sony',
+                'model'         =>  'Playstation 3',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::CONSOLE
+            ]);
+        }
+
+        /* PlayStation 4 */
+
+        if (preg_match('/PlayStation 4/ui', $ua)) {
+            $this->data->os->reset();
+            $this->data->os->identifyVersion('/PlayStation 4 ([0-9.]*)/u', $ua);
+
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Sony',
+                'model'         =>  'Playstation 4',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::CONSOLE
+            ]);
+        }
+    }
+
+
+    /* Microsoft Xbox */
+
+    private function detectXbox($ua)
+    {
+        /* Xbox 360 */
+
+        if (preg_match('/Xbox\)$/u', $ua, $match)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Microsoft',
+                'model'         =>  'Xbox 360',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::CONSOLE
+            ]);
+        }
+
+        /* Xbox One */
+
+        if (preg_match('/Xbox One\)/u', $ua, $match)) {
+            if ($this->data->isOs('Windows Phone', '=', '10')) {
+                $this->data->os->name = 'Windows';
+                $this->data->os->version->alias = '10';
+            }
+
+            if (!$this->data->isOs('Windows', '=', '10')) {
+                $this->data->os->reset();
+            }
+
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Microsoft',
+                'model'         =>  'Xbox One',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::CONSOLE
+            ]);
+        }
+    }
+
+
+    /* Sega */
+
+    private function detectSega($ua)
+    {
+        /* Sega Saturn */
+
+        if (preg_match('/SEGASATURN/u', $ua, $match)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Sega',
+                'model'         =>  'Saturn',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::CONSOLE
+            ]);
+        }
+
+        /* Sega Dreamcast */
+
+        if (preg_match('/Dreamcast/u', $ua, $match)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Sega',
+                'model'         =>  'Dreamcast',
+                'type'          =>  Constants\DeviceType::GAMING,
+                'subtype'       =>  Constants\DeviceSubType::CONSOLE
+            ]);
+        }
+    }
+}

+ 34 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Gps.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent\Device;
+
+use WhichBrowser\Constants;
+
+trait Gps
+{
+    private function detectGps($ua)
+    {
+        if (!preg_match('/Nuvi/ui', $ua)) {
+            return;
+        }
+        
+        $this->detectGarmin($ua);
+    }
+
+
+
+
+
+    /* Garmin Nuvi */
+
+    private function detectGarmin($ua)
+    {
+        if (preg_match('/Nuvi/u', $ua) && preg_match('/Qtopia/u', $ua)) {
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Garmin',
+                'model'         =>  'Nuvi',
+                'type'          =>  Constants\DeviceType::GPS
+            ]);
+        }
+    }
+}

+ 119 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Media.php

@@ -0,0 +1,119 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent\Device;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Model\Version;
+
+trait Media
+{
+    private function detectMedia($ua)
+    {
+        if (!preg_match('/(Archos|Zune|Walkman)/ui', $ua)) {
+            return;
+        }
+
+        $this->detectArchos($ua);
+        $this->detectZune($ua);
+        $this->detectWalkman($ua);
+    }
+
+
+
+
+    /* Archos Generation 4, 5 and 6 */
+
+    private function detectArchos($ua)
+    {
+        /* Generation 4 */
+
+        if (preg_match('/Archos A([67]04)WIFI\//u', $ua, $match)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Archos',
+                'model'         =>  $match[1] . ' WiFi',
+                'type'          =>  Constants\DeviceType::MEDIA
+            ]);
+        }
+
+        /* Generation 5 */
+
+        if (preg_match('/ARCHOS; GOGI; a([67]05f?);/u', $ua, $match)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Archos',
+                'model'         =>  $match[1] . ' WiFi',
+                'type'          =>  Constants\DeviceType::MEDIA
+            ]);
+        }
+
+        /* Generation 6 without Android */
+
+        if (preg_match('/ARCHOS; GOGI; G6-?(S|H|L|3GP);/u', $ua, $match)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Archos',
+                'type'          =>  Constants\DeviceType::MEDIA
+            ]);
+
+            switch ($match[1]) {
+                case '3GP':
+                    $this->data->device->model = '5 3G+';
+                    break;
+                case 'S':
+                case 'H':
+                    $this->data->device->model = '5';
+                    break;
+                case 'L':
+                    $this->data->device->model = '7';
+                    break;
+            }
+        }
+
+        /* Generation 6 with Android */
+
+        if (preg_match('/ARCHOS; GOGI; A5[SH]; Version ([0-9]\.[0-9])/u', $ua, $match)) {
+            $version = new Version([ 'value' => $match[1] ]);
+
+            $this->data->os->reset([
+                'name'          => 'Android',
+                'version'       => new Version([ 'value' => $version->is('<', '1.7') ? '1.5' : '1.6' ])
+            ]);
+
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Archos',
+                'model'         =>  '5',
+                'type'          =>  Constants\DeviceType::MEDIA
+            ]);
+        }
+    }
+
+
+    /* Microsoft Zune */
+
+    private function detectZune($ua)
+    {
+        if (preg_match('/Microsoft ZuneHD/u', $ua)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Microsoft',
+                'model'         =>  'Zune HD',
+                'type'          =>  Constants\DeviceType::MEDIA
+            ]);
+        }
+    }
+
+
+    /* Sony Walkman */
+
+    private function detectWalkman($ua)
+    {
+        if (preg_match('/Walkman\/(NW-[A-Z0-9]+)/u', $ua, $match)) {
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Sony',
+                'model'         =>  $match[1] . ' Walkman',
+                'type'          =>  Constants\DeviceType::MEDIA
+            ]);
+        }
+    }
+}

+ 1280 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Mobile.php

@@ -0,0 +1,1280 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent\Device;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Data;
+use WhichBrowser\Model\Family;
+use WhichBrowser\Model\Version;
+
+trait Mobile
+{
+    private function detectMobile($ua)
+    {
+        /* Detect the type based on some common markers */
+        $this->detectGenericMobile($ua);
+
+        /* Look for specific manufacturers and models */
+        $this->detectKin($ua);
+        $this->detectNokia($ua);
+        $this->detectSamsung($ua);
+
+        /* Try to parse some generic methods to store device information */
+        $this->detectGenericMobileModels($ua);
+        $this->detectJapaneseMobileModels($ua);
+
+        /* Try to find the model names based on id */
+        $this->detectGenericMobileLocations($ua);
+    }
+
+
+
+
+
+
+    /* Generic markers */
+
+    private function detectGenericMobile($ua)
+    {
+        if (preg_match('/(MIDP|CLDC|UNTRUSTED\/|3gpp-gba|[Ww][Aa][Pp]2.0|[Ww][Aa][Pp][ _-]?[Bb]rowser)/u', $ua)) {
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+    }
+
+
+    /* Microsoft KIN */
+
+    private function detectKin($ua)
+    {
+        if (preg_match('/KIN\.(One|Two) ([0-9.]*)/ui', $ua, $match)) {
+            $this->data->os->name = 'Kin OS';
+            $this->data->os->version = new Version([ 'value' => $match[2], 'details' => 2 ]);
+
+            switch ($match[1]) {
+                case 'One':
+                    $this->data->device->manufacturer = 'Microsoft';
+                    $this->data->device->model = 'Kin ONE';
+                    $this->data->device->identified |= Constants\Id::MATCH_UA;
+                    $this->data->device->generic = false;
+                    break;
+
+                case 'Two':
+                    $this->data->device->manufacturer = 'Microsoft';
+                    $this->data->device->model = 'Kin TWO';
+                    $this->data->device->identified |= Constants\Id::MATCH_UA;
+                    $this->data->device->generic = false;
+                    break;
+            }
+        }
+    }
+
+
+    /* Nokia */
+
+    private function detectNokia($ua)
+    {
+        if (isset($this->data->device->manufacturer)) {
+            return;
+        }
+
+        if (preg_match('/Nokia[- \/]?([^\/\);]+)/ui', $ua, $match)) {
+
+            if ($match[1] == 'Browser') {
+                return;
+            }
+
+            $this->data->device->manufacturer = 'Nokia';
+            $this->data->device->model = Data\DeviceModels::cleanup($match[1]);
+            $this->data->device->identifier = $match[0];
+            $this->data->device->identified |= Constants\Id::PATTERN;
+            $this->data->device->generic = false;
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            if (!($this->data->device->identified & Constants\Id::MATCH_UA)) {
+                $device = Data\DeviceModels::identify('asha', $this->data->device->model);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+
+                    if (!isset($this->data->os->name) || $this->data->os->name != 'Nokia Asha Platform') {
+                        $this->data->os->name = 'Nokia Asha Platform';
+                        $this->data->os->version = new Version([ 'value' => '1.0' ]);
+
+                        if (preg_match('/java_runtime_version=Nokia_Asha_([0-9_]+)[;\)]/u', $ua, $match)) {
+                            $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]) ]);
+                        }
+                    }
+                }
+            }
+
+            if (!($this->data->device->identified & Constants\Id::MATCH_UA)) {
+                $device = Data\DeviceModels::identify('s40', $this->data->device->model);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+
+                    if (!isset($this->data->os->name) || $this->data->os->name != 'Series40') {
+                        $this->data->os->name = 'Series40';
+                        $this->data->os->version = null;
+                    }
+                }
+            }
+
+            if (!($this->data->device->identified & Constants\Id::MATCH_UA)) {
+                $device = Data\DeviceModels::identify('symbian', $this->data->device->model);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+
+                    if (!isset($this->data->os->name) || $this->data->os->name != 'Series60') {
+                        $this->data->os->name = 'Series60';
+                        $this->data->os->version = null;
+                        $this->data->os->family = new Family([ 'name' => 'Symbian' ]);
+                    }
+                }
+            }
+
+            $this->identifyBasedOnIdentifier();
+        }
+    }
+
+
+    /* Samsung */
+
+    private function detectSamsung($ua)
+    {
+        if (isset($this->data->device->manufacturer)) {
+            return;
+        }
+
+        if (preg_match('/(?:SAMSUNG; )?SAMSUNG ?[-\/]?([^;\/\)_,]+)/ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'Samsung';
+            $this->data->device->model = Data\DeviceModels::cleanup($match[1]);
+            $this->data->device->identifier = $match[0];
+            $this->data->device->identified |= Constants\Id::PATTERN;
+            $this->data->device->generic = false;
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            if ($this->data->isOS('Bada')) {
+                $device = Data\DeviceModels::identify('bada', $this->data->device->model);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if ($this->data->isOS('Series60')) {
+                $device = Data\DeviceModels::identify('symbian', $this->data->device->model);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if (!$this->data->os->isDetected()) {
+                if (preg_match('/Jasmine\/([0-9.]*)/u', $ua, $match)) {
+                    $version = $match[1];
+
+                    $device = Data\DeviceModels::identify('touchwiz', $this->data->device->model);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                        $this->data->os->name = 'Touchwiz';
+
+                        switch ($version) {
+                            case '0.8':
+                                $this->data->os->version = new Version([ 'value' => '1.0' ]);
+                                break;
+                            case '1.0':
+                                $this->data->os->version = new Version([ 'value' => '2.0', 'alias' => '2.0 or earlier' ]);
+                                break;
+                        }
+                    }
+                }
+
+                if (preg_match('/(?:Dolfin\/([0-9.]*)|Browser\/Dolfin([0-9.]*))/u', $ua, $match)) {
+                    $version = !empty($match[1]) ? $match[1] : $match[2];
+
+                    $device = Data\DeviceModels::identify('bada', $this->data->device->model);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                        $this->data->os->name = 'Bada';
+
+                        switch ($version) {
+                            case '2.0':
+                                $this->data->os->version = new Version([ 'value' => '1.0' ]);
+                                break;
+                            case '2.2':
+                                $this->data->os->version = new Version([ 'value' => '1.2' ]);
+                                break;
+                        }
+                    } else {
+                        $device = Data\DeviceModels::identify('touchwiz', $this->data->device->model);
+                        if ($device->identified) {
+                            $device->identified |= $this->data->device->identified;
+                            $this->data->device = $device;
+                            $this->data->os->name = 'Touchwiz';
+
+                            switch ($version) {
+                                case '1.0':
+                                    $this->data->os->version = new Version([ 'value' => '2.0', 'alias' => '2.0 or earlier' ]);
+                                    break;
+                                case '1.5':
+                                    $this->data->os->version = new Version([ 'value' => '2.0' ]);
+                                    break;
+                                case '2.0':
+                                    $this->data->os->version = new Version([ 'value' => '3.0' ]);
+                                    break;
+                            }
+                        }
+                    }
+                }
+            }
+
+            $this->identifyBasedOnIdentifier();
+        }
+    }
+
+
+    /* Generic models */
+
+    private function detectGenericMobileModels($ua)
+    {
+        if ($this->data->device->identified & Constants\Id::PATTERN) {
+            return;
+        }
+
+        if (isset($this->data->device->manufacturer)) {
+            return;
+        }
+
+        if (!preg_match('/(T-Mobile|Danger|HPiPAQ|Acer|Amoi|AIRNESS|ASUS|BenQ|maui|ALCATEL|Bird|COOLPAD|CELKON|Coship|Cricket|DESAY|Diamond|dopod|Ericsson|FLY|GIONEE|Haier|HIKe|Hisense|HS|HTC|T[0-9]{4,4}|HUAWEI|Karbonn|KWC|KONKA|KTOUCH|K-Touch|Lenovo|Lephone|LG|Micromax|MOT|Nexian|NEC|NGM|OPPO|Panasonic|Pantech|Philips|Sagem|Sanyo|Sam|SEC|SGH|SCH|SIE|Sony|SE|SHARP|Spice|Tecno|T-smart|TCL|Tiphone|Toshiba|UTStar|Videocon|vk|Vodafone|Xiaomi|ZTE|WAP)/ui', $ua)) {
+            return;
+        }
+
+        $this->data->device->identifyModel('/T-Mobile[_ ]([^\/;]+)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'T-Mobile'
+        ]);
+
+        $this->data->device->identifyModel('/Danger hiptop ([0-9.]+)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Danger',
+            'model'         => 'Hiptop'
+        ]);
+
+        $this->data->device->identifyModel('/HP(iPAQ[0-9A-Za-z]+)\//u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'HP'
+        ]);
+
+        $this->data->device->identifyModel('/Acer[_-]?([^\s\/_]*)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Acer'
+        ]);
+
+        $this->data->device->identifyModel('/Amoi[ -]([^\s\/_]*)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Amoi'
+        ]);
+
+        $this->data->device->identifyModel('/AIRNESS-([^\/]*)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Airness'
+        ]);
+
+        $this->data->device->identifyModel('/ASUS-([^\/]*)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Asus'
+        ]);
+
+        $this->data->device->identifyModel('/BenQ[ -]([^\/]*)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'BenQ'
+        ]);
+
+        $this->data->device->identifyModel('/ maui ([a-z0-9]+)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'BenQ',
+            'model'         => function ($model) {
+                return 'Maui ' . strtoupper($model);
+            }
+        ]);
+
+        $this->data->device->identifyModel('/ALCATEL[_-]([^\/]*)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Alcatel',
+            'model'         => function ($model) {
+                if (preg_match('/^TRIBE ([^\s]+)/ui', $model, $match)) {
+                    $model = 'One Touch Tribe ' . $match[1];
+                } elseif (preg_match('/^ONE TOUCH ([^\s]*)/ui', $model, $match)) {
+                    $model = 'One Touch ' . $match[1];
+                } elseif (preg_match('/^OT[-\s]*([^\s]*)/ui', $model, $match)) {
+                    $model = 'One Touch ' . $match[1];
+                }
+
+                return $model;
+            }
+        ]);
+
+        $this->data->device->identifyModel('/Bird[ _\-\.]([^\/]*)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Bird'
+        ]);
+
+        $this->data->device->identifyModel('/(?:YL-|YuLong-)?COOLPAD([^\s]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Coolpad'
+        ]);
+
+        $this->data->device->identifyModel('/CELKON\.([^\s]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Celkon'
+        ]);
+
+        $this->data->device->identifyModel('/Coship ([^\s]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Coship'
+        ]);
+
+        $this->data->device->identifyModel('/Cricket-([^\s]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Cricket'
+        ]);
+
+        $this->data->device->identifyModel('/DESAY[ _]([^\s]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'DESAY'
+        ]);
+
+        $this->data->device->identifyModel('/Diamond_([^\s]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Diamond'
+        ]);
+
+        $this->data->device->identifyModel('/dopod[-_]?([^\s]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Dopod'
+        ]);
+
+        $this->data->device->identifyModel('/^Ericsson([^\/]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Ericsson'
+        ]);
+
+        $this->data->device->identifyModel('/^(R[0-9]{3,3}) [0-9\.]+ WAP/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Ericsson'
+        ]);
+
+        $this->data->device->identifyModel('/FLY_]?([^\s\/]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Fly'
+        ]);
+
+        $this->data->device->identifyModel('/GIONEE[-_ ]([^\s\/;]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Gionee'
+        ]);
+
+        $this->data->device->identifyModel('/GIONEE([A-Z0-9]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Gionee'
+        ]);
+
+        $this->data->device->identifyModel('/HIKe_([^\s]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'HIKe'
+        ]);
+
+        $this->data->device->identifyModel('/HAIER-([A-Z][0-9]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Haier'
+        ]);
+
+        $this->data->device->identifyModel('/Hisense[ -](?:HS-)?([^\s]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Hisense'
+        ]);
+
+        $this->data->device->identifyModel('/HS-([^\s]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Hisense'
+        ]);
+
+        $this->data->device->identifyModel('/HTC[\s_-]?([^\s\/\(\);][^\/\(\);]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'HTC'
+        ]);
+
+        $this->data->device->identifyModel('/(?:HTC_)?([A-Z0-9_]+_T[0-9]{4,4})/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'HTC'
+        ]);
+
+        $this->data->device->identifyModel('/HUAWEI[\s_-]?([^\/\)\()]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Huawei'
+        ]);
+
+        $this->data->device->identifyModel('/Karbonn ([a-z0-9]+(?: ?Star| ?Plus|\+)?)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Karbonn'
+        ]);
+
+        $this->data->device->identifyModel('/KWC-([^\s\/]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Kyocera'
+        ]);
+
+        $this->data->device->identifyModel('/KONKA[-_]?([^\s]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Konka'
+        ]);
+
+        $this->data->device->identifyModel('/TIANYU-KTOUCH\/([^\/]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'K-Touch'
+        ]);
+
+        $this->data->device->identifyModel('/K-Touch_?([^\/]*)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'K-Touch'
+        ]);
+
+        $this->data->device->identifyModel('/Lenovo[_-]?([^\/]*)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Lenovo'
+        ]);
+
+        $this->data->device->identifyModel('/Lephone_([^\/]*)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Lephone'
+        ]);
+
+        $this->data->device->identifyModel('/LGE?([A-Z]{2,2}[0-9]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'LG'
+        ]);
+
+        $this->data->device->identifyModel('/LGE?(?:\/|-|_)([^\s\)\-\[\/]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'LG'
+        ]);
+
+        $this->data->device->identifyModel('/LGE? ?([A-Z]*[0-9]+[A-Z]?)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'LG'
+        ]);
+
+        $this->data->device->identifyModel('/Micromax([^\)]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Micromax'
+        ]);
+
+        $this->data->device->identifyModel('/^MOTO-?([^\/_]+)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Motorola'
+        ]);
+
+        $this->data->device->identifyModel('/MOT-([^\/_\.]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Motorola'
+        ]);
+
+        $this->data->device->identifyModel('/Motorola-([^\s]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Motorola',
+            'model'         => function ($model) {
+                return strtoupper($model);
+            }
+        ]);
+
+        $this->data->device->identifyModel('/Motorola[_ ]([^\/_;]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Motorola'
+        ]);
+
+        $this->data->device->identifyModel('/Moto([^\/\s_;r][^\/\s_;]*)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Motorola'
+        ]);
+
+        $this->data->device->identifyModel('/Nexian([^\/_]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Nexian'
+        ]);
+
+        $this->data->device->identifyModel('/NEC-([^\/_]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'NEC'
+        ]);
+
+        $this->data->device->identifyModel('/NGM_([^\/_]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'NGM'
+        ]);
+
+        $this->data->device->identifyModel('/OPPO_([^\/_]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Oppo'
+        ]);
+
+        $this->data->device->identifyModel('/Panasonic-([^\/_]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Panasonic'
+        ]);
+
+        $this->data->device->identifyModel('/Pantech[-_]?([^\/_]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Pantech'
+        ]);
+
+        $this->data->device->identifyModel('/Philips ?([A-Z]?[0-9@]+[a-z]?)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Philips'
+        ]);
+
+        $this->data->device->identifyModel('/PHILIPS-([a-zA-Z0-9@]+(?: [0-9]+)?)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Philips',
+            'model'         => function ($model) {
+                if (preg_match('/Az@lis([0-9]{3,3})/ui', $model, $match)) {
+                    return 'Az@lis ' . $match[1];
+                }
+
+                if (preg_match('/Fisio ?([0-9]{3,3})/ui', $model, $match)) {
+                    return 'Fisio ' . $match[1];
+                }
+
+                return $model;
+            }
+        ]);
+
+        $this->data->device->identifyModel('/SAGEM-([A-Z0-9\-]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Sagem'
+        ]);
+
+        $this->data->device->identifyModel('/Sanyo-([A-Z0-9]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Sanyo'
+        ]);
+
+        $this->data->device->identifyModel('/sam-([A-Z][0-9]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Samsung'
+        ]);
+
+        $this->data->device->identifyModel('/SEC-(SGH[A-Z][0-9]+)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Samsung',
+            'model'         => function ($model) {
+                return str_replace('SGH', 'SGH-', $model);
+            }
+        ]);
+
+        $this->data->device->identifyModel('/((?:SGH|SCH)-[A-Z][0-9]+)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Samsung'
+        ]);
+
+        $this->data->device->identifyModel('/(GT-[A-Z][0-9]+[A-Z]?)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Samsung'
+        ]);
+
+        $this->data->device->identifyModel('/(?:Siemens |SIE-)([A-Z]+[0-9]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Siemens'
+        ]);
+
+        $this->data->device->identifyModel('/SIE-([0-9]{4,4}|[A-Z]{4,4})/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Siemens'
+        ]);
+
+        $this->data->device->identifyModel('/Sony ([A-Z0-9\-]+)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Sony'
+        ]);
+
+        $this->data->device->identifyModel('/SE([A-Z][0-9]+[a-z])/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Sony Ericsson'
+        ]);
+
+        $this->data->device->identifyModel('/sony-ericsson ([A-Z][0-9]+[a-z])/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Sony Ericsson'
+        ]);
+
+        $this->data->device->identifyModel('/SonyE?ricsson ?([^\/\);]+)/iu', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Sony Ericsson',
+            'model'         => function ($model) {
+                if (preg_match('/^([A-Z]) ([0-9]+)$/u', $model, $match)) {
+                    $model = $match[1] . $match[2];
+                }
+
+                if (preg_match('/^[a-z][0-9]+/u', $model)) {
+                    $model[0] = strtoupper($model[0]);
+                }
+
+                return $model;
+            }
+        ]);
+
+        $this->data->device->identifyModel('/SHARP[-_\/]([^\/\;]*)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Sharp'
+        ]);
+
+        $this->data->device->identifyModel('/Spice\s([^\s]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Spice'
+        ]);
+
+        $this->data->device->identifyModel('/Spice\s?([A-Z][0-9]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Spice'
+        ]);
+
+        $this->data->device->identifyModel('/Tecno([^\/]*)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Tecno'
+        ]);
+
+        $this->data->device->identifyModel('/T-smart_([^\/]*)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'T-smart'
+        ]);
+
+        $this->data->device->identifyModel('/TCL[-_ ]([^\/\;\)]*)/ui', $ua, [
+            'manufacturer'  => 'TCL'
+        ]);
+
+        $this->data->device->identifyModel('/Tiphone ([^\/]*)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'TiPhone'
+        ]);
+
+        $this->data->device->identifyModel('/Toshiba[-\/]([^\/-]*)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Toshiba'
+        ]);
+
+        $this->data->device->identifyModel('/UTStar(?:com)?-([^\s\.\/;]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'UTStarcom'
+        ]);
+
+
+        $this->data->device->identifyModel('/vk-(vk[0-9]+)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'VK Mobile',
+            'model'         => function ($model) {
+                return strtoupper($model);
+            }
+        ]);
+
+        $this->data->device->identifyModel('/Videocon[-_ \/]([A-Z0-9\.]+)/iu', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Videocon'
+        ]);
+
+        $this->data->device->identifyModel('/Vodafone(?:[ _-]Chat)?[ _-]?([0-9]+)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Vodafone'
+        ]);
+
+        $this->data->device->identifyModel('/Vodafone\/[0-9.]+\/(v[0-9]+)[^\/]*\//u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Vodafone'
+        ]);
+
+        $this->data->device->identifyModel('/Xiaomi[_]?([^\s]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'Xiaomi'
+        ]);
+
+
+        $this->data->device->identifyModel('/ZTE[-_\s]?([^\s\/\(\);,]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'manufacturer'  => 'ZTE',
+            'model'         => function ($model) {
+                return preg_match('/[A-Z]+[0-9]+/iu', $model) ? strtoupper($model) : $model;
+            }
+        ]);
+
+        $this->identifyBasedOnIdentifier();
+    }
+
+
+    /* Japanese models */
+
+    private function detectJapaneseMobileModels($ua)
+    {
+        if (isset($this->data->device->manufacturer)) {
+            return;
+        }
+
+        if ($this->data->os->isFamily('Android')) {
+            return;
+        }
+
+        /* Sometimes DoCoMo UA strings are (partially) encoded */
+
+        if (preg_match('/^DoCoMo/u', $ua)) {
+            $ua = preg_replace_callback(
+                "#\\\x([0-9A-Fa-f]{2})#",
+                function ($m) {
+                    return chr(hexdec($m[1]));
+                },
+                $ua
+            );
+        }
+
+        /* First identify it based on id */
+
+        $model = null;
+        $manufacturer = null;
+        $carrier = null;
+        $falsepositive = false;
+
+        $ids = [
+            'CA'    => 'Casio',
+            'DL'    => 'Dell',
+            'ER'    => 'Ericsson',
+            'HT'    => 'HTC',
+            'HW'    => 'Huawei',
+            'IA'    => 'Inventec',
+            'JR'    => 'JRC',
+            'KO'    => 'Kokusai',
+            'LC'    => 'Longcheer',
+            'NK'    => 'Nokia',
+            'NM'    => 'Nokia',
+            'KE'    => 'KES',
+            'SA'    => 'Sanyo',
+            'SC'    => 'Samsung',
+            'SS'    => 'Samsung',
+            'SH'    => 'Sharp',
+            'SE'    => 'Sony Ericsson',
+            'SO'    => 'Sony',
+            'ZT'    => 'ZTE',
+            'F'     => 'Fujitsu',
+            'D'     => 'Mitsubishi',
+            'J'     => 'JRC',
+            'K'     => 'Kyocera',
+            'L'     => 'LG',
+            'M'     => 'Motorola',
+            'N'     => 'NEC',
+            'P'     => 'Panasonic',
+            'R'     => 'JRC',
+            'T'     => 'Toshiba',
+            'Z'     => 'ZTE',
+        ];
+
+        if (preg_match('/(?:^|[\s\/\-\(;])((' . implode('|', array_keys($ids)) . ')[0-9]{3,3}[a-z]+[A-Z]*)/u', $ua, $match)) {
+            $model = $match[1];
+            $manufacturer = $match[2];
+            $carrier = 'DoCoMo';
+        }
+
+        if (preg_match('/(?:; |\()((' . implode('|', array_keys($ids)) . ')[0-9]{2,2}[A-Z][0-9]?)[\);]/u', $ua, $match)) {
+            $model = $match[1];
+            $manufacturer = $match[2];
+            $carrier = 'DoCoMo';
+        }
+
+        if (preg_match('/DoCoMo\/[0-9].0 ((' . implode('|', array_keys($ids)) . ')[0-9]{2,2}[A-Z][0-9]?)(?:\s?\(|$)/u', $ua, $match)) {
+            $model = $match[1];
+            $manufacturer = $match[2];
+            $carrier = 'DoCoMo';
+        }
+
+        if (preg_match('/DoCoMo\/[0-9].0[\/\s](?:MST_v_)?((' . implode('|', array_keys($ids)) . ')[1-9][0-9]{3,3}[A-Z]?)/u', $ua, $match)) {
+            $model = $match[1];
+            $manufacturer = $match[2];
+            $carrier = 'DoCoMo';
+        }
+
+        if (preg_match('/[\/\(]([SHW][0-9]{2,2}(' . implode('|', array_keys($ids)) . '))[\/;]/u', $ua, $match)) {
+            $model = $match[1];
+            $manufacturer = $match[2];
+            $carrier = 'EMOBILE';
+        }
+
+        if (preg_match('/\) ([SHW][0-9]{2,2}(' . implode('|', array_keys($ids)) . '))$/u', $ua, $match)) {
+            $model = $match[1];
+            $manufacturer = $match[2];
+            $carrier = 'EMOBILE';
+        }
+
+        if (preg_match('/[\s\/\-\(;](J-(' . implode('|', array_keys($ids)) . ')[0-9]{2,2})/u', $ua, $match)) {
+            $model = $match[1];
+            $manufacturer = $match[2];
+            $carrier = 'Softbank';
+        }
+
+        if (preg_match('/(?:^|; |\/)([0-9]{3,3}(' . implode('|', array_keys($ids)) . '))[eps]?[\/\)]/u', $ua, $match)) {
+            $model = $match[1];
+            $manufacturer = $match[2];
+            $carrier = 'Softbank';
+        }
+
+        if (preg_match('/\(([0-9]{3,3}(' . implode('|', array_keys($ids)) . ')[eps]?);SoftBank/u', $ua, $match)) {
+            $model = $match[1];
+            $manufacturer = $match[2];
+            $carrier = 'Softbank';
+        }
+
+        if (preg_match('/(?:^|[\s\/\(;])((V|DM|W|WS|WX)[0-9]{2,3}(' . implode('|', array_keys($ids)) . '))/u', $ua, $match)) {
+            $model = $match[1];
+            $manufacturer = $match[3];
+
+            switch ($match[2]) {
+                case 'V':
+                    $carrier = 'Softbank';
+                    break;
+                case 'DM':
+                    $carrier = 'Disney Mobile';
+                    break;
+                case 'W':
+                case 'WS':
+                case 'WX':
+                    $carrier = 'Willcom';
+                    break;
+            }
+        }
+
+        if (preg_match('/(AH-(' . implode('|', array_keys($ids)) . ')[1-9][0-9]{3,3}[A-Z]?)/u', $ua, $match)) {
+            $model = $match[1];
+            $manufacturer = $match[2];
+            $carrier = 'Willcom';
+        }
+
+        if (in_array($model, [ '360SE' ])) {
+            $falsepositive = true;
+        }
+
+        if (!$falsepositive && !empty($model) && !empty($manufacturer)) {
+            $this->data->device->reset([
+                'type'      => Constants\DeviceType::MOBILE,
+                'model'     => $model,
+                'carrier'   => $carrier
+            ]);
+
+            if (array_key_exists($manufacturer, $ids)) {
+                $this->data->device->manufacturer = $ids[$manufacturer];
+            }
+
+            $this->data->device->identified |= Constants\Id::PATTERN;
+
+            /* Set flags for MOAP */
+
+            switch ($model) {
+                case 'F06B':
+                case 'F07B':
+                case 'F08B':
+                case 'SH07B':
+                    $this->data->os->reset([ 'family' => new Family([ 'name' => 'Symbian' ]) ]);
+                    $this->data->device->flag = Constants\Flag::MOAPS;
+                    break;
+            }
+
+            return;
+        }
+
+        /* Then KDDI model number */
+
+        $ids = [
+            'CA'    => 'Casio',
+            'DE'    => 'Denso',
+            'PT'    => 'Pantech',
+            'SA'    => 'Sanyo',
+            'ST'    => 'Sanyo',
+            'SH'    => 'Sharp',
+            'H'     => 'Hitachi',
+            'K'     => 'Kyocera',
+            'P'     => 'Panasonic',
+            'S'     => 'Sony Ericsson',
+            'T'     => 'Toshiba'
+        ];
+
+        if (preg_match('/(?:^|KDDI-)(W[0-9]{2,2}(' . implode('|', array_keys($ids)) . '))[;\)\s\/]/u', $ua, $match)) {
+            $model = $match[1];
+            $manufacturer = $match[2];
+
+            $this->data->device->reset([
+                'type'      => Constants\DeviceType::MOBILE,
+                'model'     => $model,
+                'carrier'   => 'au'
+            ]);
+
+            if (array_key_exists($manufacturer, $ids)) {
+                $this->data->device->manufacturer = $ids[$manufacturer];
+            }
+
+            $this->data->device->identified |= Constants\Id::PATTERN;
+            return;
+        }
+
+        /* Then identify it based on KDDI id */
+
+        $ids = [
+            'CA'    => 'Casio',
+            'DN'    => 'Denso',
+            'ER'    => 'Ericsson',
+            'FJ'    => 'Fujitsu',
+            'HI'    => 'Hitachi',
+            'KC'    => 'Kyocera',
+            'MA'    => 'Panasonic',
+            'MI'    => 'Mitsubishi',
+            'PT'    => 'Pantech',
+            'SA'    => 'Sanyo',
+            'ST'    => 'Sanyo',
+            'SY'    => 'Sanyo',
+            'SH'    => 'Sharp',
+            'SN'    => 'Sony Ericsson',
+            'TS'    => 'Toshiba'
+        ];
+
+        if (preg_match('/(?:^|KDDI-|UP\. ?Browser\/[0-9\.]+-|; )((' . implode('|', array_keys($ids)) . ')(?:[0-9][0-9]|[A-Z][0-9]|[0-9][A-Z]))($|[;\)\s])/ui', $ua, $match)) {
+            $model = strtoupper($match[1]);
+            $manufacturer = strtoupper($match[2]);
+            $falsepositive = false;
+
+            if (in_array($model, [ 'MAM2', 'MAM3' ])) {
+                $falsepositive = true;
+            }
+
+            if (!$falsepositive) {
+                $this->data->device->reset([
+                    'type'      => Constants\DeviceType::MOBILE,
+                    'model'     => $model,
+                    'carrier'   => 'au'
+                ]);
+
+                if (array_key_exists($manufacturer, $ids)) {
+                    $this->data->device->manufacturer = $ids[$manufacturer];
+
+                    $device = Data\DeviceModels::identify('kddi', $model);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $device->carrier = 'au';
+                        $this->data->device = $device;
+                    }
+                }
+
+                $this->data->device->identified |= Constants\Id::PATTERN;
+                return;
+            }
+        }
+
+
+        /* Finally identify it based on carrier */
+
+        $this->data->device->identifyModel('/\(([A-Z]+[0-9]+[A-Z])[^;]*; ?FOMA/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'carrier'       => 'DoCoMo'
+        ]);
+
+        $this->data->device->identifyModel('/\(FOMA ([^;]+)+;/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'carrier'       => 'DoCoMo'
+        ]);
+
+        $this->data->device->identifyModel('/DoCoMo\/[0-9].0[\/\s]([0-9A-Z]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'carrier'       => 'DoCoMo'
+        ]);
+
+        $this->data->device->identifyModel('/NTTDoCoMo ([0-9A-Z]+)/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'carrier'       => 'DoCoMo'
+        ]);
+
+        $this->data->device->identifyModel('/J-PHONE\/[^\/]+\/([^\/_]+)/u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'carrier'       => 'Softbank'
+        ]);
+
+        $this->data->device->identifyModel('/SoftBank\/[^\/]+\/([^\/]+)\//u', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'carrier'       => 'Softbank'
+        ]);
+
+        $this->data->device->identifyModel('/Vodafone\/[0-9.]+\/V([0-9]+[A-Z]+)[^\/]*\//ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'carrier'       => 'Softbank'
+        ]);
+
+        $this->data->device->identifyModel('/(KDDI-[^\s\)\.;]{4,})/ui', $ua, [
+            'type'          => Constants\DeviceType::MOBILE,
+            'carrier'       => 'au'
+        ]);
+
+
+        if (!empty($this->data->device->model)) {
+            $this->identifyBasedOnId($this->data->device->model);
+        }
+    }
+
+
+
+    /* Device models not identified by a prefix */
+
+    private function detectGenericMobileLocations($ua)
+    {
+        if ($this->data->device->identified & Constants\Id::PATTERN) {
+            return;
+        }
+
+        $candidates = [];
+
+        if (preg_match('/^([a-z0-9\.\_\+\/ ]+)_TD\//iu', $ua, $match)) {
+            array_push($candidates, $match[1]);
+        }
+
+        if (preg_match('/^([a-z0-9\_]+)/iu', $ua, $match)) {
+            array_push($candidates, $match[1]);
+        }
+
+        if (preg_match('/[; ]\(?([^\s\)\/;]+)[^\s;]*$/u', $ua, $match)) {
+            array_push($candidates, $match[1]);
+        }
+
+        if (preg_match('/^([^\/\)]+)/u', $ua, $match)) {
+            array_push($candidates, $match[1]);
+        }
+
+        if (preg_match('/MobilePhone ([^\/\)]+)/u', $ua, $match)) {
+            array_push($candidates, $match[1]);
+        }
+
+        $candidates = array_diff($candidates, [
+            'Mobile', 'Safari', 'Version', 'GoogleTV', 'WebKit', 'NetFront',
+            'Microsoft', 'ZuneWP7', 'Firefox', 'UCBrowser', 'IEMobile', 'Touch',
+            'Fennec', 'Minimo', 'Gecko', 'TizenBrowser', 'Browser', 'sdk',
+            'Mini', 'Fennec', 'Darwin', 'Puffin', 'Tanggula', 'Edge',
+            'QHBrowser', 'BonEcho', 'Iceweasel', 'Midori', 'BeOS', 'UBrowser',
+            'SeaMonkey', 'Model', 'Silk-Accelerated=true', 'Configuration',
+            'UNTRUSTED', 'OSRE', 'Dolfin', 'Surf', 'Epiphany', 'Konqueror',
+            'Presto', 'OWB', 'PmWFx', 'Netscape', 'Netscape6', 'Navigator',
+            'Opera', 'Mozilla', 'BrightSign', 'Motorola', 'UCWEB',
+            'NativeOperaMini', 'OperaMini', 'SogouMobileBrowser', 'iLunascape',
+            'Sleipnir', 'MobileSafari', 'MQQBrowser', 'BREW', '?',
+            'Maxthon', '360%20Browser', 'OPR', 'CFNetwork', 'JUC', 'Skyfire',
+            'UP.Browser', 'DolphinHDCN', 'NintendoBrowser', 'NCSA',
+            'NCSA Mosaic', 'NCSA_Mosaic', 'U', 'NetFrontNX', 'QtWebKit',
+            'HtmlRenderer', 'HbbTV', 'WebAppManager', 'SmartTV', 'UPLUSTVBROWSER',
+            'LG Browser', 'LG', 'LGSmartTV', 'OBIGO-T10', 'Linux', 'DLNADOC',
+            'Aplix_SANYO_browser', 'Japanese', 'WebBrowser', 'Freetime',
+            'OreganMediaBrowser', 'NETRANGEMMH', 'http:', 'bxapi', 'Kodi',
+            'XBMC', 'KreaTVWebKit', 'MachBlue', 'Espial', 'TouchPad',
+            'sharp', 'sharp wd browser', 'sharp pda browser', 'browser',
+            'Palmscape', 'CorePlayer', 'Xiino', 'SONY', 'WorldTALK', 'TOPS',
+            'Windows', 'Microsoft Pocket Internet Explorer', 'Explorer',
+            'CE', 'Desktop', 'Maemo Browser', 'Maemo', 'baidubrowser',
+            'Mercury', 'BREW-Applet', 'ucweb-squid', 'iSurf', '3gpp-gba',
+            'InfoPath.2', 'UC', 'J2ME', 'IUC', 'AveFront', 'MMP', 'BaiduHD',
+            '360%20Lite', '360', 'AppleWebKit', 'Instagram', 'FBOP',
+            'Nuanti', 'NuantiMeta', 'Silk', 'VTE', 'DreamKey', 'DreamPassport',
+            'Aplix_SEGASATURN_browser', 'NWF', 'Bunjalloo', 'libwww',
+            'Inferno', 'NEXT', 'I', 'Microsoft Internet Explorer', 'MAM3',
+            'MAM2', '360SE', 'Ziepod', 'Vista', 'XP', 'Links', 'Syllable',
+            'sun4m', 'sun4c', 'sun4u', 'i86pc', 'X11', 'NaenaraBrowser',
+            'QuickTime', 'IBM', 'QQBrowser', 'x86_64', 'i686', 'i386', 'Chrome',
+            'TenFourFox', 'Swing', 'NetFrontBrowserNX', 'Mac_PowerPC',
+            'NetCast.TV-2012', 'NetCast.TV-2011', 'NetCast.Media-2011',
+            'PaleMoon', 'Fedora', 'SUSE', 'iCab', 'Googlebot', 'Pixi',
+            'Pre', 'ELinks', 'developer', 'beta', 'BingPreview', 'IBrowse', '+http:'
+        ]);
+
+        $candidates = array_unique($candidates);
+
+        foreach ($candidates as $i => $id) {
+            if (preg_match('/^[0-9\.]+$/u', $id)) {
+                unset($candidates[$i]);
+                continue;
+            }
+
+            if (preg_match('/^[0-9]+[xX][0-9]+$/u', $id)) {
+                unset($candidates[$i]);
+                continue;
+            }
+
+            if (preg_match('/^\[?[a-z]{2,2}(\-[a-z]{2,2})?\]?$/ui', $id)) {
+                unset($candidates[$i]);
+                continue;
+            }
+
+            if (strlen($id) < 4) {
+                unset($candidates[$i]);
+                continue;
+            }
+        }
+
+        foreach ($candidates as $i => $id) {
+            $this->identifyBasedOnIdUsingOs($id);
+
+            if ($this->data->device->identified & Constants\Id::MATCH_UA) {
+                return;
+            }
+        }
+    }
+
+    function identifyBasedOnIdentifier()
+    {
+        if ($this->data->device->identified & Constants\Id::MATCH_UA) {
+            return;
+        }
+
+        $ids = [];
+
+        if (!empty($this->data->device->identifier)) {
+            $ids[] = $this->data->device->identifier;
+        }
+
+        if (!empty($this->data->device->model)) {
+            $ids[] = $this->data->device->model;
+        }
+
+        foreach ($ids as $i => $id) {
+            $this->identifyBasedOnIdUsingOs($id);
+
+            if ($this->data->device->identified & Constants\Id::MATCH_UA) {
+                return;
+            }
+        }
+
+        foreach ($ids as $i => $id) {
+            $this->identifyBasedOnId($id);
+
+            if ($this->data->device->identified & Constants\Id::MATCH_UA) {
+                return;
+            }
+        }
+    }
+
+    function identifyBasedOnIdUsingOs($id)
+    {
+        switch ($this->data->os->getFamily()) {
+
+            case 'Android':
+                $device = Data\DeviceModels::identify('android', $id);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+                break;
+
+            case 'Brew':
+                $device = Data\DeviceModels::identify('brew', $id);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+                break;
+
+            case 'Symbian':
+                $device = Data\DeviceModels::identify('symbian', $id);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+                break;
+
+            case 'Windows':
+            case 'Windows CE':
+            case 'Windows Mobile':
+                $device = Data\DeviceModels::identify('wm', $id);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+
+                    if (!$this->data->isOs('Windows Mobile')) {
+                        $this->data->os->reset([
+                            'name' => 'Windows Mobile'
+                        ]);
+                    }
+                }
+                break;
+
+            default:
+                $device = Data\DeviceModels::identify('feature', $id);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+                break;
+        }
+    }
+
+    function identifyBasedOnId($id)
+    {
+        if ($this->data->device->type != 'mobile') {
+            return;
+        }
+
+        if (!($this->data->device->identified & Constants\Id::MATCH_UA)) {
+            $device = Data\DeviceModels::identify('brew', $id);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+
+                if (!in_array($this->data->os->name, [ 'Brew', 'Brew MP' ])) {
+                    $this->data->os->name = 'Brew';
+                }
+            }
+        }
+
+        if (!($this->data->device->identified & Constants\Id::MATCH_UA)) {
+            $device = Data\DeviceModels::identify('bada', $id);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+                $this->data->os->name = 'Bada';
+            }
+        }
+
+        if (!($this->data->device->identified & Constants\Id::MATCH_UA)) {
+            $device = Data\DeviceModels::identify('touchwiz', $id);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+                $this->data->os->name = 'Touchwiz';
+            }
+        }
+
+        if (!($this->data->device->identified & Constants\Id::MATCH_UA)) {
+            $device = Data\DeviceModels::identify('symbian', $id);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+                $this->data->os->reset([
+                    'family' => new Family([ 'name' => 'Symbian' ])
+                ]);
+            }
+        }
+
+        if (!($this->data->device->identified & Constants\Id::MATCH_UA)) {
+            $device = Data\DeviceModels::identify('wm', $id);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+                $this->data->os->name = 'Windows Mobile';
+            }
+        }
+
+        if (!($this->data->device->identified & Constants\Id::MATCH_UA)) {
+            $device = Data\DeviceModels::identify('feature', $id);
+            if ($device->identified) {
+                $device->identified |= $this->data->device->identified;
+                $this->data->device = $device;
+            }
+        }
+    }
+}

+ 290 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Pda.php

@@ -0,0 +1,290 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent\Device;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Data;
+use WhichBrowser\Model\Family;
+use WhichBrowser\Model\Version;
+
+trait Pda
+{
+    private function detectPda($ua)
+    {
+        if (!preg_match('/(CASIO|Palm|Psion|pdQ|COM|airboard|sharp|pda|POCKET-E|OASYS|NTT\/PI)/ui', $ua)) {
+            return;
+        }
+
+        $this->detectCasio($ua);
+        $this->detectPalm($ua);
+        $this->detectPsion($ua);
+        $this->detectSonyMylo($ua);
+        $this->detectSonyAirboard($ua);
+        $this->detectSharpZaurus($ua);
+        $this->detectSharpShoin($ua);
+        $this->detectPanasonicPocketE($ua);
+        $this->detectFujitsuOasys($ua);
+        $this->detectNttPetitWeb($ua);
+    }
+
+
+
+
+
+    /* Casio */
+
+    private function detectCasio($ua)
+    {
+        if (preg_match('/Product\=CASIO\/([^\);]+)[\);]/ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'Casio';
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->type = Constants\DeviceType::PDA;
+
+            if ($match[1] == 'CASSIOPEIA BE') {
+                $this->data->device->model = 'Cassiopeia';
+            }
+
+            if ($match[1] == 'PPP101') {
+                $this->data->device->model = 'Pocket PostPet';
+                $this->data->device->carrier = 'DoCoMo';
+            }
+        }
+    }
+
+
+    /* Palm */
+
+    private function detectPalm($ua)
+    {
+        if (preg_match('/PalmOS/iu', $ua, $match)) {
+            $this->data->os->name = 'Palm OS';
+            $this->data->device->type = Constants\DeviceType::PDA;
+
+            if (preg_match('/PalmOS ([0-9.]*)/iu', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if (preg_match('/; ([^;)]+)\)/u', $ua, $match)) {
+                $device = Data\DeviceModels::identify('palmos', $match[1]);
+
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if (preg_match('/PalmOS\/([a-z]+)\/model ([^\/]+)\//iu', $ua, $match)) {
+                $device = Data\DeviceModels::identify('palmos', $match[1] . '-' . $match[2]);
+
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+        }
+
+        if (preg_match('/Palm OS ([0-9.]*)/iu', $ua, $match)) {
+            $this->data->os->name = 'Palm OS';
+            $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            $this->data->device->type = Constants\DeviceType::PDA;
+        }
+
+        if (preg_match('/PalmSource/u', $ua, $match)) {
+            $this->data->os->name = 'Palm OS';
+            $this->data->os->version = null;
+            $this->data->device->type = Constants\DeviceType::PDA;
+
+            if (preg_match('/PalmSource\/([^;]+)/u', $ua, $match)) {
+                $this->data->device->model = $match[1];
+                $this->data->device->identified = Constants\Id::PATTERN;
+            }
+
+            if (isset($this->data->device->model) && $this->data->device->model) {
+                $device = Data\DeviceModels::identify('palmos', $this->data->device->model);
+
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+        }
+
+        /* Some model markers */
+
+        if (preg_match('/PalmPilot Pro/ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'Palm';
+            $this->data->device->model = 'Pilot Professional';
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+
+        if (preg_match('/pdQbrowser/ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'Kyocera';
+            $this->data->device->model = 'QCP-6035';
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+    }
+
+
+    /* PSION */
+
+    private function detectPsion($ua)
+    {
+        if (preg_match('/Psion Cpw\//iu', $ua, $match)) {
+            $this->data->browser->name = 'WAP Browser';
+            $this->data->browser->version = null;
+            $this->data->browser->type = Constants\BrowserType::BROWSER;
+
+            $this->data->os->name = 'EPOC';
+            $this->data->os->family = new Family([ 'name' => 'Symbian' ]);
+
+            $this->data->device->manufacturer = 'Psion';
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->type = Constants\DeviceType::PDA;
+
+            if (preg_match('/\(([A-Z0-9]+)\)/u', $ua, $match)) {
+                switch ($match[1]) {
+                    case 'S5':
+                        $this->data->device->model = 'Series 5mx';
+                        break;
+                    case 'S7':
+                        $this->data->device->model = 'Series 7';
+                        break;
+                    case 'RV':
+                        $this->data->device->model = 'Revo';
+                        break;
+                }
+            }
+        }
+    }
+
+
+    /* Sony Mylo */
+
+    private function detectSonyMylo($ua)
+    {
+        if (preg_match('/SONY\/COM([0-9])/ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'Sony';
+            $this->data->device->model = 'Mylo ' . $match[1];
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->type = Constants\DeviceType::PDA;
+
+            $this->data->os->reset();
+
+            if (preg_match('/Qt embedded/ui', $ua, $match)) {
+                $this->data->os->name = 'Qtopia';
+            }
+        }
+    }
+
+
+    /* Sony Airboard */
+
+    private function detectSonyAirboard($ua)
+    {
+        if (preg_match('/SONY\/airboard\/IDT-([A-Z0-9]+)/ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'Sony';
+            $this->data->device->model = 'Airboard ' . $match[1];
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->type = Constants\DeviceType::PDA;
+        }
+
+        if (preg_match('/LocationFreeTV; Airboard\/(LF-[A-Z0-9]+)/ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'Sony';
+            $this->data->device->model = 'Airboard ' . $match[1];
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->type = Constants\DeviceType::PDA;
+        }
+    }
+
+
+    /* Sharp Zaurus */
+
+    private function detectSharpZaurus($ua)
+    {
+        if (preg_match('/sharp pda browser\/([0-9\.]+)/ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'Sharp';
+            $this->data->device->model = 'Zaurus';
+            $this->data->device->type = Constants\DeviceType::PDA;
+
+            if (preg_match('/\(([A-Z0-9\-]+)\/[0-9\.]+\)/ui', $ua, $match)) {
+                $this->data->device->model = 'Zaurus ' . $match[1];
+                $this->data->device->identified |= Constants\Id::MATCH_UA;
+                $this->data->device->generic = false;
+            }
+        }
+
+        if (preg_match('/\(PDA; (SL-[A-Z][0-9]+)\/[0-9\.]/ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'Sharp';
+            $this->data->device->model = 'Zaurus ' . $match[1];
+            $this->data->device->type = Constants\DeviceType::PDA;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+    }
+
+
+    /* Sharp Shoin (Word Processor) */
+
+    private function detectSharpShoin($ua)
+    {
+        if (preg_match('/sharp wd browser\/([0-9\.]+)/ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'Sharp';
+            $this->data->device->model = 'Mobile Shoin';
+            $this->data->device->type = Constants\DeviceType::PDA;
+
+            if (preg_match('/\(([A-Z0-9\-]+)\/[0-9\.]+\)/ui', $ua, $match)) {
+                $this->data->device->model = 'Mobile Shoin ' . $match[1];
+                $this->data->device->identified |= Constants\Id::MATCH_UA;
+                $this->data->device->generic = false;
+            }
+        }
+    }
+
+
+    /* Panasonic POCKET・E */
+
+    private function detectPanasonicPocketE($ua)
+    {
+        if (preg_match('/Product\=Panasonic\/POCKET-E/ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'Panasonic';
+            $this->data->device->model = 'POCKET・E';
+            $this->data->device->type = Constants\DeviceType::PDA;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+    }
+
+
+    /* Fujitsu OASYS */
+
+    private function detectFujitsuOasys($ua)
+    {
+        if (preg_match('/Fujitsu; OASYS/ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'Fujitsu';
+            $this->data->device->model = 'OASYS';
+            $this->data->device->type = Constants\DeviceType::PDA;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+
+            if (preg_match('/eNavigator/ui', $ua, $match)) {
+                $this->data->browser->name = 'eNavigator';
+                $this->data->browser->version = null;
+                $this->data->browser->type = Constants\BrowserType::BROWSER;
+            }
+        }
+    }
+
+
+    /* PetitWeb */
+
+    private function detectNttPetitWeb($ua)
+    {
+        if (preg_match('/Product\=NTT\/(PI-[0-9]+)/ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'NTT';
+            $this->data->device->model = 'PetitWeb ' . $match[1];
+            $this->data->device->type = Constants\DeviceType::PDA;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+    }
+}

+ 32 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Phone.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent\Device;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Data;
+use WhichBrowser\Model\Version;
+
+trait Phone
+{
+    private function detectPhone($ua)
+    {
+        $this->detectNttTeless($ua);
+    }
+
+
+
+
+
+    /* Casio */
+
+    private function detectNttTeless($ua)
+    {
+        if (preg_match('/Product\=NTT\/Teless/ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'NTT';
+            $this->data->device->model = 'Teless';
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+            $this->data->device->subtype = Constants\DeviceSubType::DESKTOP;
+        }
+    }
+}

+ 46 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Printer.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent\Device;
+
+use WhichBrowser\Constants;
+
+trait Printer
+{
+    private function detectPrinter($ua)
+    {
+        if (!preg_match('/(TASKalfa|CanonIJCL|PrintSmart)/ui', $ua)) {
+            return;
+        }
+
+        /* TASKalfa */
+
+        if (preg_match('/TASKalfa ([0-9A-Z]+)/iu', $ua, $match)) {
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Kyocera',
+                'model'         =>  'TASKalfa ' . $match[1],
+                'type'          =>  Constants\DeviceType::PRINTER
+            ]);
+        }
+
+
+        /* Canon IJ */
+
+        if (preg_match('/CanonIJCL/iu', $ua, $match)) {
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'Canon',
+                'model'         =>  'IJ Printer',
+                'type'          =>  Constants\DeviceType::PRINTER
+            ]);
+        }
+
+        /* HP Web PrintSmart */
+
+        if (preg_match('/HP Web PrintSmart/iu', $ua, $match)) {
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'HP',
+                'model'         =>  'Web PrintSmart',
+                'type'          =>  Constants\DeviceType::PRINTER
+            ]);
+        }
+    }
+}

+ 41 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Signage.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent\Device;
+
+use WhichBrowser\Constants;
+
+trait Signage
+{
+    private function detectSignage($ua)
+    {
+        if (!preg_match('/(BrightSign|ADAPI)/ui', $ua)) {
+            return;
+        }
+
+        /* BrightSign */
+
+        if (preg_match('/BrightSign\/[0-9\.]+(?:-[a-z0-9\-]+)? \(([^\)]+)/u', $ua, $match)) {
+            $this->data->os->reset();
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'BrightSign',
+                'model'         =>  $match[1],
+                'type'          =>  Constants\DeviceType::SIGNAGE
+            ]);
+        }
+
+
+        /* Iadea */
+
+        if (preg_match('/ADAPI/u', $ua) && preg_match('/\(MODEL:([^\)]+)\)/u', $ua, $match)) {
+            if (!$this->data->isOs('Android')) {
+                $this->data->os->reset();
+            }
+
+            $this->data->device->setIdentification([
+                'manufacturer'  =>  'IAdea',
+                'model'         =>  $match[1],
+                'type'          =>  Constants\DeviceType::SIGNAGE
+            ]);
+        }
+    }
+}

+ 37 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Tablet.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent\Device;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Data;
+use WhichBrowser\Model\Version;
+
+trait Tablet
+{
+    private function detectTablet($ua)
+    {
+        $this->detectWebTab($ua);
+    }
+
+
+
+
+
+    /* WeTab */
+
+    private function detectWebTab($ua)
+    {
+        if (preg_match('/WeTab-Browser /ui', $ua, $match)) {
+            $this->data->device->manufacturer = 'WeTab';
+            $this->data->device->model = 'WeTab';
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->type = Constants\DeviceType::TABLET;
+
+            $this->data->browser->name = 'WebTab Browser';
+            $this->data->browser->version = null;
+
+            $this->data->os->name = 'MeeGo';
+            $this->data->os->version = null;
+        }
+    }
+}

+ 1168 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Device/Television.php

@@ -0,0 +1,1168 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent\Device;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Data;
+
+trait Television
+{
+    private function detectTelevision($ua)
+    {
+        /* Detect the type based on some common markers */
+        $this->detectGenericTelevision($ua);
+
+        /* Try to parse some generic methods to store device information */
+        $this->detectGenericTelevisionModels($ua);
+        $this->detectGenericInettvBrowser($ua);
+        $this->detectGenericHbbTV($ua);
+
+        /* Look for specific manufacturers and models */
+        $this->detectPanasonicTelevision($ua);
+        $this->detectSharpTelevision($ua);
+        $this->detectSamsungTelevision($ua);
+        $this->detectSonyTelevision($ua);
+        $this->detectPhilipsTelevision($ua);
+        $this->detectLgTelevision($ua);
+        $this->detectToshibaTelevision($ua);
+        $this->detectSanyoTelevision($ua);
+
+        /* Try to detect set top boxes from various manufacturers */
+        $this->detectSettopboxes($ua);
+
+        /* Improve model names */
+        $this->improveModelsOnDeviceTypeTelevision();
+    }
+
+
+
+
+
+    /* Generic markers */
+
+    private function detectGenericTelevision($ua)
+    {
+        if (preg_match('/CE-HTML/u', $ua)) {
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+        }
+
+        if (preg_match('/SmartTvA\//u', $ua)) {
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+        }
+
+        if (preg_match('/NETRANGEMMH/u', $ua)) {
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+        }
+    }
+
+
+    /* Toshiba */
+
+    private function detectToshibaTelevision($ua)
+    {
+        if (preg_match('/Toshiba_?TP\//u', $ua) || preg_match('/TSBNetTV ?\//u', $ua)) {
+            $this->data->device->manufacturer = 'Toshiba';
+            $this->data->device->series = 'Smart TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+
+        if (preg_match('/TOSHIBA;[^;]+;([A-Z]+[0-9]+[A-Z]+);/u', $ua, $match)) {
+            $this->data->device->manufacturer = 'Toshiba';
+            $this->data->device->model = $match[1];
+            $this->data->device->series = 'Smart TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+    }
+
+
+    /* LG */
+
+    private function detectLgTelevision($ua)
+    {
+        if (preg_match('/(LGSmartTV|LG smartTV)/u', $ua)) {
+            $this->data->device->manufacturer = 'LG';
+            $this->data->device->series = 'Smart TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+
+        if (preg_match('/UPLUSTVBROWSER/u', $ua)) {
+            $this->data->device->manufacturer = 'LG';
+            $this->data->device->series = 'U+ tv';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+
+
+        /* NetCast */
+
+        if (preg_match('/LG NetCast\.(TV|Media)-([0-9]*)/u', $ua, $match)) {
+            $this->data->device->manufacturer = 'LG';
+            $this->data->device->series = 'NetCast ' . $match[1] . ' ' . $match[2];
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (preg_match('/LG Browser\/[0-9.]+\([^;]+; LGE; ([^;]+);/u', $ua, $match)) {
+                if (substr($match[1], 0, 6) != 'GLOBAL' && substr($match[1], 0, 7) != 'NETCAST') {
+                    $this->data->device->model = $match[1];
+                }
+            }
+        }
+
+        /* NetCast */
+
+        if ($ua == "Mozilla/5.0 (X11; Linux; ko-KR) AppleWebKit/534.26+ (KHTML, like Gecko) Version/5.0 Safari/534.26+" ||
+            $ua == "Mozilla/5.0 (DirectFB; Linux; ko-KR) AppleWebKit/534.26 (KHTML, like Gecko) Version/5.0 Safari/534.26" ||
+            $ua == "Mozilla/5.0 (DirectFB; Linux; ko-KR) AppleWebKit/534.26+ (KHTML, like Gecko) Version/5.0 Safari/534.26+") {
+            $this->data->device->manufacturer = 'LG';
+            $this->data->device->series = 'NetCast TV 2012';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+
+
+        /* NetCast or WebOS */
+
+        if (preg_match('/NetCast/u', $ua) && preg_match('/SmartTV\/([0-9])/u', $ua, $match)) {
+            $this->data->device->manufacturer = 'LG';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (intval($match[1]) < 5) {
+                $this->data->device->series = 'NetCast TV';
+            } else {
+                $this->data->device->series = 'webOS TV';
+                
+                $this->data->os->reset([
+                    'name'   => 'webOS',
+                    'hidden' => true
+                ]);
+            }
+        }
+
+        /* WebOS */
+
+        if (preg_match('/Web[O0]S/u', $ua) && preg_match('/Large Screen/u', $ua)) {
+            $this->data->device->manufacturer = 'LG';
+            $this->data->device->series = 'webOS TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            $this->data->os->reset([
+                'name'   => 'webOS',
+                'hidden' => true
+            ]);
+        }
+
+        if (preg_match('/Web[O0]S; Linux\/SmartTV/u', $ua)) {
+            $this->data->device->manufacturer = 'LG';
+            $this->data->device->series = 'webOS TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            $this->data->os->reset([
+                'name'   => 'webOS',
+                'hidden' => true
+            ]);
+        }
+
+        if (preg_match('/webOS\.TV-([0-9]+)/u', $ua, $match)) {
+            $this->data->device->manufacturer = 'LG';
+            $this->data->device->series = 'webOS TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (preg_match('/LG Browser\/[0-9.]+\(LGE; ([^;]+);/u', $ua, $match)) {
+                if (strtoupper(substr($match[1], 0, 5)) != 'WEBOS') {
+                    $this->data->device->model = $match[1];
+                }
+            }
+
+            $this->data->os->reset([
+                'name'   => 'webOS',
+                'hidden' => true
+            ]);
+        }
+
+        if (preg_match('/PBRM\//u', $ua)) {
+            $this->data->browser->name = "Pro:Centric";
+            $this->data->browser->version = null;
+
+            $this->data->device->manufacturer = 'LG';
+            $this->data->device->series = 'webOS TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (preg_match('/PBRM\/[0-9.]+ \( ;LGE ;([^;]+) ;/u', $ua, $match)) {
+                if (strtoupper(substr($match[1], 0, 5)) != 'WEBOS') {
+                    $this->data->device->model = $match[1];
+                }
+            }
+
+            $this->data->os->reset([
+                'name'   => 'webOS',
+                'hidden' => true
+            ]);
+        }
+    }
+
+
+    /* Philips */
+
+    private function detectPhilipsTelevision($ua)
+    {
+        if (preg_match('/NETTV\//u', $ua)) {
+            $this->data->device->manufacturer = 'Philips';
+            $this->data->device->series = 'Net TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (preg_match('/AquosTV/u', $ua)) {
+                $this->data->device->manufacturer = 'Sharp';
+                $this->data->device->series = 'Aquos TV';
+            }
+
+            if (preg_match('/BANGOLUFSEN/u', $ua)) {
+                $this->data->device->manufacturer = 'Bang & Olufsen';
+                $this->data->device->series = 'Smart TV';
+            }
+
+            if (preg_match('/PHILIPS-AVM/u', $ua)) {
+                $this->data->device->series = 'Blu-ray Player';
+            }
+        }
+
+        if (preg_match('/PHILIPS_OLS_20[0-9]+/u', $ua)) {
+            $this->data->device->manufacturer = 'Philips';
+            $this->data->device->series = 'Net TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+    }
+
+
+    /* Sony */
+
+    private function detectSonyTelevision($ua)
+    {
+        if (preg_match('/SonyCEBrowser/u', $ua)) {
+            $this->data->device->manufacturer = 'Sony';
+            $this->data->device->series = 'Smart TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (preg_match('/SonyCEBrowser\/[0-9.]+ \((?:BDPlayer; |DTV[0-9]+\/)?([^;_]+)/u', $ua, $match)) {
+                if ($match[1] != 'ModelName') {
+                    $this->data->device->model = $match[1];
+                }
+            }
+        }
+
+        if (preg_match('/SonyDTV/u', $ua)) {
+            $this->data->device->manufacturer = 'Sony';
+            $this->data->device->series = 'Smart TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (preg_match('/(KDL-?[0-9]+[A-Z]+[0-9]+)/u', $ua, $match)) {
+                $this->data->device->model = $match[1];
+                $this->data->device->generic = false;
+            }
+
+            if (preg_match('/(XBR-?[0-9]+[A-Z]+[0-9]+)/u', $ua, $match)) {
+                $this->data->device->model = $match[1];
+                $this->data->device->generic = false;
+            }
+        }
+
+        if (preg_match('/SonyBDP/u', $ua)) {
+            $this->data->device->manufacturer = 'Sony';
+            $this->data->device->series = "Blu-ray Player";
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+
+        if (preg_match('/SmartBD/u', $ua) && preg_match('/(BDP-[A-Z][0-9]+)/u', $ua, $match)) {
+            $this->data->device->manufacturer = 'Sony';
+            $this->data->device->model = $match[1];
+            $this->data->device->series = 'Blu-ray Player';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+
+        if (preg_match('/\s+([0-9]+)BRAVIA/u', $ua, $match)) {
+            $this->data->device->manufacturer = 'Sony';
+            $this->data->device->model = 'Bravia';
+            $this->data->device->series = 'Smart TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+    }
+
+
+    /* Samsung */
+
+    private function detectSamsungTelevision($ua)
+    {
+        if (preg_match('/(SMART-TV|SmartHub)/u', $ua)) {
+            $this->data->device->manufacturer = 'Samsung';
+            $this->data->device->series = 'Smart TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (preg_match('/Linux\/SmartTV\+([0-9]*)/u', $ua, $match)) {
+                $this->data->device->series = 'Smart TV ' . $match[1];
+            } elseif (preg_match('/Maple([0-9]*)/u', $ua, $match)) {
+                $this->data->device->series = 'Smart TV ' . $match[1];
+            }
+        }
+
+        if (preg_match('/Maple_?([0-9][0-9][0-9][0-9])/u', $ua, $match)) {
+            $this->data->device->manufacturer = 'Samsung';
+            $this->data->device->series = 'Smart TV ' . $match[1];
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (preg_match('/Linux\/(?:SmartTV)?\+([0-9]{4,4})/u', $ua, $match)) {
+                $this->data->device->series = 'Smart TV ' . $match[1];
+            }
+        }
+
+        if (preg_match('/Maple ([0-9]+\.[0-9]+)\.[0-9]+/u', $ua, $match)) {
+            $this->data->device->manufacturer = 'Samsung';
+            $this->data->device->series = 'Smart TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            switch ($match[1]) {
+                case '5.0':
+                    $this->data->device->series = 'Smart TV 2009';
+                    break;
+                case '5.1':
+                    $this->data->device->series = 'Smart TV 2010';
+                    break;
+                case '6.0':
+                    $this->data->device->series = 'Smart TV 2011';
+                    break;
+            }
+        }
+
+        if (preg_match('/Model\/Samsung-(BD-[A-Z][0-9]+)/u', $ua, $match)) {
+            $this->data->device->manufacturer = 'Samsung';
+            $this->data->device->model = $match[1];
+            $this->data->device->series = 'Blu-ray Player';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+
+        if (preg_match('/olleh tv;/u', $ua)) {
+            $this->data->device->manufacturer = 'Samsung';
+            $this->data->device->model = null;
+            $this->data->device->series = null;
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (preg_match('/(SMT-[A-Z0-9]+)/u', $ua, $match)) {
+                $this->data->device->model = $match[1];
+                $this->data->device->identifier = $match[1];
+                $this->data->device->generic = false;
+            }
+
+            if ($this->data->device->model == "SMT-E5015") {
+                $this->data->device->model = 'Olleh SkyLife Smart Settopbox';
+            }
+        }
+    }
+
+
+    /* Sanyo */
+
+    private function detectSanyoTelevision($ua)
+    {
+        if (preg_match('/Aplix_SANYO_browser/u', $ua)) {
+            $this->data->device->manufacturer = 'Sanyo';
+            $this->data->device->series = 'Internet TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+    }
+
+
+    /* Sharp */
+
+    private function detectSharpTelevision($ua)
+    {
+        if (preg_match('/(AQUOSBrowser|AQUOS-(AS|DMP))/u', $ua)) {
+            $this->data->device->manufacturer = 'Sharp';
+            $this->data->device->series = 'Aquos TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (preg_match('/LC\-([0-9]+[A-Z]+[0-9]+[A-Z]+)/u', $ua, $match)) {
+                $this->data->device->model = $match[1];
+                $this->data->device->generic = false;
+            }
+        }
+    }
+
+
+    /* Panasonic */
+
+    private function detectPanasonicTelevision($ua)
+    {
+        if (preg_match('/Viera/u', $ua)) {
+            $this->data->device->manufacturer = 'Panasonic';
+            $this->data->device->series = 'Viera';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (preg_match('/Panasonic\.tv\.(?:mid\.)?([0-9]+)/u', $ua, $match)) {
+                $this->data->device->series = 'Viera ' . $match[1];
+            }
+
+            if (preg_match('/\(Panasonic, ([0-9]+),/u', $ua, $match)) {
+                $this->data->device->series = 'Viera ' . $match[1];
+            }
+
+            if (preg_match('/Viera\; rv\:34/u', $ua, $match)) {
+                $this->data->device->series = 'Viera 2015';
+            }
+        }
+
+        if (preg_match('/; Diga;/u', $ua)) {
+            $this->data->device->manufacturer = 'Panasonic';
+            $this->data->device->series = 'Diga';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+    }
+
+
+    /* Various set top boxes */
+
+    private function detectSettopboxes($ua)
+    {
+        if (!preg_match('/(lacleTV|LOEWE|KreaTV|ADB|Mstar|TechniSat|Technicolor|Highway|CiscoBrowser|Sunniwell|Enseo|LocationFreeTV|Winbox|DuneHD|Roku|AppleTV|Apple TV|WebTV|OpenTV|MediStream)/ui', $ua)) {
+            return;
+        }
+
+        /* Orange La clé TV */
+
+        if (preg_match('/lacleTV\//u', $ua)) {
+            $this->data->device->manufacturer = 'Orange';
+            $this->data->device->series = 'La clé TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+
+        /* Loewe */
+
+        if (preg_match('/LOEWE\/TV/u', $ua)) {
+            $this->data->device->manufacturer = 'Loewe';
+            $this->data->device->series = 'Smart TV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (preg_match('/((?:SL|ID)[0-9]+)/u', $ua, $match)) {
+                $this->data->device->model = $match[1];
+            }
+        }
+
+        /* KreaTV */
+
+        if (preg_match('/KreaTV/u', $ua)) {
+            $this->data->os->reset();
+
+            $this->data->device->series = 'KreaTV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+
+            if (preg_match('/Motorola/u', $ua)) {
+                $this->data->device->manufacturer = 'Motorola';
+            }
+        }
+
+        /* ADB */
+
+        if (preg_match('/\(ADB; ([^\)]+)\)/u', $ua, $match)) {
+            $this->data->os->reset();
+
+            $this->data->device->manufacturer = 'ADB';
+            $this->data->device->model = ($match[1] != 'Unknown' ? str_replace('ADB', '', $match[1]) . ' ' : '') . 'IPTV receiver';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+
+        /* MStar */
+
+        if (preg_match('/Mstar;/u', $ua)) {
+            $this->data->os->reset();
+
+            $this->data->device->manufacturer = 'MStar';
+            $this->data->device->model = 'PVR';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+
+        /* TechniSat */
+
+        if (preg_match('/TechniSat ([^;]+);/u', $ua, $match)) {
+            $this->data->os->reset();
+
+            $this->data->device->manufacturer = 'TechniSat';
+            $this->data->device->model = $match[1];
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+
+        /* Technicolor */
+
+        if (preg_match('/Technicolor_([^;]+);/u', $ua, $match)) {
+            $this->data->os->reset();
+
+            $this->data->device->manufacturer = 'Technicolor';
+            $this->data->device->model = $match[1];
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+
+        /* Cisco MediaHighway */
+
+        if (preg_match('/(Media-Highway Evolution|CiscoBrowser\/CI)/u', $ua, $match)) {
+            $this->data->os->reset();
+
+            $this->data->device->manufacturer = 'Cisco';
+            $this->data->device->model = 'MediaHighway';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+
+        /* Sunniwell */
+
+        if (preg_match('/Sunniwell/u', $ua) && preg_match('/Resolution/u', $ua)) {
+            $this->data->os->reset();
+
+            $this->data->device->manufacturer = 'Sunniwell';
+            $this->data->device->series = 'STB';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+
+        /* Enseo */
+
+        if (preg_match('/Enseo\/([A-Z0-9]+)/u', $ua, $match)) {
+            $this->data->os->reset();
+
+            $this->data->device->manufacturer = 'Enseo';
+            $this->data->device->model = $match[1];
+            $this->data->device->series = 'STB';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+
+        /* Sony LocationFreeTV */
+
+        if (preg_match('/LocationFreeTV\/([A-Z0-9\-]+)/u', $ua, $match)) {
+            $this->data->os->reset();
+
+            $this->data->device->manufacturer = 'Sony';
+            $this->data->device->model = 'LocationFreeTV ' . $match[1];
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+
+        /* Winbox Evo2 */
+
+        if (preg_match('/Winbox Evo2/u', $ua)) {
+            $this->data->os->reset();
+
+            $this->data->device->manufacturer = 'Winbox';
+            $this->data->device->model = 'Evo2';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+
+        /* DuneHD */
+
+        if (preg_match('/DuneHD\//u', $ua)) {
+            $this->data->os->reset();
+
+            $this->data->device->manufacturer = 'Dune HD';
+            $this->data->device->model = '';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (preg_match('/DuneHD\/[0-9.]+ \(([^;]+);/u', $ua, $match)) {
+                $this->data->device->model = $match[1];
+            }
+        }
+
+        /* Roku  */
+
+        if (preg_match('/^Roku\/DVP-(?:[0-9A-Z]+-)?[0-9\.]+ \(([0-9]{2,2})/u', $ua, $match)) {
+            $this->data->os->reset();
+
+            $this->data->device->manufacturer = 'Roku';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+
+            switch ($match[1]) {
+                case '02':
+                    $this->data->device->model = '2 XS';
+                    $this->data->device->generic = false;
+                    break;
+                case '04':
+                    $this->data->device->model = '3';
+                    $this->data->device->generic = false;
+                    break;
+                case '07':
+                    $this->data->device->model = 'LT';
+                    $this->data->device->generic = false;
+                    break;
+                case '09':
+                    $this->data->device->model = 'Streaming Stick';
+                    $this->data->device->generic = false;
+                    break;
+            }
+
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+
+        if (preg_match('/\(Roku/u', $ua)) {
+            $this->data->device->manufacturer = 'Roku';
+            $this->data->device->model = '';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+
+        /* AppleTV */
+
+        if (preg_match('/Apple ?TV/u', $ua)) {
+            $this->data->os->reset();
+
+            $this->data->device->manufacturer = 'Apple';
+            $this->data->device->model = 'AppleTV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+
+        /* WebTV */
+
+        if (preg_match('/WebTV\/[0-9.]/u', $ua)) {
+            $this->data->os->reset();
+
+            $this->data->device->manufacturer = 'Microsoft';
+            $this->data->device->model = 'WebTV';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+
+        /* MediStream */
+
+        if (preg_match('/MediStream/u', $ua)) {
+            $this->data->os->reset();
+
+            $this->data->device->manufacturer = 'Bewatec';
+            $this->data->device->model = 'MediStream';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+    }
+
+
+    /* Generic model information */
+
+    private function detectGenericTelevisionModels($ua)
+    {
+        if (preg_match('/\(([^,\(]+),\s*([^,\(]+),\s*(?:[Ww]ired|[Ww]ireless)\)/u', $ua, $match)) {
+            $vendorName = Data\Manufacturers::identify(Constants\DeviceType::TELEVISION, $match[1]);
+            $modelName = trim($match[2]);
+
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::PATTERN;
+
+            if (!isset($this->data->device->series)) {
+                $this->data->device->series = 'Smart TV';
+            }
+
+            switch ($vendorName) {
+                case 'ARRIS':
+                    $this->data->device->manufacturer = 'Arris';
+                    $this->data->device->model = $modelName;
+                    break;
+
+                case 'LG':
+                    $this->data->device->manufacturer = 'LG';
+
+                    switch ($modelName) {
+                        case 'WEBOS1':
+                        case 'webOS.TV':
+                            $this->data->device->series = 'webOS TV';
+                            break;
+                        case 'NETCAST4':
+                        case 'NetCast4.0':
+                        case 'GLOBAL-PLAT4':
+                            $this->data->device->series = 'NetCast TV 2013';
+                            break;
+                        default:
+                            $this->data->device->model = $modelName;
+                            break;
+                    }
+
+                    break;
+
+                case 'Google Fiber':
+                    $this->data->device->manufacturer = $vendorName;
+                    $this->data->device->model = 'TV Box';
+                    break;
+
+                case 'Sagemcom':
+                    $this->data->device->manufacturer = $vendorName;
+                    $this->data->device->series = 'Settopbox';
+
+                    if (preg_match('/^([A-Z]+[0-9]+)/ui', $modelName, $match)) {
+                        $this->data->device->model = $match[1];
+                        unset($this->data->device->series);
+                    }
+
+                    break;
+
+                case 'TiVo':
+                    $this->data->device->manufacturer = 'TiVo';
+                    $this->data->device->series = 'DVR';
+                    break;
+
+                default:
+                    $this->data->device->manufacturer = $vendorName;
+
+                    if (!in_array($modelName, [ 'dvb' ])) {
+                        $this->data->device->model = $modelName;
+                    }
+
+                    break;
+            }
+        }
+    }
+
+
+    /* InettvBrowser model information */
+
+    private function detectGenericInettvBrowser($ua)
+    {
+        if (preg_match('/(?:DTVNetBrowser|InettvBrowser|Hybridcast)\/[0-9\.]+[A-Z]? ?\(/u', $ua, $match)) {
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+
+            $vendorName = null;
+            $modelName = null;
+            $found = false;
+
+            if (preg_match('/(?:DTVNetBrowser|InettvBrowser)\/[0-9\.]+[A-Z]? ?\(([^;]*)\s*;\s*([^;]*)\s*;/u', $ua, $match)) {
+                $vendorName = trim($match[1]);
+                $modelName = trim($match[2]);
+                $found = true;
+            }
+
+            if (preg_match('/Hybridcast\/[0-9\.]+ ?\([^;]*;([^;]*)\s*;\s*([^;]*)\s*;/u', $ua, $match)) {
+                $vendorName = trim($match[1]);
+                $modelName = trim($match[2]);
+                $found = true;
+            }
+
+            if ($found) {
+                $this->data->device->identified |= Constants\Id::PATTERN;
+
+                $data = [
+                    '0003D5'    =>  'Advanced Communications',
+                    '000024'    =>  'Connect AS',
+                    '000087'    =>  'Hitachi',
+                    '00A0B0'    =>  'I-O Data Device',
+                    '00E091'    =>  'LG',
+                    '0050C9'    =>  'Maspro Denkoh',
+                    '002692'    =>  'Mitsubishi',
+                    '38E08E'    =>  'Mitsubishi',
+                    '008045'    =>  'Panasonic',
+                    '00E036'    =>  'Pioneer',
+                    '00E064'    =>  'Samsung',
+                    '08001F'    =>  'Sharp',
+                    '00014A'    =>  'Sony',
+                    '000039'    =>  'Toshiba'
+                ];
+
+                if (isset($data[$vendorName])) {
+                    $this->data->device->manufacturer = $data[$vendorName];
+
+                    if ($this->data->device->manufacturer == 'LG') {
+                        switch ($modelName) {
+                            case 'LGE2D2012M':
+                                $this->data->device->series = 'NetCast TV 2012';
+                                break;
+                            case 'LGE3D2012M':
+                                $this->data->device->series = 'NetCast TV 2012';
+                                break;
+                            case 'LGwebOSTV':
+                                $this->data->device->series = 'webOS TV';
+                                break;
+                        }
+                    }
+
+                    if ($this->data->device->manufacturer == 'Panasonic') {
+                        if (substr($modelName, 0, 6) != 'PANATV') {
+                            $this->data->device->model = $modelName;
+                        }
+                    }
+                }
+
+                if (!isset($this->data->device->series)) {
+                    $this->data->device->series = 'Smart TV';
+                }
+            }
+        }
+    }
+
+
+    /* HbbTV model information */
+
+    private function detectGenericHbbTV($ua)
+    {
+        if (preg_match('/((HbbTV|OHTV|SmartTV)\/[0-9\.]+|CE-HTML)/iu', $ua)) {
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+
+            $vendorName = null;
+            $modelName = null;
+            $found = false;
+
+            if (preg_match('/HbbTV\/[0-9\.]+;CE-HTML\/[0-9\.]+;([A-Z]+)\s([^;]+);/iu', $ua, $match)) {
+                $vendorName = Data\Manufacturers::identify(Constants\DeviceType::TELEVISION, $match[1]);
+                $modelName = trim($match[2]);
+                $found = true;
+            }
+
+            if (preg_match('/UID\([a-f0-9:]+\/([^\/]+)\/([^\/]+)\/[0-9a-z\.]+\)\+CE-HTML/iu', $ua, $match)) {
+                $vendorName = Data\Manufacturers::identify(Constants\DeviceType::TELEVISION, $match[2]);
+                $modelName = trim($match[1]);
+                $found = true;
+            }
+
+            if (preg_match('/(?:HbbTV|OHTV)\/[0-9\.]+ \(([^;]*);\s*([^;]*)\s*;\s*([^;]*)\s*;/u', $ua, $match)) {
+                if (trim($match[1]) == "" || in_array(strtok($match[1], ' '), [ 'PVR', 'DL' ]) || strpos($match[1], '+') !== false) {
+                    $vendorName = Data\Manufacturers::identify(Constants\DeviceType::TELEVISION, $match[2]);
+                    $modelName = trim($match[3]);
+                } else {
+                    $vendorName = Data\Manufacturers::identify(Constants\DeviceType::TELEVISION, $match[1]);
+                    $modelName = trim($match[2]);
+                }
+
+                $found = true;
+            }
+
+            if (preg_match('/(?:^|\s)SmartTV\/[0-9\.]+ \(([^;]*)\s*;\s*([^;]*)\s*;/u', $ua, $match)) {
+                $vendorName = Data\Manufacturers::identify(Constants\DeviceType::TELEVISION, $match[1]);
+                $modelName = trim($match[2]);
+                $found = true;
+            }
+
+            if (in_array($vendorName, [ 'Access', 'ANT', 'EMSYS', 'Em-Sys', 'Opera', 'Opera Software', 'Seraphic', 'Vendor' ])) {
+                $found = false;
+            }
+
+            if ($found) {
+                $this->data->device->identified |= Constants\Id::PATTERN;
+
+                switch ($vendorName) {
+                    case 'LG':
+                        $this->data->device->manufacturer = 'LG';
+
+                        switch ($modelName) {
+                            case 'NetCast 3.0':
+                            case 'GLOBAL_PLAT3':
+                                $this->data->device->series = 'NetCast TV 2012';
+                                break;
+                            case 'NetCast 4.0':
+                            case 'GLOBAL-PLAT4':
+                                $this->data->device->series = 'NetCast TV 2013';
+                                break;
+                            case 'WEBOS3':
+                                $this->data->device->series = 'webOS TV';
+                                break;
+                        }
+
+                        break;
+
+                    case 'Samsung':
+                        $this->data->device->manufacturer = 'Samsung';
+
+                        switch ($modelName) {
+                            case 'SmartTV2012':
+                                $this->data->device->series = 'Smart TV 2012';
+                                break;
+                            case 'SmartTV2013':
+                                $this->data->device->series = 'Smart TV 2013';
+                                break;
+                            case 'SmartTV2014':
+                                $this->data->device->series = 'Smart TV 2014';
+                                break;
+                            case 'SmartTV2015':
+                                $this->data->device->series = 'Smart TV 2015';
+                                break;
+                            case 'OTV-SMT-E5015':
+                                $this->data->device->model = 'Olleh SkyLife Smart Settopbox';
+                                unset($this->data->device->series);
+                                break;
+                        }
+
+                        break;
+
+                    case 'Panasonic':
+                        $this->data->device->manufacturer = 'Panasonic';
+
+                        switch ($modelName) {
+                            case 'VIERA 2011':
+                                $this->data->device->series = 'Viera 2011';
+                                break;
+                            case 'VIERA 2012':
+                                $this->data->device->series = 'Viera 2012';
+                                break;
+                            case 'VIERA 2013':
+                                $this->data->device->series = 'Viera 2013';
+                                break;
+                            case 'VIERA 2014':
+                                $this->data->device->series = 'Viera 2014';
+                                break;
+                            case 'VIERA 2015':
+                            case 'Viera2015.mid':
+                                $this->data->device->series = 'Viera 2015';
+                                break;
+                            default:
+                                $this->data->device->model = $modelName;
+                                break;
+                        }
+
+                        break;
+
+                    case 'TV2N':
+                        $this->data->device->manufacturer = 'TV2N';
+
+                        switch ($modelName) {
+                            case 'videoweb':
+                                $this->data->device->model = 'Videoweb';
+                                break;
+                        }
+
+                        break;
+
+                    default:
+                        if ($vendorName != '' && !in_array($vendorName, [ 'OEM', 'vendorName' ])) {
+                            $this->data->device->manufacturer = $vendorName;
+                        }
+
+                        if ($modelName != '' && !in_array($modelName, [ 'dvb', 'modelName', 'undefined-model-name', 'N/A' ])) {
+                            $this->data->device->model = $modelName;
+                        }
+
+                        break;
+                }
+
+                switch ($modelName) {
+                    case 'hdr1000s':
+                        $this->data->device->manufacturer = 'Humax';
+                        $this->data->device->model = 'HDR-1000S';
+                        $this->data->device->identified |= Constants\Id::MATCH_UA;
+                        $this->data->device->generic = false;
+                        break;
+
+                    case 'hdr4000t':
+                        $this->data->device->manufacturer = 'Humax';
+                        $this->data->device->model = 'HDR-4000T';
+                        $this->data->device->identified |= Constants\Id::MATCH_UA;
+                        $this->data->device->generic = false;
+                        break;
+
+                    case 'hgs1000s':
+                        $this->data->device->manufacturer = 'Humax';
+                        $this->data->device->model = 'HGS-1000S';
+                        $this->data->device->identified |= Constants\Id::MATCH_UA;
+                        $this->data->device->generic = false;
+                        break;
+
+                    case 'hms1000s':
+                    case 'hms1000sph2':
+                        $this->data->device->manufacturer = 'Humax';
+                        $this->data->device->model = 'HMS-1000S';
+                        $this->data->device->identified |= Constants\Id::MATCH_UA;
+                        $this->data->device->generic = false;
+                        break;
+                }
+            }
+        }
+
+        if (preg_match('/HbbTV\/[0-9.]+;CE-HTML\/[0-9.]+;([^\s;]+)\s[^\s;]+;/u', $ua, $match)) {
+            $this->data->device->manufacturer = Data\Manufacturers::identify(Constants\DeviceType::TELEVISION, $match[1]);
+            if (!isset($this->data->device->series)) {
+                $this->data->device->series = 'Smart TV';
+            }
+        }
+
+        if (preg_match('/HbbTV\/[0-9.]+;CE-HTML\/[0-9.]+;Vendor\/([^\s;]+);/u', $ua, $match)) {
+            $this->data->device->manufacturer = Data\Manufacturers::identify(Constants\DeviceType::TELEVISION, $match[1]);
+            if (!isset($this->data->device->series)) {
+                $this->data->device->series = 'Smart TV';
+            }
+        }
+    }
+
+
+    /* Try to reformat some of the detected generic models */
+
+    private function improveModelsOnDeviceTypeTelevision()
+    {
+        if ($this->data->device->type != Constants\DeviceType::TELEVISION) {
+            return;
+        }
+
+
+        if (isset($this->data->device->model) && isset($this->data->device->manufacturer)) {
+
+            if ($this->data->device->manufacturer == 'Dune HD') {
+                if (preg_match('/tv([0-9]+[a-z]?)/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = 'TV-' . strtoupper($match[1]);
+                }
+
+                if ($this->data->device->model == 'connect') {
+                    $this->data->device->model = 'Connect';
+                }
+            }
+
+            if ($this->data->device->manufacturer == 'Humax') {
+                $this->data->device->series = "Digital Receiver";
+            }
+
+            if ($this->data->device->manufacturer == 'Inverto') {
+                if (preg_match('/IDL[ -]?([0-9]+.*)/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = 'IDL ' . $match[1];
+                }
+
+                if (preg_match('/MBN([0-9]+)/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = 'MBN ' . $match[1];
+                }
+            }
+
+            if ($this->data->device->manufacturer == 'HyperPanel') {
+                $this->data->device->model = strtok(strtoupper($this->data->device->model), ' ');
+            }
+
+            if ($this->data->device->manufacturer == 'LG') {
+                if (preg_match('/(?:ATSC|DVB)-(.*)/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->generic = false;
+                }
+
+                if (preg_match('/[0-9][0-9]([A-Z][A-Z][0-9][0-9][0-9][0-9A-Z])/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->generic = false;
+                }
+
+                if (preg_match('/Media\/(.*)/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->generic = false;
+                }
+            }
+
+            if ($this->data->device->manufacturer == 'Loewe') {
+                $this->data->device->series = 'Smart TV';
+
+                if (preg_match('/((?:ID|SL)[0-9]+)/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = 'Connect '.  $match[1];
+                    $this->data->device->generic = false;
+                }
+            }
+
+            if ($this->data->device->manufacturer == 'Philips') {
+                if (preg_match('/[0-9][0-9]([A-Z][A-Z][A-Z][0-9][0-9][0-9][0-9])/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->generic = false;
+                }
+
+                if (preg_match('/(MT[0-9]+)/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->series = "Digital Receiver";
+                    $this->data->device->generic = false;
+                }
+
+                if (preg_match('/(BDP[0-9]+)/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->series = "Blu-ray Player";
+                    $this->data->device->generic = false;
+                }
+            }
+
+            if ($this->data->device->manufacturer == 'Toshiba') {
+                if (preg_match('/DTV_(.*)/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = 'Regza ' . $match[1];
+                    $this->data->device->generic = false;
+                }
+
+                if (preg_match('/[0-9][0-9]([A-Z][A-Z][0-9][0-9][0-9])/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = 'Regza ' . $match[1];
+                    $this->data->device->generic = false;
+                }
+
+                if (preg_match('/[0-9][0-9](ZL[0-9])/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = $match[1] . ' Cevo';
+                    $this->data->device->generic = false;
+                }
+
+                if (preg_match('/(BDX[0-9]+)/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->series = "Blu-ray Player";
+                    $this->data->device->generic = false;
+                }
+            }
+
+            if ($this->data->device->manufacturer == 'Selevision') {
+                $this->data->device->model = str_replace('Selevision ', '', $this->data->device->model);
+            }
+
+            if ($this->data->device->manufacturer == 'Sharp') {
+                if (preg_match('/[0-9][0-9]([A-Z]+[0-9]+[A-Z]+)/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->generic = false;
+                }
+            }
+
+            if ($this->data->device->manufacturer == 'Sony') {
+                if (preg_match('/(BDP[0-9]+G)/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->series = "Blu-ray Player";
+                    $this->data->device->generic = false;
+                }
+
+                if (preg_match('/KDL?-?[0-9]*([A-Z]+[0-9]+)[A-Z]*/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = 'Bravia ' . $match[1];
+                    $this->data->device->series = 'Smart TV';
+                    $this->data->device->generic = false;
+                }
+            }
+
+            if ($this->data->device->manufacturer == 'Pioneer') {
+                if (preg_match('/(BDP-[0-9]+)/u', $this->data->device->model, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->series = "Blu-ray Player";
+                    $this->data->device->generic = false;
+                }
+            }
+        }
+    }
+}

+ 170 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Engine.php

@@ -0,0 +1,170 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent;
+
+use WhichBrowser\Model\Version;
+
+trait Engine
+{
+    private function &detectEngine($ua)
+    {
+        $this->detectWebkit($ua);
+        $this->detectKHTML($ua);
+        $this->detectGecko($ua);
+        $this->detectServo($ua);
+        $this->detectGoanna($ua);
+        $this->detectPresto($ua);
+        $this->detectTrident($ua);
+        $this->detectEdgeHTMLUseragent($ua);
+
+        return $this;
+    }
+
+
+
+
+    /* WebKit */
+
+    private function detectWebkit($ua)
+    {
+        if (preg_match('/WebKit\/([0-9.]*)/iu', $ua, $match)) {
+            $this->data->engine->name = 'Webkit';
+            $this->data->engine->version = new Version([ 'value' => $match[1] ]);
+
+            if (preg_match('/(?:Chrome|Chromium)\/([0-9]*)/u', $ua, $match)) {
+                if (intval($match[1]) >= 27) {
+                    $this->data->engine->reset([ 'name' => 'Blink' ]);
+                }
+            }
+        }
+
+        if (preg_match('/Browser\/AppleWebKit\/?([0-9.]*)/iu', $ua, $match)) {
+            $this->data->engine->name = 'Webkit';
+            $this->data->engine->version = new Version([ 'value' => $match[1] ]);
+        }
+
+        if (preg_match('/AppleWebkit\(like Gecko\)/iu', $ua, $match)) {
+            $this->data->engine->name = 'Webkit';
+        }
+    }
+
+
+    /* KHTML */
+
+    private function detectKHTML($ua)
+    {
+        if (preg_match('/KHTML\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->engine->name = 'KHTML';
+            $this->data->engine->version = new Version([ 'value' => $match[1] ]);
+        }
+    }
+
+
+    /* Gecko */
+
+    private function detectGecko($ua)
+    {
+        if (preg_match('/Gecko/u', $ua) && !preg_match('/like Gecko/iu', $ua)) {
+            $this->data->engine->name = 'Gecko';
+
+            if (preg_match('/; rv:([^\);]+)[\);]/u', $ua, $match)) {
+                $this->data->engine->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+        }
+    }
+
+
+    /* Servo */
+
+    private function detectServo($ua)
+    {
+        if (preg_match('/Servo\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->engine->name = 'Servo';
+            $this->data->engine->version = new Version([ 'value' => $match[1] ]);
+        }
+    }
+
+
+    /* Goanna */
+
+    private function detectGoanna($ua)
+    {
+        if (preg_match('/Goanna/u', $ua)) {
+            $this->data->engine->name = 'Goanna';
+
+            if (preg_match('/Goanna\/([0-9]\.[0-9.]+)/u', $ua, $match)) {
+                $this->data->engine->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if (preg_match('/Goanna\/20[0-9]{6,6}/u', $ua) && preg_match('/; rv:([^\);]+)[\);]/u', $ua, $match)) {
+                $this->data->engine->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+    }
+
+
+    /* Presto */
+
+    private function detectPresto($ua)
+    {
+        if (preg_match('/Presto\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->engine->name = 'Presto';
+            $this->data->engine->version = new Version([ 'value' => $match[1] ]);
+        }
+    }
+
+
+    /* Trident */
+
+    private function detectTrident($ua)
+    {
+        if (preg_match('/Trident\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->engine->name = 'Trident';
+            $this->data->engine->version = new Version([ 'value' => $match[1] ]);
+
+
+            if (isset($this->data->browser->version) && isset($this->data->browser->name) && $this->data->browser->name == 'Internet Explorer') {
+                if ($this->data->engine->version->toNumber() >= 7 && $this->data->browser->version->toFloat() < 11) {
+                    $this->data->browser->version = new Version([ 'value' => '11.0' ]);
+                    $this->data->browser->mode = 'compat';
+                }
+
+                if ($this->data->engine->version->toNumber() == 6 && $this->data->browser->version->toFloat() < 10) {
+                    $this->data->browser->version = new Version([ 'value' => '10.0' ]);
+                    $this->data->browser->mode = 'compat';
+                }
+
+                if ($this->data->engine->version->toNumber() == 5 && $this->data->browser->version->toFloat() < 9) {
+                    $this->data->browser->version = new Version([ 'value' => '9.0' ]);
+                    $this->data->browser->mode = 'compat';
+                }
+
+                if ($this->data->engine->version->toNumber() == 4 && $this->data->browser->version->toFloat() < 8) {
+                    $this->data->browser->version = new Version([ 'value' => '8.0' ]);
+                    $this->data->browser->mode = 'compat';
+                }
+            }
+
+            if (isset($this->data->os->version) && isset($this->data->os->name) && $this->data->os->name == 'Windows Phone' && isset($this->data->browser->name) && $this->data->browser->name == 'Mobile Internet Explorer') {
+                if ($this->data->engine->version->toNumber() == 7 && $this->data->os->version->toFloat() < 8.1) {
+                    $this->data->os->version = new Version([ 'value' => '8.1', 'details' => 2 ]);
+                }
+
+                if ($this->data->engine->version->toNumber() == 5 && $this->data->os->version->toFloat() < 7.5) {
+                    $this->data->os->version = new Version([ 'value' => '7.5', 'details' => 2 ]);
+                }
+            }
+        }
+    }
+
+
+    /* EdgeHTML */
+
+    private function detectEdgeHTMLUseragent($ua)
+    {
+        if (preg_match('/Edge\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->engine->name = 'EdgeHTML';
+            $this->data->engine->version = new Version([ 'value' => $match[1], 'hidden' => true ]);
+        }
+    }
+}

+ 2414 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Os.php

@@ -0,0 +1,2414 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Data;
+use WhichBrowser\Model\Family;
+use WhichBrowser\Model\Version;
+
+trait Os
+{
+    private function &detectOperatingSystem($ua)
+    {
+        $this->detectUnix($ua);
+        $this->detectLinux($ua);
+        $this->detectBsd($ua);
+        $this->detectDarwin($ua);
+        $this->detectWindows($ua);
+        $this->detectAndroid($ua);
+        $this->detectChromeos($ua);
+        $this->detectBlackberry($ua);
+        $this->detectWebos($ua);
+        $this->detectSymbian($ua);
+        $this->detectNokiaOs($ua);
+        $this->detectTizen($ua);
+        $this->detectSailfish($ua);
+        $this->detectBada($ua);
+        $this->detectBrew($ua);
+        $this->detectQtopia($ua);
+        $this->detectOpenTV($ua);
+        $this->detectRemainingOperatingSystems($ua);
+
+        return $this;
+    }
+
+
+    private function &refineOperatingSystem($ua)
+    {
+        $this->determineAndroidVersionBasedOnBuild($ua);
+
+        return $this;
+    }
+
+
+
+
+
+
+
+    /* Darwin */
+
+    private function detectDarwin($ua)
+    {
+        /* iOS */
+
+        if (preg_match('/\(iOS;/u', $ua)) {
+            $this->data->os->name = 'iOS';
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+
+        if (preg_match('/(iPhone|iPad|iPod)/u', $ua) && !preg_match('/like iPhone/u', $ua)) {
+            $this->data->os->name = 'iOS';
+
+            if (preg_match('/CPU like Mac OS X/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => '1.0' ]);
+            }
+
+            if (preg_match('/OS (.*) like Mac OS X/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]) ]);
+            }
+
+            if (preg_match('/iPhone OS ([0-9._]*);/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]) ]);
+            }
+
+            if (preg_match('/iPhone Simulator;/u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::EMULATOR;
+            } else {
+                if (preg_match('/(iPad|iPhone( 3GS| 3G| 4S| 4| 5)?|iPod( touch)?)/u', $ua, $match)) {
+                    $device = Data\DeviceModels::identify('ios', $match[0]);
+
+                    if ($device) {
+                        $this->data->device = $device;
+                    }
+                }
+
+                if (preg_match('/(iPad|iPhone|iPod)[0-9],[0-9]/u', $ua, $match)) {
+                    $device = Data\DeviceModels::identify('ios', $match[0]);
+
+                    if ($device) {
+                        $this->data->device = $device;
+                    }
+                }
+            }
+        } /* OS X */
+
+        elseif (preg_match('/Mac OS X/u', $ua) || preg_match('/;os=Mac/u', $ua)) {
+            $this->data->os->name = 'OS X';
+
+            if (preg_match('/Mac OS X (10[0-9\._]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]), 'details' => 2 ]);
+            }
+
+            if (preg_match('/;os=Mac (10[0-9[\.,]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => str_replace(',', '.', $match[1]), 'details' => 2 ]);
+            }
+
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+
+        /* Darwin */
+
+        if (preg_match('/Darwin(?:\/([0-9]+).[0-9]+)?/u', $ua, $match)) {
+            if (preg_match('/\(X11;/u', $ua)) {
+
+                /* Darwin */
+                $this->data->os->name = 'Darwin';
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            } elseif (preg_match('/\((?:x86_64|i386|Power%20Macintosh)\)/u', $ua)) {
+
+                /* OS X */
+                $this->data->os->name = 'OS X';
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+
+                if (isset($match[1])) {
+                    $version = Data\Darwin::getVersion('osx', $match[1]);
+                    if ($version) {
+                        $this->data->os->version = new Version($version);
+                    }
+
+                    if (preg_match('/CFNetwork\/([0-9\.]+)/u', $ua, $match)) {
+                        $version = Data\CFNetwork::getVersion('osx', $match[1]);
+                        if ($version) {
+                            $this->data->os->version = new Version($version);
+                        }
+                    }
+                }
+            } else {
+
+                /* iOS */
+                $this->data->os->name = 'iOS';
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                if (isset($match[1])) {
+                    $version = Data\Darwin::getVersion('ios', $match[1]);
+                    if ($version) {
+                        $this->data->os->version = new Version($version);
+                    }
+
+                    if (preg_match('/CFNetwork\/([0-9\.]+)/u', $ua, $match)) {
+                        $version = Data\CFNetwork::getVersion('ios', $match[1]);
+                        if ($version) {
+                            $this->data->os->version = new Version($version);
+                        }
+                    }
+                }
+            }
+        }
+
+        /* Mac OS */
+
+        if (preg_match('/\(Macintosh;/u', $ua) && !preg_match('/OS X/u', $ua)) {
+            $this->data->os->name = 'Mac OS';
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+    }
+
+
+    /* Android */
+
+    private function detectAndroid($ua)
+    {
+        /* Android */
+
+        if (preg_match('/Andr[0o]id/ui', $ua)) {
+            $falsepositive = false;
+
+            /* Prevent the Mobile IE 11 Franken-UA from matching Android */
+            if (preg_match('/IEMobile\/1/u', $ua)) {
+                $falsepositive = true;
+            }
+            if (preg_match('/Windows Phone 10/u', $ua)) {
+                $falsepositive = true;
+            }
+
+            /* Prevent from OSes that claim to be 'like' Android from matching */
+            if (preg_match('/like Android/u', $ua)) {
+                $falsepositive = true;
+            }
+            if (preg_match('/COS like Android/u', $ua)) {
+                $falsepositive = false;
+            }
+
+            if (!$falsepositive) {
+                $this->data->os->name = 'Android';
+                $this->data->os->version = new Version();
+
+                if (preg_match('/Andr[0o]id(?: )?(?:AllPhone_|CyanogenMod_|OUYA )?(?:\/)?v?([0-9.]+)/ui', str_replace('-update', ',', $ua), $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+                }
+
+                if (preg_match('/Android [0-9][0-9].[0-9][0-9].[0-9][0-9]\(([^)]+)\);/u', str_replace('-update', ',', $ua), $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+                }
+
+                if (preg_match('/Android Eclair/u', $ua)) {
+                    $this->data->os->version = new Version([ 'value' => '2.0', 'details' => 3 ]);
+                }
+
+                if (preg_match('/Android KeyLimePie/u', $ua)) {
+                    $this->data->os->version = new Version([ 'value' => '4.4', 'details' => 3 ]);
+                }
+
+                if (preg_match('/Android (?:L|4.4.99);/u', $ua)) {
+                    $this->data->os->version = new Version([ 'value' => '5', 'details' => 3, 'alias' => 'L' ]);
+                }
+
+                if (preg_match('/Android (?:M|5.[01].99);/u', $ua)) {
+                    $this->data->os->version = new Version([ 'value' => '6', 'details' => 3, 'alias' => 'M' ]);
+                }
+
+                if (preg_match('/Android (?:N|6.0.99);/u', $ua)) {
+                    $this->data->os->version = new Version([ 'value' => '7', 'details' => 3, 'alias' => 'N' ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                if ($this->data->os->version->toFloat() >= 3) {
+                    $this->data->device->type = Constants\DeviceType::TABLET;
+                }
+
+                if ($this->data->os->version->toFloat() >= 4 && preg_match('/Mobile/u', $ua)) {
+                    $this->data->device->type = Constants\DeviceType::MOBILE;
+                }
+
+                $candidates = [];
+
+                if (preg_match('/Build/ui', $ua)) {
+
+                    /* Normal Android useragent strings */
+
+                    if (preg_match('/; [a-z][a-zA-Z][-_][a-zA-Z][a-zA-Z] ([^;]*[^;\s])\s+(?:BUILD|Build|build)/u', $ua, $match)) {
+                        $candidates[] = $match[1];
+                    }
+
+                    if (preg_match('/Android [A-Za-z]+; (?:[a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?) Build\/([^\/]*)\//u', $ua, $match)) {
+                        $candidates[] = $match[1];
+                    }
+
+                    if (preg_match('/;\+? ?(?:\*\*)?([^;]*[^;\s]);?\s+(?:BUILD|Build|build)/u', $ua, $match)) {
+                        $candidates[] = $match[1];
+                    }
+                } elseif (preg_match('/Release\//ui', $ua)) {
+
+                    /* WAP style useragent strings */
+
+                    if (preg_match('/^(?U)([^\/]+)(?U)(?:(?:_CMCC_TD|_CMCC|_TD|_TDLTE|_LTE)?\/[^\/]*)? Linux\/[0-9.+]+ Android\/[0-9.]+/u', $this->removeKnownPrefixes($ua), $match)) {
+                        $candidates[] = $match[1];
+                    } else if (preg_match('/^(?U)([^\/]+)(?U)(?:(?:_CMCC_TD|_CMCC|_TD|_TDLTE|_LTE)?\/[^\/]*)? Android(_OS)?\/[0-9.]+/u', $this->removeKnownPrefixes($ua), $match)) {
+                        $candidates[] = $match[1];
+                    } else if (preg_match('/^(?U)([^\/]+)(?U)(?:(?:_CMCC_TD|_CMCC|_TD|_TDLTE|_LTE)?\/[^\/]*)? Release\/[0-9.]+/u', $this->removeKnownPrefixes($ua), $match)) {
+                        $candidates[] = $match[1];
+                    }
+                } elseif (preg_match('/Mozilla\//ui', $ua)) {
+
+                    /* Old Android useragent strings */
+
+                    if (preg_match('/Linux; (?:U; )?Android [^;]+; (?:[a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?; )?(?:[^;]+; ?)?([^)\/;]+)\)/u', $ua, $match)) {
+                        $candidates[] = $match[1];
+                    } elseif (preg_match('/\(([^;]+);U;Android\/[^;]+;[0-9]+\*[0-9]+;CTC\/2.0\)/u', $ua, $match)) {
+                        $candidates[] = $match[1];
+                    }
+                } else {
+
+                    /* Other applications */
+
+                    if (preg_match('/[34]G Explorer\/[0-9.]+ \(Linux;Android [0-9.]+,([^\)]+)\)/u', $ua, $match)) {
+                        $candidates[] = $match[1];
+                    }
+
+                    if (preg_match('/GetJarSDK\/.*android\/[0-9.]+ \([^;]+; [^;]+; ([^\)]+)\)$/u', $ua, $match)) {
+                        $candidates[] = $match[1];
+                    }
+                }
+
+                $candidates = array_unique($candidates);
+
+                for ($c = 0; $c < count($candidates); $c++) {
+                    if (preg_match('/^[a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?$/u', $candidates[$c])) {
+                        unset($candidates[$c]);
+                        continue;
+                    }
+
+                    if (preg_match('/^Android [0-9\.]+$/u', $candidates[$c])) {
+                        unset($candidates[$c]);
+                        continue;
+                    }
+
+                    $candidates[$c] = preg_replace('/^[a-zA-Z][a-zA-Z][-_][a-zA-Z][a-zA-Z]\s+/u', '', $candidates[$c]);
+                    $candidates[$c] = preg_replace('/(.*) - [0-9\.]+ - (?:with Google Apps - )?API [0-9]+ - [0-9]+x[0-9]+/', '\\1', $candidates[$c]);
+                    $candidates[$c] = preg_replace('/^sprd-/u', '', $candidates[$c]);
+                }
+
+                $candidates = array_unique($candidates);
+
+                if (count($candidates)) {
+                    $this->data->device->model = $candidates[0];
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    for ($c = 0; $c < count($candidates); $c++) {
+                        $device = Data\DeviceModels::identify('android', $candidates[$c]);
+                        if ($device->identified) {
+                            $device->identified |= $this->data->device->identified;
+                            $this->data->device = $device;
+                            break;
+                        }
+                    }
+                }
+
+                if (preg_match('/HP eStation/u', $ua)) {
+                    $this->data->device->manufacturer = 'HP';
+                    $this->data->device->model = 'eStation';
+                    $this->data->device->type = Constants\DeviceType::PRINTER;
+                    $this->data->device->identified |= Constants\Id::MATCH_UA;
+                    $this->data->device->generic = false;
+                }
+            }
+        }
+
+        if (preg_match('/\(Linux; (?:U; )?(?:([0-9.]+); )?(?:[a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?; )?([^;]+) Build/u', $ua, $match)) {
+            $falsepositive = false;
+
+            if ($match[2] == 'OpenTV') {
+                $falsepositive = true;
+            }
+
+            if (!$falsepositive) {
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+                $this->data->device->model = $match[2];
+
+                $this->data->os->name = 'Android';
+
+                if (!empty($match[1])) {
+                    $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+                }
+
+                $device = Data\DeviceModels::identify('android', $match[2]);
+                if ($device->identified) {
+                    $device->identified |= Constants\Id::PATTERN;
+                    $device->identified |= $this->data->device->identified;
+
+                    $this->data->device = $device;
+                }
+            }
+        }
+
+        if (preg_match('/Linux x86_64; ([^;\)]+)(?:; [a-zA-Z][a-zA-Z](?:[-_][a-zA-Z][a-zA-Z])?)?\) AppleWebKit\/534.24 \(KHTML, like Gecko\) Chrome\/11.0.696.34 Safari\/534.24/u', $ua, $match)) {
+            $device = Data\DeviceModels::identify('android', $match[1]);
+            if ($device->identified) {
+                $device->identified |= Constants\Id::PATTERN;
+                $device->identified |= $this->data->device->identified;
+
+                $this->data->os->name = 'Android';
+                $this->data->device = $device;
+            }
+        }
+
+        if (preg_match('/\(Linux; U; Linux Ventana; [^;]+; ([^;]+) Build/u', $ua, $match)) {
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+            $this->data->device->model = $match[1];
+
+            $device = Data\DeviceModels::identify('android', $match[1]);
+            if ($device->identified) {
+                $device->identified |= Constants\Id::PATTERN;
+                $device->identified |= $this->data->device->identified;
+
+                $this->data->os->name = 'Android';
+                $this->data->device = $device;
+            }
+        }
+
+        /* Aliyun OS */
+
+        if (preg_match('/Aliyun/u', $ua) || preg_match('/YunOs/ui', $ua)) {
+            $this->data->os->name = 'Aliyun OS';
+            $this->data->os->family = new Family([ 'name' => 'Android' ]);
+            $this->data->os->version = new Version();
+
+            if (preg_match('/YunOs[ \/]([0-9.]+)/iu', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+
+            if (preg_match('/AliyunOS ([0-9.]+)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            if (preg_match('/; ([^;]*[^;\s])\s+Build/u', $ua, $match)) {
+                $this->data->device->model = $match[1];
+            }
+
+            if (isset($this->data->device->model)) {
+                $this->data->device->identified |= Constants\Id::PATTERN;
+
+                $device = Data\DeviceModels::identify('android', $this->data->device->model);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+        }
+
+        if (preg_match('/Android/u', $ua)) {
+            if (preg_match('/Android v(1.[0-9][0-9])_[0-9][0-9].[0-9][0-9]-/u', $ua, $match)) {
+                $this->data->os->name = 'Aliyun OS';
+                $this->data->os->family = new Family([ 'name' => 'Android' ]);
+                $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+
+            if (preg_match('/Android[ \/](1.[0-9].[0-9].[0-9]+)-R?T/u', $ua, $match)) {
+                $this->data->os->name = 'Aliyun OS';
+                $this->data->os->family = new Family([ 'name' => 'Android' ]);
+                $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+
+            if (preg_match('/Android ([12].[0-9].[0-9]+)-R-20[0-9]+/u', $ua, $match)) {
+                $this->data->os->name = 'Aliyun OS';
+                $this->data->os->family = new Family([ 'name' => 'Android' ]);
+                $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
+            }
+
+            if (preg_match('/Android 20[0-9]+\./u', $ua, $match)) {
+                $this->data->os->name = 'Aliyun OS';
+                $this->data->os->family = new Family([ 'name' => 'Android' ]);
+                $this->data->os->version = null;
+            }
+        }
+
+        /* Baidu Yi */
+
+        if (preg_match('/Baidu Yi/u', $ua)) {
+            $this->data->os->name = 'Baidu Yi';
+            $this->data->os->family = new Family([ 'name' => 'Android' ]);
+            $this->data->os->version = null;
+        }
+
+        /* Google TV */
+
+        if (preg_match('/GoogleTV/u', $ua)) {
+            $this->data->os->name = 'Google TV';
+            $this->data->os->family = new Family([ 'name' => 'Android' ]);
+
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+
+            if (preg_match('/GoogleTV [0-9\.]+; ?([^;]*[^;\s])\s+Build/u', $ua, $match)) {
+                $this->data->device->model = $match[1];
+            }
+
+            if (isset($this->data->device->model) && $this->data->device->model) {
+                $this->data->device->identified |= Constants\Id::PATTERN;
+
+                $device = Data\DeviceModels::identify('android', $this->data->device->model);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+        }
+
+        /* LeOS */
+
+        if (preg_match('/LeOS/u', $ua)) {
+            $this->data->os->name = 'LeOS';
+            $this->data->os->family = new Family([ 'name' => 'Android' ]);
+
+            if (preg_match('/LeOS([0-9\.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            $this->data->device->type = Constants\DeviceType::TABLET;
+
+            if (preg_match('/LeOS[0-9\.]+; [^;]+; (.*) Build/u', $ua, $match)) {
+                $this->data->device->model = $match[1];
+            }
+
+            if (isset($this->data->device->model) && $this->data->device->model) {
+                $this->data->device->identified |= Constants\Id::PATTERN;
+
+                $device = Data\DeviceModels::identify('android', $this->data->device->model);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+        }
+
+        /* WoPhone */
+
+        if (preg_match('/WoPhone/u', $ua)) {
+            $this->data->os->name = 'WoPhone';
+            $this->data->os->family = new Family([ 'name' => 'Android' ]);
+
+            if (preg_match('/WoPhone\/([0-9\.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+
+        /* COS */
+
+        if (preg_match('/(COS|(China|Chinese) Operating System)/ui', $ua)) {
+            if (preg_match('/COS[\/ ]?([0-9]\.[0-9.]+)/ui', $ua, $match)) {
+                $this->data->os->name = 'COS';
+                $this->data->os->family = new Family([ 'name' => 'Android' ]);
+                $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            } elseif (preg_match('/(?:\(|; )(?:China|Chinese) Operating System ([0-9]\.[0-9.]*);/ui', $ua, $match)) {
+                $this->data->os->name = 'COS';
+                $this->data->os->family = new Family([ 'name' => 'Android' ]);
+                $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            } elseif (preg_match('/COS like Android/ui', $ua, $match)) {
+                $this->data->os->name = 'COS';
+                $this->data->os->family = new Family([ 'name' => 'Android' ]);
+                $this->data->os->version = null;
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            } elseif (preg_match('/(COS like Android|COSBrowser\/|\(COS;|\(COS 998;)/ui', $ua, $match)) {
+                $this->data->os->name = 'COS';
+                $this->data->os->family = new Family([ 'name' => 'Android' ]);
+            }
+        }
+
+        /* RemixOS */
+
+        if (preg_match('/RemixOS/u', $ua)) {
+            $this->data->os->name = 'Remix OS';
+            $this->data->os->version = null;
+            $this->data->os->family = new Family([ 'name' => 'Android' ]);
+
+            if (preg_match('/RemixOS ([0-9]\.[0-9])/u', $ua, $match)) {
+                switch ($match[1]) {
+                    case '5.1':
+                        $this->data->os->version = new Version([ 'value' => '1.0' ]);
+                        break;
+                    case '6.0':
+                        $this->data->os->version = new Version([ 'value' => '2.0' ]);
+                        break;
+                }
+            }
+
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+    }
+
+    private function determineAndroidVersionBasedOnBuild($ua)
+    {
+        if ($this->data->isOs('Android')) {
+            if (preg_match('/Build\/([^\);]+)/u', $ua, $match)) {
+                $version = Data\BuildIds::identify($match[1]);
+                if ($version) {
+                    if (!isset($this->data->os->version) || $this->data->os->version == null || $this->data->os->version->value == null || $version->toFloat() < $this->data->os->version->toFloat()) {
+                        $this->data->os->version = $version;
+                    }
+
+                    /* Special case for Android L */
+                    if ($version->toFloat() == 5) {
+                        $this->data->os->version = $version;
+                    }
+                }
+
+                $this->data->os->build = $match[1];
+            }
+        }
+    }
+
+
+    /* Windows */
+
+    private function detectWindows($ua)
+    {
+        if (preg_match('/(Windows|WinNT|WinCE|WinMobile|Win ?[9MX]|Win(16|32))/u', $ua)) {
+            $this->data->os->name = 'Windows';
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+
+
+            /* Windows NT */
+
+            if (preg_match('/Windows 2000/u', $ua)) {
+                $this->data->os->version = new Version([ 'value' => '5.0', 'alias' => '2000' ]);
+            }
+
+            if (preg_match('/(Windows XP|WinXP)/u', $ua)) {
+                $this->data->os->version = new Version([ 'value' => '5.1', 'alias' => 'XP' ]);
+            }
+
+            if (preg_match('/Windows Vista/u', $ua)) {
+                $this->data->os->version = new Version([ 'value' => '6.0', 'alias' => 'Vista' ]);
+            }
+
+            if (preg_match('/(?:Windows NT |WinNT)([0-9][0-9]?\.[0-9])/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+
+                switch ($match[1]) {
+                    case '10.1':
+                    case '10.0':
+                    case '6.4':
+                        $this->data->os->version = new Version([ 'value' => $match[1], 'alias' => '10' ]);
+                        break;
+
+                    case '6.3':
+                        if (preg_match('/; ARM;/u', $ua)) {
+                            $this->data->os->version = new Version([ 'value' => $match[1], 'alias' => 'RT 8.1' ]);
+                        } else {
+                            $this->data->os->version = new Version([ 'value' => $match[1], 'alias' => '8.1' ]);
+                        }
+                        break;
+
+                    case '6.2':
+                        if (preg_match('/; ARM;/u', $ua)) {
+                            $this->data->os->version = new Version([ 'value' => $match[1], 'alias' => 'RT' ]);
+                        } else {
+                            $this->data->os->version = new Version([ 'value' => $match[1], 'alias' => '8' ]);
+                        }
+                        break;
+
+                    case '6.1':
+                        $this->data->os->version = new Version([ 'value' => $match[1], 'alias' => '7' ]);
+                        break;
+                    case '6.0':
+                        $this->data->os->version = new Version([ 'value' => $match[1], 'alias' => 'Vista' ]);
+                        break;
+                    case '5.2':
+                        $this->data->os->version = new Version([ 'value' => $match[1], 'alias' => 'Server 2003' ]);
+                        break;
+                    case '5.1':
+                        $this->data->os->version = new Version([ 'value' => $match[1], 'alias' => 'XP' ]);
+                        break;
+                    case '5.0':
+                        $this->data->os->version = new Version([ 'value' => $match[1], 'alias' => '2000' ]);
+                        break;
+                    default:
+                        $this->data->os->version = new Version([ 'value' => $match[1], 'alias' => 'NT ' . $match[1] ]);
+                        break;
+                }
+
+                $this->detectWindowsOemManufacturer($ua);
+            }
+
+
+            /* Windows */
+
+            if (preg_match('/(Windows 95|Win95)/u', $ua)) {
+                $this->data->os->version = new Version([ 'value' => '4.0', 'alias' => '95' ]);
+            }
+
+            if (preg_match('/(Windows 98|Win98)/u', $ua)) {
+                $this->data->os->version = new Version([ 'value' => '4.1', 'alias' => '98' ]);
+            }
+
+            if (preg_match('/(Windows M[eE]|WinME)/u', $ua)) {
+                $this->data->os->version = new Version([ 'value' => '4.9', 'alias' => 'ME' ]);
+            }
+
+            if (preg_match('/(?:Windows|Win 9x) (([1234]\.[0-9])[0-9\.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+
+                switch ($match[2]) {
+                    case '4.0':
+                        $this->data->os->version = new Version([ 'value' => '4.0', 'alias' => '95' ]);
+                        break;
+                    case '4.1':
+                        $this->data->os->version = new Version([ 'value' => '4.1', 'alias' => '98' ]);
+                        break;
+                    case '4.9':
+                        $this->data->os->version = new Version([ 'value' => '4.9', 'alias' => 'ME' ]);
+                        break;
+                }
+            }
+
+
+            /* Windows Mobile and Windows Phone */
+
+            if (preg_match('/WPDesktop/u', $ua)) {
+                $this->data->os->name = 'Windows Phone';
+                $this->data->os->version = new Version([ 'value' => '8.0', 'details' => 2 ]);
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+                $this->data->browser->mode = 'desktop';
+            }
+
+            if (preg_match('/WP7/u', $ua)) {
+                $this->data->os->name = 'Windows Phone';
+                $this->data->os->version = new Version([ 'value' => '7', 'details' => 1 ]);
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+                $this->data->browser->mode = 'desktop';
+            }
+
+            if (preg_match('/WinMobile/u', $ua)) {
+                $this->data->os->name = 'Windows Mobile';
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                if (preg_match('/WinMobile\/([0-9.]*)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+                }
+            }
+
+            if (preg_match('/(Windows CE|WindowsCE|WinCE)/u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                if (preg_match('/ IEMobile/u', $ua)) {
+                    $this->data->os->name = 'Windows Mobile';
+
+                    if (preg_match('/ IEMobile\/9/u', $ua)) {
+                        $this->data->os->name = 'Windows Phone';
+                        $this->data->os->version = new Version([ 'value' => '7.5', 'details' => 2 ]);
+                    }
+
+                    if (preg_match('/ IEMobile 8/u', $ua)) {
+                        $this->data->os->version = new Version([ 'value' => '6.5', 'details' => 2 ]);
+                    }
+
+                    if (preg_match('/ IEMobile 7/u', $ua)) {
+                        $this->data->os->version = new Version([ 'value' => '6.1', 'details' => 2 ]);
+                    }
+
+                    if (preg_match('/ IEMobile 6/u', $ua)) {
+                        $this->data->os->version = new Version([ 'value' => '6.0', 'details' => 2 ]);
+                    }
+                } else {
+                    $this->data->os->name = 'Windows CE';
+
+                    if (preg_match('/WindowsCEOS\/([0-9.]*)/u', $ua, $match)) {
+                        $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+                    }
+
+                    if (preg_match('/Windows CE ([0-9.]*)/u', $ua, $match)) {
+                        $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+                    }
+                }
+
+
+                $model = null;
+
+                if (empty($model) && preg_match('/IEMobile [0-9.]+\)  ?(?:PPC; |SP; |Smartphone; )?(?:[0-9]+[Xx][0-9]+;? )?(?:VZW; )?([^;\(]+)/u', $ua, $match)) {
+                    if (!preg_match('/(Profile\/MIDP|UNTRUSTED)/u', $match[1])) {
+                        $model = $match[1];
+                    }
+                }
+
+                if (empty($model) && preg_match('/IEMobile [0-9.]+\) (?:PPC|SP|Smartphone); (?:[0-9]+[Xx][0-9]+;? )([^;]+) Profile\/MIDP/u', $ua, $match)) {
+                    $model = $match[1];
+                }
+
+                if (empty($model) && preg_match('/MSIE [0-9.]+; Windows CE; (?:PPC|SP|Smartphone); [0-9]+x[0-9]+; ([^;\)]+)\)$/u', $ua, $match)) {
+                    $model = $match[1];
+                }
+
+                if (empty($model) && preg_match('/MSIE [0-9.]+; Windows CE; (?:PPC|SP|Smartphone); [0-9]+x[0-9]+; ([^;]+); (?:PPC|OpVer)/u', $ua, $match)) {
+                    $model = $match[1];
+                }
+
+                if (empty($model) && preg_match('/MSIE [0-9.]+; Windows CE; (?:PPC|SP|Smartphone); ([^;]+) Profile\/MIDP/u', $ua, $match)) {
+                    $model = $match[1];
+                }
+
+                if (empty($model) && preg_match('/MSIE [0-9.]+; Windows CE; (?:PPC|SP|Smartphone) ([^;\(]+)[;\/] [0-9]+x[0-9]+/u', $ua, $match)) {
+                    $model = $match[1];
+                }
+
+                if (empty($model) && preg_match('/MSIE [0-9.]+; Windows CE; ([^;\(]+); [0-9]+x[0-9]+\)/u', $ua, $match)) {
+                    if (!preg_match('/^(Smartphone|PPC$)/u', $match[1])) {
+                        $model = $match[1];
+                    }
+                }
+
+                if (empty($model) && preg_match('/MSIE [0-9.]+; Windows CE; ([^;\(]+);? ?(?:PPC|SP|Smartphone); ?[0-9]+x[0-9]+/u', $ua, $match)) {
+                    if (!preg_match('/^(MIDP-2.0)/u', $match[1])) {
+                        $model = $match[1];
+                    }
+                }
+
+                if (empty($model) && preg_match('/MSIE [0-9.]+; Windows CE; ([^;\)]+)(?:; (?:PPC|SP|Smartphone); [0-9]+x[0-9]+)?\)( \[[a-zA-Z\-]+\])?$/u', $ua, $match)) {
+                    if (!preg_match('/^(IEMobile|MIDP-2.0|Smartphone|PPC$)/u', $match[1])) {
+                        $model = $match[1];
+                    }
+                }
+
+                if (!empty($model)) {
+                    $model = preg_replace('/(HTC\/|Toshiba\/)/', '', $model);
+
+                    $this->data->device->model = $model;
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+                    $this->data->os->name = 'Windows Mobile';
+
+                    $device = Data\DeviceModels::identify('wm', $model);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                } else {
+                    if (empty($model) && preg_match('/Windows CE [^;]+; Trident\/[^;]+; IEMobile[\/ ][^;]+[\);] ([A-Z\s]+); ?([^\/\),]+)/ui', $ua, $match)) {
+                        $model = $match[2];
+                    }
+
+                    if (!empty($model)) {
+                        $this->data->device->model = $model;
+                        $this->data->device->identified |= Constants\Id::PATTERN;
+                        $this->data->os->name = 'Windows Phone';
+
+                        $device = Data\DeviceModels::identify('wp', $model);
+                        if ($device->identified) {
+                            $device->identified |= $this->data->device->identified;
+                            $this->data->device = $device;
+                        }
+                    }
+                }
+            }
+
+            if (preg_match('/Microsoft Windows; (PPC|Smartphone)/u', $ua)) {
+                $this->data->os->name = 'Windows Mobile';
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+
+            if (preg_match('/Windows CE; (PPC|Smartphone)/u', $ua)) {
+                $this->data->os->name = 'Windows Mobile';
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+
+
+            /* Detect models in common places */
+
+            if (preg_match('/Windows ?Mobile/u', $ua)) {
+                $this->data->os->name = 'Windows Mobile';
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                if (preg_match('/Windows ?Mobile[\/ ]([0-9.]*)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+                }
+
+                if (preg_match('/Windows Mobile; (?:SHARP\/)?([^;]+); (?:PPC|Smartphone);/u', $ua, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('wm', $match[1]);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+
+                if (preg_match('/\(([^;]+); U; Windows Mobile/u', $ua, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('wm', $match[1]);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+            }
+
+            if (preg_match('/(Windows Phone|Windows NT 1[0-9]\.[0-9]; ARM|WPDesktop|ZuneWP7)/u', $ua)) {
+                $this->data->os->name = 'Windows Phone';
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                if (preg_match('/Windows Phone(?: OS)?[ \/]([0-9.]*)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+
+                    if (intval($match[1]) < 7) {
+                        $this->data->os->name = 'Windows Mobile';
+                    }
+                }
+
+                /* Windows Mobile 6.5 */
+                if (preg_match('/Windows NT 5.1; ([^;]+); Windows Phone/u', $ua, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('wm', $match[1]);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+
+                /* Windows Phone 7 (buggy) */
+                if (preg_match('/Windows Phone OS [^;]+; Trident\/[^;]+; IEMobile[\/ ][^;]+[\);] ([A-Z\s]+); ?([^\/\),]+)/ui', $ua, $match)) {
+                    $this->data->device->manufacturer = $match[1];
+                    $this->data->device->model = $match[2];
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('wp', $match[2]);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+
+                /* Windows Phone 7 and 8 */
+                if (preg_match('/IEMobile\/[^;]+;(?: ARM; Touch; )?(?:rv:[0-9]+; )?(?: WpsLondonTest; )?\s*([^;\s][^;\)]*);\s*([^;\)\s][^;\)]*)[;|\)]/u', $ua, $match)) {
+                    $this->data->device->manufacturer = $match[1];
+                    $this->data->device->model = $match[2];
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('wp', $match[2]);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+
+                /* Windows Phone 10 */
+                if (preg_match('/Windows Phone 1[0-9]\.[0-9]; Android [0-9\.]+; (?:WebView\/[0-9\.]+; )?([^;\s][^;]*);\s*([^;\)\s][^;\)]*)[;|\)]/u', $ua, $match)) {
+                    $this->data->device->manufacturer = $match[1];
+                    $this->data->device->model = $match[2];
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('wp', $match[2]);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+
+                /* Windows Phone 10 Continuum */
+                if (preg_match('/Windows NT 1[0-9]\.[0-9]; ARM; ([^;\)\s][^;\)]*)\)/u', $ua, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('wp', $match[1]);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+
+                    $this->data->device->type = Constants\DeviceType::DESKTOP;
+                }
+
+                /* Third party browsers */
+                if (preg_match('/IEMobile\/[^;]+;(?: ARM; Touch; )?\s*(?:[^\/]+\/[^\/]+);\s*([^;\s][^;]*);\s*([^;\)\s][^;\)]*)[;|\)]/u', $ua, $match)) {
+                    $this->data->device->manufacturer = $match[1];
+                    $this->data->device->model = $match[2];
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('wp', $match[2]);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+
+                if (preg_match('/\(Windows Phone OS\/[0-9\.]+; ([^:]+):([^;]+); [a-z]+(?:\-[a-z]+)?\)/iu', $ua, $match)) {
+                    $this->data->device->manufacturer = $match[1];
+                    $this->data->device->model = $match[2];
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('wp', $match[2]);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+
+                /* Desktop mode of WP 8.1 */
+                if (preg_match('/WPDesktop;\s*([^;\)]*)(?:;\s*([^;\)]*))?(?:;\s*([^;\)]*))?\) like Gecko/u', $ua, $match)) {
+                    if (preg_match("/^[A-Z]+$/", $match[1]) && isset($match[2])) {
+                        $this->data->device->manufacturer = $match[1];
+                        $this->data->device->model = $match[2];
+                    } else {
+                        $this->data->device->model = $match[1];
+                    }
+
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('wp', $this->data->device->model);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+
+                /* Desktop mode of WP 7 */
+                if (preg_match('/XBLWP7; ZuneWP7; ([^\)]+)\)/u', $ua, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('wp', $match[1]);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+
+                /* Desktop mode of WP 8.0 and 8.1 Update (buggy version) */
+                if (preg_match('/Touch; WPDesktop;\s*([^;\)]*)(?:;\s*([^;\)]*))?(?:;\s*([^;\)]*))?\)/u', $ua, $match)) {
+                    if (preg_match("/^[A-Z]+$/", $match[1]) && isset($match[2])) {
+                        $this->data->device->manufacturer = $match[1];
+                        $this->data->device->model = $match[2];
+                    } else {
+                        $this->data->device->model = $match[1];
+                    }
+
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('wp', $this->data->device->model);
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+
+                if (isset($this->data->device->manufacturer) && isset($this->data->device->model)) {
+                    if ($this->data->device->manufacturer == 'ARM' && $this->data->device->model == 'Touch') {
+                        $this->data->device->manufacturer = null;
+                        $this->data->device->model = null;
+                        $this->data->device->identified = Constants\Id::NONE;
+                    }
+
+                    if ($this->data->device->model == 'XDeviceEmulator') {
+                        $this->data->device->manufacturer = null;
+                        $this->data->device->model = null;
+                        $this->data->device->type = Constants\DeviceType::EMULATOR;
+                        $this->data->device->identified |= Constants\Id::MATCH_UA;
+                    }
+                }
+            }
+        } elseif (preg_match('/WMPRO/u', $ua)) {
+            $this->data->os->name = 'Windows Mobile';
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+    }
+
+    private function detectWindowsOemManufacturer($ua)
+    {
+        $manufacturers = [
+            'MAAR'      => 'Acer',
+            'ASJB'      => 'Asus',
+            'ASU2'      => 'Asus',
+            'MAAU'      => 'Asus',
+            'NP06'      => 'Asus',
+            'NP07'      => 'Asus',
+            'NP08'      => 'Asus',
+            'NP09'      => 'Asus',
+            'CMNTDF'    => 'Compaq',
+            'CPDTDF'    => 'Compaq',
+            'CPNTDF'    => 'Compaq',
+            'MDDR'      => 'Dell',
+            'MDDC'      => 'Dell',
+            'MDDS'      => 'Dell',
+            'FSJB'      => 'Fujitsu',
+            'MAFS'      => 'Fujitsu',
+            'MAGW'      => 'Gateway',
+            'HPCMHP'    => 'HP',
+            'HPDTDF'    => 'HP',
+            'HPNTDF'    => 'HP',
+            'MANM'      => 'Hyrican',
+            'LCJB'      => 'Lenovo',
+            'LEN2'      => 'Lenovo',
+            'MALC'      => 'Lenovo',
+            'MALE'      => 'Lenovo',
+            'MALN'      => 'Lenovo',
+            'MAMD'      => 'Medion',
+            'MAMI'      => 'MSI',
+            'MAM3'      => 'MSI',
+            'MASM'      => 'Samsung',
+            'SMJB'      => 'Samsung',
+            'MASA'      => 'Sony',
+            'MASE'      => 'Sony',
+            'MASP'      => 'Sony',
+            'MATB'      => 'Toshiba',
+            'MATM'      => 'Toshiba',
+            'MATP'      => 'Toshiba',
+            'TAJB'      => 'Toshiba',
+            'TNJB'      => 'Toshiba',
+        ];
+
+        $keys = array_keys($manufacturers);
+
+        if (preg_match('/; (' . implode('|', $keys) . ')(?:JS)?[\);]/u', $ua, $match)) {
+            $this->data->device->manufacturer = $manufacturers[$match[1]];
+            $this->data->device->hidden = true;
+            $this->data->device->identified |= Constants\Id::INFER;
+        }
+    }
+
+
+    /* Jolla Sailfish */
+
+    private function detectSailfish($ua)
+    {
+        if (preg_match('/Sailfish;/u', $ua)) {
+            $this->data->os->name = 'Sailfish';
+            $this->data->os->version = null;
+
+            if (preg_match('/Jolla;/u', $ua)) {
+                $this->data->device->manufacturer = 'Jolla';
+            }
+
+            if (preg_match('/Mobile/u', $ua)) {
+                $this->data->device->model = 'Phone';
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+                $this->data->device->identified = Constants\Id::PATTERN;
+            }
+
+            if (preg_match('/Tablet/u', $ua)) {
+                $this->data->device->model = 'Tablet';
+                $this->data->device->type = Constants\DeviceType::TABLET;
+                $this->data->device->identified = Constants\Id::PATTERN;
+            }
+        }
+    }
+
+
+    /* Bada */
+
+    private function detectBada($ua)
+    {
+        if (preg_match('/[b|B]ada/u', $ua)) {
+            $this->data->os->name = 'Bada';
+
+            if (preg_match('/[b|B]ada[\/ ]([0-9.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            }
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            if (preg_match('/\(([^;]+); ([^\/]+)\//u', $ua, $match)) {
+                if ($match[1] != 'Bada') {
+                    $this->data->device->manufacturer = $match[1];
+                    $this->data->device->model = $match[2];
+                    $this->data->device->identified = Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('bada', $match[2]);
+
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+            }
+        }
+    }
+
+
+    /* Tizen */
+
+    private function detectTizen($ua)
+    {
+        if (preg_match('/Tizen/u', $ua)) {
+            $this->data->os->name = 'Tizen';
+
+            if (preg_match('/Tizen[\/ ]?([0-9.]*[0-9])/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if (preg_match('/\(([^;]+); ([^\/]+)\//u', $ua, $match)) {
+                $falsepositive = false;
+                if (strtoupper($match[1]) == 'SMART-TV') {
+                    $falsepositive = true;
+                }
+                if ($match[1] == 'TV') {
+                    $falsepositive = true;
+                }
+                if ($match[1] == 'Linux') {
+                    $falsepositive = true;
+                }
+                if ($match[1] == 'Tizen') {
+                    $falsepositive = true;
+                }
+
+                if (!$falsepositive) {
+                    $this->data->device->manufacturer = $match[1];
+                    $this->data->device->model = $match[2];
+                    $this->data->device->identified = Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('tizen', $match[2]);
+
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+            }
+
+            if (preg_match('/\s*([^;]+);\s+([^;\)]+)\)/u', $ua, $match)) {
+                $falsepositive = false;
+                if ($match[1] == 'U') {
+                    $falsepositive = true;
+                }
+                if (substr($match[2], 0, 5) == 'Tizen') {
+                    $falsepositive = true;
+                }
+                if (substr($match[2], 0, 11) == 'AppleWebKit') {
+                    $falsepositive = true;
+                }
+                if (preg_match("/^[a-z]{2,2}(?:\-[a-z]{2,2})?$/", $match[2])) {
+                    $falsepositive = true;
+                }
+
+                if (!$falsepositive) {
+                    $this->data->device->model = $match[2];
+                    $this->data->device->identified = Constants\Id::PATTERN;
+
+                    $device = Data\DeviceModels::identify('tizen', $match[2]);
+
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+            }
+
+
+            if (!$this->data->device->type && preg_match('/Mobile/iu', $ua, $match)) {
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+
+
+            if (preg_match('/\((SMART[ -])?TV;/iu', $ua, $match)) {
+                $this->data->device->type = Constants\DeviceType::TELEVISION;
+                $this->data->device->manufacturer = 'Samsung';
+                $this->data->device->series = 'Smart TV';
+                $this->data->device->identified = Constants\Id::PATTERN;
+            }
+
+
+            if (preg_match('/(?:Samsung|Tizen ?)Browser\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->browser->name = "Samsung Browser";
+                $this->data->browser->channel = null;
+                $this->data->browser->stock = true;
+                $this->data->browser->version = new Version([ 'value' => $match[1] ]);
+                $this->data->browser->channel = null;
+            }
+        }
+
+        if (preg_match('/Linux\; U\; Android [0-9.]+\; ko\-kr\; SAMSUNG\; (NX[0-9]+[^\)]]*)/u', $ua, $match)) {
+            $this->data->os->name = 'Tizen';
+            $this->data->os->version = null;
+
+            $this->data->device->type = Constants\DeviceType::CAMERA;
+            $this->data->device->manufacturer = 'Samsung';
+            $this->data->device->model = $match[1];
+            $this->data->device->identified = Constants\Id::PATTERN;
+        }
+    }
+
+
+    /* Symbian */
+
+    private function detectSymbian($ua)
+    {
+        if (!preg_match('/(EPOC|Series|Symbian|S60|UIQ)/ui', $ua)) {
+            return;
+        }
+
+        /* EPOC */
+
+        if (preg_match('/EPOC(?:32)?[;\-\)]/u', $ua, $match)) {
+            $this->data->os->name = 'EPOC';
+            $this->data->os->family = new Family([ 'name' => 'Symbian' ]);
+            $this->data->device->type = Constants\DeviceType::PDA;
+
+            if (preg_match('/Crystal\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->os->name = 'Series80';
+                $this->data->os->version = new Version([ 'value' => '1.0' ]);
+                $this->data->os->family->version = new Version([ 'value' => $match[1] ]);
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                $this->data->device->manufacturer = 'Nokia';
+                $this->data->device->model = '9210';
+                $this->data->device->identified |= Constants\Id::PATTERN;
+            }
+
+            if (preg_match('/Nokia\/Series-9200/u', $ua)) {
+                $this->data->os->name = 'Series80';
+                $this->data->os->version = new Version([ 'value' => '1.0' ]);
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+
+                $this->data->device->manufacturer = 'Nokia';
+                $this->data->device->model = '9210i';
+                $this->data->device->identified |= Constants\Id::PATTERN;
+            }
+        }
+
+        /* Series 80 */
+
+        if (preg_match('/Series80\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->os->name = 'Series80';
+            $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            $this->data->os->family = new Family([ 'name' => 'Symbian' ]);
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+
+        /* Series 60 */
+
+        if (preg_match('/Symbian\/3/u', $ua)) {
+            $this->data->os->name = 'Series60';
+            $this->data->os->version = new Version([ 'value' => '5.2' ]);
+            $this->data->os->family = new Family([ 'name' => 'Symbian' ]);
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+
+        if (preg_match('/Series[ ]?60/u', $ua) || preg_match('/S60[V\/;]/u', $ua)) {
+            $this->data->os->name = 'Series60';
+            $this->data->os->family = new Family([ 'name' => 'Symbian' ]);
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            if (preg_match('/Series60\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if (preg_match('/S60\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if (preg_match('/S60V([0-9.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+        /* UIQ */
+
+        if (preg_match('/UIQ\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->os->name = 'UIQ';
+            $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            $this->data->os->family = new Family([ 'name' => 'Symbian' ]);
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+
+        /* Symbian */
+
+        if (preg_match('/Symbian/u', $ua)) {
+            $this->data->os->family = new Family([ 'name' => 'Symbian' ]);
+
+            if (preg_match('/SymbianOS\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->os->family->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+
+        if ($this->data->os->isFamily('Symbian')) {
+            if (preg_match('/Nokia-?([^\/;\)\s]+)[\s|\/|;|\)]/u', $ua, $match)) {
+                if ($match[1] != 'Browser') {
+                    $this->data->device->manufacturer = 'Nokia';
+                    $this->data->device->model = Data\DeviceModels::cleanup($match[1]);
+                    $this->data->device->identified |= Constants\Id::PATTERN;
+                }
+            }
+
+            if (preg_match('/Symbian(?:\/3)?; U; (?:Nokia)?([^;]+); [a-z][a-z](?:\-[a-z][a-z])?/u', $ua, $match)) {
+                $this->data->device->manufacturer = 'Nokia';
+                $this->data->device->model = Data\DeviceModels::cleanup($match[1]);
+                $this->data->device->identified |= Constants\Id::PATTERN;
+            }
+
+            if (preg_match('/Vertu([^\/;]+)[\/|;]/u', $ua, $match)) {
+                $this->data->device->manufacturer = 'Vertu';
+                $this->data->device->model = Data\DeviceModels::cleanup($match[1]);
+                $this->data->device->identified |= Constants\Id::PATTERN;
+            }
+
+            if (preg_match('/Samsung\/([^;]*);/u', $ua, $match)) {
+                $this->data->device->manufacturer = 'Samsung';
+                $this->data->device->model = Data\DeviceModels::cleanup($match[1]);
+                $this->data->device->identified |= Constants\Id::PATTERN;
+            }
+
+            if (isset($this->data->device->model)) {
+                $device = Data\DeviceModels::identify('symbian', $this->data->device->model);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+        }
+    }
+
+    private function detectNokiaOs($ua)
+    {
+        if (!preg_match('/(Series|MeeGo|Maemo|Geos)/ui', $ua)) {
+            return;
+        }
+
+        /* Series 40 */
+
+        if (preg_match('/Series40/u', $ua)) {
+            $this->data->os->name = 'Series40';
+
+            if (preg_match('/Nokia([^\/]+)\//u', $ua, $match)) {
+                $this->data->device->manufacturer = 'Nokia';
+                $this->data->device->model = Data\DeviceModels::cleanup($match[1]);
+                $this->data->device->identified |= Constants\Id::PATTERN;
+            }
+
+            if (isset($this->data->device->model)) {
+                $device = Data\DeviceModels::identify('s40', $this->data->device->model);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if (isset($this->data->device->model)) {
+                $device = Data\DeviceModels::identify('asha', $this->data->device->model);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->os->name = 'Nokia Asha Platform';
+                    $this->data->os->version = new Version([ 'value' => '1.0' ]);
+                    $this->data->device = $device;
+                }
+
+                if (preg_match('/java_runtime_version=Nokia_Asha_([0-9_]+);/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]) ]);
+                }
+            }
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+
+        /* Series 30+ */
+
+        if (preg_match('/Series30Plus/u', $ua)) {
+            $this->data->os->name = 'Series30+';
+
+            if (preg_match('/Nokia([^\/]+)\//u', $ua, $match)) {
+                $this->data->device->manufacturer = 'Nokia';
+                $this->data->device->model = Data\DeviceModels::cleanup($match[1]);
+                $this->data->device->identified |= Constants\Id::PATTERN;
+            }
+
+            if (isset($this->data->device->model)) {
+                $device = Data\DeviceModels::identify('s30plus', $this->data->device->model);
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+
+        /* Meego */
+
+        if (preg_match('/MeeGo/u', $ua)) {
+            $this->data->os->name = 'MeeGo';
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            if (preg_match('/Nokia([^\);]+)\)/u', $ua, $match)) {
+                $this->data->device->manufacturer = 'Nokia';
+                $this->data->device->model = Data\DeviceModels::cleanup($match[1]);
+                $this->data->device->identified |= Constants\Id::PATTERN;
+                $this->data->device->generic = false;
+            }
+        }
+
+        /* Maemo */
+
+        if (preg_match('/Maemo/u', $ua)) {
+            $this->data->os->name = 'Maemo';
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            if (preg_match('/(N[0-9]+)/u', $ua, $match)) {
+                $this->data->device->manufacturer = 'Nokia';
+                $this->data->device->model = $match[1];
+                $this->data->device->identified |= Constants\Id::PATTERN;
+                $this->data->device->generic = false;
+            }
+        }
+
+        /* GEOS */
+
+        if (preg_match('/Geos ([0-9.]+)/u', $ua, $match)) {
+            $this->data->os->name = 'GEOS';
+            $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            if (preg_match('/Nokia-([0-9]{4,4}[a-z]?)/u', $ua, $match)) {
+                $this->data->device->manufacturer = 'Nokia';
+                $this->data->device->model = $match[1];
+                $this->data->device->identified |= Constants\Id::PATTERN;
+                $this->data->device->generic = false;
+            }
+        }
+    }
+
+
+    /* WebOS */
+
+    private function detectWebos($ua)
+    {
+        if (preg_match('/(?:web|hpw)OS\/(?:HP webOS )?([0-9.]*)/u', $ua, $match)) {
+            $this->data->os->name = 'webOS';
+            $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            $this->data->device->type = preg_match('/Tablet/iu', $ua) ? Constants\DeviceType::TABLET : Constants\DeviceType::MOBILE;
+            $this->data->device->generic = false;
+        }
+
+        if (preg_match('/(?:Spark|elite)\/fzz/u', $ua, $match) || preg_match('/webOSBrowser/u', $ua, $match)) {
+            $this->data->os->name = 'webOS';
+            $this->data->device->type = preg_match('/Tablet/iu', $ua) ? Constants\DeviceType::TABLET : Constants\DeviceType::MOBILE;
+            $this->data->device->generic = false;
+        }
+
+        if (preg_match('/ (Pre|Pixi|TouchPad|P160UN?A?)\/[0-9\.]+$/u', $ua, $match)) {
+            $this->data->os->name = 'webOS';
+            $this->data->device->type = $match[1] == 'TouchPad' ? Constants\DeviceType::TABLET : Constants\DeviceType::MOBILE;
+            $this->data->device->generic = false;
+        }
+
+        if ($this->data->isOs('webOS')) {
+            if (preg_match('/Pre\/1.0/u', $ua)) {
+                $this->data->device->manufacturer = 'Palm';
+                $this->data->device->model = 'Pre';
+            }
+            if (preg_match('/Pre\/1.1/u', $ua)) {
+                $this->data->device->manufacturer = 'Palm';
+                $this->data->device->model = 'Pre Plus';
+            }
+            if (preg_match('/Pre\/1.2/u', $ua)) {
+                $this->data->device->manufacturer = 'Palm';
+                $this->data->device->model = 'Pre 2';
+            }
+            if (preg_match('/Pre\/3.0/u', $ua)) {
+                $this->data->device->manufacturer = 'Palm';
+                $this->data->device->model = 'Pre 3';
+            }
+            if (preg_match('/Pixi\/1.0/u', $ua)) {
+                $this->data->device->manufacturer = 'Palm';
+                $this->data->device->model = 'Pixi';
+            }
+            if (preg_match('/Pixi\/1.1/u', $ua)) {
+                $this->data->device->manufacturer = 'Palm';
+                $this->data->device->model = 'Pixi Plus';
+            }
+            if (preg_match('/P160UN?A?\/1.0/u', $ua)) {
+                $this->data->device->manufacturer = 'HP';
+                $this->data->device->model = 'Veer';
+            }
+            if (preg_match('/TouchPad\/1.0/u', $ua)) {
+                $this->data->device->manufacturer = 'HP';
+                $this->data->device->model = 'TouchPad';
+            }
+
+            if (preg_match('/Emulator\//u', $ua) || preg_match('/Desktop\//u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::EMULATOR;
+                $this->data->device->manufacturer = null;
+                $this->data->device->model = null;
+            }
+
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        }
+    }
+
+
+    /* BlackBerry */
+
+    private function detectBlackberry($ua)
+    {
+        /* BlackBerry OS */
+
+        if (preg_match('/RIM([0-9]{3,3})/u', $ua, $match)) {
+            $this->data->os->name = 'BlackBerry OS';
+            $this->data->device->manufacturer = 'RIM';
+            $this->data->device->model = $match[1];
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+            $this->data->device->identified = Constants\Id::INFER;
+        }
+
+        if (preg_match('/BlackBerry/u', $ua) && !preg_match('/BlackBerry Runtime for Android Apps/u', $ua)) {
+            $this->data->os->name = 'BlackBerry OS';
+
+            $this->data->device->model = 'BlackBerry';
+            $this->data->device->manufacturer = 'RIM';
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+            $this->data->device->identified = Constants\Id::INFER;
+
+            if (!preg_match('/Opera/u', $ua)) {
+                if (preg_match('/BlackBerry([0-9]+[ei]?)\/([0-9.]*)/u', $ua, $match)) {
+                    $this->data->device->model = $match[1];
+                    $this->data->os->version = new Version([ 'value' => $match[2], 'details' => 2 ]);
+                }
+
+                if (preg_match('/; BlackBerry ([0-9]*);/u', $ua, $match)) {
+                    $this->data->device->model = $match[1];
+                }
+
+                if (preg_match('/; ([0-9]+)[^;\)]+\)/u', $ua, $match)) {
+                    $this->data->device->model = $match[1];
+                }
+
+                if (preg_match('/Version\/([0-9.]*)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+                }
+
+                if (isset($this->data->os->version) && $this->data->os->version->toFloat() >= 10) {
+                    $this->data->os->name = 'BlackBerry';
+                }
+
+                if ($this->data->device->model) {
+                    $device = Data\DeviceModels::identify('blackberry', $this->data->device->model);
+
+                    if ($device->identified) {
+                        $device->identified |= $this->data->device->identified;
+                        $this->data->device = $device;
+                    }
+                }
+            }
+        }
+
+        /* BlackBerry 10 */
+
+        if (preg_match('/\(BB(1[^;]+); ([^\)]+)\)/u', $ua, $match)) {
+            $this->data->os->name = 'BlackBerry';
+            $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+
+            $this->data->device->manufacturer = 'BlackBerry';
+            $this->data->device->model = $match[2];
+
+            if ($this->data->device->model == 'Kbd') {
+                $this->data->device->model = 'Q series or Passport';
+            }
+
+            if ($this->data->device->model == 'Touch') {
+                $this->data->device->model = 'A or Z series';
+            }
+
+            if ($this->data->device->model == 'STL100-2') {
+                $this->data->device->model = 'Z10';
+            }
+
+            $this->data->device->type = preg_match('/Mobile/u', $ua) ? Constants\DeviceType::MOBILE : Constants\DeviceType::TABLET;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+
+            if (preg_match('/Version\/([0-9.]+)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+            }
+        }
+
+        /* BlackBerry Tablet OS */
+
+        if (preg_match('/RIM Tablet OS ([0-9.]*)/u', $ua, $match)) {
+            $this->data->os->name = 'BlackBerry Tablet OS';
+            $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+
+            $this->data->device->manufacturer = 'RIM';
+            $this->data->device->model = 'BlackBerry PlayBook';
+            $this->data->device->type = Constants\DeviceType::TABLET;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        } elseif (preg_match('/\(PlayBook;/u', $ua) && preg_match('/PlayBook Build\/([0-9.]*)/u', $ua, $match)) {
+            $this->data->os->name = 'BlackBerry Tablet OS';
+            $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+
+            $this->data->device->manufacturer = 'RIM';
+            $this->data->device->model = 'BlackBerry PlayBook';
+            $this->data->device->type = Constants\DeviceType::TABLET;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+        } elseif (preg_match('/PlayBook/u', $ua) && !preg_match('/Android/u', $ua)) {
+            if (preg_match('/Version\/([0-9.]*)/u', $ua, $match)) {
+                $this->data->os->name = 'BlackBerry Tablet OS';
+                $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+
+                $this->data->device->manufacturer = 'RIM';
+                $this->data->device->model = 'BlackBerry PlayBook';
+                $this->data->device->type = Constants\DeviceType::TABLET;
+                $this->data->device->identified |= Constants\Id::MATCH_UA;
+            }
+        }
+
+        /* Internal versions of BlackBerry 10 running on the Playbook */
+
+        if ($this->data->isOs('BlackBerry Tablet OS', '>=', 10)) {
+            $this->data->os->name = 'BlackBerry';
+        }
+    }
+
+
+    /* Chrome OS */
+
+    private function detectChromeos($ua)
+    {
+        /* ChromeCast */
+
+        if (preg_match('/CrKey/u', $ua) && !preg_match('/Espial/u', $ua)) {
+            $this->data->device->manufacturer = 'Google';
+            $this->data->device->model = 'Chromecast';
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+            $this->data->device->identified |= Constants\Id::MATCH_UA;
+            $this->data->device->generic = false;
+        }
+
+        /* Chrome OS */
+
+        if (preg_match('/CrOS/u', $ua)) {
+            $this->data->os->name = 'Chrome OS';
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+    }
+
+
+    /* Open TV */
+
+    private function detectOpenTV($ua)
+    {
+        if (preg_match('/OpenTV/ui', $ua, $match)) {
+            $this->data->device->type = Constants\DeviceType::TELEVISION;
+
+            $this->data->os->name = 'OpenTV';
+            $this->data->os->version = null;
+
+            if (preg_match('/OpenTV Build\/([0-9\.]+)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if (preg_match('/OpenTV ([0-9\.]+)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if (preg_match('/Opentv([0-9]+)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if (preg_match('/OTV([0-9\.]+)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+    }
+
+
+    /* Qtopia */
+
+    private function detectQtopia($ua)
+    {
+        if (preg_match('/Qtopia/u', $ua)) {
+            $this->data->os->name = 'Qtopia';
+
+            if (preg_match('/Qtopia\/([0-9.]+)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+    }
+
+
+    /* Unix */
+
+    private function detectUnix($ua)
+    {
+        if (!preg_match('/(UNIX|OSF|ULTRIX|HP-UX|SunOS|Solaris|AIX|IRIX|NEWS-OS|GENIX)/ui', $ua)) {
+            return;
+        }
+
+        /* Unix */
+
+        if (preg_match('/Unix/iu', $ua)) {
+            $this->data->os->name = 'Unix';
+        }
+
+        /* Unix System V */
+
+        if (preg_match('/(?:UNIX_System_V|UNIX_SV) ([0-9.]*)/u', $ua, $match)) {
+            $this->data->os->name = 'UNIX System V';
+            $this->data->os->family = new Family([ 'name' => 'UNIX' ]);
+            $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+
+        /* Digital Unix */
+
+        if (preg_match('/OSF1?[ _]/u', $ua)) {
+            $this->data->os->name = 'Digital Unix';
+            $this->data->os->family = new Family([ 'name' => 'UNIX' ]);
+
+            if (preg_match('/OSF1?[ _]V?([0-9.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+
+        /* Digital ULTRIX */
+
+        if (preg_match('/ULTRIX/u', $ua)) {
+            $this->data->os->name = 'ULTRIX';
+            $this->data->os->family = new Family([ 'name' => 'BSD' ]);
+
+            if (preg_match('/ULTRIX ([0-9.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+
+        /* HP-UX */
+
+        if (preg_match('/HP-UX/u', $ua)) {
+            $this->data->os->name = 'HP-UX';
+            $this->data->os->family = new Family([ 'name' => 'UNIX' ]);
+
+            if (preg_match('/HP-UX [A-Z].0?([1-9][0-9.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+
+        /* Solaris */
+
+        if (preg_match('/SunOS/u', $ua)) {
+            $this->data->os->name = 'Solaris';
+            $this->data->os->family = new Family([ 'name' => 'UNIX' ]);
+
+            if (preg_match('/SunOS ([1234]\.[0-9\.]+)/u', $ua, $match)) {
+                $this->data->os->name = 'SunOS';
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                $this->data->os->family = new Family([ 'name' => 'BSD' ]);
+
+                if (preg_match('/SunOS 4\.1\.([1234])/u', $ua, $match)) {
+                    $this->data->os->name = 'Solaris';
+
+                    switch ($match[1]) {
+                        case '1':
+                            $this->data->os->version = new Version([ 'value' => '1.0' ]);
+                            break;
+                        case '2':
+                            $this->data->os->version = new Version([ 'value' => '1.0.1' ]);
+                            break;
+                        case '3':
+                            $this->data->os->version = new Version([ 'value' => '1.1' ]);
+                            break;
+                        case '4':
+                            $this->data->os->version = new Version([ 'value' => '1.1.2' ]);
+                            break;
+                    }
+                }
+            }
+
+            if (preg_match('/SunOS 5\.([123456](?:\.[0-9\.]*)?) /u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => '2.' . $match[1] ]);
+            } else if (preg_match('/SunOS 5\.([0-9\.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+
+        if (preg_match('/Solaris(?: ([0-9\.]+))?;/u', $ua, $match)) {
+            $this->data->os->name = 'Solaris';
+            $this->data->os->family = new Family([ 'name' => 'UNIX' ]);
+
+            if (preg_match('/Solaris ([0-9\.]+);/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+
+        /* AIX */
+
+        if (preg_match('/AIX/u', $ua)) {
+            $this->data->os->name = 'AIX';
+            $this->data->os->family = new Family([ 'name' => 'UNIX' ]);
+
+            if (preg_match('/AIX ([0-9.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+
+        /* IRIX */
+
+        if (preg_match('/IRIX/u', $ua)) {
+            $this->data->os->name = 'IRIX';
+            $this->data->os->family = new Family([ 'name' => 'UNIX' ]);
+
+            if (preg_match('/IRIX ([0-9.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            if (preg_match('/IRIX;?(?:64|32) ([0-9.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+
+        /* Sony NEWS OS */
+
+        if (preg_match('/NEWS-OS ([0-9\.]+)/u', $ua, $match)) {
+            $this->data->os->name = 'NEWS OS';
+            $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            $this->data->os->family = new Family([ 'name' => 'BSD' ]);
+
+
+            if (preg_match('/NEWS-OS [56]/u', $ua)) {
+                $this->data->os->family = new Family([ 'name' => 'UNIX' ]);
+            }
+
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+
+        /* NEC EWS-UX */
+
+        if (preg_match('/EWS-UNIX rev ([0-9\.]+)/u', $ua, $match)) {
+            $this->data->os->name = 'EWS-UX';
+            $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            $this->data->os->family = new Family([ 'name' => 'UNIX' ]);
+
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+
+        /* National Semiconductors GENIX */
+
+        if (preg_match('/GENIX ([0-9\.]+)/u', $ua, $match)) {
+            $this->data->os->name = 'GENIX';
+            $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            $this->data->os->family = new Family([ 'name' => 'BSD' ]);
+
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+    }
+
+
+    /* BSD */
+
+    private function detectBsd($ua)
+    {
+        if (!preg_match('/(BSD|DragonFly)/ui', $ua)) {
+            return;
+        }
+
+        if (preg_match('/X11/u', $ua)) {
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+
+        /* BSD/OS */
+
+        if (preg_match('/BSD\/386/u', $ua)) {
+            $this->data->os->name = 'BSD/OS';
+            $this->data->os->family = new Family([ 'name' => 'BSD' ]);
+        }
+
+        if (preg_match('/BSD\/OS/u', $ua)) {
+            $this->data->os->name = 'BSD/OS';
+            $this->data->os->family = new Family([ 'name' => 'BSD' ]);
+
+            if (preg_match('/BSD\/OS ([0-9.]*)/u', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+        /* FreeBSD */
+
+        if (preg_match('/FreeBSD/iu', $ua)) {
+            $this->data->os->name = 'FreeBSD';
+            $this->data->os->family = new Family([ 'name' => 'BSD' ]);
+
+            if (preg_match('/FreeBSD[ -\/]?([0-9.]*)/iu', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+        /* OpenBSD */
+
+        if (preg_match('/OpenBSD/iu', $ua)) {
+            $this->data->os->name = 'OpenBSD';
+            $this->data->os->family = new Family([ 'name' => 'BSD' ]);
+
+            if (preg_match('/OpenBSD ?([0-9.]*)/iu', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+        /* NetBSD */
+
+        if (preg_match('/NetBSD/iu', $ua)) {
+            $this->data->os->name = 'NetBSD';
+            $this->data->os->family = new Family([ 'name' => 'BSD' ]);
+
+            if (preg_match('/NetBSD ?([0-9.]*)/iu', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+        }
+
+        /* DragonFly */
+
+        if (preg_match('/DragonFly/iu', $ua)) {
+            $this->data->os->name = 'DragonFly BSD';
+            $this->data->os->family = new Family([ 'name' => 'BSD' ]);
+        }
+    }
+
+
+    /* Linux */
+
+    private function detectLinux($ua)
+    {
+        if (preg_match('/Linux/u', $ua)) {
+            $this->data->os->name = 'Linux';
+
+            if (preg_match('/X11/u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Antergos Linux/u', $ua)) {
+                $this->data->os->name = 'Antergos Linux';
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Arch ?Linux/u', $ua)) {
+                $this->data->os->name = 'Arch Linux';
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Black Lab Linux/u', $ua)) {
+                $this->data->os->name = 'Black Lab Linux';
+                if (preg_match('/Black Lab Linux ([0-9\.]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/CentOS/u', $ua)) {
+                $this->data->os->name = 'CentOS';
+                if (preg_match('/CentOS\/[0-9\.\-]+el([0-9_]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]) ]);
+                }
+
+                if (preg_match('/CentOS Linux release ([0-9\.]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Debian/u', $ua)) {
+                $this->data->os->name = 'Debian';
+                if (preg_match('/Debian\/([0-9.]*)/iu', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                if (preg_match('/Debian GNU\/Linux ([0-9\.]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/elementary OS/u', $ua)) {
+                $this->data->os->name = 'elementary OS';
+                if (preg_match('/elementary OS ([A-Za-z]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'alias' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Fedora/u', $ua)) {
+                $this->data->os->name = 'Fedora';
+                if (preg_match('/Fedora\/[0-9\.\-]+fc([0-9]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]) ]);
+                }
+
+                if (preg_match('/Fedora release ([0-9\.]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Gentoo/u', $ua)) {
+                $this->data->os->name = 'Gentoo';
+                if (preg_match('/Gentoo Base System release ([0-9\.]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/gNewSense/u', $ua)) {
+                $this->data->os->name = 'gNewSense';
+                if (preg_match('/gNewSense\/[^\(]+\(([0-9\.]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Kubuntu/u', $ua)) {
+                $this->data->os->name = 'Kubuntu';
+                if (preg_match('/Kubuntu[ \/]([0-9.]*)/iu', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Linux Mint/u', $ua)) {
+                $this->data->os->name = 'Linux Mint';
+                if (preg_match('/Linux Mint ([0-9\.]+)/iu', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Mandriva Linux/u', $ua)) {
+                $this->data->os->name = 'Mandriva';
+                if (preg_match('/Mandriva Linux\/[0-9\.\-]+mdv([0-9]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Mageia/u', $ua)) {
+                $this->data->os->name = 'Mageia';
+                if (preg_match('/Mageia\/[0-9\.\-]+mga([0-9]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                if (preg_match('/Mageia ([0-9\.]+)/iu', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Mandriva/u', $ua)) {
+                $this->data->os->name = 'Mandriva';
+                if (preg_match('/Mandriva\/[0-9\.\-]+mdv([0-9]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/moonOS/u', $ua)) {
+                $this->data->os->name = 'moonOS';
+                if (preg_match('/moonOS\/([0-9.]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Red Hat/u', $ua)) {
+                $this->data->os->name = 'Red Hat';
+                if (preg_match('/Red Hat[^\/]*\/[0-9\.\-]+el([0-9_]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]) ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Slackware/u', $ua)) {
+                $this->data->os->name = 'Slackware';
+                if (preg_match('/Slackware[ \/](1[0-9.]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/SUSE/u', $ua)) {
+                $this->data->os->name = 'SUSE';
+                if (preg_match('/SUSE\/([0-9]\.[0-9]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                if (preg_match('/openSUSE ([0-9\.]+)/iu', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Turbolinux/u', $ua)) {
+                $this->data->os->name = 'Turbolinux';
+                if (preg_match('/Turbolinux\/([0-9]\.[0-9]+)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Ubuntu/u', $ua)) {
+                $this->data->os->name = 'Ubuntu';
+                if (preg_match('/Ubuntu\/([0-9.]*)/u', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                }
+
+                if (preg_match('/Ubuntu ([0-9\.]+)/iu', $ua, $match)) {
+                    $this->data->os->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
+                }
+
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/《붉은별》\/([0-9.]*)/iu', $ua, $match)) {
+                $this->data->os->name = 'Red Star';
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Fedora\/[0-9\.\-]+rs([0-9\.]+)/u', $ua, $match)) {
+                $this->data->os->name = 'Red Star';
+                $this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]) ]);
+                $this->data->device->type = Constants\DeviceType::DESKTOP;
+            }
+
+            if (preg_match('/Linux\/X2\/R1/u', $ua)) {
+                $this->data->os->name = 'LiMo';
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+
+
+            if (preg_match('/Linux\/SLP\/([0-9.]+)/u', $ua, $match)) {
+                $this->data->os->name = 'Linux SLP';
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+
+
+            if (preg_match('/LinuxOS\//u', $ua) && preg_match('/Software\/R5/u', $ua)) {
+                $this->data->os->name = 'EZX Linux';
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+        }
+
+        if (preg_match('/\(Ubuntu; (Mobile|Tablet)/u', $ua)) {
+            $this->data->os->name = 'Ubuntu Touch';
+
+            if (preg_match('/\(Ubuntu; Mobile/u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::MOBILE;
+            }
+            if (preg_match('/\(Ubuntu; Tablet/u', $ua)) {
+                $this->data->device->type = Constants\DeviceType::TABLET;
+            }
+        }
+
+        if (preg_match('/(?:\(|; )Ubuntu ([0-9.]+) like Android/u', $ua, $match)) {
+            $this->data->os->name = 'Ubuntu Touch';
+            $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+        }
+
+        if (preg_match('/Lindows ([0-9.]+)/u', $ua, $match)) {
+            $this->data->os->name = 'Lindows';
+            $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            $this->data->device->type = Constants\DeviceType::DESKTOP;
+        }
+    }
+
+
+    /* Brew */
+
+    private function detectBrew($ua)
+    {
+        if (preg_match('/REX; U/ui', $ua) || preg_match('/REXL4/ui', $ua)) {
+            $this->data->os->name = 'REX';
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            if (preg_match('/REX; U; [^;]+; ([^;]+); ([^;\/]+)[^;]*; NetFront/u', $ua, $match)) {
+                $this->data->device->manufacturer = Data\Manufacturers::identify(Constants\DeviceType::MOBILE, $match[1]);
+                $this->data->device->model = $match[2];
+                $this->data->device->identified = Constants\Id::PATTERN;
+
+                $device = Data\DeviceModels::identify('brew', $match[2]);
+
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+        }
+
+        if (preg_match('/[\(\s\-;]BREW[\s\/\-;]/ui', $ua) || preg_match('/BMP( [0-9.]*)?; U/u', $ua) || preg_match('/B(?:rew)?MP\/([0-9.]*)/u', $ua)) {
+            $this->data->os->name = 'Brew';
+
+            if (preg_match('/BREW MP/iu', $ua) || preg_match('/B(rew)?MP/iu', $ua)) {
+                $this->data->os->name = 'Brew MP';
+            }
+
+            if (preg_match('/; Brew ([0-9.]+);/iu', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            } elseif (preg_match('/BREW; U; ([0-9.]+)/iu', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            } elseif (preg_match('/[\(;]BREW[\/ ]([0-9.]+)/iu', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            } elseif (preg_match('/BREW MP ([0-9.]*)/iu', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            } elseif (preg_match('/BMP ([0-9.]*); U/iu', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            } elseif (preg_match('/B(?:rew)?MP\/([0-9.]*)/iu', $ua, $match)) {
+                $this->data->os->version = new Version([ 'value' => $match[1] ]);
+            }
+
+            $this->data->device->type = Constants\DeviceType::MOBILE;
+
+            if (preg_match('/(?:Brew MP|BREW|BMP) [^;]+; U; [^;]+; ([^;]+); NetFront[^\)]+\) [^\s]+ ([^\s]+)/u', $ua, $match)) {
+                $this->data->device->manufacturer = Data\Manufacturers::identify(Constants\DeviceType::MOBILE, $match[1]);
+                $this->data->device->model = $match[2];
+                $this->data->device->identified = Constants\Id::PATTERN;
+
+                $device = Data\DeviceModels::identify('brew', $match[2]);
+
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if (preg_match('/\(([^;]+);U;REX\/[^;]+;BREW\/[^;]+;(?:.*;)?[0-9]+\*[0-9]+(?:;CTC\/2.0)?\)/u', $ua, $match)) {
+                $this->data->device->model = $match[1];
+                $this->data->device->identified = Constants\Id::PATTERN;
+
+                $device = Data\DeviceModels::identify('brew', $match[1]);
+
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if (preg_match('/\(BREW [^;]+; U; [^;]+; [^;]+; ([^;]+); (Polaris|Netfront)\/[0-9\.]+\/(WAP|AMB|INT)\)/ui', $ua, $match)) {
+                $this->data->device->model = $match[1];
+                $this->data->device->identified = Constants\Id::PATTERN;
+
+                $device = Data\DeviceModels::identify('brew', $match[1]);
+
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+
+            if (preg_match('/\(BREW [^;]+; U; [^;]+; [^;]+; Opera Mobi; Presto\/[0-9\.]+\/(?:WAP|AMB|INT)\) ([^\/]+) [^\/]+\//ui', $ua, $match)) {
+                $this->data->device->model = $match[1];
+                $this->data->device->identified = Constants\Id::PATTERN;
+
+                $device = Data\DeviceModels::identify('brew', $match[1]);
+
+                if ($device->identified) {
+                    $device->identified |= $this->data->device->identified;
+                    $this->data->device = $device;
+                }
+            }
+        }
+    }
+
+
+    /* Remaining operating systems */
+
+    private function detectRemainingOperatingSystems($ua)
+    {
+        if (!preg_match('/(BeOS|Haiku|AmigaOS|MorphOS|AROS|VMS|RISC|Joli|OS\/2|Inferno|Syllable|Grid|MTK|MRE|MAUI|Nucleus|QNX|VRE|SpreadTrum|ThreadX)/ui', $ua)) {
+            return;
+        }
+
+        $patterns = [
+            [ 'name' => 'BeOS',         'regexp' => [ '/BeOS/iu' ],                                         'type' => Constants\DeviceType::DESKTOP ],
+            [ 'name' => 'Haiku',        'regexp' => [ '/Haiku/iu' ],                                        'type' => Constants\DeviceType::DESKTOP ],
+            [ 'name' => 'AmigaOS',      'regexp' => [ '/AmigaOS ?([0-9.]+)/iu', '/AmigaOS/iu' ],            'type' => Constants\DeviceType::DESKTOP ],
+            [ 'name' => 'MorphOS',      'regexp' => [ '/MorphOS(?: ([0-9.]*))?/iu' ],                       'type' => Constants\DeviceType::DESKTOP ],
+            [ 'name' => 'AROS',         'regexp' => [ '/AROS/iu' ],                                         'type' => Constants\DeviceType::DESKTOP ],
+            [ 'name' => 'OpenVMS',      'regexp' => [ '/OpenVMS V([0-9.]+)/iu', '/OpenVMS/iu' ],            'type' => Constants\DeviceType::DESKTOP ],
+            [ 'name' => 'RISC OS',      'regexp' => [ '/RISC OS(?:-NC)? ([0-9.]*)/iu', '/RISC OS/iu' ],     'type' => Constants\DeviceType::DESKTOP ],
+            [ 'name' => 'Joli OS',      'regexp' => [ '/Joli OS\/([0-9.]*)/iu' ],                           'type' => Constants\DeviceType::DESKTOP ],
+            [ 'name' => 'OS/2',         'regexp' => [ '/OS\/2;(?: (?:U; )?Warp ([0-9.]*))?/iu' ],           'type' => Constants\DeviceType::DESKTOP ],
+            [ 'name' => 'Inferno',      'regexp' => [ '/Inferno/iu' ],                                      'type' => Constants\DeviceType::DESKTOP ],
+            [ 'name' => 'Syllable',     'regexp' => [ '/Syllable/iu' ],                                     'type' => Constants\DeviceType::DESKTOP ],
+
+            [ 'name' => 'Grid OS',      'regexp' => [ '/Grid OS ([0-9.]*)/iu' ],                            'type' => Constants\DeviceType::TABLET ],
+
+            [ 'name' => 'MRE',          'regexp' => [ '/\(MTK;/iu', '/\/MTK /iu' ],                         'type' => Constants\DeviceType::MOBILE ],
+            [ 'name' => 'MRE',          'regexp' => [ '/MRE\\\\/iu' ],                                      'type' => Constants\DeviceType::MOBILE ],
+            [ 'name' => 'MRE',          'regexp' => [ '/MAUI[-_ ](?:Browser|Runtime)/iu' ],                 'type' => Constants\DeviceType::MOBILE ],
+            [ 'name' => 'MRE',          'regexp' => [ '/Browser\/MAUI/iu' ],                                'type' => Constants\DeviceType::MOBILE ],
+            [ 'name' => 'MRE',          'regexp' => [ '/Nucleus RTOS\//iu' ],                               'type' => Constants\DeviceType::MOBILE ],
+            [ 'name' => 'MRE',          'regexp' => [ '/\/Nucleus/iu' ],                                    'type' => Constants\DeviceType::MOBILE ],
+            [ 'name' => 'MRE',          'regexp' => [ '/Nucleus\//iu' ],                                    'type' => Constants\DeviceType::MOBILE ],
+
+            [ 'name' => 'QNX',          'regexp' => [ '/QNX/iu' ],                                          'type' => Constants\DeviceType::MOBILE ],
+            [ 'name' => 'VRE',          'regexp' => [ '/\(VRE;/iu' ],                                       'type' => Constants\DeviceType::MOBILE ],
+            [ 'name' => 'SpreadTrum',   'regexp' => [ '/\(SpreadTrum;/iu' ],                                'type' => Constants\DeviceType::MOBILE ],
+
+            [ 'name' => 'ThreadX',      'regexp' => [ '/ThreadX(?:_OS)?\/([0-9.]*)/iu' ] ],
+        ];
+
+        $count = count($patterns);
+        for ($b = 0; $b < $count; $b++) {
+            for ($r = 0; $r < count($patterns[$b]['regexp']); $r++) {
+
+                if (preg_match($patterns[$b]['regexp'][$r], $ua, $match)) {
+                    $this->data->os->name = $patterns[$b]['name'];
+
+                    if (isset($match[1]) && $match[1]) {
+                        $this->data->os->version = new Version([ 'value' => $match[1], 'details' => isset($patterns[$b]['details']) ? $patterns[$b]['details'] : null ]);
+                    } else {
+                        $this->data->os->version = null;
+                    }
+
+                    if (isset($patterns[$b]['type'])) {
+                        $this->data->device->type = $patterns[$b]['type'];
+                    }
+
+                    break;
+                }
+            }
+        }
+    }
+}

+ 59 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Useragent/Using.php

@@ -0,0 +1,59 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header\Useragent;
+
+use WhichBrowser\Model\Version;
+
+trait Using
+{
+    private function &detectUsing($ua)
+    {
+        if (!preg_match('/(AdobeAIR|Awesomium|Embedded|bsalsa|Canvace|Ekioh|AtomShell|Electron|JavaFX|GFXe|luakit|Titanium|OpenWebKitSharp|Prism|Qt|Reqwireless|RhoSimulator|UWebKit|nw-tests|WebKit2)/ui', $ua)) {
+            return $this;
+        }
+
+        $items = [
+            [ 'name' => 'AdobeAIR',                         'regexp' => '/AdobeAIR\/([0-9.]*)/u' ],
+            [ 'name' => 'Awesomium',                        'regexp' => '/Awesomium\/([0-9.]*)/u' ],
+            [ 'name' => 'Delphi Embedded Web Browser',      'regexp' => '/EmbeddedWB ([0-9.]*)/u' ],
+            [ 'name' => 'Delphi Embedded Web Browser',      'regexp' => '/bsalsa\.com/u' ],
+            [ 'name' => 'Delphi Embedded Web Browser',      'regexp' => '/Embedded Web Browser/u' ],
+            [ 'name' => 'Canvace',                          'regexp' => '/Canvace Standalone\/([0-9.]*)/u' ],
+            [ 'name' => 'Ekioh',                            'regexp' => '/Ekioh\/([0-9.]*)/u' ],
+            [ 'name' => 'Electron',                         'regexp' => '/AtomShell\/([0-9.]*)/u' ],
+            [ 'name' => 'Electron',                         'regexp' => '/Electron\/([0-9.]*)/u' ],
+            [ 'name' => 'JavaFX',                           'regexp' => '/JavaFX\/([0-9.]*)/u' ],
+            [ 'name' => 'GFXe',                             'regexp' => '/GFXe\/([0-9.]*)/u' ],
+            [ 'name' => 'LuaKit',                           'regexp' => '/luakit/u' ],
+            [ 'name' => 'Titanium',                         'regexp' => '/Titanium\/([0-9.]*)/u' ],
+            [ 'name' => 'OpenWebKitSharp',                  'regexp' => '/OpenWebKitSharp/u' ],
+            [ 'name' => 'Prism',                            'regexp' => '/Prism\/([0-9.]*)/u' ],
+            [ 'name' => 'Qt',                               'regexp' => '/Qt\/([0-9.]*)/u' ],
+            [ 'name' => 'Qt',                               'regexp' => '/QtWebEngine\/([4-9][0-9.]*)?/u' ],
+            [ 'name' => 'Qt',                               'regexp' => '/QtEmbedded/u' ],
+            [ 'name' => 'Qt',                               'regexp' => '/QtEmbedded.*Qt\/([0-9.]*)/u' ],
+            [ 'name' => 'ReqwirelessWeb',                   'regexp' => '/ReqwirelessWeb\/([0-9.]*)/u' ],
+            [ 'name' => 'RhoSimulator',                     'regexp' => '/RhoSimulator/u' ],
+            [ 'name' => 'UWebKit',                          'regexp' => '/UWebKit\/([0-9.]*)/u' ],
+            [ 'name' => 'Node-WebKit',                      'regexp' => '/nw-tests\/([0-9.]*)/u' ],
+            [ 'name' => 'WebKit2.NET',                      'regexp' => '/WebKit2.NET/u' ],
+        ];
+
+        $count = count($items);
+        for ($i = 0; $i < $count; $i++) {
+            if (preg_match($items[$i]['regexp'], $ua, $match)) {
+                $this->data->browser->using = new \WhichBrowser\Model\Using([
+                    'name' => $items[$i]['name']
+                ]);
+
+                if (isset($match[1]) && $match[1]) {
+                    $this->data->browser->using->version = new Version([ 'value' => $match[1], 'details' => isset($items[$i]['details']) ? $items[$i]['details'] : null ]);
+                }
+
+                break;
+            }
+        }
+
+        return $this;
+    }
+}

+ 41 - 0
Qii/Library/Third/WhichBrowser/Analyser/Header/Wap.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace WhichBrowser\Analyser\Header;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Data;
+
+class Wap
+{
+    public function __construct($header, &$data)
+    {
+        $this->data =& $data;
+
+        $header = trim($header);
+
+        if ($header[0] == '"') {
+            $header = explode(",", $header);
+            $header = trim($header[0], '"');
+        }
+
+        $result = Data\DeviceProfiles::identify($header);
+
+        if ($result) {
+            $this->data->device->manufacturer = $result[0];
+            $this->data->device->model = $result[1];
+            $this->data->device->identified |= Constants\Id::MATCH_PROF;
+
+            if (!empty($result[2]) && (!isset($this->data->os->name) || $this->data->os->name != $result[2])) {
+                $this->data->os->name = $result[2];
+                $this->data->os->version = null;
+
+                $this->data->engine->name = null;
+                $this->data->engine->version = null;
+            }
+
+            if (isset($result[3])) {
+                $this->data->device->type = $result[3];
+            }
+        }
+    }
+}

+ 110 - 0
Qii/Library/Third/WhichBrowser/Cache.php

@@ -0,0 +1,110 @@
+<?php
+
+namespace WhichBrowser;
+
+use Psr\Cache\CacheItemPoolInterface;
+
+trait Cache
+{
+    private $cache;
+    private $expires;
+
+    /**
+     * @var boolean     $cached   Was this result retrieve from the cache?
+     */
+
+    public $cached = false;
+
+
+    /**
+     * Enable caching of results
+     *
+     * @param  object   $cache     An PSR-6 cache pool (an object that implements Psr\Cache\CacheItemPoolInterface)
+     * @param  int      $expires   Optional the number of seconds after which a cached item expires, default is 15 minutes
+     */
+
+    public function setCache($cache, $expires = 900)
+    {
+        $this->cache = $cache;
+        $this->expires = $expires;
+    }
+
+
+    /**
+     * Apply cached data to the main Parser object
+     *
+     * @internal
+     *
+     * @param  array    $data      An array with a key for every property it needs to apply
+     */
+
+    private function applyCachedData($data)
+    {
+        foreach ($data as $key => $value) {
+            $this->$key = $value;
+        }
+
+        $this->cached = true;
+    }
+
+
+    /**
+     * Retrieve the data that can be cached from the main Parser object
+     *
+     * @internal
+     *
+     * @return  array    An array with a key for every property that will be cached
+     */
+
+    private function retrieveCachedData()
+    {
+        return [
+            'browser' => $this->browser,
+            'engine' => $this->engine,
+            'os' => $this->os,
+            'device' => $this->device,
+            'camouflage' => $this->camouflage,
+            'features' => $this->features
+        ];
+    }
+
+
+    /**
+     * Retrieve the result from the cache, or analyse and store in the cache
+     *
+     * @internal
+     *
+     * @param  array|string     $headers   An array with all of the headers or a string with just the User-Agent header
+     *
+     * @return  boolean         did we actually retrieve or analyse results
+     */
+
+    private function analyseWithCache($headers, $options = [])
+    {
+        if (isset($options['cache'])) {
+            if (isset($options['cacheExpires'])) {
+                $this->setCache($options['cache'], $options['cacheExpires']);
+            } else {
+                $this->setCache($options['cache']);
+            }
+        }
+
+        if ($this->cache instanceof CacheItemPoolInterface) {
+            $item = $this->cache->getItem('whichbrowser_' . md5(serialize($headers)));
+
+            if ($item->isHit()) {
+                $this->applyCachedData($item->get());
+            } else {
+                $analyser = new Analyser($headers, $options);
+                $analyser->setdata($this);
+                $analyser->analyse();
+
+                $item->set($this->retrieveCachedData());
+                $item->expiresAfter($this->expires);
+                $this->cache->save($item);
+            }
+
+            return true;
+        }
+    }
+}

+ 28 - 0
Qii/Library/Third/WhichBrowser/Constants/BrowserType.php

@@ -0,0 +1,28 @@
+<?php
+
+
+namespace WhichBrowser\Constants;
+
+class BrowserType
+{
+    const UNKNOWN = '';
+
+    const BROWSER = 'browser';
+    const BROWSER_TEXT = 'browser:text';
+
+    const APP = 'app';
+    const APP_EMAIL = 'app:email';
+    const APP_GAME = 'app:game';
+    const APP_MEDIAPLAYER = 'app:mediaplayer';
+    const APP_FEEDREADER = 'app:feedreader';
+    const APP_PODCAST = 'app:podcast';
+    const APP_SOCIAL = 'app:social';
+    const APP_OFFICE = 'app:office';
+    const APP_EDITOR = 'app:editor';
+    const APP_DOWNLOAD = 'app:download';
+    const APP_SEARCH = 'app:search';
+    const APP_NEWS = 'app:news';
+    const APP_ANTIVIRUS = 'app:antivirus';
+    const APP_SHOPPING = 'app:shopping';
+    const APP_CHAT = 'app:chat';
+}

+ 13 - 0
Qii/Library/Third/WhichBrowser/Constants/DeviceSubType.php

@@ -0,0 +1,13 @@
+<?php
+
+
+namespace WhichBrowser\Constants;
+
+class DeviceSubType
+{
+    const FEATURE = 'feature';
+    const SMART = 'smart';
+    const DESKTOP = 'desktop';
+    const CONSOLE = 'console';
+    const PORTABLE = 'portable';
+}

+ 32 - 0
Qii/Library/Third/WhichBrowser/Constants/DeviceType.php

@@ -0,0 +1,32 @@
+<?php
+
+
+namespace WhichBrowser\Constants;
+
+class DeviceType
+{
+    const DESKTOP = 'desktop';
+    const MOBILE = 'mobile';
+    const PDA = 'pda';
+    const DECT = 'dect';
+    const TABLET = 'tablet';
+    const GAMING = 'gaming';
+    const EREADER = 'ereader';
+    const MEDIA = 'media';
+    const HEADSET = 'headset';
+    const WATCH = 'watch';
+    const EMULATOR = 'emulator';
+    const TELEVISION = 'television';
+    const MONITOR = 'monitor';
+    const CAMERA = 'camera';
+    const PRINTER = 'printer';
+    const SIGNAGE = 'signage';
+    const WHITEBOARD = 'whiteboard';
+    const DEVBOARD = 'devboard';
+    const INFLIGHT = 'inflight';
+    const APPLIANCE = 'appliance';
+    const GPS = 'gps';
+    const CAR = 'car';
+    const POS = 'pos';
+    const BOT = 'bot';
+}

+ 14 - 0
Qii/Library/Third/WhichBrowser/Constants/EngineType.php

@@ -0,0 +1,14 @@
+<?php
+
+
+namespace WhichBrowser\Constants;
+
+class EngineType
+{
+    const TRIDENT = 1;
+    const PRESTO = 2;
+    const CHROMIUM = 4;
+    const GECKO = 8;
+    const WEBKIT = 16;
+    const V8 = 32;
+}

+ 15 - 0
Qii/Library/Third/WhichBrowser/Constants/Feature.php

@@ -0,0 +1,15 @@
+<?php
+
+
+namespace WhichBrowser\Constants;
+
+class Feature
+{
+    const SANDBOX = 1;
+    const WEBSOCKET = 2;
+    const WORKER = 4;
+    const APPCACHE = 8;
+    const HISTORY = 16;
+    const FULLSCREEN = 32;
+    const FILEREADER = 64;
+}

+ 17 - 0
Qii/Library/Third/WhichBrowser/Constants/Flag.php

@@ -0,0 +1,17 @@
+<?php
+
+
+namespace WhichBrowser\Constants;
+
+class Flag
+{
+    const GOOGLETV = 1;
+    const GOOGLEGLASS = 2;
+    const ANDROIDWEAR = 4;
+    const ANDROIDTV = 8;
+    const NOKIAX = 16;
+    const FIREOS = 32;
+    const UIQ = 64;
+    const S60 = 128;
+    const MOAPS = 256;
+}

+ 13 - 0
Qii/Library/Third/WhichBrowser/Constants/Id.php

@@ -0,0 +1,13 @@
+<?php
+
+
+namespace WhichBrowser\Constants;
+
+class Id
+{
+    const NONE = 0;
+    const INFER = 1;
+    const PATTERN = 2;
+    const MATCH_UA = 4;
+    const MATCH_PROF = 8;
+}

+ 99 - 0
Qii/Library/Third/WhichBrowser/Data/Applications.php

@@ -0,0 +1,99 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+use WhichBrowser\Model\Browser;
+use WhichBrowser\Model\Version;
+
+class Applications
+{
+    public static $BOTS = [];
+    public static $BOTS_REGEX = '';
+
+    public static $BROWSERS = [];
+    public static $BROWSERS_REGEX = '';
+
+    public static $OTHERS = [];
+    public static $OTHERS_REGEX = '';
+
+
+    public static function identifyBrowser($ua)
+    {
+        require_once __DIR__ . '/../../data/regexes/applications-browsers.php';
+
+        if (preg_match(self::$BROWSERS_REGEX, $ua)) {
+            require_once __DIR__ . '/../../data/applications-browsers.php';
+
+            foreach (self::$BROWSERS as $type => $list) {
+                foreach ($list as $i => $item) {
+
+                    if (preg_match($item['regexp'], $ua, $match)) {
+                        return [
+                            'browser' => [
+                                'name'      => $item['name'],
+                                'hidden'    => isset($item['hidden']) ? $item['hidden'] : false,
+                                'stock'     => false,
+                                'channel'   => '',
+                                'type'      => $type,
+                                'version'   => isset($match[1]) && $match[1] ? new Version([ 'value' => $match[1], 'details' => isset($item['details']) ? $item['details'] : null ]) : null
+                            ],
+
+                            'device' => isset($item['type']) ? [
+                                'type'      => $item['type']
+                            ] : null
+                        ];
+                    }
+                }
+            }
+        }
+    }
+
+    public static function identifyOther($ua)
+    {
+        require_once __DIR__ . '/../../data/regexes/applications-others.php';
+
+        if (preg_match(self::$OTHERS_REGEX, $ua)) {
+            require_once __DIR__ . '/../../data/applications-others.php';
+
+            foreach (self::$OTHERS as $type => $list) {
+                foreach ($list as $i => $item) {
+
+                    if (preg_match($item['regexp'], $ua, $match)) {
+                        return [
+                            'browser' => [
+                                'name'      => $item['name'],
+                                'hidden'    => isset($item['hidden']) ? $item['hidden'] : false,
+                                'stock'     => false,
+                                'channel'   => '',
+                                'type'      => $type,
+                                'version'   => isset($match[1]) && $match[1] ? new Version([ 'value' => $match[1], 'details' => isset($item['details']) ? $item['details'] : null ]) : null
+                            ],
+
+                            'device' => isset($item['type']) ? [
+                                'type'      => $item['type']
+                            ] : null
+                        ];
+                    }
+                }
+            }
+        }
+    }
+    public static function identifyBot($ua)
+    {
+        require_once __DIR__ . '/../../data/regexes/applications-bots.php';
+
+        if (preg_match(self::$BOTS_REGEX, $ua)) {
+            require_once __DIR__ . '/../../data/applications-bots.php';
+
+            foreach (self::$BOTS as $i => $item) {
+                if (preg_match($item['regexp'], $ua, $match)) {
+                    return new Browser([
+                        'name'      => $item['name'],
+                        'stock'     => false,
+                        'version'   => isset($match[1]) && $match[1] ? new Version([ 'value' => $match[1], 'details' => isset($item['details']) ? $item['details'] : null ]) : null
+                    ]);
+                }
+            }
+        }
+    }
+}

+ 17 - 0
Qii/Library/Third/WhichBrowser/Data/BrowserIds.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+class BrowserIds
+{
+    public static $ANDROID_BROWSERS = [];
+
+    public static function identify($model)
+    {
+        require_once __DIR__ . '/../../data/id-android.php';
+
+        if (isset(BrowserIds::$ANDROID_BROWSERS[$model])) {
+            return BrowserIds::$ANDROID_BROWSERS[$model];
+        }
+    }
+}

+ 23 - 0
Qii/Library/Third/WhichBrowser/Data/BuildIds.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+use WhichBrowser\Model\Version;
+
+class BuildIds
+{
+    public static $ANDROID_BUILDS = [];
+
+    public static function identify($id)
+    {
+        require_once __DIR__ . '/../../data/build-android.php';
+
+        if (isset(BuildIds::$ANDROID_BUILDS[$id])) {
+            if (is_array(BuildIds::$ANDROID_BUILDS[$id])) {
+                return new Version(BuildIds::$ANDROID_BUILDS[$id]);
+            } else {
+                return new Version([ 'value' => BuildIds::$ANDROID_BUILDS[$id] ]);
+            }
+        }
+    }
+}

+ 27 - 0
Qii/Library/Third/WhichBrowser/Data/CFNetwork.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+class CFNetwork
+{
+    public static $OSX = [];
+    public static $IOS = [];
+
+    public static function getVersion($platform, $version)
+    {
+        require_once __DIR__ . '/../../data/os-cfnetwork.php';
+
+        switch ($platform) {
+            case 'osx':
+                if (isset(CFNetwork::$OSX[$version])) {
+                    return CFNetwork::$OSX[$version];
+                }
+                break;
+            case 'ios':
+                if (isset(CFNetwork::$IOS[$version])) {
+                    return CFNetwork::$IOS[$version];
+                }
+                break;
+        }
+    }
+}

+ 31 - 0
Qii/Library/Third/WhichBrowser/Data/Chrome.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+class Chrome
+{
+    public static $DESKTOP = [];
+    public static $MOBILE = [];
+
+    public static function getChannel($platform, $version)
+    {
+        require_once __DIR__ . '/../../data/browsers-chrome.php';
+
+        $version = implode('.', array_slice(explode('.', $version), 0, 3));
+
+        switch ($platform) {
+            case 'desktop':
+                if (isset(Chrome::$DESKTOP[$version])) {
+                    return Chrome::$DESKTOP[$version];
+                }
+                break;
+            case 'mobile':
+                if (isset(Chrome::$MOBILE[$version])) {
+                    return Chrome::$MOBILE[$version];
+                }
+                break;
+        }
+
+        return 'canary';
+    }
+}

+ 29 - 0
Qii/Library/Third/WhichBrowser/Data/Darwin.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+class Darwin
+{
+    public static $OSX = [];
+    public static $IOS = [];
+
+    public static function getVersion($platform, $version)
+    {
+        require_once __DIR__ . '/../../data/os-darwin.php';
+
+        $version = implode('.', array_slice(explode('.', $version), 0, 3));
+
+        switch ($platform) {
+            case 'osx':
+                if (isset(Darwin::$OSX[$version])) {
+                    return Darwin::$OSX[$version];
+                }
+                break;
+            case 'ios':
+                if (isset(Darwin::$IOS[$version])) {
+                    return Darwin::$IOS[$version];
+                }
+                break;
+        }
+    }
+}

+ 353 - 0
Qii/Library/Third/WhichBrowser/Data/DeviceModels.php

@@ -0,0 +1,353 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Model\Device;
+
+class DeviceModels
+{
+    public static $ANDROID_MODELS = [];
+    public static $ASHA_MODELS = [];
+    public static $BADA_MODELS = [];
+    public static $BREW_MODELS = [];
+    public static $FIREFOXOS_MODELS = [];
+    public static $TIZEN_MODELS = [];
+    public static $TOUCHWIZ_MODELS = [];
+    public static $WM_MODELS = [];
+    public static $WP_MODELS = [];
+    public static $PALMOS_MODELS = [];
+    public static $S30PLUS_MODELS = [];
+    public static $S40_MODELS = [];
+    public static $SYMBIAN_MODELS = [];
+    public static $FEATURE_MODELS = [];
+    public static $BLACKBERRY_MODELS = [];
+    public static $IOS_MODELS = [];
+    public static $KDDI_MODELS = [];
+
+    public static $ANDROID_INDEX = [];
+    public static $ASHA_INDEX = [];
+    public static $BADA_INDEX = [];
+    public static $BREW_INDEX = [];
+    public static $FIREFOXOS_INDEX = [];
+    public static $TIZEN_INDEX = [];
+    public static $TOUCHWIZ_INDEX = [];
+    public static $WM_INDEX = [];
+    public static $WP_INDEX = [];
+    public static $PALMOS_INDEX = [];
+    public static $S30PLUS_INDEX = [];
+    public static $S40_INDEX = [];
+    public static $SYMBIAN_INDEX = [];
+    public static $FEATURE_INDEX = [];
+    public static $KDDI_INDEX = [];
+
+
+    public static function identify($type, $model)
+    {
+        require_once __DIR__ . '/../../data/models-' . $type . '.php';
+
+        if ($type != 'blackberry' && $type != 'ios') {
+            require_once __DIR__ . '/../../data/indices/models-' . $type . '.php';
+        }
+
+        switch ($type) {
+            case 'android':
+                return self::identifyAndroid($model);
+            case 'asha':
+                return self::identifyList(self::$ASHA_INDEX, self::$ASHA_MODELS, $model);
+            case 'bada':
+                return self::identifyList(self::$BADA_INDEX, self::$BADA_MODELS, $model);
+            case 'blackberry':
+                return self::identifyBlackBerry($model);
+            case 'brew':
+                return self::identifyList(self::$BREW_INDEX, self::$BREW_MODELS, $model);
+            case 'firefoxos':
+                return self::identifyList(self::$FIREFOXOS_INDEX, self::$FIREFOXOS_MODELS, $model, false);
+            case 'ios':
+                return self::identifyIOS($model);
+            case 'tizen':
+                return self::identifyList(self::$TIZEN_INDEX, self::$TIZEN_MODELS, $model);
+            case 'touchwiz':
+                return self::identifyList(self::$TOUCHWIZ_INDEX, self::$TOUCHWIZ_MODELS, $model);
+            case 'wm':
+                return self::identifyWindowsMobile($model);
+            case 'wp':
+                return self::identifyList(self::$WP_INDEX, self::$WP_MODELS, $model);
+            case 's30plus':
+                return self::identifyList(self::$S30PLUS_INDEX, self::$S30PLUS_MODELS, $model);
+            case 's40':
+                return self::identifyList(self::$S40_INDEX, self::$S40_MODELS, $model);
+            case 'symbian':
+                return self::identifyList(self::$SYMBIAN_INDEX, self::$SYMBIAN_MODELS, $model);
+            case 'palmos':
+                return self::identifyList(self::$PALMOS_INDEX, self::$PALMOS_MODELS, $model);
+            case 'kddi':
+                return self::identifyList(self::$KDDI_INDEX, self::$KDDI_MODELS, $model);
+        }
+
+        require_once __DIR__ . '/../../data/models-feature.php';
+        require_once __DIR__ . '/../../data/indices/models-feature.php';
+        return self::identifyList(self::$FEATURE_INDEX, self::$FEATURE_MODELS, $model);
+    }
+    
+    public static function identifyWindowsMobile($model)
+    {
+        $model = preg_replace('/^(HTC|SAMSUNG|SHARP|Toshiba)\//u', '', $model);
+        return self::identifyList(self::$WM_INDEX, self::$WM_MODELS, $model);
+    }
+
+    public static function identifyIOS($model)
+    {
+        $original = $model;
+
+        $model = str_replace('Unknown ', '', $model);
+        $model = preg_replace("/iPh([0-9],[0-9])/", 'iPhone\\1', $model);
+        $model = preg_replace("/iPd([0-9],[0-9])/", 'iPod\\1', $model);
+
+        $device = new Device([
+            'type'          => Constants\DeviceType::MOBILE,
+            'identified'    => Constants\Id::NONE,
+            'manufacturer'  => null,
+            'model'         => $model,
+            'identifier'    => $original,
+            'generic'       => false
+        ]);
+
+        if (isset(self::$IOS_MODELS[$model])) {
+            $match = self::$IOS_MODELS[$model];
+
+            $device->manufacturer = $match[0];
+            $device->model = $match[1];
+            $device->identified = Constants\Id::MATCH_UA;
+
+            if (isset($match[2]) || isset($match['type'])) {
+                $type = isset($match[2]) ? $match[2] : $match['type'];
+                $device->type = $type;
+            }
+
+            return $device;
+        }
+
+        return $device;
+    }
+
+    public static function identifyBlackBerry($model)
+    {
+        $original = $model;
+
+        if (preg_match("/BlackBerry ?([0-9]+)/ui", $model, $match)) {
+            $model = $match[1];
+        }
+
+        $device = new Device([
+            'type'          => Constants\DeviceType::MOBILE,
+            'identified'    => Constants\Id::NONE,
+            'manufacturer'  => null,
+            'model'         => $model,
+            'identifier'    => $original,
+            'generic'       => false
+        ]);
+
+        if (preg_match("/^[1-9][0-9][0-9][0-9][ei]?$/u", $model)) {
+            $device->manufacturer = 'RIM';
+            $device->model = 'BlackBerry ' . $model;
+            $device->identified = Constants\Id::PATTERN;
+
+            if (isset(self::$BLACKBERRY_MODELS[$model])) {
+                $device->model = 'BlackBerry ' . self::$BLACKBERRY_MODELS[$model] . ' ' . $model;
+                $device->identified |= Constants\Id::MATCH_UA;
+            }
+        }
+
+        return $device;
+    }
+
+    public static function identifyAndroid($model)
+    {
+        $result = self::identifyList(self::$ANDROID_INDEX, self::$ANDROID_MODELS, $model);
+
+        if (!$result->identified) {
+            $model = self::cleanup($model);
+            if (preg_match('/AndroVM/iu', $model)  || $model == 'Emulator' || $model == 'x86 Emulator' || $model == 'x86 VirtualBox' || $model == 'vm') {
+                return new Device([
+                    'type'          => Constants\DeviceType::EMULATOR,
+                    'identified'    => Constants\Id::PATTERN,
+                    'manufacturer'  => null,
+                    'model'         => null,
+                    'generic'       => false
+                ]);
+            }
+        }
+
+        return $result;
+    }
+
+    public static function identifyList(&$index, &$list, $model, $cleanup = true)
+    {
+        $original = $model;
+
+        if ($cleanup) {
+            $model = self::cleanup($model);
+        }
+
+        $device = new Device([
+            'type'          => Constants\DeviceType::MOBILE,
+            'identified'    => Constants\Id::NONE,
+            'manufacturer'  => null,
+            'model'         => $model,
+            'identifier'    => $original,
+            'generic'       => false
+        ]);
+
+        $keys = [ '@' . strtoupper(substr($model, 0, 2)), '@' ];
+
+        $pattern = null;
+        $match = null;
+
+        foreach ($keys as $k => $key) {
+            if (isset($index[$key])) {
+                foreach ($index[$key] as $m => $v) {
+                    if (self::hasMatch($v, $model)) {
+                        if ($v) {
+                            if (substr($v, -2) == "!!") {
+                                foreach ($list[$v] as $m2 => $v2) {
+                                    if (self::hasMatch($m2, $model)) {
+                                        $match = $v2;
+                                        $pattern = $m2;
+                                        break;
+                                    }
+                                }
+                            } else {
+                                $match = $list[$v];
+                                $pattern = $v;
+                            }
+                        }
+
+                        if ($match) {
+                            $device->manufacturer = $match[0];
+                            $device->model = self::applyMatches($match[1], $model, $pattern);
+                            $device->identified = Constants\Id::MATCH_UA;
+
+                            if (isset($match[2]) || isset($match['type'])) {
+                                $type = isset($match[2]) ? $match[2] : $match['type'];
+                                if (is_array($type)) {
+                                    $device->type = $type[0];
+                                    $device->subtype = $type[1];
+                                } else {
+                                    $device->type = $type;
+                                }
+                            }
+
+                            if (isset($match[3]) || isset($match['flag'])) {
+                                $device->flag = isset($match[3]) ? $match[3] : $match['flag'];
+                            }
+
+                            if (isset($match['carrier'])) {
+                                $device->carrier = $match['carrier'];
+                            }
+
+                            if ($device->manufacturer == null && $device->model == null) {
+                                $device->identified = Constants\Id::PATTERN;
+                            }
+
+                            return $device;
+                        }
+                    }
+                }
+            }
+        }
+
+        return $device;
+    }
+
+    public static function applyMatches($model, $original, $pattern)
+    {
+        if (strpos($model, '$') !== false && substr($pattern, -1) == "!") {
+            if (preg_match('/^' . substr($pattern, 0, -1) . '/iu', $original, $matches)) {
+                foreach ($matches as $k => $v) {
+                    $model = str_replace('$' . $k, $v, $model);
+                }
+            }
+        }
+
+        return $model;
+    }
+
+    public static function hasMatch($pattern, $model)
+    {
+        if (substr($pattern, -2) == "!!") {
+            return !! preg_match('/^' . substr($pattern, 0, -2) . '/iu', $model);
+        } elseif (substr($pattern, -1) == "!") {
+            return !! preg_match('/^' . substr($pattern, 0, -1) . '/iu', $model);
+        } else {
+            return strtolower($pattern) == strtolower($model);
+        }
+    }
+
+    public static function cleanup($s = '')
+    {
+        // var_dump($s);
+
+        $s = preg_replace('/^phone\//', '', $s);
+        $s = preg_replace('/^(\/|; |;)/u', '', $s);
+        $s = preg_replace('/\/[^\/]+$/u', '', $s);
+        $s = preg_replace('/\/[^\/]+ Android\/.*/u', '', $s);
+
+        $s = preg_replace('/UCBrowser$/u', '', $s);
+
+        $s = preg_replace('/(_TD|_LTE|_GPRS|_BLEU|_CMCC|_CMCC_TD|_CUCC)$/u', '', $s);
+        $s = preg_replace('/(-BREW| MIDP).+$/u', '', $s);
+        $s = preg_replace('/ AU-MIC.+$/u', '', $s);
+        $s = preg_replace('/ (AU|UP)\.Browser$/u', '', $s);
+
+        $s = preg_replace('/_/u', ' ', $s);
+        $s = preg_replace('/^\*+/u', '', $s);
+        $s = preg_replace('/^\s+|\s+$/u', '', $s);
+
+        $s = preg_replace('/^De-Sensed /u', '', $s);
+        $s = preg_replace('/^Full JellyBean( on )?/u', '', $s);
+        $s = preg_replace('/^(Android|Generic Android|Baidu Yi|Buildroid|Gingerbread|ICS AOSP|AOSPA?|tita) (on |for )/u', '', $s);
+        $s = preg_replace('/^Full (AOSP on |Android on |Base for |Cappuccino on |MIPS Android on |Webdroid on |JellyBean on |Android)/u', '', $s);
+
+        $s = preg_replace('/^Acer( |-)?/iu', '', $s);
+        $s = preg_replace('/^Iconia( Tab)? /u', '', $s);
+        $s = preg_replace('/^ASUS ?/u', '', $s);
+        $s = preg_replace('/^Ainol /u', '', $s);
+        $s = preg_replace('/^Coolpad-?Coolpad/iu', 'Coolpad', $s);
+        $s = preg_replace('/^Coolpad ?/iu', 'Coolpad ', $s);
+        $s = preg_replace('/^Alcatel[_ ]OT[_-](.*)/iu', 'One Touch $1', $s);
+        $s = preg_replace('/^ALCATEL /u', '', $s);
+        $s = preg_replace('/^YL-/u', '', $s);
+        $s = preg_replace('/^TY-K[_\- ]Touch/iu', 'K-Touch', $s);
+        $s = preg_replace('/^K-Touch[_\-]/u', 'K-Touch ', $s);
+        $s = preg_replace('/^Novo7 ?/iu', 'Novo7 ', $s);
+        $s = preg_replace('/^HW-HUAWEI/u', 'HUAWEI', $s);
+        $s = preg_replace('/^Huawei[ -]/iu', 'Huawei ', $s);
+        $s = preg_replace('/^SAMSUNG SAMSUNG-/iu', '', $s);
+        $s = preg_replace('/^SAMSUNG[ -]/iu', '', $s);
+        $s = preg_replace('/^(Sony ?Ericsson|Sony)/u', '', $s);
+        $s = preg_replace('/^(Lenovo Lenovo|LNV-Lenovo|LENOVO-Lenovo)/u', 'Lenovo', $s);
+        $s = preg_replace('/^Lenovo-/u', 'Lenovo', $s);
+        $s = preg_replace('/^Lenovo/u', 'Lenovo ', $s);
+        $s = preg_replace('/^ZTE-/u', 'ZTE ', $s);
+        $s = preg_replace('/^(LG)[ _\/]/u', '$1-', $s);
+        $s = preg_replace('/^(HTC.+)\s[v|V][0-9.]+$/u', '$1', $s);
+        $s = preg_replace('/^(HTC)[-\/]/u', '$1 ', $s);
+        $s = preg_replace('/^(HTC)([A-Z][0-9][0-9][0-9])/u', '$1 $2', $s);
+        $s = preg_replace('/^(Motorola MOT-|MOT-|Motorola[\s|-])/u', '', $s);
+        $s = preg_replace('/^Moto([^\s])/u', '$1', $s);
+        $s = preg_replace('/^(UTStar-)/u', '', $s);
+
+        $s = preg_replace('/^VZW:/iu', '', $s);
+        $s = preg_replace('/^(Swisscom|Vodafone)\/1.0\//iu', '', $s);
+        $s = preg_replace('/-?(orange(-ls)?|vodafone|bouygues|parrot|Kust)$/iu', '', $s);
+        $s = preg_replace('/[ -](Mozilla|Opera|Obigo|Java|PPC)$/iu', '', $s);
+        $s = preg_replace('/ ?Build$/iu', '', $s);
+        $s = preg_replace('/ \(compatible$/iu', '', $s);
+        $s = preg_replace('/http:\/\/.+$/iu', '', $s);
+        $s = preg_replace('/^\s+|\s+$/u', '', $s);
+        $s = preg_replace('/\s+/u', ' ', $s);
+
+        return $s;
+    }
+}

+ 19 - 0
Qii/Library/Third/WhichBrowser/Data/DeviceProfiles.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+class DeviceProfiles
+{
+    public static $PROFILES = [];
+
+    public static function identify($url)
+    {
+        require_once __DIR__ . '/../../data/profiles.php';
+
+        if (isset(self::$PROFILES[$url])) {
+            return self::$PROFILES[$url];
+        }
+
+        return false;
+    }
+}

+ 30 - 0
Qii/Library/Third/WhichBrowser/Data/Manufacturers.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+use WhichBrowser\Constants;
+
+class Manufacturers
+{
+    public static $GENERIC = [];
+    public static $TELEVISION = [];
+
+    public static function identify($type, $name)
+    {
+        $name = preg_replace('/^CUS\:/u', '', trim($name));
+
+        require_once __DIR__ . '/../../data/manufacturer-names.php';
+
+        if ($type == Constants\DeviceType::TELEVISION) {
+            if (isset(Manufacturers::$TELEVISION[$name])) {
+                return self::$TELEVISION[$name];
+            }
+        }
+
+        if (isset(Manufacturers::$GENERIC[$name])) {
+            return self::$GENERIC[$name];
+        }
+
+        return $name;
+    }
+}

+ 181 - 0
Qii/Library/Third/WhichBrowser/Model/Browser.php

@@ -0,0 +1,181 @@
+<?php
+
+namespace WhichBrowser\Model;
+
+use WhichBrowser\Model\Primitive\NameVersion;
+
+class Browser extends NameVersion
+{
+    /**
+     * @var \WhichBrowser\Model\Using       $using      Information about web views the browser is using
+     * @var \WhichBrowser\Model\Family      $family     To which browser family does this browser belong
+     */
+    public $using;
+    public $family;
+
+
+    /** @var string */
+    public $channel;
+
+    /** @var boolean */
+    public $stock = true;
+
+    /** @var boolean */
+    public $hidden = false;
+
+    /** @var string */
+    public $mode = '';
+
+    /** @var string */
+    public $type = '';
+
+
+    /**
+     * Set the properties to the default values
+     *
+     * @param   array|null  $properties  An optional array of properties to set after setting it to the default values
+     *
+     * @internal
+     */
+
+    public function reset($properties = null)
+    {
+        parent::reset();
+
+        unset($this->channel);
+        unset($this->using);
+        unset($this->family);
+
+        $this->stock = true;
+        $this->hidden = false;
+        $this->mode = '';
+        $this->type = '';
+
+        if (is_array($properties)) {
+            $this->set($properties);
+        }
+    }
+
+
+    /**
+     * Get the name in a human readable format
+     *
+     * @return string
+     */
+
+    public function getName()
+    {
+        $name = !empty($this->alias) ? $this->alias : (!empty($this->name) ? $this->name : '');
+        return $name ? $name . (!empty($this->channel) ? ' ' . $this->channel : '') : '';
+    }
+
+
+    /**
+     * Is the browser from the specified family
+     *
+     * @param  string   $name   The name of the family
+     *
+     * @return boolean
+     */
+
+    public function isFamily($name)
+    {
+        if ($this->getName() == $name) {
+            return true;
+        }
+
+        if (isset($this->family)) {
+            if ($this->family->getName() == $name) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+
+    /**
+     * Is the browser using the specified webview
+     *
+     * @param  string   $name   The name of the webview
+     *
+     * @return boolean
+     */
+
+    public function isUsing($name)
+    {
+        if (isset($this->using)) {
+            if ($this->using->getName() == $name) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+
+    /**
+     * Get a combined name and version number in a human readable format
+     *
+     * @return string
+     */
+
+    public function toString()
+    {
+        if ($this->hidden) {
+            return '';
+        }
+        
+        $result = trim($this->getName() . ' ' . (!empty($this->version) && !$this->version->hidden ? $this->getVersion() : ''));
+
+        if (empty($result) && isset($this->using)) {
+            return $this->using->toString();
+        }
+
+        return $result;
+    }
+
+
+    /**
+     * Get an array of all defined properties
+     *
+     * @internal
+     *
+     * @return array
+     */
+
+    public function toArray()
+    {
+        $result = [];
+
+        if (!empty($this->name)) {
+            $result['name'] = $this->name;
+        }
+
+        if (!empty($this->alias)) {
+            $result['alias'] = $this->alias;
+        }
+
+        if (!empty($this->using)) {
+            $result['using'] = $this->using->toArray();
+        }
+
+        if (!empty($this->family)) {
+            $result['family'] = $this->family->toArray();
+        }
+
+        if (!empty($this->version)) {
+            $result['version'] = $this->version->toArray();
+        }
+
+        if (!empty($this->type)) {
+            $result['type'] = $this->type;
+        }
+
+        if (isset($result['version']) && !count($result['version'])) {
+            unset($result['version']);
+        }
+
+        return $result;
+    }
+}

+ 251 - 0
Qii/Library/Third/WhichBrowser/Model/Device.php

@@ -0,0 +1,251 @@
+<?php
+
+namespace WhichBrowser\Model;
+
+use WhichBrowser\Constants;
+use WhichBrowser\Data;
+use WhichBrowser\Model\Primitive\Base;
+
+class Device extends Base
+{
+    /** @var string */
+    public $manufacturer;
+
+    /** @var string */
+    public $model;
+
+    /** @var string */
+    public $series;
+
+    /** @var string */
+    public $carrier;
+
+    /** @var int */
+    public $identifier;
+
+    /** @var mixed */
+    public $flag;
+
+
+    /** @var string */
+    public $type = '';
+
+    /** @var string */
+    public $subtype = '';
+
+    /** @var int */
+    public $identified = Constants\Id::NONE;
+
+    /** @var boolean */
+    public $generic = true;
+
+    /** @var boolean */
+    public $hidden = false;
+
+
+    /**
+     * Set the properties to the default values
+     *
+     * @param   array|null  $properties  An optional array of properties to set after setting it to the default values
+     *
+     * @internal
+     */
+
+    public function reset($properties = null)
+    {
+        unset($this->manufacturer);
+        unset($this->model);
+        unset($this->series);
+        unset($this->carrier);
+        unset($this->identifier);
+
+        $this->type = '';
+        $this->subtype = '';
+        $this->identified = Constants\Id::NONE;
+        $this->generic = true;
+        $this->hidden = false;
+
+        if (is_array($properties)) {
+            $this->set($properties);
+        }
+    }
+
+
+    /**
+     * Identify the manufacturer and model based on a pattern
+     *
+     * @param   string      $pattern   The regular expression that defines the group that matches the model
+     * @param   string      $subject   The string the regular expression is matched with
+     * @param   array|null  $defaults  An optional array of properties to set together
+     *
+     * @return string
+     */
+
+    public function identifyModel($pattern, $subject, $defaults = [])
+    {
+        if (preg_match($pattern, $subject, $match)) {
+            $this->manufacturer = !empty($defaults['manufacturer']) ? $defaults['manufacturer'] : null;
+            $this->model = Data\DeviceModels::cleanup($match[1]);
+            $this->identifier = preg_replace('/ (Mozilla|Opera|Obigo|AU.Browser|UP.Browser|Build|Java|PPC|AU-MIC.*)$/iu', '', $match[0]);
+            $this->identifier = preg_replace('/_(TD|GPRS|LTE|BLEU|CMCC|CUCC)$/iu', '', $match[0]);
+
+            if (isset($defaults['model'])) {
+                if (is_callable($defaults['model'])) {
+                    $this->model = call_user_func($defaults['model'], $this->model);
+                } else {
+                    $this->model = $defaults['model'];
+                }
+            }
+
+            $this->generic = false;
+            $this->identified |= Constants\Id::PATTERN;
+
+            if (!empty($defaults['carrier'])) {
+                $this->carrier = $defaults['carrier'];
+            }
+
+            if (!empty($defaults['type'])) {
+                $this->type = $defaults['type'];
+            }
+        }
+    }
+
+
+    /**
+     * Declare an positive identification
+     *
+     * @param  array  $properties  An array, the key of an element determines the name of the property
+     *
+     * @return string
+     */
+
+    public function setIdentification($properties)
+    {
+        $this->reset($properties);
+
+        if (!empty($this->model)) {
+            $this->generic = false;
+        }
+        
+        $this->identified |= Constants\Id::MATCH_UA;
+    }
+
+
+    /**
+     * Get the name of the carrier in a human readable format
+     *
+     * @return string
+     */
+
+    public function getCarrier()
+    {
+        return $this->identified && !empty($this->carrier) ? $this->carrier : '';
+    }
+
+
+    /**
+     * Get the name of the manufacturer in a human readable format
+     *
+     * @return string
+     */
+
+    public function getManufacturer()
+    {
+        return $this->identified && !empty($this->manufacturer) ? $this->manufacturer : '';
+    }
+
+
+    /**
+     * Get the name of the model in a human readable format
+     *
+     * @return string
+     */
+
+    public function getModel()
+    {
+        if ($this->identified) {
+            return trim((!empty($this->model) ? $this->model . ' ' : '') . (!empty($this->series) ? $this->series : ''));
+        }
+
+        return !empty($this->model) ? $this->model : '';
+    }
+
+
+    /**
+     * Get the combined name of the manufacturer and model in a human readable format
+     *
+     * @return string
+     */
+
+    public function toString()
+    {
+        if ($this->hidden) {
+            return '';
+        }
+        
+        if ($this->identified) {
+            $model = $this->getModel();
+            $manufacturer = $this->getManufacturer();
+
+            if ($manufacturer != '' && strpos($model, $manufacturer) === 0) {
+                $manufacturer = '';
+            }
+
+            return trim($manufacturer . ' ' . $model);
+        }
+
+        return !empty($this->model) ? 'unrecognized device (' . $this->model . ')' : '';
+    }
+
+
+    /**
+     * Check if device information is detected
+     *
+     * @return boolean
+     */
+
+    public function isDetected()
+    {
+        return !empty($this->type) || !empty($this->model) || !empty($this->manufacturer);
+    }
+
+
+    /**
+     * Get an array of all defined properties
+     *
+     * @internal
+     *
+     * @return array
+     */
+
+    public function toArray()
+    {
+        $result = [];
+
+        if (!empty($this->type)) {
+            $result['type'] = $this->type;
+        }
+        
+        if (!empty($this->subtype)) {
+            $result['subtype'] = $this->subtype;
+        }
+
+        if (!empty($this->manufacturer)) {
+            $result['manufacturer'] = $this->manufacturer;
+        }
+
+        if (!empty($this->model)) {
+            $result['model'] = $this->model;
+        }
+
+        if (!empty($this->series)) {
+            $result['series'] = $this->series;
+        }
+
+        if (!empty($this->carrier)) {
+            $result['carrier'] = $this->carrier;
+        }
+
+        return $result;
+    }
+}

+ 35 - 0
Qii/Library/Third/WhichBrowser/Model/Engine.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace WhichBrowser\Model;
+
+use WhichBrowser\Model\Primitive\NameVersion;
+
+class Engine extends NameVersion
+{
+    /**
+     * Get an array of all defined properties
+     *
+     * @internal
+     *
+     * @return array
+     */
+
+    public function toArray()
+    {
+        $result = [];
+
+        if (!empty($this->name)) {
+            $result['name'] = $this->name;
+        }
+        
+        if (!empty($this->version)) {
+            $result['version'] = $this->version->toArray();
+        }
+
+        if (isset($result['version']) && !count($result['version'])) {
+            unset($result['version']);
+        }
+
+        return $result;
+    }
+}

+ 35 - 0
Qii/Library/Third/WhichBrowser/Model/Family.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace WhichBrowser\Model;
+
+use WhichBrowser\Model\Primitive\NameVersion;
+
+class Family extends NameVersion
+{
+    /**
+     * Get an array of all defined properties
+     *
+     * @internal
+     *
+     * @return array
+     */
+
+    public function toArray()
+    {
+        $result = [];
+
+        if (!empty($this->name) && empty($this->version)) {
+            return $this->name;
+        }
+
+        if (!empty($this->name)) {
+            $result['name'] = $this->name;
+        }
+
+        if (!empty($this->version)) {
+            $result['version'] = $this->version->toArray();
+        }
+
+        return $result;
+    }
+}

+ 373 - 0
Qii/Library/Third/WhichBrowser/Model/Main.php

@@ -0,0 +1,373 @@
+<?php
+
+namespace WhichBrowser\Model;
+
+use WhichBrowser\Model\Browser;
+use WhichBrowser\Model\Engine;
+use WhichBrowser\Model\Os;
+use WhichBrowser\Model\Device;
+
+class Main
+{
+    /**
+     * @var \WhichBrowser\Model\Browser  $browser      Information about the browser
+     */
+    public $browser;
+
+    /**
+     * @var \WhichBrowser\Model\Engine   $engine       Information about the rendering engine
+     */
+    public $engine;
+
+    /**
+     * @var \WhichBrowser\Model\Os       $os           Information about the operating system
+     */
+    public $os;
+
+    /**
+     * @var \WhichBrowser\Model\Device   $device       Information about the device
+     */
+    public $device;
+
+    /**
+     * @var boolean                      $camouflage   Is the browser camouflaged as another browser
+     */
+    public $camouflage = false;
+
+    /**
+     * @var int[]                        $features
+     */
+    public $features = [];
+
+
+    /**
+     * Create default objects
+     */
+
+    public function __construct()
+    {
+        $this->browser = new Browser();
+        $this->engine = new Engine();
+        $this->os = new Os();
+        $this->device = new Device();
+    }
+
+
+    /**
+     * Check the name of a property and optionally is a specific version
+     *
+     * @internal
+     *
+     * @param  string   The name of the property, such as 'browser', 'engine' or 'os'
+     * @param  string   The name of the browser that is checked
+     * @param  string   Optional, the operator, must be <, <=, =, >= or >
+     * @param  mixed    Optional, the value, can be an integer, float or string with a version number
+     *
+     * @return boolean
+     */
+
+    private function isX()
+    {
+        $arguments = func_get_args();
+        $x = $arguments[0];
+        
+        if (count($arguments) < 2) {
+            return false;
+        }
+
+        if (empty($this->$x->name)) {
+            return false;
+        }
+    
+        if ($this->$x->name != $arguments[1]) {
+            return false;
+        }
+    
+        if (count($arguments) >= 4) {
+            if (empty($this->$x->version)) {
+                return false;
+            }
+
+            if (!$this->$x->version->is($arguments[2], $arguments[3])) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+
+    /**
+     * Check the name of the browser and optionally is a specific version
+     *
+     * @param  string   The name of the browser that is checked
+     * @param  string   Optional, the operator, must be <, <=, =, >= or >
+     * @param  mixed    Optional, the value, can be an integer, float or string with a version number
+     *
+     * @return boolean
+     */
+
+    public function isBrowser()
+    {
+        $arguments = func_get_args();
+        array_unshift($arguments, 'browser');
+        return call_user_func_array([ $this, 'isX' ], $arguments);
+    }
+
+
+    /**
+     * Check the name of the rendering engine and optionally is a specific version
+     *
+     * @param  string   The name of the rendering engine that is checked
+     * @param  string   Optional, the operator, must be <, <=, =, >= or >
+     * @param  mixed    Optional, the value, can be an integer, float or string with a version number
+     *
+     * @return boolean
+     */
+
+    public function isEngine()
+    {
+        $arguments = func_get_args();
+        array_unshift($arguments, 'engine');
+        return call_user_func_array([ $this, 'isX' ], $arguments);
+    }
+
+
+    /**
+     * Check the name of the operating system and optionally is a specific version
+     *
+     * @param  string   The name of the operating system that is checked
+     * @param  string   Optional, the operator, must be <, <=, =, >= or >
+     * @param  mixed    Optional, the value, can be an integer, float or string with a version number
+     *
+     * @return boolean
+     */
+
+    public function isOs()
+    {
+        $arguments = func_get_args();
+        array_unshift($arguments, 'os');
+        return call_user_func_array([ $this, 'isX' ], $arguments);
+    }
+
+
+    /**
+     * Check if the detected browser is of the specified type
+     *
+     * @param  string   $model      The type, or a combination of type and subtime joined with a semicolon.
+     *
+     * @return boolean
+     */
+
+    public function isDevice($model)
+    {
+        return (!empty($this->device->series) && $this->device->series == $model) || (!empty($this->device->model) && $this->device->model == $model);
+    }
+
+
+    /**
+     * Get the type and subtype, separated by a semicolon (if applicable)
+     *
+     * @return string
+     */
+
+    public function getType()
+    {
+        return $this->device->type . (!empty($this->device->subtype) ? ':' . $this->device->subtype : '');
+    }
+
+
+    /**
+     * Check if the detected browser is of the specified type
+     *
+     * @param  string   The type, or a combination of type and subtype joined with a semicolon.
+     * @param  string   Unlimited optional types to check
+     *
+     * @return boolean
+     */
+
+    public function isType()
+    {
+        $arguments = func_get_args();
+
+        $count = count($arguments);
+        for ($a = 0; $a < $count; $a++) {
+            if (strpos($arguments[$a], ':') !== false) {
+                list($type, $subtype) = explode(':', $arguments[$a]);
+                if ($type == $this->device->type && $subtype == $this->device->subtype) {
+                    return true;
+                }
+            } else {
+                if ($arguments[$a] == $this->device->type) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+
+    /**
+     * Check if the detected browser is a mobile device
+     *
+     * @return boolean
+     */
+
+    public function isMobile()
+    {
+        return $this->isType('mobile', 'tablet', 'ereader', 'media', 'watch', 'camera', 'gaming:portable');
+    }
+
+
+    /**
+     * Check if a browser was detected
+     *
+     * @return boolean
+     */
+
+    public function isDetected()
+    {
+        return $this->browser->isDetected() || $this->os->isDetected() || $this->engine->isDetected() || $this->device->isDetected();
+    }
+
+
+    /**
+     * Return the input string prefixed with 'a' or 'an' depending on the first letter of the string
+     *
+     * @internal
+     *
+     * @param  string   $s      The string that will be prefixed
+     *
+     * @return string
+     */
+
+    private function a($s)
+    {
+        return (preg_match("/^[aeiou]/i", $s) ? 'an ' : 'a ') . $s;
+    }
+
+
+    /**
+     * Get a human readable string of the whole browser identification
+     *
+     * @return string
+     */
+
+    public function toString()
+    {
+        $prefix = $this->camouflage ? 'an unknown browser that imitates ' : '';
+        $browser = $this->browser->toString();
+        $os = $this->os->toString();
+        $engine = $this->engine->toString();
+        $device = $this->device->toString();
+        
+
+        if (empty($device) && empty($os) && $this->device->type == 'television') {
+            $device = 'television';
+        }
+
+        if (empty($device) && $this->device->type == 'emulator') {
+            $device = 'emulator';
+        }
+
+    
+        if (!empty($browser) && !empty($os) && !empty($device)) {
+            return $prefix . $browser . ' on ' . $this->a($device) . ' running ' . $os;
+        }
+
+        if (!empty($browser) && empty($os) && !empty($device)) {
+            return $prefix . $browser . ' on ' . $this->a($device);
+        }
+
+        if (!empty($browser) && !empty($os) && empty($device)) {
+            return $prefix . $browser . ' on ' . $os;
+        }
+
+        if (empty($browser) && !empty($os) && !empty($device)) {
+            return $prefix . $this->a($device) . ' running ' . $os;
+        }
+
+        if (!empty($browser) && empty($os) && empty($device)) {
+            return $prefix . $browser;
+        }
+
+        if (empty($browser) && empty($os) && !empty($device)) {
+            return $prefix . $this->a($device);
+        }
+
+        if ($this->device->type == 'desktop' && !empty($os) && !empty($engine) && empty($device)) {
+            return 'an unknown browser based on ' . $engine . ' running on ' . $os;
+        }
+
+        if ($this->browser->stock && !empty($os) && empty($device)) {
+            return $os;
+        }
+
+        if ($this->browser->stock && !empty($engine) && empty($device)) {
+            return 'an unknown browser based on ' . $engine;
+        }
+        
+        if ($this->device->type == 'bot') {
+            return 'an unknown bot';
+        }
+
+        return 'an unknown browser';
+    }
+
+
+    /**
+     * Get a string containing a JavaScript representation of the object
+     *
+     * @return string
+     */
+
+    public function toJavaScript()
+    {
+        return "this.browser = new Browser({ " . $this->browser->toJavaScript() . " });\n" .
+               "this.engine = new Engine({ " . $this->engine->toJavaScript() . " });\n" .
+               "this.os = new Os({ " . $this->os->toJavaScript() . " });\n" .
+               "this.device = new Device({ " . $this->device->toJavaScript() . " });\n" .
+               "this.camouflage = " . ($this->camouflage ? 'true' : 'false') . ";\n" .
+               "this.features = " . json_encode($this->features) . ";\n";
+    }
+
+
+    /**
+     * Get an array of all defined properties
+     *
+     * @return array
+     */
+
+    public function toArray()
+    {
+        $result = [
+            'browser'   => $this->browser->toArray(),
+            'engine'    => $this->engine->toArray(),
+            'os'        => $this->os->toArray(),
+            'device'    => $this->device->toArray()
+        ];
+
+        if (!count($result['browser'])) {
+            unset($result['browser']);
+        }
+
+        if (!count($result['engine'])) {
+            unset($result['engine']);
+        }
+
+        if (!count($result['os'])) {
+            unset($result['os']);
+        }
+
+        if (!count($result['device'])) {
+            unset($result['device']);
+        }
+
+        if ($this->camouflage) {
+            $result['camouflage'] = true;
+        }
+
+        return $result;
+    }
+}

+ 140 - 0
Qii/Library/Third/WhichBrowser/Model/Os.php

@@ -0,0 +1,140 @@
+<?php
+
+namespace WhichBrowser\Model;
+
+use WhichBrowser\Model\Primitive\NameVersion;
+
+class Os extends NameVersion
+{
+    /**
+     * @var \WhichBrowser\Model\Family      $family     To which family does this operating system belong
+     */
+    public $family;
+
+    /** @var string */
+    public $edition;
+
+    /** @var boolean */
+    public $hidden = false;
+
+
+    /**
+     * Set the properties to the default values
+     *
+     * @param   array|null  $properties  An optional array of properties to set after setting it to the default values
+     *
+     * @internal
+     */
+
+    public function reset($properties = null)
+    {
+        parent::reset();
+
+        unset($this->family);
+        unset($this->edition);
+
+        $this->hidden = false;
+
+        if (is_array($properties)) {
+            $this->set($properties);
+        }
+    }
+
+
+    /**
+     * Return the name of the operating system family
+     *
+     * @return string
+     */
+
+    public function getFamily()
+    {
+        if (isset($this->family)) {
+            return $this->family->getName();
+        }
+
+        return $this->getName();
+    }
+
+
+    /**
+     * Is the operating from the specified family
+     *
+     * @param  string   $name   The name of the family
+     *
+     * @return boolean
+     */
+
+    public function isFamily($name)
+    {
+        if ($this->getName() == $name) {
+            return true;
+        }
+
+        if (isset($this->family)) {
+            if ($this->family->getName() == $name) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+
+    /**
+     * Get the name and version in a human readable format
+     *
+     * @return string
+     */
+
+    public function toString()
+    {
+        if ($this->hidden) {
+            return '';
+        }
+        
+        return trim($this->getName() .
+            (!empty($this->version) && !$this->version->hidden ? ' ' . $this->getVersion() : '')) .
+            (!empty($this->edition) ? ' ' . $this->edition : '');
+    }
+
+
+    /**
+     * Get an array of all defined properties
+     *
+     * @internal
+     *
+     * @return array
+     */
+
+    public function toArray()
+    {
+        $result = [];
+
+        if (!empty($this->name)) {
+            $result['name'] = $this->name;
+        }
+
+        if (!empty($this->family)) {
+            $result['family'] = $this->family->toArray();
+        }
+
+        if (!empty($this->alias)) {
+            $result['alias'] = $this->alias;
+        }
+
+        if (!empty($this->edition)) {
+            $result['edition'] = $this->edition;
+        }
+
+        if (!empty($this->version)) {
+            $result['version'] = $this->version->toArray();
+        }
+
+        if (isset($result['version']) && !count($result['version'])) {
+            unset($result['version']);
+        }
+
+        return $result;
+    }
+}

+ 81 - 0
Qii/Library/Third/WhichBrowser/Model/Primitive/Base.php

@@ -0,0 +1,81 @@
+<?php
+
+namespace WhichBrowser\Model\Primitive;
+
+/**
+ * @internal
+ */
+
+class Base
+{
+    /**
+     * Set the properties of the object the the values specified in the array
+     *
+     * @param  array|null   An array, the key of an element determines the name of the property
+     */
+    public function __construct($defaults = null)
+    {
+        if (is_array($defaults)) {
+            $this->set($defaults);
+        }
+    }
+
+
+    /**
+     * Set the properties of the object the the values specified in the array
+     *
+     * @param  array  $properties  An array, the key of an element determines the name of the property
+     *
+     * @internal
+     */
+    public function set($properties)
+    {
+        foreach ($properties as $k => $v) {
+            $this->{$k} = $v;
+        }
+    }
+
+
+    /**
+     * Get a string containing a JavaScript representation of the object
+     *
+     * @internal
+     *
+     * @return string
+     */
+
+    public function toJavaScript()
+    {
+        $lines = [];
+
+        foreach (get_object_vars($this) as $key => $value) {
+            if (!is_null($value)) {
+                $line = $key . ": ";
+
+                if ($key == 'version') {
+                    $line .= 'new Version({ ' . $value->toJavaScript() . ' })';
+                } elseif ($key == 'family') {
+                    $line .= 'new Family({ ' . $value->toJavaScript() . ' })';
+                } elseif ($key == 'using') {
+                    $line .= 'new Using({ ' . $value->toJavaScript() . ' })';
+                } else {
+                    switch (gettype($value)) {
+                        case 'boolean':
+                            $line .= $value ? 'true' : 'false';
+                            break;
+                        case 'string':
+                            $line .= '"' . addslashes($value) . '"';
+                            break;
+                        case 'integer':
+                            $line .= $value;
+                            break;
+                    }
+                }
+
+                $lines[] = $line;
+            }
+        }
+
+        return implode($lines, ", ");
+    }
+}

+ 121 - 0
Qii/Library/Third/WhichBrowser/Model/Primitive/NameVersion.php

@@ -0,0 +1,121 @@
+<?php
+
+namespace WhichBrowser\Model\Primitive;
+
+use WhichBrowser\Model\Version;
+
+/**
+ * @internal
+ */
+
+class NameVersion extends Base
+{
+    /**
+     * @var string                          $name       The name
+     * @var string                          $alias      An alternative name that is used for readable strings
+     * @var \WhichBrowser\Model\Version     $version    Version information
+     */
+    public $name;
+    public $alias;
+    public $version;
+
+
+    /**
+     * Set the properties to the default values
+     *
+     * @param   array|null  $properties  An optional array of properties to set after setting it to the default values
+     *
+     * @internal
+     */
+
+    public function reset($properties = null)
+    {
+        unset($this->name);
+        unset($this->alias);
+        unset($this->version);
+
+        if (is_array($properties)) {
+            $this->set($properties);
+        }
+    }
+
+
+    /**
+     * Identify the version based on a pattern
+     *
+     * @param   string      $pattern   The regular expression that defines the group that matches the version string
+     * @param   string      $subject   The string the regular expression is matched with
+     * @param   array|null  $defaults  An optional array of properties to set together with the value
+     *
+     * @return string
+     */
+
+    public function identifyVersion($pattern, $subject, $defaults = [])
+    {
+        if (preg_match($pattern, $subject, $match)) {
+            $version = $match[1];
+
+            if (isset($defaults['type'])) {
+                switch ($defaults['type']) {
+                    case 'underscore':
+                        $version = str_replace('_', '.', $version);
+                        break;
+                    case 'legacy':
+                        $version = preg_replace("/([0-9])([0-9])/", '$1.$2', $version);
+                        break;
+                }
+            }
+
+
+            $this->version = new Version(array_merge($defaults, [ 'value' => $version ]));
+        }
+    }
+
+
+    /**
+     * Get the name in a human readable format
+     *
+     * @return string
+     */
+
+    public function getName()
+    {
+        return !empty($this->alias) ? $this->alias : (!empty($this->name) ? $this->name : '');
+    }
+
+
+    /**
+     * Get the version in a human readable format
+     *
+     * @return string
+     */
+
+    public function getVersion()
+    {
+        return !empty($this->version) ? $this->version->toString() : '';
+    }
+
+
+    /**
+     * Is a name detected?
+     *
+     * @return boolean
+     */
+
+    public function isDetected()
+    {
+        return !empty($this->name);
+    }
+
+
+    /**
+     * Get the name and version in a human readable format
+     *
+     * @return string
+     */
+
+    public function toString()
+    {
+        return trim($this->getName() . ' ' . (!empty($this->version) && !$this->version->hidden ? $this->getVersion() : ''));
+    }
+}

+ 35 - 0
Qii/Library/Third/WhichBrowser/Model/Using.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace WhichBrowser\Model;
+
+use WhichBrowser\Model\Primitive\NameVersion;
+
+class Using extends NameVersion
+{
+    /**
+     * Get an array of all defined properties
+     *
+     * @internal
+     *
+     * @return array
+     */
+
+    public function toArray()
+    {
+        $result = [];
+
+        if (!empty($this->name) && empty($this->version)) {
+            return $this->name;
+        }
+
+        if (!empty($this->name)) {
+            $result['name'] = $this->name;
+        }
+
+        if (!empty($this->version)) {
+            $result['version'] = $this->version->toArray();
+        }
+
+        return $result;
+    }
+}

+ 301 - 0
Qii/Library/Third/WhichBrowser/Model/Version.php

@@ -0,0 +1,301 @@
+<?php
+
+namespace WhichBrowser\Model;
+
+use WhichBrowser\Model\Primitive\Base;
+
+class Version extends Base
+{
+    /** @var string|null */
+    public $value = null;
+
+    /** @var boolean */
+    public $hidden = false;
+
+    /** @var string */
+    public $nickname;
+
+    /** @var string */
+    public $alias;
+
+    /** @var int */
+    public $details;
+
+    /** @var boolean */
+    public $builds;
+
+
+
+    /**
+     * Determine if the version is lower, equal or higher than the specified value
+     *
+     * @param  string   The operator, must be <, <=, =, >= or >
+     * @param  mixed    The value, can be an integer, float or string with a version number
+     *
+     * @return boolean
+     */
+
+    public function is()
+    {
+        $valid = false;
+
+        $arguments = func_get_args();
+        if (count($arguments)) {
+            $operator = '=';
+            $compare = null;
+
+            if (count($arguments) == 1) {
+                $compare = $arguments[0];
+            }
+
+            if (count($arguments) >= 2) {
+                $operator = $arguments[0];
+                $compare = $arguments[1];
+            }
+
+            if (!is_null($compare)) {
+                $min = min(substr_count($this->value, '.'), substr_count($compare, '.')) + 1;
+
+                $v1 = $this->toValue($this->value, $min);
+                $v2 = $this->toValue($compare, $min);
+
+                switch ($operator) {
+                    case '<':
+                        $valid = $v1 < $v2;
+                        break;
+                    case '<=':
+                        $valid = $v1 <= $v2;
+                        break;
+                    case '=':
+                        $valid = $v1 == $v2;
+                        break;
+                    case '>':
+                        $valid = $v1 > $v2;
+                        break;
+                    case '>=':
+                        $valid = $v1 >= $v2;
+                        break;
+                }
+            }
+        }
+
+        return $valid;
+    }
+
+
+    /**
+     * Return an object with each part of the version number
+     *
+     * @return object
+     */
+
+    public function getParts()
+    {
+        $parts = explode('.', $this->value);
+
+        return (object) [
+            'major' => !empty($parts[0]) ? intval($parts[0]) : 0,
+            'minor' => !empty($parts[1]) ? intval($parts[1]) : 0,
+            'patch' => !empty($parts[2]) ? intval($parts[2]) : 0,
+        ];
+    }
+
+
+    /**
+     * Return the major version as an integer
+     *
+     * @return integer
+     */
+
+    public function getMajor()
+    {
+        return $this->getParts()->major;
+    }
+
+
+    /**
+     * Return the minor version as an integer
+     *
+     * @return integer
+     */
+
+    public function getMinor()
+    {
+        return $this->getParts()->minor;
+    }
+
+
+    /**
+     * Return the patch number as an integer
+     *
+     * @return integer
+     */
+
+    public function getPatch()
+    {
+        return $this->getParts()->patch;
+    }
+
+
+    /**
+     * Convert a version string seperated by dots into a float that can be compared
+     *
+     * @internal
+     *
+     * @param  string   Version string, with elements seperated by a dot
+     * @param  int      The maximum precision
+     *
+     * @return float
+     */
+
+    private function toValue($value = null, $count = null)
+    {
+        if (is_null($value)) {
+            $value = $this->value;
+        }
+
+        $parts = explode('.', $value);
+        if (!is_null($count)) {
+            $parts = array_slice($parts, 0, $count);
+        }
+
+        $result = $parts[0];
+
+        if (count($parts) > 1) {
+            $result .= '.';
+
+            $count = count($parts);
+            for ($p = 1; $p < $count; $p++) {
+                $result .= substr('0000' . $parts[$p], -4);
+            }
+        }
+
+        return floatval($result);
+    }
+
+
+    /**
+     * Return the version as a float
+     *
+     * @return float
+     */
+
+    public function toFloat()
+    {
+        return floatval($this->value);
+    }
+
+
+    /**
+     * Return the version as an integer
+     *
+     * @return int
+     */
+
+    public function toNumber()
+    {
+        return intval($this->value);
+    }
+
+
+    /**
+     * Return the version as a human readable string
+     *
+     * @return string
+     */
+
+    public function toString()
+    {
+        if (!empty($this->alias)) {
+            return $this->alias;
+        }
+
+        $version = '';
+
+        if (!empty($this->nickname)) {
+            $version .= $this->nickname . ' ';
+        }
+
+        if (!empty($this->value)) {
+            if (preg_match("/([0-9]+)(?:\.([0-9]+))?(?:\.([0-9]+))?(?:\.([0-9]+))?(?:([ab])([0-9]+))?/", $this->value, $match)) {
+                $v = [ $match[1] ];
+
+                if (array_key_exists(2, $match) && strlen($match[2])) {
+                    $v[] = $match[2];
+                }
+
+                if (array_key_exists(3, $match) && strlen($match[3])) {
+                    $v[] = $match[3];
+                }
+
+                if (array_key_exists(4, $match) && strlen($match[4])) {
+                    $v[] = $match[4];
+                }
+
+                if (!empty($this->details)) {
+                    if ($this->details < 0) {
+                        array_splice($v, $this->details, 0 - $this->details);
+                    }
+
+                    if ($this->details > 0) {
+                        array_splice($v, $this->details, count($v) - $this->details);
+                    }
+                }
+
+                if (isset($this->builds) && !$this->builds) {
+                    $count = count($v);
+                    for ($i = 0; $i < $count; $i++) {
+                        if ($v[$i] > 999) {
+                            array_splice($v, $i, 1);
+                        }
+                    }
+                }
+
+                $version .= implode($v, '.');
+
+                if (array_key_exists(5, $match) && strlen($match[5])) {
+                    $version .= $match[5] . (!empty($match[6]) ? $match[6] : '');
+                }
+            }
+        }
+
+        return $version;
+    }
+
+
+    /**
+     * Get an array of all defined properties
+     *
+     * @internal
+     *
+     * @return array
+     */
+
+    public function toArray()
+    {
+        $result = [];
+
+        if (!empty($this->value)) {
+            if (!empty($this->details)) {
+                $parts = explode('.', $this->value);
+                $result['value'] = join('.', array_slice($parts, 0, $this->details));
+            } else {
+                $result['value'] = $this->value;
+            }
+        }
+
+        if (!empty($this->alias)) {
+            $result['alias'] = $this->alias;
+        }
+
+        if (!empty($this->nickname)) {
+            $result['nickname'] = $this->nickname;
+        }
+
+        if (isset($result['value']) && !isset($result['alias']) && !isset($result['nickname'])) {
+            return $result['value'];
+        }
+
+        return $result;
+    }
+}

+ 57 - 0
Qii/Library/Third/WhichBrowser/Parser.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace WhichBrowser;
+
+use WhichBrowser\Model\Main;
+
+class Parser extends Main
+{
+    use Cache;
+
+    /**
+     * Create a new object that contains all the detected information
+     *
+     * @param  array|string   $headers   Optional, an array with all of the headers or a string with just the User-Agent header
+     * @param  array          $options   Optional, an array with configuration options
+     */
+
+    public function __construct($headers = null, $options = [])
+    {
+        parent::__construct();
+        if (!is_null($headers)) {
+            $this->analyse($headers, $options);
+        }
+    }
+
+    /**
+     * Analyse the provided headers or User-Agent string
+     *
+     * @param  array|string   $headers   An array with all of the headers or a string with just the User-Agent header
+     */
+
+    public function analyse($headers, $options = [])
+    {
+        $o = $options;
+
+        if (is_string($headers)) {
+            $h = [ 'User-Agent' => $headers ];
+        } else {
+            if (isset($headers['headers'])) {
+                $h = $headers['headers'];
+
+                unset($headers['headers']);
+                $o = array_merge($headers, $options);
+            } else {
+                $h = $headers;
+            }
+        }
+
+        if ($this->analyseWithCache($h, $o)) {
+            return;
+        }
+
+        $analyser = new Analyser($h, $o);
+        $analyser->setdata($this);
+        $analyser->analyse();
+    }
+}

+ 510 - 0
Qii/Library/Third/WhichBrowser/README.md

@@ -0,0 +1,510 @@
+<img src="https://api.whichbrowser.net/whichbrowser.svg" width="400">
+
+This is an extremely complicated and almost completely useless browser sniffing library. Useless because you shouldn't use browser sniffing. So stop right now and go read something about feature detecting instead. I'm serious. Go away. You'll thank me later.
+
+
+WhichBrowser/Parser-PHP
+=======================
+
+The PHP version of WhichBrowser for use on a server. Fully compatible with PHP 5.4 or higher, including PHP 7 and HHVM.
+
+[![Build Status](https://travis-ci.org/WhichBrowser/Parser-PHP.svg?branch=master)](https://travis-ci.org/WhichBrowser/Parser)
+[![Coverage Status](https://coveralls.io/repos/WhichBrowser/Parser-PHP/badge.svg?branch=master&service=github)](https://coveralls.io/github/WhichBrowser/Parser-PHP?branch=master)
+[![License](https://poser.pugx.org/whichbrowser/parser/license)](https://packagist.org/packages/whichbrowser/parser)
+[![Latest Stable Version](https://poser.pugx.org/whichbrowser/parser/v/stable)](https://packagist.org/packages/whichbrowser/parser)
+
+[![Twitter Follow](https://img.shields.io/twitter/follow/whichbrowserlib.svg?style=social)](https://twitter.com/whichbrowserlib)
+
+Also available:
+
+- [WhichBrowser/Parser-JavaScript](https://github.com/WhichBrowser/Parser-JavaScript)<br>
+  A JavaScript version of WhichBrowser for use with Node.js on the server
+
+- [WhichBrowser/Server](https://github.com/WhichBrowser/Parser-JavaScript)<br>
+  A server written in PHP that provides a JavaScript API for use in the browser
+
+---
+
+
+About WhichBrowser
+------------------
+
+**But why *almost completely useless* and not completely useless?**
+Well, there is always an exception to the rule. There are valid reasons to do browser sniffing: to improve the user experience or to gather intelligence about which browsers are used on your website. My website is html5test.com and I wanted to know which score belongs to which browser. And to do that you need a browser sniffing library.
+
+**Why is it extremely complicated?**  
+Because everybody lies. Seriously, there is not a single browser that is completely truthful. Almost all browsers say they are Netscape 5 and almost all WebKit browsers say they are based on Gecko. Even Internet Explorer 11 now no longer claims to be IE at all, but instead an unnamed browser that is like Gecko. And it gets worse. That is why it is complicated.
+
+**What kind of information does it give?**
+You get a nice object which has information about the browser, rendering engine, os and device. It gives you names and versions and even device manufacturer and model. And WhichBrowser is pretty tenacious. It gives you info that others don't. For example:
+
+    JUC (Linux; U; 2.3.6; zh-cn; GT-I8150; 480*800) UCWEB8.7.4.225/145/800  
+    UC Browser 8.7 on a Samsung Galaxy W running Android 2.3.6
+
+Android is never mentioned
+
+    Mozilla/5.0 (Series40; Nokia501/10.0.2; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.0.0.0.73  
+    Nokia Xpress 3.0.0 on a Nokia Asha 501 running Nokia Asha Platform
+
+Despite the useragent header claiming to be a Series40 device, we know it's actually running the Asha Platform and we also know that OviBrowser has been renamed to Nokia Xpress.
+
+    Opera/9.80 (X11; Linux zvav; U; zh) Presto/2.8.119 Version/11.10  
+    Opera Mini on a Nokia 5230 running Series60 5.0
+
+The useragent header looks like Opera 11.10 on Linux, but we know it's Opera Mini. We can even figure out the real operating system and device model from other headers.
+
+
+
+Requirements
+-----------------
+
+WhichBrowser requires with PHP 5.4 or higher and supports PHP 7 and HHVM. WhichBrowser is compatible with the PSR-4 autoloading standard and follows PSR-1 and PSR-2 coding style.
+
+
+How to install it
+-----------------
+
+You can install WhichBrowser by using Composer - the standard package manager for PHP. The package is called `whichbrowser/parser`.
+
+    composer require whichbrowser/parser
+
+You can easily update WhichBrowser by running a simple command.
+
+    composer update whichbrowser/parser
+
+You should run this command as often as possible. You might even want to consider setting up a cron job for this purpose.
+
+
+
+
+How to use it
+-------------
+
+The first step require the Composer autoloader:
+
+```php
+<?php
+
+    require 'vendor/autoload.php';
+```
+
+The second step is to create a new `WhichBrowser\Parser` object. This object will contain all the information the library could find about the browser. The object has a required parameter, either the headers send by the browser, or a useragent string. Using the headers is preferable, because it will allow a better detection, but if you have just the useragent string, this will also work.
+
+For example:
+
+```php
+$result = new WhichBrowser\Parser(getallheaders());
+```
+
+or:
+
+```php
+$result = new WhichBrowser\Parser($_SERVER['HTTP_USER_AGENT']);
+```
+
+
+The variable `$result` now contains an object which you can query for information. There are various ways to access the information.
+
+
+First of all, you can call to `toString()` function to get a human readable identification:
+
+```php
+"You are using " . $result->toString();
+// You are using Chrome 27 on OS X Mountain Lion 10.8
+```
+
+Another possiblity is to query the object:
+
+```php
+$result->isType('desktop');
+// true
+
+$result->isType('mobile', 'tablet', 'media', 'gaming:portable');
+// false
+
+$result->isBrowser('Maxthon', '<', '4.0.5');
+// false
+
+$result->isOs('iOS', '>=', '8');
+// false
+
+$result->isOs('OS X');
+// true
+
+$result->isEngine('Blink');
+// true
+```
+
+You can also access these properties directly:
+
+```php
+$result->browser->toString();
+// Chrome 27  
+
+$result->engine->toString();
+// Blink
+
+$result->os->toString();
+// OS X Mountain Lion 10.8
+```
+
+Or access parts of these properties directly:
+
+```php
+$result->browser->name;
+// Chrome
+
+$result->browser->name . ' ' . $result->browser->version.toString();
+// Chrome 27
+
+$result->browser->version->value;
+// 27.0.1453.110
+
+$result->engine->name;
+// Blink
+```
+
+Finally you can also query versions directly:
+
+```php
+$result->browser->version->is('>', 26);
+// true
+
+$result->os->version->is('<', '10.7.4');
+// false
+```
+
+Options
+-------
+
+It is possible to set additional options by passing an array as the second parameter when creating the `Parser` object.
+
+### Disabling detection of bots
+
+In some cases you may want to disable the detection of bots. This allows the bot the deliberately fool WhichBrowser, so you can pick up the identity of useragent what the bot tries to mimic. This is especially handy when you want to use WhichBrowser to switch between different variants of your website and want to make sure crawlers see the right variant of the website. For example, a bot that mimics a mobile device will see the mobile variant of you site.
+
+```php
+$result = new WhichBrowser\Parser(getallheaders(), [ 'detectBots' => false ]);
+```
+
+Enable result caching
+---------------------
+
+WhichBrowser supports PSR-6 compatible cache adapters for caching results between requests. Using a cache is especially useful if you use WhichBrowser on every page of your website and a user visits multiple pages. During the first visit the headers will be parsed and the result will be cached. Upon further visits, the cached results will be used, which is much faster than having to parse the headers again and again.
+
+There are adapters available for other types of caches, such as APC, Doctrine, Memcached, MongoDB, Redis and many more. The configuration of these adapters all differ from each other, but once configured, all you have to do is pass it as an option when creating the `Parser` object, or use the `setCache()` function to set it afterwards. WhichBrowser has been tested to work with the adapters provided by [PHP Cache](http://php-cache.readthedocs.org/en/latest/). For a list of other packages that provide adapters see [Packagist](https://packagist.org/providers/psr/cache-implementation).
+
+For example, if you want to enable a memcached based cache you need to install an extra composer package:
+
+    composer require cache/memcached-adapter
+
+And change the call to WhichBrowser/Parser as follows:
+
+```php
+$client = new \Memcached();
+$client->addServer('localhost', 11211);
+
+$pool = new \Cache\Adapter\Memcached\MemcachedCachePool($client);
+
+$result = new WhichBrowser\Parser(getallheaders(), [ 'cache' => $pool ]);
+```
+
+or
+
+```php
+$client = new \Memcached();
+$client->addServer('localhost', 11211);
+
+$pool = new \Cache\Adapter\Memcached\MemcachedCachePool($client);
+
+$result = new WhichBrowser\Parser();
+$result->setCache($pool);
+$result->analyse(getallheaders());
+```
+
+You can also specify after how many seconds a cached result should be discarded. The default value is 900 seconds or 15 minutes. If you think WhichBrowser uses too much memory for caching, you should lower this value. You can do this by setting the `cacheExpires` option or passing it as a second parameter to the `setCache()` function.
+
+
+API reference
+-------------
+
+### The Parser object
+
+After a new `WhichBrowser\Parser` object is created, it contains a number of properties and functions. All of these properties are guaranteed to be present.
+
+**Properties:**
+
+* `browser`  
+  an object that contains information about the browser itself
+* `engine`  
+  an object that contains information about the rendering engine
+* `os`  
+  an object that contains information about the operating system
+* `device`  
+  an object that contains information about the device
+
+**Functions:**
+
+`getType()`  
+Returns the `type` and `subtype` property of the `device` object. If a subtype is present it is concatenated to the type and seperated by a semicolor, for example: `mobile:smart` or `gaming:portable`. If the subtype is not applicable, it just return the type, for example: `desktop` or `ereader`.
+
+`isType($type [,$type [,$type [,$type]]])`  
+If a single argument is used, the function returns `true` if the argument matches the `type` propery of `device` object. The argument can optionally also provide a subtype by concatenating it to the type and seperating it with a semicolon. It can use multiple arguments in which case the function returns `true` if one of the arguments matches. If none of the arguments matches, it returns `false`
+
+`isMobile()`  
+Return `true` if the browser is a mobile device, like a phone, tablet, ereader, camera, portable media player, watch or portable gaming console. Otherwise it returns `false`.
+
+`isBrowser($name [, $comparison, $version])`  
+Is used to query the `name` and `version` property of the `browser` object. The funcion can contain a single argument to a simple comparison based on `name`, or three arguments to compare both `name` and `version`. The first argument always contains the name of the browser. The second arguments is a string that can container either `<`, `<=`, `=`, `=>` or `>`. The third is an integer, float or string that contains the version. You can use versions like `10`, `10.7` or `'10.7.4'`. For more information about how version comparisons are performed, please see the `is()` function of the `Version` object.
+
+`isEngine($name [, $comparison, $version])`  
+Is used to query the `name` and `version` property of the `engine` object. This function works in exactly the same way as `isBrowser`.
+
+`isOs($name [, $comparison, $version])`  
+Is used to query the `name` and `version` property of the `os` object. This function works in exactly the same way as `isBrowser`.
+
+`isDetected()`  
+Is there actually some browser detected, for did we fail to detect anything?
+
+`toString()`  
+Get a human readable representation of the detected browser, including operating system and device information.
+
+
+### The browser object
+
+An object of the `WhichBrowser\Model\Browser` class is used for the `browser` property of the main `WhichBrowser\Parser` object and contains a number of properties. If a property is not applicable in this situation it will be null or undefined.
+
+**Properties:**
+
+* `name`  
+  a string containing the name of the browser
+* `alias`  
+  a string containing an alternative name of the browser
+* `version`  
+  a version object containing information about the version of the browser
+* `stock`  
+  a boolean, true if the browser is the default browser of the operating system, false otherwise
+* `channel`  
+  a string containing the distribution channel, ie. 'Nightly' or 'Next'.
+* `mode`  
+  a string that can contain the operating mode of the browser, ie. 'proxy'.
+* `hidden`  
+  a boolean that is true if the browser does not have a name and is the default of the operating system.
+* `family`  
+  an object that contains information about to which family this browser belongs
+* `using`  
+  an object that contains information about to which kind of webview this browser uses
+
+**Functions:**
+
+`isFamily($name)`  
+Does the family of this browser have this name, or does the browser itself have this name.
+
+`isUsing($name)`  
+Is the browser using a webview using with the provided name.
+
+`getName()`  
+Get the name of the browser
+
+`getVersion()`  
+Get the version of the browser
+
+`toString()`  
+Get a human readable representation of the detected browser
+
+
+### The engine object
+
+An object of the `WhichBrowser\Model\Engine` class is used for the `engine` property of the main `WhichBrowser\Parser` object and contains a number of properties. If a property is not applicable in this situation it will be null or undefined.
+
+**Properties:**
+
+* `name`  
+  a string containing the name of the rendering engine
+* `version`  
+  a version object containing information about the version of the rendering engine
+
+**Functions:**
+
+`getName()`  
+Get the name of the rendering engine
+
+`getVersion()`  
+Get the version of the rendering engine
+
+`toString()`  
+Get a human readable representation of the detected rendering engine
+
+
+### The os object
+
+An object of the `WhichBrowser\Model\Os` class is used for the `os` property of the main `WhichBrowser\Parser` object and contains a number of properties. If a property is not applicable in this situation it will be null or undefined.
+
+**Properties:**
+
+* `name`  
+  a string containing the name of the operating system
+* `version`  
+  a version object containing information about the version of the operating system
+* `family`  
+  an object that contains information about to which family this operating system belongs
+
+**Functions:**
+
+`isFamily($name)`  
+Does the family of this operating system have this name, or does the operating system itself have this name.
+
+`getName()`  
+Get the name of the operating system
+
+`getVersion()`  
+Get the version of the operating system
+
+`toString()`  
+Get a human readable representation of the detected operating system
+
+
+### The device object
+
+An object of the `WhichBrowser\Model\Device` class is used for the `device` property of the main `WhichBrowser\Parser` object and contains a number of properties. If a property is not applicable in this situation it will be null or undefined.
+
+**Properties:**
+
+* `type`  
+  a string containing the type of the browser.
+* `subtype`  
+  a string containing the subtype of the browser.
+* `identified`  
+  a boolean that is true if the device has been positively identified.
+* `manufacturer`  
+  a string containing the manufacturer of the device, ie. 'Apple' or 'Samsung'.
+* `model`  
+  as string containing the model of the device, ie. 'iPhone' or 'Galaxy S4'.
+
+The `type` property can contain any value from the following list:
+
+* desktop
+* mobile
+* tablet
+* gaming
+* headset
+* ereader
+* media
+* emulator
+* television
+* monitor
+* camera
+* signage
+* whiteboard
+* car
+* pos
+* bot
+
+If the `type` is "mobile", the `subtype` property can contain any value from the following list:
+
+* feature
+* smart
+
+If the `type` is "gaming", the `subtype` property can contain any value from the following list:
+
+* console
+* portable
+
+**Functions:**
+
+`getManufacturer()`  
+Get the name of the manufacturer
+
+`getModel()`  
+Get the name of the model
+
+`toString()`  
+Get a human readable representation of the detected device
+
+
+### The family object
+
+An object of the `WhichBrowser\Model\Family` class is used for the `family` property of the `WhichBrowser\Model\Browser` and `WhichBrowser\Model\Os` object and contains a number of properties. If a property is not applicable in this situation it will be null or undefined.
+
+**Properties:**
+
+* `name`  
+  a string containing the name of the family
+* `version`  
+  a version object containing information about the version of the family
+
+**Functions:**
+
+`getName()`  
+Get the name of the family
+
+`getVersion()`  
+Get the version of the family
+
+`toString()`  
+Get a human readable representation of the family
+
+
+### The using object
+
+An object of the `WhichBrowser\Model\Using` class is used for the `using` property of the `WhichBrowser\Model\Browser` object and contains a number of properties. If a property is not applicable in this situation it will be null or undefined.
+
+**Properties:**
+
+* `name`  
+  a string containing the name of the webview
+* `version`  
+  a version object containing information about the version of the webview
+
+**Functions:**
+
+`getName()`  
+Get the name of the webview
+
+`getVersion()`  
+Get the version of the webview
+
+`toString()`  
+Get a human readable representation of the webview
+
+
+### The version object
+
+An object of the `WhichBrowser\Model\Version` class is used for the `version` property of the `browser`, `engine` and `os` object and contains a number of properties and functions. If a property is not applicable in this situation it will be null or undefined.
+
+**Properties:**
+
+* `value`  
+  a string containing the original version number.
+* `alias`  
+  a string containing an alias for the version number, ie. 'XP' for Windows '5.1'.
+* `details`  
+  an integer containing the number of digits of the version number that should be printed.
+
+**Functions:**
+
+`is($version)` or `is($comparison, $version)`  
+Using this function it is easy to compare a version to another version. If you specify only one argument, this function will return if the versions are the same. You can also specify two arguments, in that case the first argument contains the comparison operator, such as `<`, `<=`, `=`, `=>` or `>`. The second argument is the version you want to compare it to. You can use versions like `10`, `10.7` or `'10.7.4'`, but be aware that `10` is not the same as `10.0`. For example if our OS version is `10.7.4`:
+
+```php
+$result->os->version->is('10.7.4');
+// true
+
+$result->os->version->is('10.7');
+// true
+
+$result->os->version->is('10');
+// true
+
+$result->os->version->is('10.0');
+// false
+
+$result->os->version->is('>', '10');
+// false
+
+$result->os->version->is('>', '10.7');
+// false
+
+$result->os->version->is('>', '10.7.3');
+// true
+```

+ 289 - 0
Qii/Library/Third/data/applications-bots.php

@@ -0,0 +1,289 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+Applications::$BOTS = [
+    [ 'name' => '80legs',                       'id'    => '008',      'regexp' => '/(?:^|\s)008\/([0-9.]*)/u' ],
+    [ 'name' => '360spider',                    'id'    => '360',      'regexp' => '/360Spider/u' ],
+    [ 'name' => '360spider',                    'id'    => '360',      'regexp' => '/360spider-image/u' ],
+    [ 'name' => 'A6 Indexer',                   'id'    => 'a6',      'regexp' => '/A6-Indexer(?:\/([0-9.]*))?/u' ],
+    [ 'name' => 'Aboundex',                     'id'    => 'abound',      'regexp' => '/Aboundex\/([0-9.]*)/u' ],
+    [ 'name' => 'Ad Muncher',                   'id'    => 'muncher',      'regexp' => '/Ad Muncher v([0-9.]*)/u' ],
+    [ 'name' => 'Adaxas',                       'id'    => 'adaxas',      'regexp' => '/Adaxas Spider/u' ],
+    [ 'name' => 'AddThis.com',                  'id'    => 'addthis',      'regexp' => '/AddThis.com/u' ],
+    [ 'name' => 'ADmantX',                      'id'    => 'admantx',      'regexp' => '/ADmantX Platform Semantic Analyzer/u' ],
+    [ 'name' => 'AhrefsBot',                    'id'    => 'ahrefsbot',      'regexp' => '/AhrefsBot.Feeds v([0-9.]*)/u' ],
+    [ 'name' => 'AhrefsBot',                    'id'    => 'ahrefsbot',      'regexp' => '/AhrefsBot\/([0-9.]*)/u' ],
+    [ 'name' => 'Alexa',                        'id'    => 'archiver',      'regexp' => '/ia_archiver/u' ],
+    [ 'name' => 'AltaVista',                    'id'    => 'altavista',      'regexp' => '/AltaVista Intranet V([0-9.]*)/u' ],
+    [ 'name' => 'Analytics SEO',                'id'    => 'curious',      'regexp' => '/Curious George - www.analyticsseo.com\/crawler/u' ],
+    [ 'name' => 'Amazon CloudFront',            'id'    => 'cloudfront',      'regexp' => '/Amazon CloudFront/u' ],
+    [ 'name' => 'Amorank Spider',               'id'    => 'amorank',      'regexp' => '/AmorankSpider\/([0-9.]*)/u' ],
+    [ 'name' => 'ArchiveBot',                   'id'    => 'archive',      'regexp' => '/ArchiveTeam ArchiveBot/u' ],
+    [ 'name' => 'Archive.org',                  'id'    => 'archive',      'regexp' => '/archive.org_bot(?:\/([0-9.]*))?/u' ],
+    [ 'name' => 'Archive.org',                  'id'    => 'archive',      'regexp' => '/special_archiver(?:\/([0-9.]*))?/u' ],
+    [ 'name' => 'Ask Jeeves',                   'id'    => 'jeeves',      'regexp' => '/Ask Jeeves\/Teoma/u' ],
+    [ 'name' => 'AstraSpider',                  'id'    => 'astra',      'regexp' => '/AstraSpider V([0-9.]*)/u' ],
+    [ 'name' => 'Backlink-Check',               'id'    => 'backlink',      'regexp' => '/Backlink-Ceck.de/u' ],
+    [ 'name' => 'BacklinkCrawler',              'id'    => 'backlink',      'regexp' => '/BacklinkCrawler/u' ],
+    [ 'name' => 'Baiduspider',                  'id'    => 'baidu',      'regexp' => '/Baiduspider[\+ ]\([\+ ]/u' ],
+    [ 'name' => 'Baiduspider',                  'id'    => 'baidu',      'regexp' => '/Baiduspider\/([0-9.]*)/u' ],
+    [ 'name' => 'Baiduspider',                  'id'    => 'baidu',      'regexp' => '/Baiduspider/u' ],
+    [ 'name' => 'Baiduspider',                  'id'    => 'baidu',      'regexp' => '/baiduspider-mobile-gate/u' ],
+    [ 'name' => 'Baiduspider',                  'id'    => 'baidu',      'regexp' => '/\+http:\/\/www.baidu.com\/search\/spider.html/u' ],
+    [ 'name' => 'Baiduspider',                  'id'    => 'baidu',      'regexp' => '/BaiduImagespider/u' ],
+    [ 'name' => 'BazQux',                       'id'    => 'bazqux',      'regexp' => '/BazQux\/([0-9.]*)/u' ],
+    [ 'name' => 'Bing',                         'id'    => 'bingbot',      'regexp' => '/bingbot\/([0-9.]*)/u' ],
+    [ 'name' => 'Bing',                         'id'    => 'msnbot',      'regexp' => '/msnbot\/([0-9.]*)/u' ],
+    [ 'name' => 'Bing',                         'id'    => 'msnbot',      'regexp' => '/msnbot-UDiscovery\/([0-9.]*)/u' ],
+    [ 'name' => 'Bing',                         'id'    => 'msnbot',      'regexp' => '/msnbot-media\/([0-9.]*)/u' ],
+    [ 'name' => 'Bing',                         'id'    => 'msnbot',      'regexp' => '/MsnBot-Media \/([0-9.]*)/u' ],
+    [ 'name' => 'Bing',                         'id'    => 'msnbot',      'regexp' => '/msnbot-NewsBlogs\/([0-9.]*)/u' ],
+    [ 'name' => 'Bing',                         'id'    => 'msnbot',      'regexp' => '/MSNBOT_Mobile/u' ],
+    [ 'name' => 'Bing',                         'id'    => 'msmobot',      'regexp' => '/MSMOBOT/u' ],
+    [ 'name' => 'Bing Preview',                 'id'    => 'bing',      'regexp' => '/BingPreview\/([0-9.]*)/u' ],
+    [ 'name' => 'BlogBridge',                   'id'    => 'blogbridge',      'regexp' => '/BlogBridge ([0-9.]*)/u' ],
+    [ 'name' => 'Bloglines',                    'id'    => 'bloglines',      'regexp' => '/Bloglines\/([0-9.]*)/u' ],
+    [ 'name' => 'Bloglovin',                    'id'    => 'bloglovin',      'regexp' => '/Bloglovin\/([0-9.]*)/u' ],
+    [ 'name' => 'BlogPulse',                    'id'    => 'blogpulse',      'regexp' => '/BlogPulse \(ISSpider-([0-9.]*)/u' ],
+    [ 'name' => 'Blogram',                      'id'    => 'blogram',      'regexp' => '/BlogramCrawler\/([0-9.]*)/u' ],
+    [ 'name' => 'Blogtrottr',                   'id'    => 'blogtrot',      'regexp' => '/Blogtrottr\/([0-9.]*)/u' ],
+    [ 'name' => 'Blogshares',                   'id'    => 'blogshares',      'regexp' => '/Blogshares/u' ],
+    [ 'name' => 'BoardReader',                  'id'    => 'boardreader',      'regexp' => '/BoardReader\/([0-9.]*)/u' ],
+    [ 'name' => 'Browsershots',                 'id'    => 'browsershots',      'regexp' => '/Browsershots/u' ],
+    [ 'name' => 'BUbiNG',                       'id'    => 'bubing',      'regexp' => '/BUbiNG/u' ],
+    [ 'name' => 'Butterfly',                    'id'    => 'butterfly',      'regexp' => '/Butterfly\/([0-9.]*)/u' ],
+    [ 'name' => 'CiteSeerX',                    'id'    => 'heritrix',      'regexp' => '/heritrix\/([0-9.]*)/u' ],
+    [ 'name' => 'Cliqzbot',                     'id'    => 'cliqz',      'regexp' => '/Cliqzbot\/([0-9.]*)/u' ],
+    [ 'name' => 'CloudFare Always Online',      'id'    => 'cloudflare',      'regexp' => '/CloudFlare-AlwaysOnline\/([0-9.]*)/u' ],
+    [ 'name' => 'Comodo',                       'id'    => 'comodo',      'regexp' => '/Comodo Spider ([0-9.]*)/u' ],
+    [ 'name' => 'CommaFeed',                    'id'    => 'commafeed',      'regexp' => '/CommaFeed\/([0-9.]*)/u' ],
+    [ 'name' => 'CommonCrawl',                  'id'    => 'cbot',      'regexp' => '/CCBot\/([0-9.]*)/u' ],
+    [ 'name' => 'Data Hotel Watchdog',          'id'    => 'watchdog',      'regexp' => '/Data-Hotel-Watchdog\/([0-9.]*)/u' ],
+    [ 'name' => 'DataparkSearch',               'id'    => 'datasearch',      'regexp' => '/DataparkSearch\/([0-9.]*)/u' ],
+    [ 'name' => 'Daumoa',                       'id'    => 'daumoa',      'regexp' => '/Daumoa ([0-9.]*)/u' ],
+    [ 'name' => 'Digg',                         'id'    => 'digg',      'regexp' => '/Digg Deeper\/v([0-9.]*)/u' ],
+    [ 'name' => 'Digg',                         'id'    => 'digg',      'regexp' => '/Digg\/([0-9.]*)/u' ],
+    [ 'name' => 'Domain Re-Animator',           'id'    => 'domain',      'regexp' => '/Domain Re-Animator Bot/u' ],
+    [ 'name' => 'Exabot Thumbnails',            'id'    => 'exabot',      'regexp' => '/Exabot-Thumbnails/u' ],
+    [ 'name' => 'ExactSeek',                    'id'    => 'exactseek',      'regexp' => '/ExactSeek Crawler/u' ],
+    [ 'name' => 'Ezooms Crawler',               'id'    => 'ezooms',      'regexp' => '/Ezooms\/([0-9.]*)/u' ],
+    [ 'name' => 'Facebook',                     'id'    => 'facebook',      'regexp' => '/facebookplatform\/([0-9.]*)/u' ],
+    [ 'name' => 'Facebook',                     'id'    => 'facebook',      'regexp' => '/facebookexternalhit\/([0-9.]*)/u' ],
+    [ 'name' => 'Facebook',                     'id'    => 'facebook',      'regexp' => '/facebookscraper\/([0-9.]*)/u' ],
+    [ 'name' => 'Facebook',                     'id'    => 'facebook',      'regexp' => '/FacebookSecurity\/([0-9.]*)/u' ],
+    [ 'name' => 'FAST Crawler',                 'id'    => 'fast',      'regexp' => '/FAST Crawler ([0-9.]*)/u' ],
+    [ 'name' => 'FAST Crawler',                 'id'    => 'fast',      'regexp' => '/FastCrawler3/u' ],
+    [ 'name' => 'FAST Enterprise Crawler',      'id'    => 'fast',      'regexp' => '/FAST Enterprise Crawler\/([0-9.]*)/u' ],
+    [ 'name' => 'FAST Enterprise Crawler',      'id'    => 'fast',      'regexp' => '/FAST Enterprise Crawler ([0-9.]*)/u' ],
+    [ 'name' => 'FAST Enterprise Crawler',      'id'    => 'fast',      'regexp' => '/FAST EnterpriseCrawler ([0-9.]*)/u' ],
+    [ 'name' => 'FAST MetaWeb Crawler',         'id'    => 'fast',      'regexp' => '/FAST MetaWeb Crawler/u' ],
+    [ 'name' => 'FAST mSEARCH Crawler',         'id'    => 'fast',      'regexp' => '/FAST-mSEARCH Crawler ([0-9.]*)/u' ],
+    [ 'name' => 'FAST Web Crawler',             'id'    => 'fast',      'regexp' => '/FAST-WebCrawler\/([0-9.]*)/u' ],
+    [ 'name' => 'Flamingo Search',              'id'    => 'flamingo',      'regexp' => '/Flamingo_SearchEngine/u' ],
+    [ 'name' => 'Fastladder',                   'id'    => 'fastladder',      'regexp' => '/Fastladder FeedFetcher\/([0-9.]*)/u' ],
+    [ 'name' => 'Feedbin',                      'id'    => 'feed',      'regexp' => '/Feedbin/u' ],
+    [ 'name' => 'FeedWrangler',                 'id'    => 'wrangler',      'regexp' => '/Feed Wrangler\/([0-9.]*)/u' ],
+    [ 'name' => 'Feedly',                       'id'    => 'feed',      'regexp' => '/FeedlyApp\/([0-9.]*)/u' ],
+    [ 'name' => 'Feedly',                       'id'    => 'feed',      'regexp' => '/FeedlyBot\/([0-9.]*)/u' ],
+    [ 'name' => 'Feedly',                       'id'    => 'feed',      'regexp' => '/MetaFeedly\/([0-9.]*)/u' ],
+    [ 'name' => 'Feedspot',                     'id'    => 'feed',      'regexp' => '/Feedspot/u' ],
+    [ 'name' => 'FeedValidator',                'id'    => 'validator',      'regexp' => '/FeedValidator\/([0-9.]*)/u' ],
+    [ 'name' => 'FeedZirra',                    'id'    => 'feed',      'regexp' => '/feedzirra/u' ],
+    [ 'name' => 'Fever',                        'id'    => 'fever',      'regexp' => '/Fever\/([0-9.]*)/u' ],
+    [ 'name' => 'Friendica',                    'id'    => 'friendica',      'regexp' => '/Friendica/u' ],
+    [ 'name' => 'FTRF: Friendly Robot',         'id'    => 'robot',      'regexp' => '/FTRF: Friendly robot\/([0-9.]*)/u' ],
+    [ 'name' => 'Genieo Web Filter',            'id'    => 'genieo',      'regexp' => '/Genieo\/([0-9.]*)/u' ],
+    [ 'name' => 'GNIP',                         'id'    => 'fetchor',      'regexp' => '/UnwindFetchor\/([0-9.]*)/u' ],
+    [ 'name' => 'Gocrawl',                      'id'    => 'google',      'regexp' => '/Googlebot \(gocrawl v([0-9.]*)\)/u' ],
+    [ 'name' => 'GomezAgent',                   'id'    => 'gomez',      'regexp' => '/GomezAgent ([0-9.]+)/u' ],
+    [ 'name' => 'Goo',                          'id'    => 'ichiro',      'regexp' => '/ichiro\/mobile goo/u' ],
+    [ 'name' => 'Goo Blog Search',              'id'    => 'gooblog',      'regexp' => '/gooblog\/([0-9.]*)/u' ],
+    [ 'name' => 'Goo Blog Search',              'id'    => 'gooblog',      'regexp' => '/gooblogsearch\/([0-9.]*)/u' ],
+    [ 'name' => 'Goo RSS Reader',               'id'    => 'goorss',      'regexp' => '/gooRSSreader([0-9.]*)/u' ],
+    [ 'name' => 'Googlebot',                    'id'    => 'google',      'regexp' => '/Google[Bb]ot\/([0-9.]*)/u' ],
+    [ 'name' => 'Googlebot Mobile',             'id'    => 'google',      'regexp' => '/Googlebot-Mobile\/([0-9.]*)/u' ],
+    [ 'name' => 'Googlebot Image',              'id'    => 'google',      'regexp' => '/Googlebot-Image\/([0-9.]*)/u' ],
+    [ 'name' => 'Googlebot Video',              'id'    => 'google',      'regexp' => '/Googlebot-Video\/([0-9.]*)/u' ],
+    [ 'name' => 'Google Ads Bot',               'id'    => 'google',      'regexp' => '/AdsBot-Google/u' ],
+    [ 'name' => 'Google Adsense Snapshot',      'id'    => 'google',      'regexp' => '/Adsense-Snapshot-Google/u' ],
+    [ 'name' => 'Google App Engine',            'id'    => 'google',      'regexp' => '/AppEngine-Google/u' ],
+    [ 'name' => 'Google Web Preview',           'id'    => 'google',      'regexp' => '/Google Web Preview/u' ],
+    [ 'name' => 'Google Page Speed',            'id'    => 'google',      'regexp' => '/Google Page Speed Insights/u' ],
+    [ 'name' => 'Google FeedBurner',            'id'    => 'feed',      'regexp' => '/FeedBurner\/([0-9.]*)/u' ],
+    [ 'name' => 'Google Feedfetcher',           'id'    => 'google',      'regexp' => '/Feedfetcher-Google/iu' ],
+    [ 'name' => 'Google Font Analysis',         'id'    => 'google',      'regexp' => '/Google-FontAnalysis\/([0-9.]*)/u' ],
+    [ 'name' => 'Google Sitemaps',              'id'    => 'google',      'regexp' => '/Google-Sitemaps\/([0-9.]*)/u' ],
+    [ 'name' => 'Google Site Verification',     'id'    => 'google',      'regexp' => '/Google-Site-Verification\/([0-9.]*)/u' ],
+    [ 'name' => 'Google Rich Snippets',         'id'    => 'google',      'regexp' => '/Googlebot-richsnippets/u' ],
+    [ 'name' => 'Google Mediapartners',         'id'    => 'google',      'regexp' => '/Mediapartners-Google\/([0-9.]*)/u' ],
+    [ 'name' => 'Google Mediapartners',         'id'    => 'google',      'regexp' => '/Mediapartners-Google/u' ],
+    [ 'name' => 'Google News',                  'id'    => 'google',      'regexp' => '/Googlebot-News/u' ],
+    [ 'name' => 'Google Wireless Transcoder',   'id'    => 'google',      'regexp' => '/Google Wireless Transcoder/u' ],
+    [ 'name' => 'Google Play Newsstand',        'id'    => 'google',      'regexp' => '/GoogleProducer/u' ],
+    [ 'name' => 'Google YouTube Sample',        'id'    => 'google',      'regexp' => '/Google-YouTubeSample\/([0-9.]*)/u' ],
+    [ 'name' => 'Grammarly',                    'id'    => 'grammarly',      'regexp' => '/Grammarly\/([0-9.]*)/u' ],
+    [ 'name' => 'Grub',                         'id'    => 'grub',      'regexp' => '/grub-client-([0-9.]*)/u' ],
+    [ 'name' => 'Hatena Antenna',               'id'    => 'hatena',      'regexp' => '/Hatena Antenna\/([0-9.]*)/u' ],
+    [ 'name' => 'Hatena Diary',                 'id'    => 'hatena',      'regexp' => '/Hatena Diary RSS Module/u' ],
+    [ 'name' => 'Hatena Pagetitle',             'id'    => 'hatena',      'regexp' => '/Hatena Pagetitle Agent\/([0-9.]*)/u' ],
+    [ 'name' => 'HeartRails Capture',           'id'    => 'capture',      'regexp' => '/HeartRails_Capture\/([0-9.]*)/u' ],
+    [ 'name' => 'htdig',                        'id'    => 'htdig',      'regexp' => '/htdig\/([0-9.]*)/u' ],
+    [ 'name' => 'HTTPMon',                      'id'    => 'httpmon',      'regexp' => '/HTTPMon\/([0-9.]*)/u' ],
+    [ 'name' => 'HubPages',                     'id'    => 'hubpages',      'regexp' => '/HubPages V([0-9.]*)/u' ],
+    [ 'name' => 'iAsk Spider',                  'id'    => 'spider',      'regexp' => '/iaskspider\/([0-9.]*)/u' ],
+    [ 'name' => 'iAsk Spider',                  'id'    => 'spider',      'regexp' => '/iaskspider2/u' ],
+    [ 'name' => 'Ichiro',                       'id'    => 'ichiro',      'regexp' => '/ichiro\/([0-9.]*)/u' ],
+    [ 'name' => 'Internet Archive',             'id'    => 'archive',      'regexp' => '/InternetArchive\/([0-9.]*)/u' ],
+    [ 'name' => 'JamesBOT',                     'id'    => 'crawler',      'regexp' => '/James BOT - WebCrawler/u' ],
+    [ 'name' => 'Jayde',                        'id'    => 'crawler',      'regexp' => '/Jayde Crawler./u' ],
+    [ 'name' => 'Kouio',                        'id'    => 'kouio',      'regexp' => '/kouio.com/u' ],
+    [ 'name' => 'Larbin',                       'id'    => 'larbin',      'regexp' => '/[Ll]arbin[\/_]([0-9.]*)/u' ],
+    [ 'name' => 'Linkedin Bot',                 'id'    => 'linkedin',      'regexp' => '/LinkedInBot\/([0-9.]*)/u' ],
+    [ 'name' => 'Linkdex Bot',                  'id'    => 'linkdex',      'regexp' => '/linkdexbot-mobile\/([0-9.]*)/u' ],
+    [ 'name' => 'Linkdex Bot',                  'id'    => 'linkdex',      'regexp' => '/linkdex.com\/v([0-9.]*)/u' ],
+    [ 'name' => 'Livedoor',                     'id'    => 'livedoor',      'regexp' => '/livedoor/u' ],
+    [ 'name' => 'LTX71',                        'id'    => 'ltx71',      'regexp' => '/ltx71/u' ],
+    [ 'name' => 'Magpie RSS',                   'id'    => 'magpie',      'regexp' => '/MagpieRSS\/([0-9.]*)/u' ],
+    [ 'name' => 'Mapian News Bot',              'id'    => 'mapion',      'regexp' => '/mapion-news-bot\/([0-9.]*)/u' ],
+    [ 'name' => 'Microsoft Social Streams',     'id'    => 'socialstreams',      'regexp' => '/Microsoft MSN SocialStreams Bot/u' ],
+    [ 'name' => 'Mixi',                         'id'    => 'mixi',      'regexp' => '/mixi-check\/([0-9.]*)/u' ],
+    [ 'name' => 'MnoGoSearch',                  'id'    => 'mnogo',      'regexp' => '/MnoGoSearch\/([0-9.]*)/u' ],
+    [ 'name' => 'Monitor.us',                   'id'    => 'monitor',      'regexp' => '/monitor.us/u' ],
+    [ 'name' => 'Naver Yeti',                   'id'    => 'yeti',      'regexp' => '/Yeti\/([0-9.]*)/u' ],
+    [ 'name' => 'Netcraft Survey Bot',          'id'    => 'netcraft',      'regexp' => '/Netcraft Web Server Survey/u' ],
+    [ 'name' => 'Netvibes',                     'id'    => 'netvibes',      'regexp' => '/Netvibes/u' ],
+    [ 'name' => 'NewsBlur',                     'id'    => 'newsblur',      'regexp' => '/NewsBlur Favicon Fetcher/u' ],
+    [ 'name' => 'NewsBlur',                     'id'    => 'newsblur',      'regexp' => '/NewsBlur Feed Fetcher/u' ],
+    [ 'name' => 'NewsBlur',                     'id'    => 'newsblur',      'regexp' => '/NewsBlur Feed Finder/u' ],
+    [ 'name' => 'NewsBlur',                     'id'    => 'newsblur',      'regexp' => '/NewsBlur Page Fetcher/u' ],
+    [ 'name' => 'NewsGator',                    'id'    => 'newsgator',      'regexp' => '/NewsGator\/([0-9.]*)/u' ],
+    [ 'name' => 'NewsGator',                    'id'    => 'newsgator',      'regexp' => '/NewsGatorOnline\/([0-9.]*)/u' ],
+    [ 'name' => 'NewsGator FetchLinks',         'id'    => 'newsgator',      'regexp' => '/NewsGator FetchLinks extension\/([0-9.]*)/u' ],
+    [ 'name' => 'OpenWebSpider',                'id'    => 'spider',      'regexp' => '/OpenWebSpider v([0-9.]*)/u' ],
+    [ 'name' => 'OrangeBot',                    'id'    => 'orange',      'regexp' => '/OrangeBot-Collector\/([0-9.]*)/u' ],
+    [ 'name' => 'OrangeBot',                    'id'    => 'orange',      'regexp' => '/OrangeBot-Mobile/u' ],
+    [ 'name' => 'PagesInventory ',              'id'    => 'pages',      'regexp' => '/PagesInventory/u' ],
+    [ 'name' => 'Picsearch bot',                'id'    => 'psbot',      'regexp' => '/psbot-page/u' ],
+    [ 'name' => 'Pingdom',                      'id'    => 'pingdom',      'regexp' => '/Pingdom.com_bot_version_([0-9.]*)/u' ],
+    [ 'name' => 'Pinterest',                    'id'    => 'pinterest',      'regexp' => '/Pinterest\/([0-9.]+)( \(+|$)/u' ],
+    [ 'name' => 'PostRank',                     'id'    => 'postrank',      'regexp' => '/PostRank\/([0-9.]*)/u' ],
+    [ 'name' => 'PowerMapper',                  'id'    => 'crawler',      'regexp' => '/CrawlerProcess \(http:\/\/www\.PowerMapper\.com\) \/([0-9.]*)/u' ],
+    [ 'name' => 'Radian 6',                     'id'    => 'feed',      'regexp' => '/R6_FeedFetcher/u' ],
+    [ 'name' => 'Radian 6',                     'id'    => 'comment',      'regexp' => '/R6_CommentReader/u' ],
+    [ 'name' => 'RssBar',                       'id'    => 'rssbar',      'regexp' => '/RssBar\/([0-9.]*)/u' ],
+    [ 'name' => 'ROI Hunter',                   'id'    => 'hunter',      'regexp' => '/ROI Hunter/u' ],
+    [ 'name' => 'QuerySeekerSpider',            'id'    => 'spider',      'regexp' => '/QuerySeekerSpider(?:\/([0-9.]*))?/u' ],
+    [ 'name' => 'Quora Link Preview',           'id'    => 'quora',      'regexp' => '/Quora Link Preview\/([0-9.]*)/u' ],
+    [ 'name' => 'SafeSearch Microdata',         'id'    => 'safesearch',      'regexp' => '/SafeSearch microdata crawler/u' ],
+    [ 'name' => 'Scrapy',                       'id'    => 'scrapy',      'regexp' => '/Scrapy\/([0-9.]*)/u' ],
+    [ 'name' => 'ScreenerBot',                  'id'    => 'crawler',      'regexp' => '/ScreenerBot Crawler Beta ([0-9.]*)/u' ],
+    [ 'name' => 'Server Density',               'id'    => 'monitor',      'regexp' => '/Server Density Service Monitoring/u' ],
+    [ 'name' => 'ShopWiki',                     'id'    => 'shopwiki',      'regexp' => '/ShopWiki\/([0-9.]*)/u' ],
+    [ 'name' => 'SilverReader',                 'id'    => 'reader',      'regexp' => '/SilverReader\/([0-9.]*)/u' ],
+    [ 'name' => 'SimplePie',                    'id'    => 'simplepie',      'regexp' => '/SimplePie\/([0-9.]*)/u' ],
+    [ 'name' => 'Site24x7',                     'id'    => 'site24',      'regexp' => '/Site24x7/u' ],
+    [ 'name' => 'Sogou Web Spider',             'id'    => 'sogou',      'regexp' => '/sogou spider/u' ],
+    [ 'name' => 'Sogou Web Spider',             'id'    => 'sogou',      'regexp' => '/Sogou pic spider\/([0-9.]*)/u' ],
+    [ 'name' => 'Sogou Web Spider',             'id'    => 'sogou',      'regexp' => '/Sogou inst spider\/([0-9.]*)/u' ],
+    [ 'name' => 'Sogou Web Spider',             'id'    => 'sogou',      'regexp' => '/Sogou web spider\/([0-9.]*)/u' ],
+    [ 'name' => 'Sogou Mobile Spider',          'id'    => 'sogou',      'regexp' => '/Sogou Mobile Spider([0-9.]*)/u' ],
+    [ 'name' => 'Sophora Linkchecker',          'id'    => 'sophora',      'regexp' => '/Sophora Linkchecker/u' ],
+    [ 'name' => 'Soso Web Spider',              'id'    => 'soso',      'regexp' => '/Sosospider\/([0-9.]*)/u' ],
+    [ 'name' => 'Soso Web Spider',              'id'    => 'soso',      'regexp' => '/Sosospider/u' ],
+    [ 'name' => 'Soso Image Spider',            'id'    => 'soso',      'regexp' => '/Sosoimagespider/u' ],
+    [ 'name' => 'SPDYCheck',                    'id'    => 'spdycheck',      'regexp' => '/SPDYCheck SPDY Protocol Tester/iu' ],
+    [ 'name' => 'Spinn3r',                      'id'    => 'spinn',      'regexp' => '/Spinn3r ([0-9.]*)/iu' ],
+    [ 'name' => 'Spiderlytics',                 'id'    => 'spider',      'regexp' => '/Spiderlytics\/([0-9.]*)/iu' ],
+    [ 'name' => 'StatusCake Error Detector',    'id'    => 'detector',      'regexp' => '/StatusCake Error Detector/iu' ],
+    [ 'name' => 'Summify',                      'id'    => 'summify',      'regexp' => '/Summify\/([0-9.]*)/u' ],
+    [ 'name' => 'TelegramBot',                  'id'    => 'telegram',      'regexp' => '/TelegramBot/u' ],
+    [ 'name' => 'Twisted PageGetter',           'id'    => 'twisted',      'regexp' => '/Twisted PageGetter/u' ],
+    [ 'name' => 'Twitterbot',                   'id'    => 'twitter',      'regexp' => '/Twitterbot\/([0-9.]*)/u' ],
+    [ 'name' => 'Tiny Tiny RSS',                'id'    => 'tiny',      'regexp' => '/Tiny Tiny RSS\/([0-9.]*)/u' ],
+    [ 'name' => 'TLSProber',                    'id'    => 'tlsprober',      'regexp' => '/TLSProber\/([0-9.]*)/u' ],
+    [ 'name' => 'Typhoeus',                     'id'    => 'typhoeus',      'regexp' => '/Typhoeus/u' ],
+    [ 'name' => 'Vagabondo',                    'id'    => 'vagabondo',      'regexp' => '/Vagabondo\/([0-9.]*)/u' ],
+    [ 'name' => 'Voilabot',                     'id'    => 'voila',      'regexp' => '/Voila[Bb]ot/u' ],
+    [ 'name' => 'VocusBot',                     'id'    => 'vocus',      'regexp' => '/VocusBot ([0-9.]*)/u' ],
+    [ 'name' => 'Vodafone mCrawler',            'id'    => 'mcrawler',      'regexp' => '/Vodafone mCrawler/u' ],
+    [ 'name' => 'W3Bot',                        'id'    => 'w3bot',      'regexp' => '/W3Bot ([0-9.]*)/u' ],
+    [ 'name' => 'W3C CSS Validator',            'id'    => 'jigsaw',      'regexp' => '/Jigsaw\/([0-9.]*)/u' ],
+    [ 'name' => 'W3C Internationalization Checker',     'id'    => 'w3c',      'regexp' => '/W3C_I18n-Checker\/([0-9.]*)/u' ],
+    [ 'name' => 'W3C Line Mode',                'id'    => 'w3c',      'regexp' => '/W3CLineMode\/([0-9.]*)/u' ],
+    [ 'name' => 'W3C Link Checker',             'id'    => 'w3c',      'regexp' => '/W3C-checklink\/([0-9.]*)/u' ],
+    [ 'name' => 'W3C Markup Validator',         'id'    => 'w3c',      'regexp' => '/W3C_Validator\/([0-9.]*)/u' ],
+    [ 'name' => 'W3C MobileOK Checker',         'id'    => 'w3c',      'regexp' => '/W3C-mobileOK\/DDC-([0-9.]*)/u' ],
+    [ 'name' => 'W3C Multipage Validator',      'id'    => 'w3c',      'regexp' => '/W3C_Multipage_Validator\/([0-9.]*)/u' ],
+    [ 'name' => 'W3C Robot',                    'id'    => 'w3c',      'regexp' => '/W3CRobot\/([0-9.]*)/u' ],
+    [ 'name' => 'W3C Unified Validator',        'id'    => 'w3c',      'regexp' => '/W3C_Unicorn\/([0-9.]*)/u' ],
+    [ 'name' => 'W3C Validator.nu',             'id'    => 'validator',      'regexp' => '/Validator.nu\//u' ],
+    [ 'name' => 'Wayback Archive',              'id'    => 'wayback',      'regexp' => '/waybackarchive.org\/([0-9.]*)/u' ],
+    [ 'name' => 'WebbCrawler',                  'id'    => 'crawler',      'regexp' => '/WebbCrawler ([0-9.]*)/u' ],
+    [ 'name' => 'WebIndexer',                   'id'    => 'webindexer',      'regexp' => '/WebIndexer\//u' ],
+    [ 'name' => 'WordPress',                    'id'    => 'wordpress',      'regexp' => '/WordPress\/([0-9.]*)/u' ],
+    [ 'name' => 'WordPress.com',                'id'    => 'wordpress',      'regexp' => '/WordPress\.com; http/u' ],
+    [ 'name' => 'WordPress Jetpack',            'id'    => 'wordpress',      'regexp' => '/Jetpack by WordPress\.com/u' ],
+    [ 'name' => 'WWW Mechanize',                'id'    => 'mechanize',      'regexp' => '/WWW-Mechanize\/([0-9.]*)/u' ],
+    [ 'name' => 'Xerka WebBot',                 'id'    => 'xerka',      'regexp' => '/Xerka WebBot v([0-9.]*)/u' ],
+    [ 'name' => 'XML Sitemaps Generator',       'id'    => 'sitemap',      'regexp' => '/XML-Sitemaps\/([0-9.]*)/u' ],
+    [ 'name' => 'XMLSitemapGenerator',          'id'    => 'sitemap',      'regexp' => '/XmlSitemapGenerator/u' ],
+    [ 'name' => 'YaCy Bot',                     'id'    => 'yacy',      'regexp' => '/yacy(?:\/|\s|bot)/u' ],
+    [ 'name' => 'Yandex Anti Virus',            'id'    => 'yandex',      'regexp' => '/YandexAntivirus\/([0-9.]*)/u' ],
+    [ 'name' => 'Yandex Blogs',                 'id'    => 'yandex',      'regexp' => '/YandexBlogs\/([0-9.]*)/u' ],
+    [ 'name' => 'Yandex Bot',                   'id'    => 'yandex',      'regexp' => '/YandexBot\/([0-9.]*)/u' ],
+    [ 'name' => 'Yandex Direct',                'id'    => 'yandex',      'regexp' => '/YandexDirect\/([0-9.]*)/u' ],
+    [ 'name' => 'Yandex Favicons',              'id'    => 'yandex',      'regexp' => '/YandexFavicons\/([0-9.]*)/u' ],
+    [ 'name' => 'Yandex Image Resizer',         'id'    => 'yandex',      'regexp' => '/YandexImageResizer\/([0-9.]*)/u' ],
+    [ 'name' => 'Yandex Images',                'id'    => 'yandex',      'regexp' => '/YandexImages\/([0-9.]*)/u' ],
+    [ 'name' => 'Yandex Metrika',               'id'    => 'yandex',      'regexp' => '/YandexMetrika\/([0-9.]*)/u' ],
+    [ 'name' => 'Yandex News',                  'id'    => 'yandex',      'regexp' => '/YandexNews\/([0-9.]*)/u' ],
+    [ 'name' => 'Yandex Newslinks',             'id'    => 'yandex',      'regexp' => '/YandexNewslinks(?:\/([0-9.]*))?/u' ],
+    [ 'name' => 'Yahoo! Ad Monitoring',         'id'    => 'yahoo',      'regexp' => '/Yahoo Ad monitoring/u' ],
+    [ 'name' => 'Yahoo! Blogs',                 'id'    => 'yahoo',      'regexp' => '/Yahoo-Blogs\/v([0-9.]*)/u' ],
+    [ 'name' => 'Yahoo! Cache System',          'id'    => 'yahoo',      'regexp' => '/YahooCacheSystem/u' ],
+    [ 'name' => 'Yahoo! Feed Seeker',           'id'    => 'yahoo',      'regexp' => '/YahooFeedSeeker\/([0-9.]*)/u' ],
+    [ 'name' => 'Yahoo! Feed Seeker',           'id'    => 'yahoo',      'regexp' => '/YahooFeedSeeker Testing\/([0-9.]*)/u' ],
+    [ 'name' => 'Yahoo! Image',                 'id'    => 'yahoo',      'regexp' => '/Yahoo-MMCrawler\/([0-9.]*)/u' ],
+    [ 'name' => 'Yahoo! Link Expander',         'id'    => 'yahoo',      'regexp' => '/Yahoo:LinkExpander/u' ],
+    [ 'name' => 'Yahoo! Link Preview',          'id'    => 'yahoo',      'regexp' => '/Yahoo Link Preview/u' ],
+    [ 'name' => 'Yahoo! Video',                 'id'    => 'yahoo',      'regexp' => '/Yahoo-MMAudVid\/([0-9.]*)/u' ],
+    [ 'name' => 'Yahoo! Mindset',               'id'    => 'yahoo',      'regexp' => '/Yahoo\! Mindset/u' ],
+    [ 'name' => 'Yahoo! Product Search',        'id'    => 'yahoo',      'regexp' => '/YahooSeeker\/ProductSearch([0-9.]*)/u' ],
+    [ 'name' => 'Yahoo! Slurp',                 'id'    => 'yahoo',      'regexp' => '/Yahoo\! Slurp\/([0-9.]*)/u' ],
+    [ 'name' => 'Yahoo! Slurp',                 'id'    => 'yahoo',      'regexp' => '/Yahoo\! Slurp/u' ],
+    [ 'name' => 'Yahoo! Seeker',                'id'    => 'yahoo',      'regexp' => '/YahooSeeker(?:\/([0-9.]*))?/u' ],
+    [ 'name' => 'Yahoo! Seeker',                'id'    => 'yahoo',      'regexp' => '/YahooSeeker-Testing\/v([0-9.]*)/u' ],
+    [ 'name' => 'Yahoo! Seeker',                'id'    => 'yahoo',      'regexp' => '/yahooseeker-jp-mobile/u' ],
+    [ 'name' => 'Yahoo! Site Checker',          'id'    => 'y\!j',      'regexp' => '/Y\!J SiteChecker/u' ],
+    [ 'name' => 'Yahoo! Pipes',                 'id'    => 'yahoo',      'regexp' => '/Yahoo Pipes ([0-9.]*)/u' ],
+    [ 'name' => 'Yahoo! Video Search',          'id'    => 'yahoo',      'regexp' => '/YahooVideoSearch/u' ],
+    [ 'name' => 'Yahoo! Japan',                 'id'    => 'yahoo',      'regexp' => '/Yahoo\! Japan/u' ],
+    [ 'name' => 'Yahoo! Japan',                 'id'    => 'y\!j',      'regexp' => '/(^|\(compatible; )Y\!J-/u' ],
+
+    [ 'name' => 'Inktomi Slurp',                'id'    => 'slurp',      'regexp' => '/Slurp\/([0-9.]*)/u' ],
+    [ 'name' => 'Inktomi Slurp',                'id'    => 'slurp',      'regexp' => '/Slurp\.so\/([0-9.]*)/u' ],
+
+    /* Generic bots */
+    [ 'name' => 'Apache Httpd',                 'id'    => 'httpclient',      'regexp' => '/Apache-HttpClient(?:\/([0-9.]*))?/u' ],
+    [ 'name' => 'Apache Jakarta',               'id'    => 'httpclient',      'regexp' => '/Jakarta Commons-HttpClient(?:\/([0-9.]*))?/u' ],
+    [ 'name' => 'Apache Nutch',                 'id'    => 'nutch',      'regexp' => '/\/Nutch-([0-9.]*)/u' ],
+    [ 'name' => 'Apache Nutch',                 'id'    => 'nutch',      'regexp' => '/Nutch(?:CVS|Org)\/([0-9.]*)/u' ],
+    [ 'name' => 'Apache Synapse',               'id'    => 'synapse',      'regexp' => '/compatible; Synapse/u' ],
+    [ 'name' => 'Borland Delphi',               'id'    => 'indy',      'regexp' => '/Indy Library/u' ],
+    [ 'name' => 'Wget',                         'id'    => 'wget',      'regexp' => '/Wget\/([0-9.]*)/u' ],
+    [ 'name' => 'Curl',                         'id'    => 'curl',      'regexp' => '/^curl\/([0-9.]*)/u' ],
+
+    [ 'name' => 'Go',                           'id'    => 'package',      'regexp' => '/Go [0-9\.]+ package http/u' ],
+    [ 'name' => 'Java',                         'id'    => 'java',      'regexp' => '/^Java\/([0-9.]*)/u' ],
+    [ 'name' => 'Perl',                         'id'    => 'simple',      'regexp' => '/LWP::Simple\//u' ],
+    [ 'name' => 'Perl',                         'id'    => 'libwww',      'regexp' => '/libwww-perl\//u' ],
+    [ 'name' => 'Perl',                         'id'    => 'lwp',      'regexp' => '/lwp-trivial\//u' ],
+    [ 'name' => 'Python',                       'id'    => 'urllib',      'regexp' => '/Python-urllib/u' ],
+    [ 'name' => 'PHP',                          'id'    => 'php',      'regexp' => '/ PHP\/([0-9.]*)/u' ],
+    [ 'name' => 'PHP',                          'id'    => 'php',      'regexp' => '/^PHP/u' ],
+    [ 'name' => 'PHP',                          'id'    => 'pear',      'regexp' => '/PEAR HTTP_Request class/u' ],
+    [ 'name' => 'PHP',                          'id'    => 'php',      'regexp' => '/CakePHP/u' ],
+    [ 'name' => 'PHP',                          'id'    => 'zend',      'regexp' => '/Zend_Http_Client/u' ],
+    [ 'name' => 'Ruby',                         'id'    => 'ruby',      'regexp' => '/^Ruby/u' ],
+];

+ 244 - 0
Qii/Library/Third/data/applications-browsers.php

@@ -0,0 +1,244 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+use WhichBrowser\Constants;
+
+Applications::$BROWSERS = [
+
+    Constants\BrowserType::BROWSER => [
+
+        /* Desktop browsers */
+        [ 'name' => '115 Browser',          'id'    => '115',      'regexp' =>'/115Browser\/([0-9.]*)/u' ],
+        [ 'name' => '115 Chrome',           'id'    => '115',      'regexp' =>'/115Chrome\/([0-9.]*)/u' ],
+        [ 'name' => '126 Browser',          'id'    => '126',      'regexp' =>'/126BROWSER/u' ],
+        [ 'name' => '2345 Explorer',        'id'    => '2345',      'regexp' =>'/2345Explorer\/([0-9.]*)/u', 'details' => 3 ],
+        [ 'name' => '2345 Explorer',        'id'    => '2345',      'regexp' =>'/2345Explorer v([0-9.]*)/u', 'details' => 3 ],
+        [ 'name' => '2345 Chrome',          'id'    => '2345',      'regexp' =>'/2345chrome v([0-9.]*)/u', 'details' => 3 ],
+        [ 'name' => '360 Extreme Explorer', 'id'    => 'qihu',      'regexp' =>'/QIHU 360EE/u', 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => '360 Safe Explorer',    'id'    => 'qihu',      'regexp' =>'/QIHU 360SE/u', 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => '7Star',                'id'    => '7star',      'regexp' =>'/7Star\/([0-9.]*)/u' ],                                                                // see: http://www.qixing123.com
+        [ 'name' => 'ABrowse',              'id'    => 'abrowse',      'regexp' =>'/A[Bb]rowse ([0-9.]*)/u' ],                                                            // browser for the Syllable OS
+        [ 'name' => 'Abrowser',             'id'    => 'abrowse',      'regexp' =>'/Abrowser\/([0-9.]*)/u' ],                                                             // unbranded version of Firefox
+        [ 'name' => 'Acorn Browse',         'id'    => 'acorn',      'regexp' =>'/Acorn Browse ([0-9.]+)/u'  ],
+        [ 'name' => 'Acorn Browse',         'id'    => 'acorn',      'regexp' =>'/Acorn Phoenix ([0-9.]+)/u'  ],
+        [ 'name' => 'Acoo Browser',         'id'    => 'acoo',       'regexp' =>'/Acoo Browser/u' ],
+        [ 'name' => 'AOL Desktop',          'id'    => 'aol',      'regexp' =>'/AOL ([0-9.]*); AOLBuild/i' ],
+        [ 'name' => 'AOL Browser',          'id'    => 'america',      'regexp' =>'/America Online Browser (?:[0-9.]*); rev([0-9.]*);/i' ],
+        [ 'name' => 'Arachne',              'id'    => 'arachne',      'regexp' =>'/xChaos_Arachne\/[0-9]\.([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],       // see: www.glennmcc.org
+        [ 'name' => 'Arora',                'id'    => 'arora',      'regexp' =>'/[Aa]rora\/([0-9.]*)/u' ],                                                             // see: www.arora-browser.org
+        [ 'name' => 'AWeb',                 'id'    => 'aweb',      'regexp' =>'/Amiga-AWeb(?:\/([0-9.]*))?/u' ],
+        [ 'name' => 'AvantGo',              'id'    => 'avant',      'regexp' =>'/AvantGo ([0-9.]+)/u' ],
+        [ 'name' => 'Avant Browser',        'id'    => 'avant',      'regexp' =>'/Avant Browser/u' ],
+        [ 'name' => 'Avant Browser',        'id'    => 'avant',      'regexp' =>'/Avant TriCore/u' ],
+        [ 'name' => 'Avast SafeZone',       'id'    => 'asw',      'regexp' =>'/ASW\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Aviator',              'id'    => 'aviator',      'regexp' =>'/Aviator\/([0-9.]*)/u', 'details' => 1 ],                                              // see: https://github.com/WhiteHatSecurity/Aviator
+        [ 'name' => 'Baidu Browser',        'id'    => 'flyflow',      'regexp' =>'/FlyFlow\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Baidu Browser',        'id'    => 'bdbrowser',      'regexp' =>'/bdbrowser\/([0-9.]*)/i' ],
+        [ 'name' => 'Baidu Browser',        'id'    => 'bdbrowser',      'regexp' =>'/bdbrowser_i18n\/([0-9.]*)/i' ],
+        [ 'name' => 'Baidu Spark',          'id'    => 'bdspark',      'regexp' =>'/BDSpark\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Beamrise',             'id'    => 'beamrise',      'regexp' =>'/Beamrise\/([0-9.]*)/u' ],                                                             // see: http://beamrise.com
+        [ 'name' => 'Black Wren',           'id'    => 'blackwren',      'regexp' =>'/BlackWren\/([0-9.]*)/u', 'details' => 2 ],                                            // see: https://github.com/conmarap/jetbrowser
+        [ 'name' => 'Brave',                'id'    => 'brave',      'regexp' =>'/brave\/([0-9.]*)/u' ],
+        [ 'name' => 'Byffox',               'id'    => 'byffox',      'regexp' =>'/Byffox\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Camino',               'id'    => 'camino',      'regexp' =>'/Camino\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Canure',               'id'    => 'canure',      'regexp' =>'/Canure\/([0-9.]*)/u', 'details' => 3 ],                                               // see: http://canure.weebly.com/index.html
+        [ 'name' => 'Charon',               'id'    => 'charon',      'regexp' =>'/Charon/' ],                                                                           // see: http://www.vitanuova.com/inferno/man/1/charon.html
+        [ 'name' => 'ChromePlus',           'id'    => 'chromeplus',      'regexp' =>'/ChromePlus(?:\/([0-9.]*))?$/u', 'details' => 3, 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'CometBird',            'id'    => 'cometbird',      'regexp' =>'/CometBird\/([0-9.]*)/u' ],                                                            // see: http://www.cometbird.com
+        [ 'name' => 'Comodo Dragon',        'id'    => 'comodo',      'regexp' =>'/Comodo_Dragon\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Comodo Dragon',        'id'    => 'dragon',      'regexp' =>'/Dragon\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Comodo IceDragon',     'id'    => 'dragon',      'regexp' =>'/IceDragon\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Conkeror',             'id'    => 'conkeror',      'regexp' =>'/[Cc]onkeror\/([0-9.]*)/u' ],
+        [ 'name' => 'CoolNovo',             'id'    => 'coolnovo',      'regexp' =>'/(?:CoolNovo|CoolNovoChromePlus)\/([0-9.]*)/u', 'details' => 3, 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Cunaguaro',            'id'    => 'cunaguaro',      'regexp' =>'/Cunaguaro\/([0-9.]*)/u', 'details' => 3, 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Cyberfox',             'id'    => 'cyberfox',      'regexp' =>'/Cyberfox\/([0-9.]*)/u', 'details' => 2 ],                                             // see: https://cyberfox.8pecxstudios.com
+        [ 'name' => 'Daedalus',             'id'    => 'daedalus',      'regexp' =>'/Daedalus ([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Dillo',                'id'    => 'dillo',      'regexp' =>'/Dillo\/([0-9.]*)/u' ],                                                                // see: http://www.dillo.org
+        [ 'name' => 'Doga Rhodonit',        'id'    => 'rhodonit',      'regexp' =>'/DogaRhodonit/u' ],
+        [ 'name' => 'EudoraWeb',            'id'    => 'eudoraweb',      'regexp' =>'/EudoraWeb ([0-9.]*)/u' ],
+        [ 'name' => 'Flock',                'id'    => 'flock',      'regexp' =>'/Flock\/([0-9.]*)/u', 'details' => 3, 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Galeon',               'id'    => 'galeon',      'regexp' =>'/Galeon\/([0-9.]*)/u', 'details' => 3 ],
+        [ 'name' => 'GNOME Web',            'id'    => 'epiphany',      'regexp' =>'/Epiphany\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'IBrowse',              'id'    => 'ibrowse',      'regexp' =>'/IBrowse[\/ ]([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'iCab',                 'id'    => 'icab',      'regexp' =>'/iCab(?: J)?\/([0-9.]*)/u' ],
+        [ 'name' => 'Iceape',               'id'    => 'iceape',      'regexp' =>'/Iceape\/([0-9.]*)/u' ],
+        [ 'name' => 'IceCat',               'id'    => 'icecat',      'regexp' =>'/IceCat[ \/]([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],                   // see: https://www.gnu.org/software/gnuzilla/
+        [ 'name' => 'Iceweasel',            'id'    => 'iceweasel',      'regexp' =>'/Iceweasel\/([0-9.]*)/iu', 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Iridium',              'id'    => 'iridium',      'regexp' =>'/Iridium\/([0-9.]*)/u', 'details' => 2 ],                                                 // see: http://www.srware.net/en/software_srware_iron.php
+        [ 'name' => 'Iron',                 'id'    => 'iron',      'regexp' =>'/Iron\/([0-9.]*)/u', 'details' => 2 ],                                                 // see: http://www.srware.net/en/software_srware_iron.php
+        [ 'name' => 'Kazehakase',           'id'    => 'kazehakase',      'regexp' =>'/Kazehakase\/([0-9.]*)/u' ],                                                           // see: http://kazehakase.osdn.jp
+        [ 'name' => 'KChrome',              'id'    => 'kchrome',      'regexp' =>'/KChrome\/([0-9.]*)/u', 'details' => 3 ],                                              // see: http://www.kchrome.com
+        [ 'name' => 'K-Meleon',             'id'    => 'meleon',      'regexp' =>'/K-Meleon\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],                    // see: http://kmeleonbrowser.org
+        [ 'name' => 'LieBao',               'id'    => 'lbbrowser',      'regexp' =>'/LBBROWSER/u' ],                                                                       // see: http://www.liebao.cn
+        [ 'name' => 'Lobo',                 'id'    => 'lobo',      'regexp' =>'/Lobo\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],                        // see: http://sourceforge.net/projects/xamj/files/Lobo%20Browser/
+        [ 'name' => 'Lunascape',            'id'    => 'lunascape',      'regexp' =>'/ Lunascape[\/| ]([0-9.]*)/u', 'details' => 3 ],                                        // see: http://www.lunascape.tv
+        [ 'name' => 'Naenara',              'id'    => 'naenara',      'regexp' =>'/NaenaraBrowser\/([0-9.]*)/u', 'details' => 2 ],                                       // Firefox based browser used with Red Star OS
+        [ 'name' => 'Maxthon',              'id'    => 'mxbrowser',      'regexp' =>'/MxBrowser\/([0-9.]*)/u' ],
+        [ 'name' => 'Maxthon',              'id'    => 'mxbrowser',      'regexp' =>'/MxBrowser-iPhone\/([0-9.]*)/u' ],
+        [ 'name' => 'MixShark',             'id'    => 'mixshark',      'regexp' =>'/MixShark\/([0-9.]*)/u' ],                                                             // see: http://terbaddo.free.fr/mixshark.php
+        [ 'name' => 'mlbrowser',            'id'    => 'mlbrowser',      'regexp' =>'/mlbrowser/u' ],                                                                       // see: https://github.com/Topguy/mlbrowser
+        [ 'name' => 'NetPositive',          'id'    => 'netpositive',      'regexp' =>'/NetPositive\/([0-9.]*)/u' ],
+        [ 'name' => 'Origyn',               'id'    => 'origyn',      'regexp' =>'/Origyn Web Browser/u' ],
+        [ 'name' => 'Odyssey',              'id'    => 'owb',      'regexp' =>'/OWB\/([0-9.]*)/u' ],
+        [ 'name' => 'Orca',                 'id'    => 'orca',      'regexp' =>'/Orca\/([0-9.]*)/u' ],
+        [ 'name' => 'Oregano',              'id'    => 'oregano',      'regexp' =>'/Oregano ([0-9.]*)/u' ],                                                               // see: http://www.xat.nl/en/riscos/sw/oregano/
+        [ 'name' => 'Otter',                'id'    => 'otter',      'regexp' =>'/Otter(?: Browser)?\/([0-9.]*)/u' ],                                                   // see: https://otter-browser.org
+        [ 'name' => 'Pale Moon',            'id'    => 'palemoon',      'regexp' =>'/Pale[mM]oon\/([0-9.]*)/u' ],                                                          // see: https://www.palemoon.org
+        [ 'name' => 'Qihoo 360',            'id'    => 'qihu',      'regexp' =>'/QIHU THEWORLD/u' ],
+        [ 'name' => 'QtWeb',                'id'    => 'qtweb',      'regexp' =>'/QtWeb Internet Browser\/([0-9.]*)/u' ],
+        [ 'name' => 'QupZilla',             'id'    => 'qupzilla',      'regexp' =>'/QupZilla\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'rekonq',               'id'    => 'rekonq',      'regexp' =>'/rekonq(?:\/([0-9.]*))?/u', 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Ryouko',               'id'    => 'ryouko',      'regexp' =>'/Ryouko\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],                      // see: https://github.com/foxhead128/ryouko
+        [ 'name' => 'SaaYaa Explorer',      'id'    => 'saayaa',      'regexp' =>'/SaaYaa/u', 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Sleipnir',             'id'    => 'sleipnir',      'regexp' =>'/Sleipnir\/([0-9.]*)/u', 'details' => 3 ],
+        [ 'name' => 'Sogou Explorer',       'id'    => 'metasr',      'regexp' =>'/SE 2.X MetaSr/u', 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Stainless',            'id'    => 'stainless',      'regexp' =>'/Stainless\/([0-9.]*)/u' ],                                                            // see: http://www.stainlessapp.com
+        [ 'name' => 'SunChrome',            'id'    => 'sunchrome',      'regexp' =>'/SunChrome\/([0-9.]*)/u' ],
+        [ 'name' => 'Superbird',            'id'    => 'superbird',      'regexp' =>'/Super[Bb]ird\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Swing Browser',        'id'    => 'swing',      'regexp' =>'/Swing(?:\(And\))?\/([0-9.]*)/u', 'details' => 3 ],                                    // see: http://swing-browser.com
+        [ 'name' => 'Tencent Traveler',     'id'    => 'tencent',      'regexp' =>'/TencentTraveler ([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'TenFourFox',           'id'    => 'tenfourfox',      'regexp' =>'/TenFourFox\//u' ],
+        [ 'name' => 'The World',            'id'    => 'theworld',      'regexp' =>'/TheWorld(?: ([0-9.]*))?/u' ],
+        [ 'name' => 'Tungsten Browser',     'id'    => 'tungsten',      'regexp' =>'/TungstenBrowser\/([0-9.]*)/u' ],
+        [ 'name' => 'Vivaldi',              'id'    => 'vivaldi',      'regexp' =>'/Vivaldi\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Voyager',              'id'    => 'voyager',      'regexp' =>'/AmigaVoyager\/([0-9.]*)/u' ],
+        [ 'name' => 'Waterfox',             'id'    => 'waterfox',      'regexp' =>'/Waterfox\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Yandex Browser',       'id'    => 'yabrowser',      'regexp' =>'/YaBrowser\/([0-9.]*)/u', 'details' => 2 ],
+
+        /* Mobile browsers */
+        [ 'name' => '1Browser',             'id'    => '1password',      'regexp' =>'/1Password\/([0-9.]*)/u' ],
+        [ 'name' => '2345 Browser',         'id'    => '2345',      'regexp' =>'/Mb2345Browser\/([0-9.]*)/u' ],
+        [ 'name' => '3G Explorer',          'id'    => '3g explorer',      'regexp' =>'/3G Explorer\/([0-9.]*)/u', 'details' => 3 ],
+        [ 'name' => '4G Explorer',          'id'    => '4g explorer',      'regexp' =>'/4G Explorer\/([0-9.]*)/u', 'details' => 3 ],
+        [ 'name' => 'Atomic',               'id'    => 'atomiclite',      'regexp' =>'/AtomicLite\/([0-9.]*)/u' ],                                                           // see: http://atomicwebbrowser.com
+        [ 'name' => 'AU',                   'id'    => 'au',      'regexp' =>'/(?:^| )AU(?:.Browser)?\/([0-9.]+)/u' ],
+        [ 'name' => 'Awakening',            'id'    => 'awakening',      'regexp' =>'/Awakening Browser\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Baidu Browser',        'id'    => 'baidu',      'regexp' =>'/M?BaiduBrowser\/([0-9.]*)/i' ],
+        [ 'name' => 'Baidu Browser',        'id'    => 'bdmobile',      'regexp' =>'/BdMobile\/([0-9.]*)/i' ],
+        [ 'name' => 'Baidu Browser',        'id'    => 'bidu',      'regexp' =>'/BIDUBrowser[ \/]([0-9.]*)/u' ],
+        [ 'name' => 'Baidu Browser',        'id'    => 'baidu',      'regexp' =>'/BaiduHD\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ],
+        [ 'name' => 'Blazer',               'id'    => 'blazer',      'regexp' =>'/Blazer\/([0-9.]*)/u' ],
+        [ 'name' => 'Cornowser',            'id'    => 'cornowser',      'regexp' =>'/Cornowser\/([0-9.]*)/u' ],
+        [ 'name' => 'CuteBrowser',          'id'    => 'cute',      'regexp' =>'/CuteBrowser\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Digia @Web',           'id'    => 'digia',      'regexp' =>'/Digia @Web\/([0-9.]*)/u' ],
+        [ 'name' => 'Doris',                'id'    => 'doris',      'regexp' =>'/Doris\/([0-9.]*)/u' ],
+        [ 'name' => 'Dorothy',              'id'    => 'doroty',      'regexp' =>'/Dorothy$/u' ],
+        [ 'name' => 'EMOBILE Browser',      'id'    => 'www browser',      'regexp' =>'/WWW Browser\/ver([0-9.]*)/u' ],
+        [ 'name' => 'Go.Web',               'id'    => 'go\.web',      'regexp' =>'/Go\.Web\/([0-9.]*)/u' ],                                                              // used on early Blackberry, by GoAmerica
+        [ 'name' => 'Helium',               'id'    => 'helium',      'regexp' =>'/HeliumMobileBrowser\/([0-9.]*)/u' ],
+        [ 'name' => 'iCab',                 'id'    => 'icab',      'regexp' =>'/iCabMobile\/([0-9.]*)/u' ],
+        [ 'name' => 'iLunascape',           'id'    => 'lunascape',      'regexp' =>'/iLunascape\/([0-9.]*)/u', 'details' => 3 ],                                           // see: http://www.lunascape.tv
+        [ 'name' => 'InternetSurfboard',    'id'    => 'surfboard',      'regexp' =>'/InternetSurfboard\/([0-9.]*)/u' ],
+        [ 'name' => 'iSurf',                'id'    => 'isurf',      'regexp' =>'/iSurf version \/v([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Jig Browser',          'id'    => 'jig browser',      'regexp' =>'/jig browser(?: web| core|9i?)?;? ?([0-9.]+)?/u', 'type' => Constants\DeviceType::MOBILE ],
+        [ 'name' => 'Jumanji',              'id'    => 'jumanji',      'regexp' =>'/jumanji/u' ],                                                                         // see: jumanji browser ubuntu
+        [ 'name' => 'Kiosk',                'id'    => 'kiosk',      'regexp' =>'/Kiosk\/([0-9.]*)/u' ],                                                                // see: http://www.kioskbrowser.net
+        [ 'name' => 'LieBaoFast',           'id'    => 'liebao',      'regexp' =>'/LieBaoFast\/([0-9.]*)/u' ],                                                           // see: http://www.liebao.cn
+        [ 'name' => 'MaCross Mobile',       'id'    => 'macross',      'regexp' =>'/MaCross\/([0-9.]*)/u' ],
+        [ 'name' => 'Mammoth',              'id'    => 'mammoth',      'regexp' =>'/Mammoth\/([0-9.]*)/u' ],                                                              // see: https://itunes.apple.com/cn/app/meng-ma-liu-lan-qi/id403760998?mt=8
+        [ 'name' => 'Motorola Internet Browser', 'id'    => 'mib',      'regexp' =>'/MIB\/([0-9.]*)/u' ],
+        [ 'name' => 'Motorola Internet Browser', 'id'    => 'mib',      'regexp' =>'/MIB([0-9.]+)\//u' ],
+        [ 'name' => 'Motorola Internet Browser', 'id'    => 'cmcs',      'regexp' =>'/Browser\/CMCS([0-9.]*)/u' ],
+        [ 'name' => 'Motorola WebKit',      'id'    => 'motorola',      'regexp' =>'/MotorolaWebKit(?:\/([0-9.]*))?/u', 'details' => 3 ],
+        [ 'name' => 'MIUI Browser',         'id'    => 'miui',      'regexp' =>'/MiuiBrowser\/([0-9.]*)/u' ],
+        [ 'name' => 'NetFront Life Browser', 'id'    => 'netfrontlife',      'regexp' =>'/NetFrontLifeBrowser\/([0-9.]*)/u' ],
+        [ 'name' => 'OneBrowser',           'id'    => 'onebrowser',      'regexp' =>'/OneBrowser\/([0-9.]*)/u' ],
+        [ 'name' => 'PocketLink',           'id'    => 'plink',      'regexp' =>'/PLink ([0-9.]+)/iu', 'details' => 2 ],
+        [ 'name' => 'Polaris',              'id'    => 'polaris',      'regexp' =>'/Polaris[\/ ]v?([0-9.]*)/iu', 'details' => 2 ],
+        [ 'name' => 'Polaris',              'id'    => 'polaris',      'regexp' =>'/POLARIS([0-9.]+)/u', 'details' => 2 ],
+        [ 'name' => 'Openwave',             'id'    => 'openwave',      'regexp' =>'/Open[Ww]ave\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ],
+        [ 'name' => 'Openwave',             'id'    => 'openwave',      'regexp' =>'/Openwave Mobile Browser ([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ],
+        [ 'name' => 'Openwave',             'id'    => 'openwave',      'regexp' =>'/Browser\/OpenWave([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ],
+        [ 'name' => 'Openwave',             'id'    => 'up',      'regexp' =>'/UP\. ?Browser(?:\/([a-z0-9.]*))?/iu', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ],
+        [ 'name' => 'Openwave',             'id'    => 'km',      'regexp' =>'/KM\.Browser\/([0-9.]+)/iu', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ],
+        [ 'name' => 'Openwave',             'id'    => 'up',      'regexp' =>'/UP\/([0-9.]+)/u', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ],
+        [ 'name' => 'SEMC Browser',         'id'    => 'semc',      'regexp' =>'/SEMC-Browser\/([0-9.]*)/u' ],
+        [ 'name' => 'STNC HitchHiker' ,     'id'    => 'stnc',      'regexp' =>'/STNC-WTL\/[0-9.]*/u' ],
+        [ 'name' => 'Sogou Mobile',         'id'    => 'sogou',      'regexp' =>'/SogouMobileBrowser\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Swing Browser',        'id'    => 'swing',      'regexp' =>'/Swing\(And\)\/([0-9.]*)/u', 'details' => 3 ],
+        [ 'name' => 'Symphony',             'id'    => 'symphony',      'regexp' =>'/Symphony ([0-9.]+)$/u' ],
+        [ 'name' => 'WebLite',              'id'    => 'weblite',      'regexp' =>'/WebLite\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ],
+
+        /* Television browsers */
+        [ 'name' => 'AltiBrowser',          'id'    => 'alti',      'regexp' =>'/AltiBrowser\/([0-9.]*)/i' ],
+        [ 'name' => 'Aplix',                'id'    => 'aplix',      'regexp' =>'/Aplix_SANYO_browser\/([0-9](?:.[0-9.]+)?)/u' ],                                    // browser for the Sega Saturn
+        [ 'name' => 'AwoX',                 'id'    => 'awox',      'regexp' =>'/AwoX(?:\/([0-9.]*))? Browser/i' ],
+        [ 'name' => 'Isis',                 'id'    => 'browserserver',      'regexp' =>'/BrowserServer/u' ],
+        [ 'name' => 'Isis',                 'id'    => 'isis',      'regexp' =>'/ISIS\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Spyglass',             'id'    => 'spyglass',      'regexp' =>'/Spyglass ([0-9.]+); OpenTV/u' ],
+        [ 'name' => 'Oregan Browser',       'id'    => 'oregan',      'regexp' =>'/OreganMediaBrowser(?:\/([0-9.]*))?/u', 'details' => 2 ],
+        [ 'name' => 'Viera Browser',        'id'    => 'viera',      'regexp' =>'/Viera\/([0-9.]*)/u' ],
+        [ 'name' => 'Zetakey',              'id'    => 'zetakey',      'regexp' =>'/Zetakey Webkit\/([0-9.]*)/u', 'type' => Constants\DeviceType::TELEVISION ],
+        [ 'name' => 'Zetakey',              'id'    => 'zetakey',      'regexp' =>'/Zetakey\/([0-9.]*)/u', 'type' => Constants\DeviceType::TELEVISION ],
+
+        /* Gaming browsers */
+        [ 'name' => 'Aplix',                'id'    => 'aplix',      'regexp' =>'/Aplix_SEGASATURN_browser\/([0-9](?:.[0-9.]+)?)/u' ],                                    // browser for the Sega Saturn
+        [ 'name' => 'Bunjalloo',            'id'    => 'bunjalloo',      'regexp' =>'/Bunjalloo\/([0-9.]*)/u' ],                                                            // browser for the Nintento DS
+        [ 'name' => 'Nintendo Web Framework', 'id'    => 'nwf',      'regexp' =>'/NWF\/([0-9.]*)/u', 'details' => 2 ],                                                        // browser for the Sega Dreamcast
+        [ 'name' => 'Nuanti Meta',          'id'    => 'nuanti',      'regexp' =>'/Nuanti(?:Meta)?\/([0-9.]*)/u' ],                                                      // browser for the Playstation
+
+        /* Other browsers */
+        [ 'name' => 'Wear Internet Browser','id'    => 'wib',      'regexp' =>'/WIB\/([0-9.]*)/u' ],
+
+        /* PDF renderers */
+        [ 'name' => 'Prince',               'id'    => 'prince',      'regexp' =>'/Prince\/([0-9.]*)/u' ],
+
+        /* Unsorted */
+        [ 'name' => 'Demobrowser',          'id'    => 'demobrowser',      'regexp' =>'/demobrowser\/([0-9.]*)/u' ],
+        [ 'name' => 'Dooble',               'id'    => 'dooble',      'regexp' =>'/Dooble(?:\/([0-9.]*))?/u' ],                                                          // see: http://dooble.sourceforge.net
+        [ 'name' => 'DWB',                  'id'    => 'dwb',      'regexp' =>'/dwb(?:-hg)?(?:\/([0-9.]*))?/u' ],
+        [ 'name' => 'EVM Browser',          'id'    => 'evm',      'regexp' =>'/EVMBrowser\/([0-9.]*)/u' ],
+        [ 'name' => 'FireWeb',              'id'    => 'fireweb',      'regexp' =>'/FireWeb\/([0-9.]*)/u' ],
+        [ 'name' => 'Hive Explorer',        'id'    => 'hive',      'regexp' =>'/HiveE/u' ],
+        [ 'name' => 'Intermec Browser',     'id'    => 'intermec',      'regexp' =>'/Intermec\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Phantom',              'id'    => 'phantom',      'regexp' =>'/Phantom\/V([0-9.]*)/u' ],
+        [ 'name' => 'QtCreator',            'id'    => 'qt',      'regexp' =>'/QtCreator\/([0-9.]*)/u' ],
+        [ 'name' => 'QtQmlViewer',          'id'    => 'qt',      'regexp' =>'/QtQmlViewer/u' ],
+        [ 'name' => 'QtMiniBrowser',        'id'    => 'qt',      'regexp' =>'/QtMiniBrowser\/([0-9.]*)/u' ],
+        [ 'name' => 'QtTestBrowser',        'id'    => 'qt',      'regexp' =>'/QtTestBrowser\/([0-9.]*)/u' ],
+        [ 'name' => 'Roccat',               'id'    => 'roccat',      'regexp' =>'/Roccat\/([0-9]\.[0-9.]*)/u' ],
+        [ 'name' => 'Raven for Mac',        'id'    => 'raven',      'regexp' =>'/Raven for Mac\/([0-9.]*)/u' ],
+        [ 'name' => 'RockMelt',             'id'    => 'rockmelt',      'regexp' =>'/RockMelt\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Scope',                'id'    => 'scope',      'regexp' =>'/Scope\/([0-9.]*)/u', 'details' => 2 ],                                                // see: http://www.programmer.co.jp/scope.shtml
+        [ 'name' => 'SlimBoat',             'id'    => 'slim',      'regexp' =>'/SlimBoat\/([0-9.]*)/u' ],
+        [ 'name' => 'SlimBrowser',          'id'    => 'slim',      'regexp' =>'/SlimBrowser(?:\/([0-9.]*))?/u' ],
+        [ 'name' => 'SMBrowser',            'id'    => 'smbrowser',      'regexp' =>'/SMBrowser/u' ],
+        [ 'name' => 'Snowshoe',             'id'    => 'snowshoe',      'regexp' =>'/Snowshoe\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Sputnik',              'id'    => 'sputnik',      'regexp' =>'/Sputnik\/([0-9.]*)/iu', 'details' => 3 ],
+        [ 'name' => 'Surf',                 'id'    => 'surf',      'regexp' =>'/Surf\/([0-9.]*)/u' ],
+        [ 'name' => 'TaoBrowser',           'id'    => 'tao',      'regexp' =>'/TaoBrowser\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'TaomeeBrowser',        'id'    => 'tao',      'regexp' =>'/TaomeeBrowser\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'TazWeb',               'id'    => 'taz',      'regexp' =>'/TazWeb/u' ],
+        [ 'name' => 'Uzbl',                 'id'    => 'uzbl',      'regexp' =>'/^Uzbl/u' ],
+        [ 'name' => 'Villanova',            'id'    => 'villanova',      'regexp' =>'/Villanova\/([0-9.]*)/u', 'details' => 3 ],
+        [ 'name' => 'Vimb',                 'id'    => 'vimb',      'regexp' =>'/vimb\/([0-9.]*)/u' ],
+        [ 'name' => 'WADA Browser',         'id'    => 'wada',      'regexp' =>'/WadaBrowser\/([0-9.]*)/u' ],
+        [ 'name' => 'Wavelink Velocity',    'id'    => 'wavelink',      'regexp' =>'/Wavelink Velocity Browser\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'WebRender',            'id'    => 'webrender',      'regexp' =>'/WebRender/u' ],
+        [ 'name' => 'Webster',              'id'    => 'webster',      'regexp' =>'/Webster ([0-9.]*)/u' ],
+        [ 'name' => 'Wyzo',                 'id'    => 'wyzo',      'regexp' =>'/Wyzo\/([0-9.]*)/u', 'details' => 3 ],
+        [ 'name' => 'Yelang',               'id'    => 'yelang',      'regexp' =>'/Yelang\/([0-9.]*)/u', 'details' => 3 ],                           // see: wellgo.org
+        [ 'name' => 'YRC Weblink',          'id'    => 'yrcweb',      'regexp' =>'/YRCWeblink\/([0-9.]*)/u' ],
+        [ 'name' => '冲浪浏览器',             'id'    => 'surf',      'regexp' =>'/CMSurfClient-Android/u' ],
+    ],
+
+    Constants\BrowserType::BROWSER_TEXT => [
+        [ 'name' => 'CERN LineMode',        'id'    => 'linemode',      'regexp' =>'/CERN-LineMode\/([0-9.]*)/u' ],
+        [ 'name' => 'Lynx',                 'id'    => 'lynx',      'regexp' =>'/Lynx\/([0-9.]*)/u' ],
+        [ 'name' => 'Lynx',                 'id'    => 'lynx',      'regexp' =>'/Lynx \(textmode\)/u' ],
+        [ 'name' => 'ELinks',               'id'    => 'links',      'regexp' =>'/E[Ll]inks(?:\/| \()([0-9.]*[0-9])/u', 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Links',                'id'    => 'links',      'regexp' =>'/Links \(([0-9.]*)/u' ],
+        [ 'name' => 'w3m',                  'id'    => 'w3m',      'regexp' =>'/w3m\/([0-9.]*)/u' ],
+    ],
+
+    Constants\BrowserType::UNKNOWN => [
+        [ 'name' => 'PhantomJS',            'id'    => 'phantom',      'regexp' =>'/PhantomJS\/([0-9.]*)/u' ],
+        [ 'name' => 'Nimbus',               'id'    => 'nimbus',      'regexp' =>'/Nimbus\/([0-9.]*)/u' ],
+        [ 'name' => 'McAfee Web Gateway',   'id'    => 'Webwasher',      'regexp' =>'/Webwasher\/([0-9.]*)/u' ],
+        [ 'name' => 'Open Sankoré',         'id'    => 'sankore',      'regexp' =>'/Open-Sankore\/([0-9.]*)/u', 'type' => Constants\DeviceType::WHITEBOARD ],
+        [ 'name' => 'Adapi',                'id'    => 'adapi',      'regexp' =>'/ ADAPI\/([0-9.]*)/u', 'hidden' => true, 'type' => Constants\DeviceType::SIGNAGE ],
+        [ 'name' => 'BrightSign',           'id'    => 'brightsign',      'regexp' =>'/BrightSign\/([0-9.]*)/u', 'type' => Constants\DeviceType::SIGNAGE ],
+        [ 'name' => 'Coship MMCP',          'id'    => 'coship',      'regexp' =>'/Coship_MMCP_([0-9.]*)/u', 'type' => Constants\DeviceType::SIGNAGE ],
+    ]
+];

+ 138 - 0
Qii/Library/Third/data/applications-others.php

@@ -0,0 +1,138 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+use WhichBrowser\Constants;
+
+Applications::$OTHERS = [
+
+    Constants\BrowserType::APP_MEDIAPLAYER => [
+        [ 'name' => 'iTunes',               'id'    => 'itunes',            'regexp' =>'/iTunes\/(?:xaa.)?([0-9.]*)/u' ],
+        [ 'name' => 'iTunes',               'id'    => 'itunes',            'regexp' =>'/iTunes-AppleTV\//u' ],
+        [ 'name' => 'QuickTime',            'id'    => 'qt',                'regexp' =>'/\(qtver=([0-9.]*);/u' ],
+        [ 'name' => 'Bluefish',             'id'    => 'bluefish',          'regexp' =>'/bluefish ([0-9.]*)/u' ],
+        [ 'name' => 'Nightingale',          'id'    => 'nightingale',       'regexp' =>'/Nightingale\/([0-9.]*)/u' ],
+        [ 'name' => 'Songbird',             'id'    => 'songbird',          'regexp' =>'/Songbird\/([0-9.]*)/u' ],
+        [ 'name' => 'Stagefright',          'id'    => 'stagefright',       'regexp' =>'/stagefright\/([0-9.]*)/u' ],
+        [ 'name' => 'SubStream',            'id'    => 'substream',         'regexp' =>'/SubStream\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ],
+        [ 'name' => 'VLC',                  'id'    => 'vlc',               'regexp' =>'/VLC media player - version ([0-9.]*)/u' ],
+        [ 'name' => 'VLC',                  'id'    => 'vlc',               'regexp' =>'/VLC\/([0-9.]*)/u' ],
+        [ 'name' => 'Windows Media Player', 'id'    => 'windows-media',     'regexp' =>'/Windows-Media-Player\/([0-9.]*)/u', 'details' => 1 ],
+        [ 'name' => 'CorePlayer',           'id'    => 'coreplayer',        'regexp' =>'/CorePlayer\/([0-9.]*)/u' ],
+        [ 'name' => 'FlyCast',              'id'    => 'flycast',           'regexp' =>'/FlyCast\/([0-9.]*)/u' ],
+        [ 'name' => 'Boxee',                'id'    => 'boxee',             'regexp' => '/Boxee(?:\/([0-9.]*))?/u', 'type' => Constants\DeviceType::TELEVISION ],
+        [ 'name' => 'Kodi',                 'id'    => 'kodi',              'regexp' => '/^Kodi\/([0-9.]+)/u', 'details' => 2 ],
+        [ 'name' => 'XBMC',                 'id'    => 'xbmc',              'regexp' => '/^XBMC\/(?:PRE-)?([0-9.]+)/u', 'details' => 2 ],
+    ],
+
+    Constants\BrowserType::APP_EMAIL => [
+        [ 'name' => 'Lightning',            'id'    => 'lightning',      'regexp' =>'/Lightning\/([0-9.]*)/u' ],
+        [ 'name' => 'Thunderbird',          'id'    => 'thunderbird',      'regexp' =>'/Thunderbird[\/ ]([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Microsoft Outlook',    'id'    => 'outlook',      'regexp' =>'/Microsoft Outlook IMO, Build ([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Microsoft Outlook',    'id'    => 'outlook',      'regexp' =>'/Microsoft Outlook ([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Microsoft Outlook Express',    'id'    => 'outlook',      'regexp' =>'/Outlook-Express\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Lotus Notes',          'id'    => 'lotus',      'regexp' =>'/Lotus-Notes\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Postbox',              'id'    => 'postbox',      'regexp' =>'/Postbox[\/ ]([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'The Bat!',             'id'    => 'bat',      'regexp' =>'/The Bat! ([0-9.]*)/u', 'details' => 3 ],
+        [ 'name' => 'Yahoo Mail',           'id'    => 'yahoo',      'regexp' =>'/YahooMobile\/1.0 \(mail; ([0-9.]+)\)/u', 'details' => 3 ],
+    ],
+
+    Constants\BrowserType::APP_NEWS => [
+        [ 'name' => 'Daum',                 'id'    => 'daum',      'regexp' =>'/DaumApps\/([0-9.]*)/u' ],
+        [ 'name' => 'Daum',                 'id'    => 'daum',      'regexp' =>'/daumcafe\/([0-9.]*)/u' ],
+    ],
+
+    Constants\BrowserType::APP_FEEDREADER => [
+        [ 'name' => 'Akregator',            'id'    => 'akregator',      'regexp' =>'/Akregator\/([0-9.]*)/u' ],
+        [ 'name' => 'Blogos',               'id'    => 'blogos',      'regexp' =>'/Blogos\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ],
+        [ 'name' => 'Cococ',                'id'    => 'cococ',      'regexp' =>'/cococ\/([0-9.]*)/u' ],
+        [ 'name' => 'FeedDemon',            'id'    => 'feed',      'regexp' =>'/FeedDemon\/([0-9.]*)/u' ],
+        [ 'name' => 'Feeddler',             'id'    => 'feed',      'regexp' =>'/FeeddlerRSS[ \/]([0-9.]*)/u' ],
+        [ 'name' => 'Feeddler Pro',         'id'    => 'feed',      'regexp' =>'/FeeddlerPro\/([0-9.]*)/u' ],
+        [ 'name' => 'Liferea',              'id'    => 'liferea',      'regexp' =>'/Liferea\/([0-9.]*)/u' ],
+        [ 'name' => 'NewsBlur',             'id'    => 'news',      'regexp' =>'/NewsBlur\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ],
+        [ 'name' => 'Newsbeuter',           'id'    => 'news',      'regexp' =>'/newsbeuter\/([0-9.]*)/u' ],
+        [ 'name' => 'JetBrains Omea Reader','id'    => 'jetbrains',      'regexp' =>'/JetBrains Omea Reader ([0-9.]*)/u' ],
+        [ 'name' => 'RSS Bandit',           'id'    => 'rss',      'regexp' =>'/RssBandit\/([0-9.]*)/u' ],
+        [ 'name' => 'RSS Junkie',           'id'    => 'rss',      'regexp' =>'/RSS Junkie Daemon/u' ],
+        [ 'name' => 'RSS Owl',              'id'    => 'rss',      'regexp' =>'/RSSOwl\/([0-9.]*)/u' ],
+        [ 'name' => 'Reeder',               'id'    => 'reeder',      'regexp' =>'/Reeder\/([0-9.]*)/u' ],
+        [ 'name' => 'ReedKit',              'id'    => 'reedkit',      'regexp' =>'/ReedKit\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'Rome',                 'id'    => 'rome',      'regexp' =>'/Rome Client/u' ],
+        [ 'name' => 'jsRSS++',              'id'    => 'rss',      'regexp' =>'/jsRSS++\/([0-9.]*)/u' ],
+        [ 'name' => 'Windows RSS Platorm',  'id'    => 'rss',      'regexp' =>'/Windows-RSS-Platform\/([0-9.]*)/u' ],
+    ],
+
+    Constants\BrowserType::APP_PODCAST => [
+        [ 'name' => 'Ziepod',              'id'    => 'ziepod',      'regexp' =>'/Ziepod\+? ([0-9.]*)/u' ],
+    ],
+
+    Constants\BrowserType::APP_CHAT => [
+        [ 'name' => 'Facebook Messenger',   'id'    => 'messenger',      'regexp' =>'/FBAN\/MessengerForiOS/u' ],
+        [ 'name' => 'Kik',                  'id'    => 'kik',      'regexp' =>'/Kik\/([0-9.]*?)(\.0)?\.[0-9]{3,4}/u' ],
+        [ 'name' => 'WeChat',               'id'    => 'messenger',      'regexp' =>'/MicroMessenger\/([0-9.]*)/u' ],
+        [ 'name' => 'Yahoo Messenger',      'id'    => 'yahoo',      'regexp' =>'/YahooMobile\/1.0 \(im; ([0-9.]+)\)/u', 'details' => 3 ],
+        [ 'name' => 'Yammer',               'id'    => 'yammer',      'regexp' =>'/Yammer\/([0-9.]*)/u', 'details' => 2 ],
+    ],
+
+    Constants\BrowserType::APP_SOCIAL => [
+        [ 'name' => 'Facebook',             'id'    => 'fbios',      'regexp' =>'/FBAN\/FBIOS/u' ],
+        [ 'name' => 'Facebook',             'id'    => 'fb4a',      'regexp' =>'/FBAN\/FB4A/u' ],
+        [ 'name' => 'Facebook',             'id'    => 'fb4a',      'regexp' =>'/FB_IAB\/FB4A/u' ],
+        [ 'name' => 'Google+',              'id'    => 'googleplus',      'regexp' =>'/com.google.GooglePlus/u'  ],
+        [ 'name' => 'Instagram',            'id'    => 'instagram',      'regexp' =>'/Instagram ([0-9.]+)/u' ],
+        [ 'name' => 'Pinterest',            'id'    => 'pinterest',      'regexp' =>'/\[Pinterest\/(Android|iOS)\]/u' ],
+        [ 'name' => 'Pinterest',            'id'    => 'pinterest',      'regexp' =>'/Pinterest\/[0-9.]+/u' ],
+        [ 'name' => 'Sina Weibo',           'id'    => 'weibo',      'regexp' =>'/weibo__([0-9.]*)/u' ],
+        [ 'name' => 'Tumblr',               'id'    => 'tumblr',      'regexp' =>'/Tumblr\/([0-9.]*)/u' ],
+        [ 'name' => 'Twitter',              'id'    => 'twitter',      'regexp' =>'/TwitterAndroid/u' ],
+        [ 'name' => 'Twitter',              'id'    => 'twitter',      'regexp' =>'/Twitter for iPhone/u' ],
+        [ 'name' => 'WordPress',            'id'    => 'wp-android',      'regexp' =>'/wp-android\/([0-9.]*)/u' ],
+    ],
+
+    Constants\BrowserType::APP_OFFICE => [
+        [ 'name' => 'LibreOffice',          'id'    => 'office',      'regexp' =>'/LibreOffice/u' ],
+        [ 'name' => 'Microsoft Office',     'id'    => 'office',      'regexp' =>'/MSOffice ([0-9.]*)/u' ],
+        [ 'name' => 'Microsoft Office',     'id'    => 'office',      'regexp' =>'/Microsoft Office Mobile ?\/([0-9.]*)/u' ],
+        [ 'name' => 'Microsoft Excel',      'id'    => 'office',      'regexp' =>'/Microsoft Office Excel ([0-9.]*)/u' ],
+        [ 'name' => 'Microsoft OneNote',    'id'    => 'office',      'regexp' =>'/Microsoft Office OneNote ([0-9.]*)/u' ],
+        [ 'name' => 'Microsoft PowerPoint', 'id'    => 'office',      'regexp' =>'/Microsoft Office PowerPoint ([0-9.]*)/u' ],
+        [ 'name' => 'Microsoft Word',       'id'    => 'office',      'regexp' =>'/Microsoft Office Word ([0-9.]*)/u' ],
+        [ 'name' => 'OpenOffice',           'id'    => 'office',      'regexp' =>'/OpenOffice\/([0-9.]*)/u' ],
+    ],
+
+    Constants\BrowserType::APP_SEARCH => [
+        [ 'name' => 'Baidu Hao123',         'id'    => 'hao123',      'regexp' =>'/hao123\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Google Search',        'id'    => 'gsa',      'regexp' =>'/GSA\/([0-9.]*)/u', 'details' => 3 ],
+        [ 'name' => 'NAVER',                'id'    => 'naver',      'regexp' =>'/NAVER\(inapp; search; [0-9]+; ([0-9.]*)\)/u' ],
+    ],
+
+    Constants\BrowserType::APP_EDITOR => [
+        [ 'name' => 'Atom',                 'id'    => 'atom',      'regexp' =>'/Atom\/([0-9.]*)/u' ],
+        [ 'name' => 'Adobe GoLive',         'id'    => 'golive',      'regexp' =>'/GoLive ([0-9.]*)/u' ],
+        [ 'name' => 'Brackets',             'id'    => 'brackets',      'regexp' =>'/Brackets\/([0-9.]*)/u' ],
+        [ 'name' => 'iWeb',                 'id'    => 'iweb',      'regexp' =>'/(?:^| )iWeb\/([0-9])/u' ],
+        [ 'name' => 'Microsoft FrontPage',  'id'    => 'frontpage',      'regexp' =>'/MS ?FrontPage[ \/]([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
+        [ 'name' => 'W3C Amaya',            'id'    => 'amaya',      'regexp' =>'/amaya\/([0-9.]*)/u' ],
+    ],
+
+    Constants\BrowserType::APP_DOWNLOAD => [
+        [ 'name' => 'Download Manager',     'id'    => 'download',      'regexp' =>'/AndroidDownloadManager\//u' ],
+    ],
+
+    Constants\BrowserType::APP_GAME => [
+        [ 'name' => 'EA Origin',            'id'    => 'origin',      'regexp' =>'/Origin\/([0-9.]*)/u' ],
+        [ 'name' => 'SecondLife',           'id'    => 'secondlife',      'regexp' =>'/SecondLife\/([0-9.]*)/u' ],
+        [ 'name' => 'Valve Steam',          'id'    => 'valve',      'regexp' =>'/Valve Steam/u' ],
+        [ 'name' => 'Raptr',                'id'    => 'raptr',      'regexp' =>'/Raptr/u' ],
+    ],
+
+    Constants\BrowserType::APP => [
+        [ 'name' => 'AliPay',               'id'    => 'alipay',      'regexp' =>'/AlipayClient\/([0-9.]*)/u', 'details' => 3 ],
+        [ 'name' => 'Cooliris',             'id'    => 'cooliris',      'regexp' =>'/Cooliris\/([0-9.]*)/u' ],
+        [ 'name' => 'Google Earth',         'id'    => 'google',      'regexp' =>'/Google Earth\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Google Desktop',       'id'    => 'google',      'regexp' =>'/Google Desktop\/([0-9.]*)/u', 'details' => 2 ],
+        [ 'name' => 'Leechcraft',           'id'    => 'leechcraft',      'regexp' =>'/Leechcraft(?:\/([0-9.]*))?/u', 'details' => 2 ],
+        [ 'name' => 'Lotus Expeditor',      'id'    => 'expeditor',      'regexp' =>'/Gecko Expeditor ([0-9.]*)/u', 'details' => 3 ],
+    ]
+];

+ 107 - 0
Qii/Library/Third/data/browsers-chrome.php

@@ -0,0 +1,107 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+Chrome::$DESKTOP = [
+    '0.2.149' => 'beta',
+    '0.3.154' => 'beta',
+    '0.4.154' => 'beta',
+    '1.0.154' => 'stable',
+    '2.0.172' => 'stable',
+    '3.0.195' => 'stable',
+    '4.0.249' => 'stable',
+    '4.1.249' => 'stable',
+    '5.0.375' => 'stable',
+    '6.0.472' => 'stable',
+    '7.0.517' => 'stable',
+    '8.0.552' => 'stable',
+    '9.0.597' => 'stable',
+    '10.0.648' => 'stable',
+    '11.0.696' => 'stable',
+    '12.0.742' => 'stable',
+    '13.0.782' => 'stable',
+    '14.0.835' => 'stable',
+    '15.0.874' => 'stable',
+    '16.0.912' => 'stable',
+    '17.0.963' => 'stable',
+    '18.0.1025' => 'stable',
+    '19.0.1084' => 'stable',
+    '20.0.1132' => 'stable',
+    '21.0.1180' => 'stable',
+    '22.0.1229' => 'stable',
+    '23.0.1271' => 'stable',
+    '24.0.1312' => 'stable',
+    '25.0.1364' => 'stable',
+    '26.0.1410' => 'stable',
+    '27.0.1453' => 'stable',
+    '28.0.1500' => 'stable',
+    '29.0.1547' => 'stable',
+    '30.0.1599' => 'stable',
+    '31.0.1650' => 'stable',
+    '32.0.1700' => 'stable',
+    '33.0.1750' => 'stable',
+    '34.0.1847' => 'stable',
+    '35.0.1916' => 'stable',
+    '36.0.1985' => 'stable',
+    '37.0.2062' => 'stable',
+    '38.0.2125' => 'stable',
+    '39.0.2171' => 'stable',
+    '40.0.2214' => 'stable',
+    '41.0.2272' => 'stable',
+    '42.0.2311' => 'stable',
+    '43.0.2357' => 'stable',
+    '44.0.2403' => 'stable',
+    '45.0.2454' => 'stable',
+    '46.0.2490' => 'stable',
+    '47.0.2526' => 'stable',
+    '48.0.2564' => 'stable',
+    '49.0.2623' => 'stable',
+    '50.0.2661' => 'stable',
+    '51.0.2704' => 'stable',
+    '52.0.2743' => 'stable',
+    '53.0.2785' => 'stable',
+    '54.0.2840' => 'stable',
+    '55.0.2883' => 'stable',
+    '56.0.2924' => 'stable',
+    '57.0.2987' => 'stable',
+    '58.0.3029' => 'stable',
+    '59.0.3071' => 'stable',
+];
+
+Chrome::$MOBILE = [
+    '16.0.912' => 'beta',
+    '18.0.1025' => 'stable',
+    '25.0.1364' => 'stable',
+    '27.0.1453' => 'stable',
+    '29.0.1547' => 'stable',
+    '30.0.1599' => 'stable',
+    '31.0.1650' => 'stable',
+    '32.0.1700' => 'stable',
+    '33.0.1750' => 'stable',
+    '34.0.1847' => 'stable',
+    '35.0.1916' => 'stable',
+    '36.0.1985' => 'stable',
+    '37.0.2062' => 'stable',
+    '38.0.2125' => 'stable',
+    '39.0.2171' => 'stable',
+    '40.0.2214' => 'stable',
+    '41.0.2272' => 'stable',
+    '42.0.2311' => 'stable',
+    '43.0.2357' => 'stable',
+    '44.0.2403' => 'stable',
+    '45.0.2454' => 'stable',
+    '46.0.2490' => 'stable',
+    '47.0.2526' => 'stable',
+    '48.0.2564' => 'stable',
+    '49.0.2623' => 'stable',
+    '50.0.2661' => 'stable',
+    '51.0.2704' => 'stable',
+    '52.0.2743' => 'stable',
+    '53.0.2785' => 'stable',
+    '54.0.2840' => 'stable',
+    '55.0.2883' => 'stable',
+    '56.0.2924' => 'stable',
+    '57.0.2987' => 'stable',
+    '58.0.3029' => 'stable',
+    '59.0.3071' => 'stable',
+];

+ 244 - 0
Qii/Library/Third/data/build-android.php

@@ -0,0 +1,244 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+BuildIds::$ANDROID_BUILDS = [
+    'CUPCAKE'       => '1.5',
+    'DONUT'         => '1.6',
+    'ECLAIR'        => '2.0',
+    'FROYO'         => '2.2',
+    'GINGERBREAD'   => '2.3',
+
+    'DRC83'         => '1.6',
+    'DRC92'         => '1.6',
+    'DRD08'         => '1.6',
+    'DRD20'         => '1.6',
+    'DMD64'         => '1.6',
+    'ESD20'         => '2.0',
+    'ESD56'         => '2.0.1',
+    'ERD79'         => '2.1',
+    'ERE27'         => '2.1',
+    'EPE54B'        => '2.1',
+    'ESE81'         => '2.1',
+    'EPF21B'        => '2.1',
+    'FRF85B'        => '2.2',
+    'FRF91'         => '2.2',
+    'FRG01B'        => '2.2',
+    'FRG22D'        => '2.2',
+    'FRG83'         => '2.2.1',
+    'FRG83D'        => '2.2.1',
+    'FRG83G'        => '2.2.2',
+    'FRK76'         => '2.2.3',
+    'FRK76C'        => '2.2.3',
+    'GRH55'         => '2.3',
+    'GRH78'         => '2.3.1',
+    'GRH78C'        => '2.3.2',
+    'GRI40'         => '2.3.3',
+    'GRI54'         => '2.3.3',
+    'GRJ06D'        => '2.3.4',
+    'GRJ22'         => '2.3.4',
+    'GRJ90'         => '2.3.5',
+    'GRK39C'        => '2.3.6',
+    'GRK39F'        => '2.3.6',
+    'GWK74'         => '2.3.7',
+
+    'HRI39'         => '3.0',
+    'HRI66'         => '3.0',
+    'HWI69'         => '3.0',
+    'HRI83'         => '3.0',
+    'HMJ37'         => '3.1',
+    'HTJ85B'        => '3.2',
+    'HTK55D'        => '3.2.1',
+    'HTK75'         => '3.2.1',
+    'HTK75D'        => '3.2.1',
+    'HLK75C'        => '3.2.2',
+    'HLK75D'        => '3.2.2',
+    'HLK75F'        => '3.2.4',
+    'HLK75H'        => '3.2.6',
+
+    'ITL41D'        => '4.0.1',
+    'ITL41E'        => '4.0.1',
+    'ITL41F'        => '4.0.1',
+    'ICL53F'        => '4.0.2',
+    'IML74K'        => '4.0.3',
+    'IML77'         => '4.0.3',
+    'IMM76'         => '4.0.4',
+    'IMM76D'        => '4.0.4',
+    'IMM76I'        => '4.0.4',
+    'IMM76K'        => '4.0.4',
+    'IMM76L'        => '4.0.4',
+    'JRO03C'        => '4.1.1',
+    'JRO03D'        => '4.1.1',
+    'JRO03E'        => '4.1.1',
+    'JRO03H'        => '4.1.1',
+    'JRO03L'        => '4.1.1',
+    'JRO03O'        => '4.1.1',
+    'JRO03R'        => '4.1.1',
+    'JRO03S'        => '4.1.1',
+    'JZO54K'        => '4.1.2',
+    'JZO54M'        => '4.1.2',
+    'JVP15S'        => '4.2',           // Interim build used by the Nexus 7
+    'JOP40C'        => '4.2',
+    'JOP40D'        => '4.2.1',
+    'JOP40F'        => '4.2.1',
+    'JOP40G'        => '4.2.1',
+    'JDQ39'         => '4.2.2',
+    'JDQ39B'        => '4.2.2',
+    'JDQ39E'        => '4.2.2',
+    'JWR66L'        => '4.3',
+    'JWR66N'        => '4.3',
+    'JWR66N.S005'   => '4.3',           // Google Play Edition - Samsung Galaxy S4
+    'JWR66V'        => '4.3',
+    'JWR66V.H10'    => '4.3',           // Google Play Edition - HTC One
+    'JWR66V.S014'   => '4.3',           // Google Play Edition - Samsung Galaxy S4
+    'JWR66Y'        => '4.3',
+    'JWR66Y.S003'   => '4.3',           // Google Play Edition - Samsung Galaxy S4
+    'JSR78D'        => '4.3',
+    'JSS15J'        => '4.3',
+    'JSS15Q'        => '4.3',
+    'KRT16S'        => '4.4',
+    'KRT16M'        => '4.4',
+    'KOT49E'        => '4.4.1',
+    'KOT49H'        => '4.4.2',
+    'KVT49L'        => '4.4.2',
+    'KTU84L'        => '4.4.3',
+    'KTU84M'        => '4.4.3',
+    'KTU84P'        => '4.4.4',
+
+    'LPV79'         => ['value' => '5.0', 'alias' => 'L'],
+    'LPV81C'        => ['value' => '5.0', 'alias' => 'L'],
+    'LPX13D'        => ['value' => '5.0', 'alias' => 'L'],
+
+    'LRX21L'        => '5.0',
+    'LRX21M'        => '5.0',
+    'LRX21O'        => '5.0',
+    'LRX21P'        => '5.0',
+    'LRX21Q'        => '5.0',
+    'LRX21R'        => '5.0',
+    'LRX21T'        => '5.0',
+    'LRX21V'        => '5.0',
+    'LRX22C'        => '5.0.1',
+    'LRX22G'        => '5.0.2',
+    'LRX22L'        => '5.0.2',
+    'LGZ23.S3'      => '5.0.2',         // Sony Bravia Android TV
+    'LGZ23.S15'     => '5.0.2',         // Sony Bravia Android TV
+    'LGZ23.S37'     => '5.0.2',         // Sony Bravia Android TV
+    'LGZ23.S49'     => '5.0.2',         // Sony Bravia Android TV
+    'LGZ23.S55'     => '5.0.2',         // Sony Bravia Android TV
+    'LGZ23.S59'     => '5.0.2',         // Sony Bravia Android TV
+    'LGZ23.S61'     => '5.0.2',         // Sony Bravia Android TV
+    'LGZ23.S73'     => '5.0.2',         // Sony Bravia Android TV
+    'LGY70.S1'      => '5.0.2',         // Sony Bravia Android TV
+    'LGY75.S91'     => '5.0.2',         // Sony Bravia Android TV
+    'LGY75.S105'    => '5.0.2',         // Sony Bravia Android TV
+    'LGY75.S109'    => '5.0.2',         // Sony Bravia Android TV
+    'LGY75.S131'    => '5.0.2',         // Sony Bravia Android TV
+    'LGY75.S143'    => '5.0.2',         // Sony Bravia Android TV
+    'LGY75.S147'    => '5.0.2',         // Sony Bravia Android TV
+    'LMY47D'        => '5.1',
+    'LMY47E'        => '5.1',
+    'LMY47I'        => '5.1',
+    'LMY47M'        => '5.1',
+    'LMY47O'        => '5.1',
+    'LMY47V'        => '5.1.1',
+    'LMY47X'        => '5.1.1',
+    'LMY47Z'        => '5.1.1',
+    'LMY48B'        => '5.1.1',
+    'LMY48E.S1'     => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S39'    => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S63'    => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S81'    => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S89'    => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S91'    => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S117'   => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S127'   => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S143'   => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S153'   => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S155'   => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S167'   => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S185'   => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S191'   => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S195'   => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S197'   => '5.1.1',         // Sony Bravia Android TV
+    'LMY48E.S223'   => '5.1.1',         // Sony Bravia Android TV
+    'LMY48B'        => '5.1.1',
+    'LMY48G'        => '5.1.1',
+    'LMY48I'        => '5.1.1',
+    'LMY48J'        => '5.1.1',
+    'LMY48M'        => '5.1.1',
+    'LMY48N'        => '5.1.1',
+    'LMY48P'        => '5.1.1',
+    'LMY48T'        => '5.1.1',
+    'LMY48U'        => '5.1.1',
+    'LMY48W'        => '5.1.1',
+    'LMY48X'        => '5.1.1',
+    'LMY48Y'        => '5.1.1',
+    'LMY48Z'        => '5.1.1',
+    'LMY49F'        => '5.1.1',
+    'LMY49G'        => '5.1.1',
+    'LMY49H'        => '5.1.1',
+    'LMY49I'        => '5.1.1',
+    'LMY49J'        => '5.1.1',
+    'LVY48C'        => '5.1.1',
+    'LVY48E'        => '5.1.1',
+    'LVY48F'        => '5.1.1',
+    'LVY48H'        => '5.1.1',
+    'LYZ28E'        => '5.1.1',
+    'LYZ28J'        => '5.1.1',
+    'LYZ28K'        => '5.1.1',
+    'LYZ28M'        => '5.1.1',
+    'LYZ28N'        => '5.1.1',
+
+    'MPZ44Q'        => ['value' => '6.0', 'alias' => 'M'],
+    'MPZ79M'        => ['value' => '6.0', 'alias' => 'M'],
+
+    'MRA58K'        => '6.0',
+    'MRA58N'        => '6.0',
+    'MRA58U'        => '6.0',
+    'MRA58V'        => '6.0',
+    'MRA58X'        => '6.0',
+    'MRA59B'        => '6.0',
+    'MDA89D'        => '6.0',
+    'MDA89E'        => '6.0',
+    'MDB08I'        => '6.0',
+    'MDB08K'        => '6.0',
+    'MDB08L'        => '6.0',
+    'MDB08M'        => '6.0',
+    'MMB29N'        => '6.0',
+    'MMB29K'        => '6.0.1',
+    'MMB29M'        => '6.0.1',
+    'MMB29O'        => '6.0.1',
+    'MMB29P'        => '6.0.1',
+    'MMB29S'        => '6.0.1',
+    'MMB29T'        => '6.0.1',
+    'MMB29Q'        => '6.0.1',
+    'MMB29R'        => '6.0.1',
+    'MMB29U'        => '6.0.1',
+    'MMB29V'        => '6.0.1',
+    'MMB29X'        => '6.0.1',
+    'MHC19I'        => '6.0.1',
+    'MHC19J'        => '6.0.1',
+    'MHC19Q'        => '6.0.1',
+    'MOB30D'        => '6.0.1',
+    'MOB30G'        => '6.0.1',
+    'MOB30H'        => '6.0.1',
+    'MOB30I'        => '6.0.1',
+    'MOB30J'        => '6.0.1',
+    'MTC19T'        => '6.0.1',
+    'MXB48J'        => '6.0.1',
+    'MXB48K'        => '6.0.1',
+    'MXB48T'        => '6.0.1',
+    'MXC14G'        => '6.0.1',
+    'MXC89F'        => '6.0.1',
+    'M5C14J'        => '6.0.1',
+
+    'NPC56P'        => ['value' => '7.0', 'alias' => 'N'],
+    'NPC56W'        => ['value' => '7.0', 'alias' => 'N'],
+    'NPC56X'        => ['value' => '7.0', 'alias' => 'N'],
+    'NPC91K'        => ['value' => '7.0', 'alias' => 'N'],
+    'NPD35K'        => ['value' => '7.0', 'alias' => 'N'],
+    'NRD21D'        => ['value' => '7.0', 'alias' => 'N'],
+    'NRD28C'        => ['value' => '7.0', 'alias' => 'N'],
+];
+
+// Source: http://source.android.com/source/build-numbers.html

+ 323 - 0
Qii/Library/Third/data/id-android.php

@@ -0,0 +1,323 @@
+<?php
+
+/* This file is automatically generated, do not edit manually! */
+
+namespace WhichBrowser\Data;
+
+BrowserIds::$ANDROID_BROWSERS = [
+    'com.agilebits.onepassword'                                                                           => '1Password',
+    'com.browser2345'                                                                                     => '2345 Browser',
+    'com.browser2345_ucc'                                                                                 => '2345 Browser',
+    'com.browser2345hd'                                                                                   => '2345 Browser HD',
+    'air.stage.web.view'                                                                                  => 'Adobe AIR',
+    'air.stagewebview'                                                                                    => 'Adobe AIR',
+    'air.StageWebViewBridgeTest.debug'                                                                    => 'Adobe AIR',
+    'air.StageWebViewVideo.debug'                                                                         => 'Adobe AIR',
+    'com.adobe.phonegap.app'                                                                              => 'Adobe Phonegap',
+    'com.adobe.reader'                                                                                    => 'Adobe Reader',
+    'com.adobe.shadow.android'                                                                            => 'Adobe Shadow',
+    'com.airwatch.browser'                                                                                => 'AirWatch Browser',
+    'com.aliyun.mobile.browser'                                                                           => 'Aliyun Browser',
+    'net.adgjm.angel'                                                                                     => 'Angel Browser',
+    'com.apc.browser'                                                                                     => 'APC',
+    'com.apc.browser.standard'                                                                            => 'APC',
+    'com.apc.browser.standard6j8s'                                                                        => 'APC',
+    'com.apusapps.browser'                                                                                => 'APUS Browser',
+    'com.apusapps.browser.lark'                                                                           => 'APUS Browser',
+    'com.apusapps.browser.turbo'                                                                          => 'APUS Browser',
+    'com.asus.browser'                                                                                    => 'Asus Browser',
+    'com.wAuroraWebBrowser'                                                                               => 'Aurora Web Browser',
+    'bdmobile.android.app'                                                                                => 'Baidu Browser',
+    'com.baidu.blink.testapp'                                                                             => 'Baidu Browser',
+    'com.baidu.blink.v38'                                                                                 => 'Baidu Browser',
+    'com.baidu.browser.apps'                                                                              => 'Baidu Browser',
+    'com.baidu.browser.apps.lite'                                                                         => 'Baidu Browser',
+    'com.baidu.browser.apps_mr'                                                                           => 'Baidu Browser',
+    'com.baidu.browser.apps_neo'                                                                          => 'Baidu Browser',
+    'com.baidu.browser.apps_sj'                                                                           => 'Baidu Browser',
+    'com.baidu.browser.apps_yt'                                                                           => 'Baidu Browser',
+    'com.baidu.browser.app_bw'                                                                            => 'Baidu Browser',
+    'com.baidu.browser.blink.apps'                                                                        => 'Baidu Browser',
+    'com.baidu.browser.brower'                                                                            => 'Baidu Browser',
+    'com.baidu.browser.chrome'                                                                            => 'Baidu Browser',
+    'com.baidu.browser.inter'                                                                             => 'Baidu Browser',
+    'com.baidu.browser.inter.mini'                                                                        => 'Baidu Browser',
+    'com.baidu.browser.interyb'                                                                           => 'Baidu Browser',
+    'com.baidu.browser.lab'                                                                               => 'Baidu Browser',
+    'com.baidu.browser.pad'                                                                               => 'Baidu Browser',
+    'com.baidu.browserhd.inter'                                                                           => 'Baidu Browser',
+    'com.baidu.demo.webview'                                                                              => 'Baidu Browser',
+    'com.baidu.hi'                                                                                        => 'Baidu Browser',
+    'com.baidu.searchbox'                                                                                 => 'Baidu Browser',
+    'com.baidu.searchbox.pad'                                                                             => 'Baidu Browser',
+    'com.baidu.searchbox_bbk'                                                                             => 'Baidu Browser',
+    'com.baidu.searchbox_coolpad'                                                                         => 'Baidu Browser',
+    'com.baidu.searchbox_gionee'                                                                          => 'Baidu Browser',
+    'com.baidu.searchbox_hisense'                                                                         => 'Baidu Browser',
+    'com.baidu.searchbox_htc'                                                                             => 'Baidu Browser',
+    'com.baidu.searchbox_huawei'                                                                          => 'Baidu Browser',
+    'com.baidu.searchbox_ktouch'                                                                          => 'Baidu Browser',
+    'com.baidu.searchbox_lenovo'                                                                          => 'Baidu Browser',
+    'com.baidu.searchbox_oppo'                                                                            => 'Baidu Browser',
+    'com.baidu.searchbox_samsung'                                                                         => 'Baidu Browser',
+    'com.baidu.searchbox_sj'                                                                              => 'Baidu Browser',
+    'com.baidu.searchbox_sony'                                                                            => 'Baidu Browser',
+    'com.baidu.searchbox_tianyi'                                                                          => 'Baidu Browser',
+    'com.baidu.searchbox_zte'                                                                             => 'Baidu Browser',
+    'com.baidu.zeustest'                                                                                  => 'Baidu Browser',
+    'com.wBestBrowser'                                                                                    => 'Best Browser',
+    'com.boatbrowser.free'                                                                                => 'Boat Browser',
+    'com.boatbrowser.tablet'                                                                              => 'Boat Browser',
+    'com.boatgo.browser'                                                                                  => 'Boat Browser Mini',
+    'com.ericsson.research.mario'                                                                         => 'Bowser',
+    'com.dotsandlines.carbon'                                                                             => 'Carbon',
+    'app.chameleon_browser'                                                                               => 'Chameleon browser',
+    'com.coship.mmcp'                                                                                     => 'Coship MMCP',
+    'com.coship.tvos.web'                                                                                 => 'Coship MMCP',
+    'com.coship.webapp'                                                                                   => 'Coship MMCP',
+    'net.daum.android.daum'                                                                               => 'Daum',
+    'com.phikod.deviceportinfo'                                                                           => 'Device Info Android',
+    'com.dolphin.browser.android.jp'                                                                      => 'Dolphin',
+    'com.dolphin.browser.id'                                                                              => 'Dolphin',
+    'com.dolphin.browser.pad'                                                                             => 'Dolphin',
+    'com.dolphin.browser.tuna'                                                                            => 'Dolphin',
+    'com.dolphin.web.browser.android'                                                                     => 'Dolphin',
+    'mobi.mgeek.TunnyBrowser'                                                                             => 'Dolphin',
+    'mobile.mgeek.TunnyBrowser'                                                                           => 'Dolphin',
+    'com.dolphin.browser.xf'                                                                              => 'Dolphin (Fighter Edition)',
+    'com.dolphin.browser.lab.cn'                                                                          => 'Dolphin Beta',
+    'com.dolphin.browser.lab.en'                                                                          => 'Dolphin Beta',
+    'com.dolphin.browser.express.web'                                                                     => 'Dolphin Express',
+    'com.dolphin.browser.express.web.beta'                                                                => 'Dolphin Express',
+    'com.dolphin.browser'                                                                                 => 'Dolphin Mini',
+    'com.dolphin.browser.cn'                                                                              => 'Dolphin Mini',
+    'com.dolphin.browser.zero'                                                                            => 'Dolphin Zero',
+    'com.duckduckgo.mobile.android'                                                                       => 'DuckDuckGo',
+    'easy.browser'                                                                                        => 'Easy Browser',
+    'easy.browser.classic'                                                                                => 'Easy Browser',
+    'easy.browser.com'                                                                                    => 'Easy Browser',
+    'it.blogspot.fedeveloper'                                                                             => 'Emergency Browser',
+    'com.easy.browser'                                                                                    => 'ES Browser',
+    'org.espier.browser'                                                                                  => 'Espier Browser',
+    'com.exsoul'                                                                                          => 'Exsoul Web Browser',
+    'com.jv.falcon'                                                                                       => 'Falcon',
+    'com.jv.falcon.pro'                                                                                   => 'Falcon Pro',
+    'com.devhd.feedly'                                                                                    => 'Feedly',
+    'com.firemonkeybrowser'                                                                               => 'FireMonkey',
+    'com.comespice.browser'                                                                               => 'Flash Browser',
+    'com.funnyeden.browser'                                                                               => 'Flash Browser',
+    'com.whattheapps.fbrowser'                                                                            => 'Flash Browser',
+    'flipboard.app'                                                                                       => 'Flipboard',
+    'flipboard.cn'                                                                                        => 'Flipboard',
+    'com.lwi.android.flapps'                                                                              => 'Floating Apps',
+    'com.lwi.android.flappsfull'                                                                          => 'Floating Apps',
+    'gpc.myweb.hinet.net.PopupWeb'                                                                        => 'Floating Browser Flux',
+    'com.fortune.browser'                                                                                 => 'Fortune Web Browser',
+    'com.browser.frogbrowser'                                                                             => 'Frog Browser',
+    'com.crowbar.beaverbrowser'                                                                           => 'Frost Browser',
+    'com.crowbar.beaverlite'                                                                              => 'Frost Browser',
+    'galaxy.browser.gb.free'                                                                              => 'Galaxy Browser',
+    'galaxy.browser.gb.pro'                                                                               => 'Galaxy Browser',
+    'com.mybro.browsah'                                                                                   => 'Genie Browser',
+    'com.noinnion.android.greader.reader'                                                                 => 'gReader',
+    'com.noinnion.android.greader.readerpro'                                                              => 'gReader Pro',
+    'jp.ddo.pigsty.HabitBrowser'                                                                          => 'Habit Browser',
+    'jp.ddo.pigsty.Habit_Browser'                                                                         => 'Habit Browser',
+    'com.baidu.hao123'                                                                                    => 'Hao123',
+    'com.baidu.hao123.chrome.browser'                                                                     => 'Hao123',
+    'com.baidu.hao123.global'                                                                             => 'Hao123',
+    'com.htc.browser'                                                                                     => 'HTC Sense Browser',
+    'com.htc.sense.browser'                                                                               => 'HTC Sense Browser',
+    'com.huawei.android.browser'                                                                          => 'Huawei Emotion Browser',
+    'com.huawei.browser'                                                                                  => 'Huawei Emotion Browser',
+    'jp.co.lunascape.android.ilunascape'                                                                  => 'iLunascape 2',
+    'nu.tommie.inbrowser'                                                                                 => 'InBrowser',
+    'nu.tommie.inbrowser.beta'                                                                            => 'InBrowser Beta',
+    'com.infamous.browser'                                                                                => 'Infamous Browser',
+    'derek.iSurf'                                                                                         => 'iSurf',
+    'com.jerky.browser'                                                                                   => 'Javelin Incognito Browser',
+    'com.jerky.browser2'                                                                                  => 'Javelin Incognito Browser',
+    'com.adsi.kioware.client.mobile.app'                                                                  => 'KioWare Kiosk',
+    'com.kroniapp.browse'                                                                                 => 'Kronia Browser',
+    'com.web.browser.labaadibrowser'                                                                      => 'Labaadi Browser',
+    'com.vng.android.zingbrowser'                                                                         => 'Laban',
+    'com.lastpass.lpandroid'                                                                              => 'LastPass',
+    'com.lenovo.browser'                                                                                  => 'Lenovo Browser',
+    'com.lenovo.lps.simple'                                                                               => 'Lenovo Browser',
+    'com.light.browser'                                                                                   => 'Light Browser',
+    'acr.browser.barebones'                                                                               => 'Lightning Browser',
+    'acr.browser.butterfly'                                                                               => 'Lightning Browser',
+    'acr.browser.lightning'                                                                               => 'Lightning Browser',
+    'acr.browser.lightning2'                                                                              => 'Lightning Browser',
+    'acr.browser.lightningq16w'                                                                           => 'Lightning Browser',
+    'acr.browser.spartancompany'                                                                          => 'Lightning Browser',
+    'acr.browser.spartancompanypaid'                                                                      => 'Lightning Browser',
+    'acr.browser.thunder'                                                                                 => 'Lightning Browser',
+    'com.MoNTE.Lime'                                                                                      => 'Lime',
+    'com.alphonso.pulse'                                                                                  => 'LinkedIn Pulse',
+    'com.logio.logos'                                                                                     => 'Logos Browser',
+    'it.lombardo.Lombardo'                                                                                => 'Lombardo',
+    'com.powerpoint45.lucidbrowser'                                                                       => 'Lucid Browser',
+    'com.powerpoint45.lucidbrowserfree'                                                                   => 'Lucid Browser',
+    'com.fiberlink.maas360.android.securebrowser'                                                         => 'MaaS360 Browser',
+    'com.mx.browser'                                                                                      => 'Maxthon',
+    'com.mx.browser.appendix'                                                                             => 'Maxthon',
+    'com.mx.browser.fast'                                                                                 => 'Maxthon',
+    'com.mx.browser.free.mx100000000000'                                                                  => 'Maxthon',
+    'com.mx.browser.free.mx100000001915'                                                                  => 'Maxthon',
+    'com.mx.browser.free.mx100000002422'                                                                  => 'Maxthon',
+    'com.mx.browser.free.mx100000003135'                                                                  => 'Maxthon',
+    'com.mx.browser.free.mx100000003415'                                                                  => 'Maxthon',
+    'com.mx.browser.free.mx100000004211'                                                                  => 'Maxthon',
+    'com.mx.browser.free.mx100000004981'                                                                  => 'Maxthon',
+    'com.mx.browser.free.mx100000005137'                                                                  => 'Maxthon',
+    'com.mx.browser.free.mx200000000239'                                                                  => 'Maxthon',
+    'com.mx.browser.free.mx200000006760'                                                                  => 'Maxthon',
+    'com.mx.browser.free.mx200000013070'                                                                  => 'Maxthon',
+    'com.mx.browser.free.mx200000014602'                                                                  => 'Maxthon',
+    'com.mx.browser.free.mx200000014853'                                                                  => 'Maxthon',
+    'com.mx.browser.hg'                                                                                   => 'Maxthon',
+    'com.mx.browser.kids'                                                                                 => 'Maxthon',
+    'com.mx.browser.mtk'                                                                                  => 'Maxthon',
+    'com.mx.browser.tablet'                                                                               => 'Maxthon',
+    'jp.co.inos.c1Browser'                                                                                => 'MDM Browser',
+    'com.ilegendsoft.mercury'                                                                             => 'Mercury',
+    'com.dmkho.mbm'                                                                                       => 'MiniBrowser Mobile',
+    'com.dmkho.mbmbeta'                                                                                   => 'MiniBrowser Mobile',
+    'com.mseven.msecure'                                                                                  => 'mSecure',
+    'com.visvanoid.secretbrowse'                                                                          => 'My Internet',
+    'com.fevdev.nakedbrowser'                                                                             => 'Naked Browser',
+    'com.fevdev.nakedbrowserNDM'                                                                          => 'Naked Browser',
+    'com.fevdev.nakedbrowserpro'                                                                          => 'Naked Browser Pro',
+    'com.nanobrowser'                                                                                     => 'Nano Browser',
+    'com.bos.ebrowser'                                                                                    => 'Navegador eBrowser',
+    'com.nhn.android.navercafe'                                                                           => 'Naver',
+    'com.nhn.android.naverdic'                                                                            => 'Naver',
+    'com.nhn.android.search'                                                                              => 'Naver',
+    'com.access_company.android.livebrowser'                                                              => 'NetFront Life Browser',
+    'com.access_company.android.nflifebrowser.lite'                                                       => 'NetFront Life Browser',
+    'com.access_company.android.nflifeconnect'                                                            => 'NetFront Life Connect',
+    'com.jiubang.browser'                                                                                 => 'Next Browser',
+    'com.ninesky.browser'                                                                                 => 'Ninesky',
+    'com.ninesky.browsercn'                                                                               => 'Ninesky',
+    'com.ninesky.browserzh'                                                                               => 'Ninesky',
+    'com.ninesky.nqbrowsercn'                                                                             => 'Ninesky',
+    'com.ninesky.nsbrowser'                                                                               => 'Ninesky',
+    'com.ninesky.sebrowser'                                                                               => 'Ninesky',
+    'com.appsverse.privatebrowser'                                                                        => 'Nova Private Browser',
+    'com.browser.nowadvanced'                                                                             => 'Now Browser',
+    'com.browser.nowbasic'                                                                                => 'Now Browser',
+    'com.browser.nowpro'                                                                                  => 'Now Browser',
+    'com.browser.nowpro412t'                                                                              => 'Now Browser',
+    'com.wNewVisionBrowser'                                                                               => 'NVision Browser',
+    'com.compal.android.browser'                                                                          => 'Ocean Browser',
+    'com.maskyn.oldbrowser'                                                                               => 'Old But Gold Internet Browser',
+    'com.tencent.ibibo.mtt'                                                                               => 'One Browser',
+    'info.guardianproject.browser'                                                                        => 'Orweb',
+    'com.oupeng.browser'                                                                                  => 'Oupeng Browser',
+    'com.oupeng.browser.beta10'                                                                           => 'Oupeng Browser',
+    'com.oupeng.browser.turbobeta'                                                                        => 'Oupeng Browser',
+    'com.oupeng.browserpre.cmcc'                                                                          => 'Oupeng Browser',
+    'com.oupeng.mini.android'                                                                             => 'Oupeng Browser',
+    'com.oupeng.xbrowser'                                                                                 => 'Oupeng Browser',
+    'com.oupeng.xbrowser.beta'                                                                            => 'Oupeng Browser',
+    'com.myboyfriendisageek.airbrowser'                                                                   => 'OverSkreen',
+    'com.panasonic.pavc.viera.vieraremote2'                                                               => 'Panasonic TV Remote',
+    'com.wPcBrowser'                                                                                      => 'PC Browser Mini',
+    'com.penguinbrowser.penguinbrowser'                                                                   => 'Penguin browser',
+    'com.appsverse.photon'                                                                                => 'Photon Browser',
+    'com.appsverse.photonamazon'                                                                          => 'Photon Browser',
+    'com.levelup.touiteur'                                                                                => 'Plume',
+    'com.ideashower.readitlater.pro'                                                                      => 'Pocket',
+    'com.gflam.portal'                                                                                    => 'Portal',
+    'com.hat.privatebrowser'                                                                              => 'Private Browser',
+    'com.JamesBecwar.FreePrivateBrowser'                                                                  => 'Private Browser',
+    'com.JamesBecwar.PrivateBrowser'                                                                      => 'Private Browser',
+    'com.qihoa.browser'                                                                                   => 'Qihoo 360 Browser',
+    'com.qihoo.androidbrowser'                                                                            => 'Qihoo 360 Browser',
+    'com.qihoo.appstore'                                                                                  => 'Qihoo 360 Browser',
+    'com.qihoo.browser'                                                                                   => 'Qihoo 360 Browser',
+    'com.qihoo.browsertest'                                                                               => 'Qihoo 360 Browser',
+    'com.qihoo.express.browser'                                                                           => 'Qihoo 360 Browser',
+    'com.qihoo.expressbrowser'                                                                            => 'Qihoo 360 Browser',
+    'com.qihoo.haosou'                                                                                    => 'Qihoo 360 Browser',
+    'com.qihoo.padbrowser'                                                                                => 'Qihoo 360 Browser',
+    'com.qihoo.padbrowser7'                                                                               => 'Qihoo 360 Browser',
+    'com.qihoo360.mobilesafe'                                                                             => 'Qihoo 360 Browser',
+    'com.qihoo360.mobilesafe_meizu'                                                                       => 'Qihoo 360 Browser',
+    'com.qihoo360.mobilesafe_mtk6573'                                                                     => 'Qihoo 360 Browser',
+    'com.tencent.android.pad'                                                                             => 'QQ Browser',
+    'com.tencent.blink'                                                                                   => 'QQ Browser',
+    'com.tencent.hd.qq'                                                                                   => 'QQ Browser',
+    'com.tencent.internat.mtt'                                                                            => 'QQ Browser',
+    'com.tencent.international.mtt'                                                                       => 'QQ Browser',
+    'com.tencent.mobileqq'                                                                                => 'QQ Browser',
+    'com.tencent.mtt'                                                                                     => 'QQ Browser',
+    'com.tencent.padbrowser'                                                                              => 'QQ Browser',
+    'appinventor.ai_progetto2003.SCAN'                                                                    => 'QR Barcode Scanner',
+    'com.rarster.QuantumBrowser'                                                                          => 'QuantumBrowser',
+    'net.virifi.android.quickbrowser'                                                                     => 'Quick ICS Browser',
+    'net.virifi.android.quickbrowserpro'                                                                  => 'Quick ICS Browser',
+    'com.bjy.quicklinkbrowser'                                                                            => 'Quick Link Browser',
+    'com.rapid.browser'                                                                                   => 'Rapid Browser Pro',
+    'com.rapid.browser2'                                                                                  => 'Rapid Browser Pro',
+    'com.andrewshu.android.reddit'                                                                        => 'Reddit is fun',
+    'com.andrewshu.android.redditdonation'                                                                => 'Reddit is fun',
+    'reddit.news'                                                                                         => 'Reddit News',
+    'com.laurencedawson.reddit_sync.dev'                                                                  => 'Reddit Sync Dev',
+    'com.laurencedawson.reddit_sync.pro'                                                                  => 'Reddit Sync Pro',
+    'org.quantumbadger.redreader'                                                                         => 'RedReader',
+    'de.bomhard.android.RetroBrowser'                                                                     => 'RetroBrowser',
+    'com.rocket.browser'                                                                                  => 'Rocket Browser',
+    'com.springdesign.screenshare.browser.client'                                                         => 'ScreenShare',
+    'com.springdesign.screenshare.browser.server'                                                         => 'ScreenShare',
+    'com.shark.sharkbrowser'                                                                              => 'Shark Browser',
+    'com.sina.weibo'                                                                                      => 'Sina Weibo',
+    'com.sina.weibog3'                                                                                    => 'Sina Weibo',
+    'com.sithagi.sithbrowser'                                                                             => 'Sith Browser',
+    'com.skyfire.browser'                                                                                 => 'SkyFire',
+    'com.skyfire.browser.toolbar'                                                                         => 'SkyFire',
+    'com.skyfire.consumer.browser'                                                                        => 'Skyfire',
+    'jp.co.fenrir.android.sleipnir'                                                                       => 'Sleipnir',
+    'jp.co.fenrir.android.sleipnir_black'                                                                 => 'Sleipnir',
+    'jp.co.fenrir.android.sleipnir_ngp'                                                                   => 'Sleipnir',
+    'jp.co.fenrir.android.sleipnir_test'                                                                  => 'Sleipnir',
+    'jp.gocro.smartnews.android'                                                                          => 'SmartNews',
+    'com.cmcc.sofabrowser'                                                                                => 'Sofa Browser',
+    'sogou.mobile.explorer'                                                                               => 'Sogou Mobile',
+    'com.solo.browser'                                                                                    => 'Solo',
+    'com.sonymobile.smallbrowser'                                                                         => 'Sony Small Browser',
+    'com.speedy.browser'                                                                                  => 'Speedy Browser',
+    'com.appestry.split_browser'                                                                          => 'Split Browser',
+    'com.appestry.split_browser_trial'                                                                    => 'Split Browser',
+    'com.stumbleupon.android.app'                                                                         => 'StumbleUpon',
+    'iron.web.jalepano.browser'                                                                           => 'Super Fast Browser',
+    'com.gears42.surefox'                                                                                 => 'SureFox',
+    'com.mns.android.swing'                                                                               => 'Swing Browser',
+    'net.biniok.tampermonkey'                                                                             => 'Tampermonkey',
+    'com.tcl.browser'                                                                                     => 'TCL Browser',
+    'com.thuban.browser'                                                                                  => 'Thuban Handset Browser',
+    'org.tint'                                                                                            => 'Tint Browser',
+    'com.twidroid'                                                                                        => 'UberSocial',
+    'com.uc.browser'                                                                                      => 'UC Browser',
+    'com.uc.browser.en2ly5'                                                                               => 'UC Browser',
+    'com.uc.browser.hd.x86'                                                                               => 'UC Browser',
+    'com.uc.browser.hdx3kg'                                                                               => 'UC Browser',
+    'com.UCMobile'                                                                                        => 'UC Browser',
+    'com.UCMobile.labs'                                                                                   => 'UC Browser',
+    'com.UCMobile.ucsdk'                                                                                  => 'UC Browser',
+    'com.UCMobile295d'                                                                                    => 'UC Browser',
+    'com.UCMobile2jm4'                                                                                    => 'UC Browser',
+    'com.UCMobile9jpo'                                                                                    => 'UC Browser',
+    'com.UCMobileodw6'                                                                                    => 'UC Browser',
+    'com.uc.browser.hd'                                                                                   => 'UC Browser HD',
+    'com.uc.browser.en'                                                                                   => 'UC Browser Mini',
+    'com.tencent.mm'                                                                                      => 'WeChat',
+    'sui.mRelease'                                                                                        => 'xScope Browser Pro',
+    'jp.co.yahoo.android.ybrowser'                                                                        => 'Yahoo! JAPAN',
+    'jp.co.yahoo.android.yjtop'                                                                           => 'Yahoo! JAPAN',
+    'ru.yandex.shell'                                                                                     => 'Yandex Shell',
+    'com.zetakey.browser'                                                                                 => 'Zetakey',
+    'org.zirco'                                                                                           => 'Zirco Browser',
+    'com.zte.browser'                                                                                     => 'ZTE Browser',
+];

+ 7617 - 0
Qii/Library/Third/data/indices/models-android.php

@@ -0,0 +1,7617 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$ANDROID_INDEX = array (
+  '@' => 
+  array (
+    0 => 'A[0-9]{3,3}!!',
+    1 => 'E[0-9]{2,2}0?!!',
+    2 => 'S[0-9]{2,2}0?!!',
+    3 => 'V[0-9]{2,2}0!!',
+    4 => 'Z[0-9]{3,3}!!',
+    5 => '[0-9]0[0-9]F!!',
+    6 => '(Haier[- ])?H[ETW]- ?[A-Z][0-9]!!',
+    7 => '(Hisense )?(LED[0-9]{2,2}(G|K|L|EC|XT)[0-9]{2,3})!',
+    8 => '[SX0][0-9]{2,2}HT!!',
+    9 => '(Huawei )?[MSTX](1|2|7|8|10)\\-[A-Z0-9][0-9]{2,2}!!',
+    10 => 'G[0-9]{3,3}!!',
+    11 => 'Y[0-9]{3,3}!!',
+    12 => '[0-9AS][0-9]{2,2}HW!!',
+    13 => '(USCC-|KYOCERA-)?E[0-9]{4,4}!!',
+    14 => '(USCC-|KYOCERA-)?C[0-9]{4,4}!!',
+    15 => '[0-9]0[0-9]KC?!!',
+    16 => '(Lenovo ?)?(IdeaTab ?)?[AB][0-9]{4,4}!!',
+    17 => '(Lenovo )?(Tab ?)?(2 ?)?[AS](7|8|10)!!',
+    18 => '(Lenovo ?)?(IdeaTab ?)?[KSV][0-9]{4,4}!!',
+    19 => '[0-9]0[0-9]LG!!',
+    20 => 'M\\-PP!!',
+    21 => 'M\\-MP!!',
+    22 => 'M\\-IPRO!!',
+    23 => '(MEDION|(MD )?LIFETAB)!!',
+    24 => 'M\\.T\\.T\\.!!',
+    25 => 'O\\+!!',
+    26 => '[0-9]{2,2}PFH6[0-9]{3,3}!',
+    27 => '(?:RIVO )?RHYTHM RX ?([0-9]+)!',
+    28 => '[456A]0[0-9]SH!!',
+    29 => '(3|5)0[0-9]SH!!',
+    30 => 'C[0-9]{4,4}!!',
+    31 => 'D[0-9]{4,4}!!',
+    32 => 'E[0-9]{4,4}!!',
+    33 => 'F[0-9]{4,4}!!',
+    34 => 'G[0-9]{4,4}!!',
+    35 => 'E[0-9]{2,2}[a-z]!!',
+    36 => 'L[0-9]{2,2}[a-z]!!',
+    37 => '(SNM\\-)?M[0-9]{2,2}[a-z]!!',
+    38 => 'S[0-9]{2,2}[a-z]!!',
+    39 => '(XOLO )?[ABQX][0-9]{3,4}!!',
+    40 => '(ZTE ?)?N[0-9]{3,3}!!',
+    41 => '(ZXY-)?(ZTE )?N[0-9]{4,4}!!',
+    42 => '(ZTE ?)?U[0-9]{3,3}!!',
+    43 => '(ZTE ?)?V[0-9]{3,3}[A-Z]!!',
+    44 => '(ZTE ?)?V ?[0-9]{3,3}!!',
+    45 => '(ZTE ?)?X[0-9]{3,3}!!',
+    46 => '(ZTE )?Z[0-9]!!',
+    47 => '[a-z][a-z](?:-[a-z][a-z])?, SmartTabII7!',
+  ),
+  '@00' => 
+  array (
+    0 => '001DL',
+    1 => '003P',
+    2 => '003Z',
+    3 => '008Z',
+    4 => '009Z',
+  ),
+  '@0P' => 
+  array (
+    0 => '0PCV1',
+    1 => '0PM92',
+    2 => '0PJA1!',
+    3 => '0PJA2!',
+    4 => '0PKV1',
+    5 => '0PAJ5',
+  ),
+  '@10' => 
+  array (
+    0 => '101DL',
+    1 => '101N',
+    2 => '101T',
+    3 => '101P',
+    4 => '102P',
+  ),
+  '@11' => 
+  array (
+    0 => 1105,
+    1 => 1107,
+  ),
+  '@12' => 
+  array (
+    0 => '1216[X]!',
+  ),
+  '@2 ' => 
+  array (
+    0 => '(Lenovo )?(Tab ?)?(2 ?)?[AS](7|8|10)!!',
+  ),
+  '@20' => 
+  array (
+    0 => '201M',
+    1 => 2013061,
+    2 => '2014216 TD-LTE',
+    3 => '20141(12)!',
+    4 => '20148(11|12|13|17|18|19|21)!',
+    5 => '20145(02)!',
+    6 => 2013122,
+    7 => 2014715,
+    8 => '(Xiaomi )?20130(22|23)!',
+    9 => '20140(11)!',
+    10 => '20145(01)!',
+  ),
+  '@2P' => 
+  array (
+    0 => '2PQ93',
+  ),
+  '@3' => 
+  array (
+    0 => '(3|5)0[0-9]SH!!',
+  ),
+  '@3G' => 
+  array (
+    0 => '3G7334i',
+    1 => '(Lenovo |Lephone )?3GC101!',
+    2 => '(Lenovo |Lephone )?3GW100!',
+    3 => '(Lenovo |Lephone )?3GW101!',
+  ),
+  '@40' => 
+  array (
+    0 => '4002[X]!',
+    1 => '4003[AJ]!',
+    2 => '4007[D]!',
+    3 => '4008[A]!',
+    4 => '4009[ADEFIKMSX]!',
+    5 => '4013[ADEJKMX]!',
+    6 => '4014[AMX]!',
+    7 => '4015[ANTX]!',
+    8 => '4015[D]!',
+    9 => '4016[ADX]!',
+    10 => '4017[ADEFX]!',
+    11 => '4018[ADEFMX]!',
+    12 => '4024[DEX]!',
+    13 => '4027[ADNX]!',
+    14 => '4028[AEJS]!',
+    15 => '4032[ADEX]!',
+    16 => '4033[AL]!',
+    17 => '4034[ADEFGX]!',
+    18 => '4035[ADYX]!',
+    19 => '4036[E]!',
+    20 => '4037[AX]!',
+    21 => '4037[T]!',
+    22 => '4037[V]!',
+    23 => '4045[ADELOX]!',
+    24 => '4055[JU]!',
+    25 => '4060[A]!',
+    26 => '4060[W]!',
+    27 => '40[0-9]SC!!',
+    28 => '40[0-9]SO!!',
+    29 => '402ZT',
+  ),
+  '@48' => 
+  array (
+    0 => '(48|50|55)AX600C!',
+  ),
+  '@50' => 
+  array (
+    0 => '5010[DEGSUX]!',
+    1 => '5012[G]!',
+    2 => '5015[ADEX]!',
+    3 => '5016[AJ]!',
+    4 => '5017[B]!',
+    5 => '5017[ADEOX]!',
+    6 => '5019[D]!',
+    7 => '5020[A]!',
+    8 => '5022[DEX]!',
+    9 => '5023[F]!',
+    10 => '5025[DEGX]!',
+    11 => '5027[B]!',
+    12 => '5036[D]!',
+    13 => '5038[ADEX]!',
+    14 => '5042[ADEFGTWXY]!',
+    15 => '5044[DOY]!',
+    16 => '5045[ADGJTX]!',
+    17 => '5046[Y]!',
+    18 => '5050[ASYX]!',
+    19 => '5051[ADJMX]!',
+    20 => '5054[ADOSTX]!',
+    21 => '5054[NW]!',
+    22 => '5056[ADENUWX]!',
+    23 => '5056[O]!',
+    24 => '5057[M]!',
+    25 => '5065[ADJNWX]!',
+    26 => '5070[DJX]!',
+    27 => '5080[DX]!',
+    28 => '5085[CD]!',
+    29 => '5095[BIKY]!',
+    30 => '5096[A]!',
+    31 => '5098[OS]!',
+    32 => '504Q',
+    33 => '504Q+',
+    34 => '504QP',
+    35 => '501LV',
+    36 => '(48|50|55)AX600C!',
+    37 => '5080C Pro',
+    38 => '50[0-9]SO!!',
+    39 => '502ZT',
+  ),
+  '@55' => 
+  array (
+    0 => '5560S',
+    1 => '(48|50|55)AX600C!',
+  ),
+  '@58' => 
+  array (
+    0 => 5832,
+    1 => 5855,
+    2 => 5860,
+    3 => '5860A',
+    4 => '5860E',
+    5 => '5860S',
+    6 => 5870,
+  ),
+  '@60' => 
+  array (
+    0 => '6014[DX]!',
+    1 => '6016[ADEX]!',
+    2 => '6031[X]!',
+    3 => '6036[AYX]!',
+    4 => '6037[BIKY]!',
+    5 => '6039[AHJKSY]!',
+    6 => '6042[D]!',
+    7 => '6043[AD]!',
+    8 => '6044D',
+    9 => '6045[BFGIKOXY]!',
+    10 => '6050[AFWY]!',
+    11 => '6055[ABDHIKPUY]!',
+    12 => '6070[KOY]!',
+    13 => '60[0-9]SO!!',
+    14 => '6034R ORANGE Niva',
+  ),
+  '@70' => 
+  array (
+    0 => '7030[L]!',
+    1 => '7040[NR]!',
+    2 => '7040[T]!',
+    3 => '7043[AEKY]!',
+    4 => '7044[AXY]!',
+    5 => '7045[Y]!',
+    6 => '7046[T]!',
+    7 => '7048[ASWX]!',
+    8 => '7050[Y]!',
+    9 => '7051[X]!',
+    10 => '7053[D]!',
+    11 => '7055[AW]!',
+  ),
+  '@71' => 
+  array (
+    0 => '710C',
+  ),
+  '@72' => 
+  array (
+    0 => 7260,
+    1 => 7266,
+  ),
+  '@75' => 
+  array (
+    0 => '7500IPS',
+  ),
+  '@7D' => 
+  array (
+    0 => '7D-501u',
+  ),
+  '@80' => 
+  array (
+    0 => '8020[D]!',
+    1 => '8030[BY]!',
+    2 => 8022,
+    3 => '801ES',
+    4 => '80-1',
+    5 => '801a',
+    6 => '801s',
+    7 => '802w',
+    8 => '800P31C',
+  ),
+  '@81' => 
+  array (
+    0 => '8190Q',
+  ),
+  '@82' => 
+  array (
+    0 => '825 T-Mobile',
+  ),
+  '@83' => 
+  array (
+    0 => '831C',
+  ),
+  '@87' => 
+  array (
+    0 => 8720,
+    1 => '8720L',
+  ),
+  '@88' => 
+  array (
+    0 => 8810,
+  ),
+  '@89' => 
+  array (
+    0 => 8950,
+  ),
+  '@8X' => 
+  array (
+    0 => '8x-1000',
+  ),
+  '@90' => 
+  array (
+    0 => '9001[DX]!',
+    1 => '9002[AWX]!',
+    2 => '9003[AX]!',
+    3 => '9005[X]!',
+    4 => '9006[W]!',
+    5 => '9007[ATX]!',
+    6 => '9008[AIJTUX]!',
+    7 => '9010[X]!',
+    8 => '9015[BJW]!',
+    9 => '9022[SX]!',
+    10 => '9024[W]!',
+    11 => '9025[MQ]!',
+    12 => '9021A',
+    13 => '909d',
+    14 => 9088,
+    15 => '9020[A]!',
+  ),
+  '@93' => 
+  array (
+    0 => 9300,
+    1 => '9300+',
+    2 => '932i',
+  ),
+  '@97' => 
+  array (
+    0 => '97FC',
+  ),
+  '@A0' => 
+  array (
+    0 => 'A001',
+    1 => 'A0001',
+    2 => 'A0002',
+  ),
+  '@A1' => 
+  array (
+    0 => 'A1-[0-9]{3,3}!!',
+    1 => 'A10',
+    2 => 'A13-?MID!',
+    3 => 'A101B',
+    4 => 'A101C',
+    5 => 'A101B2-LZ',
+    6 => 'A101IT',
+    7 => 'A10 MID',
+    8 => 'A10MID',
+    9 => 'A101B-CF',
+    10 => 'A1001T',
+    11 => 'A19S',
+    12 => 'A11',
+    13 => 'A111',
+    14 => 'A106',
+    15 => 'A1 07',
+    16 => 'A13',
+    17 => 'A110Q',
+    18 => 'A110Q Canvas 2 Plus',
+    19 => 'A110Q Canvas 2+',
+    20 => 'A1680',
+    21 => 'A1001',
+    22 => 'A1601',
+    23 => 'A10H(D5W6)',
+    24 => 'A10HD(N9A3)',
+    25 => 'A10t(5DM3)',
+    26 => 'A10T(8DM1)',
+    27 => 'A11(M5A7)',
+    28 => 'A11s(M5A7)',
+    29 => 'A15(E6C2)',
+  ),
+  '@A2' => 
+  array (
+    0 => 'A206G',
+    1 => 'A2',
+    2 => 'A21',
+  ),
+  '@A3' => 
+  array (
+    0 => 'A3-A[0-9]{2,2}!!',
+    1 => 'A32',
+    2 => 'A35DE',
+    3 => 'A320a',
+    4 => 'A3380',
+    5 => 'A30t',
+    6 => 'A31',
+    7 => 'A31c',
+    8 => 'A31t',
+    9 => 'A33f',
+    10 => 'A37f',
+    11 => 'A3',
+  ),
+  '@A4' => 
+  array (
+    0 => 'A450TL',
+    1 => 'A460G',
+    2 => 'A460T',
+    3 => 'A462C',
+    4 => 'A463BG',
+    5 => 'A464BG',
+    6 => 'A466BG',
+    7 => 'A466T',
+    8 => 'A480G',
+    9 => 'A43',
+    10 => 'A400CG',
+    11 => 'A45',
+    12 => 'A47',
+    13 => 'A4',
+  ),
+  '@A5' => 
+  array (
+    0 => 'A520L',
+    1 => 'A520R',
+    2 => 'A521L',
+    3 => 'A554C',
+    4 => 'A556C',
+    5 => 'A560G',
+    6 => 'A562G',
+    7 => 'A564R',
+    8 => 'A564C',
+    9 => 'A570BL',
+    10 => 'A5 Easy',
+    11 => 'A5 Easy TM',
+    12 => 'A5 Lite',
+    13 => 'A5 Quad Plus',
+    14 => 'A5 Quad Plus TM',
+    15 => 'A500CG',
+    16 => 'A55i',
+    17 => 'A52',
+    18 => 'A5000',
+    19 => 'a5',
+  ),
+  '@A6' => 
+  array (
+    0 => 'A621BL',
+    1 => 'A621R',
+    2 => 'A622GL',
+    3 => 'A622VL',
+    4 => 'A6 Duo',
+    5 => 'A6 Lite',
+    6 => 'A6277',
+    7 => 'A6S',
+  ),
+  '@A7' => 
+  array (
+    0 => 'A7 Lite',
+    1 => 'A70HB',
+    2 => 'A70BHT',
+    3 => 'A70BHT-LZ',
+    4 => 'A70BHT-PR',
+    5 => 'A70CHT',
+    6 => 'A70H',
+    7 => 'A70S',
+    8 => 'A7EB',
+    9 => 'a7272',
+    10 => 'A7272+(HTC DesireZ)',
+    11 => 'A7 HD',
+    12 => 'A7*',
+    13 => 'A7+',
+    14 => 'A750',
+    15 => 'A7272+',
+    16 => 'A70(CY6T)',
+    17 => 'A78h四核(C1V3)',
+  ),
+  '@A8' => 
+  array (
+    0 => 'A845L',
+    1 => 'A846L',
+    2 => 'A851L',
+    3 => 'A862W',
+    4 => 'A80KSC!',
+    5 => 'A80HF',
+    6 => 'A89',
+    7 => 'A87',
+    8 => 'A853',
+    9 => 'A853 Milestone',
+    10 => 'A878 Duo',
+    11 => 'A898 Duo',
+    12 => 'A8HD',
+    13 => 'A80h双核(A4P9)',
+    14 => 'A80 se??(M5MA)',
+    15 => 'A80 se四核(M5MC)',
+    16 => 'A80HD四核(C4H6)',
+    17 => 'A88 mini四核(M1C5)',
+    18 => 'A81E',
+  ),
+  '@A9' => 
+  array (
+    0 => 'A995L',
+    1 => 'A95',
+    2 => 'A97i',
+    3 => '(GIO-)?(GiONEE[- ])?A9$!',
+    4 => 'A90S',
+    5 => 'A953',
+    6 => 'A955',
+  ),
+  '@AA' => 
+  array (
+    0 => 'AA3-600',
+  ),
+  '@AC' => 
+  array (
+    0 => '(AC|BC|LC|MT|RC|QS|VM|TS|OC)[0-9]{4,4}[A-Z]!!',
+    1 => 'Acer One 7 M77GHG',
+    2 => 'AC45BHE',
+    3 => 'AC50BHE',
+    4 => 'AC50DHE',
+    5 => 'AC45NE',
+    6 => 'ACM3066-8',
+    7 => '(Explay|X-tremer|ActiveD|Informer|Surfer)!!',
+    8 => 'ACT2000',
+    9 => 'Acqua',
+  ),
+  '@AD' => 
+  array (
+    0 => 'ADVAN Q7A',
+    1 => 'ADVAN E1C+',
+    2 => 'ADVAN S3',
+    3 => 'ADVAN S3+',
+    4 => 'ADVAN S3A',
+    5 => 'ADVAN S3C',
+    6 => 'ADVAN S3C 3502',
+    7 => 'ADVAN S4',
+    8 => 'ADVAN S4+',
+    9 => 'ADVAN S4A',
+    10 => 'ADVAN S4C',
+    11 => 'ADVAN S4E',
+    12 => 'Advan S4P [Official]',
+    13 => 'ADVAN S5E',
+    14 => 'ADVAN S5E Pro',
+    15 => 'ADVAN S5F+',
+    16 => 'ADVAN S5H',
+    17 => 'ADVAN S5I',
+    18 => 'Advan S5K',
+    19 => 'ADVAN S5M',
+    20 => 'ADVAN S5Q',
+    21 => 'ADVAN S6A',
+    22 => 'ADVAN T1G',
+    23 => 'ADVAN T1J',
+    24 => 'ADVAN T1J+',
+    25 => 'ADVAN T1L',
+    26 => 'ADVAN T1M',
+    27 => 'ADVAN T1X',
+    28 => 'ADVAN T2E',
+    29 => 'ADVAN T2F',
+    30 => 'ADVAN T3E+',
+    31 => 'ADVAN T5C',
+    32 => 'Advent Vega',
+    33 => 'ADR3010',
+    34 => 'AD683G',
+    35 => '(HTC|PCD|USCC)?ADR[0-9]{4,4}!!',
+    36 => 'Adam',
+    37 => 'ADM816KC',
+    38 => 'ADM816HC',
+    39 => 'ADM712HC',
+    40 => 'ADM8000KP A',
+    41 => 'ADM8000KP B',
+    42 => 'ADR8995!',
+    43 => 'ADR910L',
+    44 => 'ADR910L 4G',
+    45 => 'ADR930L',
+    46 => 'ADR930L 4G',
+    47 => 'AD686G',
+    48 => 'AD687G',
+    49 => 'AD6893G',
+    50 => 'Admire Alpha',
+    51 => 'Admire Curve',
+  ),
+  '@AE' => 
+  array (
+    0 => 'Aero A2-110',
+    1 => 'Aegis2',
+  ),
+  '@AF' => 
+  array (
+    0 => 'AFTB',
+    1 => 'AFTS',
+    2 => 'AFTM',
+    3 => 'AFTT',
+  ),
+  '@AG' => 
+  array (
+    0 => 'AG Chrome Selfie',
+    1 => 'AG CHROME ULTRA',
+    2 => 'AG Tab 7 0',
+    3 => 'AG Go-Tab Access',
+    4 => 'AG Chrome Go Tab 7.0',
+    5 => '(KATBL|Agora)!!',
+  ),
+  '@AI' => 
+  array (
+    0 => 'aigoPad',
+    1 => 'aigoPadM60',
+    2 => 'AigoPad M60',
+    3 => 'aigoPad M80D',
+    4 => 'aigoPad M80E',
+    5 => 'Ainovo Aurora-II',
+    6 => 'Ainovo Flame (Nexus 7)',
+    7 => 'AIRIS GN135',
+    8 => 'AIRIS S211',
+    9 => 'AIRIS TM([0-9]+[A-Z]*)!',
+    10 => 'AIRIS OnePAD 725',
+    11 => 'AIRIS OnePAD700',
+    12 => 'AIRIS OnePAD 730',
+    13 => 'AirisOnePad1000',
+    14 => 'AirBook TTJ702',
+    15 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!',
+    16 => 'Air!!',
+    17 => 'Aiki-4S',
+    18 => 'Aiki-5',
+  ),
+  '@AK' => 
+  array (
+    0 => 'AK330',
+    1 => 'AK330s',
+    2 => 'AKAI NEO',
+    3 => 'AKAI N8800',
+    4 => 'AKAI PHA-4800',
+    5 => 'AKAIPHA 5800',
+    6 => 'AKAI MIDMA-7002S',
+  ),
+  '@AL' => 
+  array (
+    0 => 'alien jolla bionic',
+    1 => 'alien ubuntu qt',
+    2 => 'Alcatel A851L',
+    3 => 'Alcatel one touch 908F',
+    4 => 'Alcatel one touch 918',
+    5 => 'Alcatel ONETOUCH 918',
+    6 => 'ALCATEL OT 919',
+    7 => 'Alcatel one touch 990',
+    8 => 'Alcatel one touch 990S',
+    9 => 'Alcatel OT M\'pop 5020D',
+    10 => 'Alcor Access Q913M',
+    11 => 'Alcor Zest Q813I',
+    12 => 'Alcor Zest Q813IS',
+    13 => 'Alcor Zest Q813IX',
+    14 => 'Alcor Zest Q933R',
+    15 => 'ALLVIEW A4ALL',
+    16 => 'ALLVIEW A6 Quad',
+    17 => 'ALLVIEW P1',
+    18 => 'Allview P2',
+    19 => 'ALLVIEW P4',
+    20 => 'ALLVIEW P4i',
+    21 => 'Allview P5',
+    22 => 'Allview P5-Mini',
+    23 => 'ALLVIEW P5 Quad',
+    24 => 'ALLVIEW P5 Qmax',
+    25 => 'ALLVIEW P6',
+    26 => 'ALLVIEW P6 Quad',
+    27 => 'ALLVIEW TX1 Quasar',
+    28 => 'ALLVIEW X2 Soul',
+    29 => 'ALLVIEW-X3 Soul',
+    30 => '(Allview|Alldro)!!',
+    31 => 'Allwinner A10',
+    32 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!',
+    33 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    34 => 'Alfa A93 POP',
+    35 => 'Alfa L',
+    36 => 'Ally',
+    37 => 'Altus 18',
+    38 => 'Altus 24',
+  ),
+  '@AM' => 
+  array (
+    0 => 'amd brazos',
+    1 => 'amd persimmon',
+    2 => 'Amlogic M1 reference board',
+    3 => 'AML8726M',
+    4 => 'AMLOGIC8726MX',
+    5 => 'AM335XEVM',
+    6 => 'AM335XEVM SK',
+    7 => 'am3517evm',
+    8 => 'AM437XEVM',
+    9 => 'Amazon Kindle Fire!',
+    10 => 'Amazon Otter',
+    11 => 'Amazon OtterX',
+    12 => 'Amazon Otter2',
+    13 => 'Amazon Tate',
+    14 => 'Amazon Jem',
+    15 => 'AMI-TT2',
+    16 => 'AMI-TT2C',
+    17 => 'AMI-TT2E',
+    18 => 'AMI-TT4',
+    19 => 'AMI-TTS',
+    20 => 'AMI-TTLITE',
+    21 => 'AMI-TTFORCE',
+    22 => 'AML-MX REF',
+    23 => '(AMO-)?AMOI!!',
+    24 => 'AMD120',
+    25 => '(Amaze|Hitech)!!',
+    26 => 'Amaze 4G',
+    27 => '(Amazing|Fantastic)!!',
+  ),
+  '@AN' => 
+  array (
+    0 => 'Android',
+    1 => 'Android-for-Rockchip-2818',
+    2 => 'AN7CG2',
+    3 => 'AN7G2',
+    4 => 'AN7G2DTE',
+    5 => 'AN7G2I',
+    6 => 'AN7G3',
+    7 => 'AN7BG2',
+    8 => 'AN7BG2DT',
+    9 => 'AN7BG3',
+    10 => 'AN7CG3',
+    11 => 'AN7DG3',
+    12 => 'AN7DG3B',
+    13 => 'AN7DG3-CP',
+    14 => 'AN7DG3ST-CP',
+    15 => 'AN7FG3',
+    16 => 'AN7HG3',
+    17 => 'AN7IG3',
+    18 => 'AN7SP',
+    19 => 'AN8G2',
+    20 => 'AN8G2I',
+    21 => 'AN8G3',
+    22 => 'AN8BG2',
+    23 => 'AN8BG3',
+    24 => 'AN8CG3',
+    25 => 'AN9G2',
+    26 => 'AN9G2I',
+    27 => 'AN9G3',
+    28 => 'AN10G2',
+    29 => 'AN10G2-KN',
+    30 => 'AN10G2-LN',
+    31 => 'AN10G2I',
+    32 => 'AN10BG2',
+    33 => 'AN10BG2DT',
+    34 => 'AN10BG2I',
+    35 => 'AN10BG3',
+    36 => 'AN10BG3DT',
+    37 => 'AN10CG3',
+    38 => 'AN10DG3',
+    39 => 'AN13FP',
+    40 => 'AN8BG3-LZ',
+    41 => 'AN10G2-LZ',
+    42 => 'AN10BG3-LZ',
+    43 => 'AN7DG3C',
+    44 => '(iBall )?Andi!!',
+    45 => 'AND1',
+    46 => 'AND1E',
+    47 => 'AND1E TV',
+    48 => 'Android edition by sfr STARADDICT',
+    49 => 'Android Edition Starnaute',
+    50 => 'Android Edition StarText',
+    51 => 'Android Edition StarTrail',
+    52 => '(Smartfren|Andromax)!!',
+    53 => 'Androtab 7',
+    54 => '(Starway )?Andromeda!!',
+    55 => '(Andy|Yezz)!!',
+  ),
+  '@AO' => 
+  array (
+    0 => 'AOLE 828',
+    1 => 'AOSON G18',
+    2 => 'Aoson M11',
+    3 => 'Aoson M19',
+    4 => 'aoson m33',
+    5 => 'aoson M33 3G',
+    6 => 'AOSON M82T',
+    7 => 'AOSON M97F',
+    8 => 'AOSON M106NB',
+    9 => 'AOSON M701TG-C',
+    10 => 'AOSON M706T',
+    11 => 'AOSON M721S',
+    12 => 'aoson M787T',
+    13 => 'AOSON M1016',
+    14 => '(cm|aokp) tenderloin!',
+  ),
+  '@AP' => 
+  array (
+    0 => 'App Runtime for Chrome',
+    1 => 'apollo',
+    2 => 'Apanda.A60!',
+    3 => 'apanda-A80S',
+    4 => 'apanda A80S',
+    5 => 'apanda-A80T',
+    6 => 'apanda-A100',
+    7 => 'apanda-A101',
+    8 => 'Aprix D97+',
+  ),
+  '@AQ' => 
+  array (
+    0 => '(bq|Aquaris|Edison|Maxwell)!!',
+    1 => 'Aquila 070-0508',
+    2 => 'Aquila 070-0508 3G',
+    3 => 'Aquila 080-0508',
+    4 => 'AQUILA 080-1008',
+    5 => 'Aquila 097-0508',
+    6 => 'AQUILA 097-1006',
+    7 => 'AQUILA 097-1016',
+    8 => 'AQUILA 097-1016 BT + 3G',
+    9 => 'AQUILA 097-1016 BT 3G',
+    10 => 'Aquila 101',
+    11 => 'Aquila 101-1008 3G',
+    12 => 'Aquila LE 080-0508',
+    13 => 'Aquila SE 090-0508',
+    14 => '(Intex )?Aqua!!',
+    15 => 'AQUOS!!',
+  ),
+  '@AR' => 
+  array (
+    0 => 'ARCHM901',
+    1 => 'Arnova 7G2',
+    2 => 'ARNOVA8G2',
+    3 => 'Arnova 10G2',
+    4 => 'ARNOVA 90G3',
+    5 => 'ARNOVA 90 G4',
+    6 => 'ARNOVA 97G4',
+    7 => 'ARNOVA 101 G4',
+    8 => 'ARCHOS 50PL',
+    9 => 'ARCHOS 79XE',
+    10 => 'Archos5',
+    11 => 'ARCHOS 70it2',
+    12 => 'ARCHOS 70it2G8',
+    13 => 'Archos 80 Internet Tablet',
+    14 => 'Archos 101 Internet Tablet',
+    15 => 'Archos!!',
+    16 => 'Artes D708',
+    17 => 'Artes D821',
+    18 => 'Artes i701',
+    19 => 'ARTES I709',
+    20 => 'Artes Q812',
+    21 => 'Arya A1+',
+    22 => 'Arya Z2',
+    23 => 'ARMM2V',
+    24 => 'ARMM3V',
+    25 => 'ARIES 101',
+    26 => 'ARIES 785',
+    27 => 'ARA YS608',
+    28 => 'Arc',
+    29 => 'Arc S',
+  ),
+  '@AS' => 
+  array (
+    0 => 'Astone A108',
+    1 => 'aspire1000s',
+    2 => 'Aspire!!',
+    3 => 'ASK SP[0-9]{3,3}!!',
+    4 => 'ASTRI',
+    5 => 'asus laptop',
+    6 => 'ASUS T20',
+    7 => 'ASUS Pad ME370T',
+    8 => 'Asus Fonepad ME371MG 8GB',
+    9 => 'AST21',
+    10 => 'asus google cube',
+    11 => 'ASP-4300W',
+    12 => 'ASP-4500Z',
+    13 => 'ASP-5000H',
+    14 => 'Asus A10',
+    15 => '(Huawei|Ascend|HW-)!!',
+    16 => 'AS740',
+    17 => 'AS870 4G',
+    18 => 'AS985',
+    19 => 'AS650C',
+    20 => 'Aster',
+    21 => 'Aster T',
+  ),
+  '@AT' => 
+  array (
+    0 => 'AT390',
+    1 => 'AT102HC',
+    2 => 'AT104GS',
+    3 => 'AT107F',
+    4 => 'AT108F',
+    5 => 'AT197F',
+    6 => 'AT10H-A10WP',
+    7 => 'AT101-014',
+    8 => 'AT101T-114',
+    9 => 'AT1A*',
+    10 => 'AT1C',
+    11 => 'AT1C*',
+    12 => 'AT1D',
+    13 => 'AT1G*',
+    14 => 'AT7E',
+    15 => 'ATP515CKIT',
+    16 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    17 => 'aTab9.7 IPS',
+    18 => 'AT735',
+    19 => 'Atrix 2',
+    20 => 'Atrix 2 WeifanZ',
+    21 => 'Atrix 4G',
+    22 => 'Atrix 4G ME860',
+    23 => 'Atrix 4G MB860',
+    24 => 'Atrix HD',
+    25 => 'AtrixHD',
+    26 => 'ATLANTIS',
+    27 => 'ATP7526',
+    28 => 'ATP7683',
+    29 => 'AT1S0',
+    30 => 'AT7-A',
+    31 => 'AT7-B',
+    32 => 'AT7-C',
+    33 => 'AT10-A',
+    34 => 'AT10LE-A',
+    35 => 'AT10PE-A',
+    36 => 'AT100',
+    37 => 'AT200',
+    38 => 'AT270',
+    39 => 'AT300',
+    40 => 'AT300SE',
+    41 => 'AT330',
+    42 => 'AT374',
+    43 => 'AT400',
+    44 => 'AT470',
+    45 => 'AT500',
+    46 => 'AT500a',
+    47 => 'AT503',
+    48 => 'AT570',
+    49 => 'AT703',
+    50 => 'AT830',
+    51 => 'AT-A[QS][0-9]{2,2}!!',
+    52 => 'ATLAS W',
+  ),
+  '@AU' => 
+  array (
+    0 => 'Aurora-II',
+    1 => 'AUX!!',
+    2 => '(Aura|iberry|AUXUS)!!',
+    3 => 'AURUS III',
+  ),
+  '@AV' => 
+  array (
+    0 => '(Ilium )?Avvio!!',
+  ),
+  '@AX' => 
+  array (
+    0 => 'AX3Party',
+    1 => 'AX4Nano plus',
+    2 => '(Axioo[\\- ])?PICO!!',
+    3 => '(AXPAD|Axxion)!!',
+    4 => '(Bmobile )?AX[0-9]{3,4}!!',
+    5 => 'AX7OO',
+    6 => 'AX600C',
+  ),
+  '@AZ' => 
+  array (
+    0 => 'Azumi!!',
+    1 => '(AZ|BT)[0-9]{3,3}!!',
+  ),
+  '@B1' => 
+  array (
+    0 => 'B1-[A0-9][0-9]{2,2}!!',
+    1 => 'B15',
+    2 => 'B15Q',
+  ),
+  '@B3' => 
+  array (
+    0 => 'B3-A20',
+    1 => 'B3-A30',
+    2 => 'B3000',
+  ),
+  '@B9' => 
+  array (
+    0 => 'B916C',
+  ),
+  '@BA' => 
+  array (
+    0 => 'Bay Trail Generic Platform',
+    1 => 'Bayley Bay',
+    2 => 'baoxue',
+    3 => 'Barnes & Noble Nook Tablet',
+    4 => 'Barnes & Noble Nook HD',
+    5 => 'Barnes & Noble Nook HD+',
+    6 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!',
+    7 => 'Backflip',
+    8 => 'Backflip Me600',
+    9 => 'Bambook S1',
+    10 => 'BARRY',
+    11 => 'BASE!!',
+  ),
+  '@BB' => 
+  array (
+    0 => 'BB EH7',
+    1 => 'BB EH7LE',
+    2 => '(BB )?Q5$!',
+    3 => '(BB )?Q10$!',
+    4 => '(BB )?Z10$!',
+    5 => '(BB )?Z30$!',
+    6 => 'BBA100-[0-9]!',
+    7 => 'BBB100-[0-9]!',
+    8 => '(BBG-|VIV-)?vivo!!',
+    9 => 'Bbox Miami',
+  ),
+  '@BC' => 
+  array (
+    0 => 'bcm platform',
+    1 => 'bcm7231',
+    2 => 'bcm7425',
+    3 => 'bcm7429',
+    4 => 'bcm7435',
+    5 => 'bcm7439',
+    6 => 'bcm7445',
+    7 => 'bcm7584',
+    8 => 'BCM21654!',
+    9 => 'BCM21664!',
+    10 => 'BCM23550!',
+    11 => 'BCM28145!',
+    12 => 'BCM28155!',
+    13 => '(AC|BC|LC|MT|RC|QS|VM|TS|OC)[0-9]{4,4}[A-Z]!!',
+    14 => 'BC1003',
+  ),
+  '@BD' => 
+  array (
+    0 => '(BDS|BHX|BKO)\\-!!',
+  ),
+  '@BE' => 
+  array (
+    0 => 'BEAGLEBONE',
+    1 => 'BeagleBone Black',
+    2 => 'BEAGLEBONEBLACK',
+    3 => 'BEAGLEBONEBLACK.A5C',
+    4 => 'berlin',
+    5 => 'berlin bg2!',
+    6 => 'berlin generic!',
+    7 => 'BenQ JD-130',
+    8 => 'BenQ Android TV',
+    9 => 'BenWee 5100',
+    10 => 'BEE 9500',
+    11 => 'BenQ!!',
+    12 => 'BenWee!!',
+    13 => 'BePhone UN030',
+    14 => 'Best ?sonny!!',
+    15 => 'BEAN 454',
+    16 => 'beetle',
+    17 => 'Beeline!!',
+  ),
+  '@BF' => 
+  array (
+    0 => 'BF[ \\-]!!',
+    1 => 'BFB!!',
+    2 => 'BF[0-9]{2,2}00!!',
+  ),
+  '@BG' => 
+  array (
+    0 => 'bg2 !',
+    1 => 'bg2ct !',
+    2 => 'bg2q4k !',
+    3 => 'bg2qa0v4 !',
+    4 => 'bg2qv4 !',
+    5 => 'BGO-DL09',
+  ),
+  '@BH' => 
+  array (
+    0 => '(BDS|BHX|BKO)\\-!!',
+  ),
+  '@BI' => 
+  array (
+    0 => 'bird75v2',
+    1 => 'BioniQ!!',
+    2 => 'Bird!!',
+    3 => 'BizSmartPhone',
+    4 => 'BIP-6000',
+    5 => 'BIRDY',
+  ),
+  '@BK' => 
+  array (
+    0 => '(BDS|BHX|BKO)\\-!!',
+  ),
+  '@BL' => 
+  array (
+    0 => 'Blaze',
+    1 => 'Blaze Tablet',
+    2 => 'BlueStacks!',
+    3 => 'BlackBerry Runtime for Android Apps',
+    4 => 'BLACKBERRY P\'9982',
+    5 => '(BLU|DASH|LIFE|NEO|STUDIO|VIVO)!!',
+    6 => 'Blaze S180',
+    7 => 'BLADE LE 70',
+    8 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    9 => '(BLF-)?lephone!!',
+    10 => 'Blackphone 2',
+    11 => 'BLOOM',
+    12 => 'BLACK',
+    13 => '(ZTE )?Blade!!',
+  ),
+  '@BM' => 
+  array (
+    0 => 'BMOBILE DASH 3.5',
+    1 => '(Bmobile )?AX[0-9]{3,4}!!',
+    2 => 'Bmobile T35AC',
+    3 => 'BM999',
+  ),
+  '@BN' => 
+  array (
+    0 => '(NOOK )?BNRV(200|300)!',
+    1 => '(NOOK )?BNTV250!',
+    2 => '(NOOK )?BNRV350!',
+    3 => '(NOOK )?BNTV(400)!',
+    4 => '(NOOK )?BNTV(600)!',
+    5 => '(NOOK )?BNTV(800)!',
+    6 => 'BN Nook HD',
+    7 => 'BN NookHD+',
+  ),
+  '@BO' => 
+  array (
+    0 => 'Boost',
+    1 => 'BO-FRSP4',
+    2 => 'BO-LFSPBS5',
+    3 => 'BOVO S-F16',
+    4 => 'BOWAY!!',
+    5 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!',
+    6 => 'Bouygues Telecom Bs 351',
+    7 => 'Bouygues Telecom Bs 402',
+    8 => 'Bouygues Telecom Bs 403',
+    9 => 'Bouygues Telecom Bs 451',
+    10 => 'Boston 4G',
+    11 => 'Boston',
+  ),
+  '@BP' => 
+  array (
+    0 => 'BP710A',
+  ),
+  '@BQ' => 
+  array (
+    0 => '(bq|Aquaris|Edison|Maxwell)!!',
+    1 => 'BQS-3510',
+    2 => 'BQS-3552',
+    3 => 'BQS-4001',
+    4 => 'BQS-4004',
+    5 => 'BQS-4005',
+    6 => 'BQS-4007',
+    7 => 'BQS-4008',
+    8 => 'BQS-4009',
+    9 => 'BQS-4010',
+    10 => 'BQS-4501 Bristol',
+    11 => 'BQS-4502',
+    12 => 'BQS-4503',
+    13 => 'BQS-4510',
+    14 => 'BQS-4515',
+    15 => 'BQS-4516',
+    16 => 'BQS-4525',
+    17 => 'BQS-4552',
+    18 => 'BQS-4555',
+    19 => 'BQS-4560',
+    20 => 'BQS-4700',
+    21 => 'BQS-4701',
+    22 => 'BQS-4702',
+    23 => 'BQS-4707',
+    24 => 'BQS-4800',
+    25 => 'BQS-5000 Tokyo',
+    26 => 'BQS-5003',
+    27 => 'BQS-5004',
+    28 => 'BQS-5005',
+    29 => 'BQS-5009',
+    30 => 'BQS-5001',
+    31 => 'BQS 5007',
+    32 => 'BQS-5010',
+    33 => 'BQS-5011',
+    34 => 'BQS-5020',
+    35 => 'BQS-5025',
+    36 => 'BQS-5040',
+    37 => 'BQS-5045',
+    38 => 'BQS-5050',
+    39 => 'BQS-5070',
+    40 => 'BQS-5200',
+    41 => 'BQS-5500',
+    42 => 'BQS-5502',
+    43 => 'BQS-5505',
+    44 => 'BQS 5505',
+  ),
+  '@BR' => 
+  array (
+    0 => 'Bravo',
+    1 => 'BRAVIA 2015',
+    2 => 'BRAVIA 4K 2015',
+    3 => 'BRAVIA 4K GB',
+    4 => 'BroadSign Xpress!',
+    5 => 'Broncho M7',
+    6 => '(BRS-)?BROR!!',
+    7 => 'BRAVIA',
+  ),
+  '@BS' => 
+  array (
+    0 => 'Bs 451',
+    1 => 'Bs 501',
+    2 => 'Bs541',
+    3 => 'BSTB-200C',
+  ),
+  '@BT' => 
+  array (
+    0 => '(AZ|BT)[0-9]{3,3}!!',
+  ),
+  '@BU' => 
+  array (
+    0 => 'BUSH!!',
+    1 => 'Burst S280',
+    2 => 'Butterfly S',
+  ),
+  '@C2' => 
+  array (
+    0 => 'C2',
+  ),
+  '@C5' => 
+  array (
+    0 => '(GIO-)?(GiONEE[- ])?C500!',
+    1 => 'C525c',
+  ),
+  '@C6' => 
+  array (
+    0 => 'C6 Duo',
+    1 => 'C6Quad 4G',
+    2 => '(GIO-)?(GiONEE[- ])?C600!',
+    3 => '(GIO-)?(GiONEE[- ])?C610!',
+    4 => '(GIO-)?(GiONEE[- ])?C620!',
+  ),
+  '@C7' => 
+  array (
+    0 => 'C771',
+    1 => '(GIO-)?(GiONEE[- ])?C700!',
+  ),
+  '@C8' => 
+  array (
+    0 => 'C811 4G',
+    1 => 'C8660',
+    2 => '(GIO-)?(GiONEE[- ])?C800!',
+    3 => 'C8[0-9]{3,3}!!',
+    4 => 'C868',
+  ),
+  '@C9' => 
+  array (
+    0 => 'C908',
+  ),
+  '@CA' => 
+  array (
+    0 => 'Cardhu',
+    1 => 'CA907AAC0G',
+    2 => 'Camangi-Mangrove7',
+    3 => 'CAPTIVA!!',
+    4 => 'Carpad T5',
+    5 => 'Carpad T61 2g',
+    6 => 'CAL21',
+    7 => 'CA201SP',
+    8 => 'CA-201L',
+    9 => 'Casper VIA!!',
+    10 => 'CAT!!',
+    11 => 'Candy TV',
+    12 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    13 => '(HW-|HUAWEI )?(LUA|CUN|SCC|CAM|LYO)!!',
+    14 => '(HW-|HUAWEI )?CAZ-(AL10|TL10)!',
+    15 => '(HW-|HUAWEI )?CAN-(L01|L11)!',
+    16 => 'calgary',
+    17 => 'Captivate-I897',
+  ),
+  '@CC' => 
+  array (
+    0 => 'CCE SK352',
+  ),
+  '@CE' => 
+  array (
+    0 => 'cedartrail',
+    1 => 'CENTURION',
+    2 => 'CENTURION 3',
+    3 => 'Celkon!!',
+  ),
+  '@CH' => 
+  array (
+    0 => 'Chacer',
+    1 => 'ChangHong!!',
+    2 => 'CHER!!',
+    3 => 'Cherry Mobile Burst',
+    4 => 'Cherry Life',
+    5 => 'Cherry Razor',
+    6 => 'Cherry Mobile Razor',
+    7 => 'CHERRY SNAP',
+    8 => 'Cherry Sonic',
+    9 => 'Cherry thunder2.0',
+    10 => 'Cherry Mobile Amber W380',
+    11 => 'Cherry w500',
+    12 => 'CHUWI!!',
+    13 => 'CHONG!!',
+    14 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    15 => '(HW-|HUAWEI )?(CHC|TAG|KII)!!',
+    16 => 'chagall',
+  ),
+  '@CI' => 
+  array (
+    0 => 'cius',
+    1 => 'CIUS-7!',
+    2 => 'Citycall!!',
+    3 => 'CINK',
+    4 => 'CINK+',
+    5 => 'CINK FIVE',
+    6 => 'CINK KING',
+    7 => 'CINK PEAX',
+    8 => 'CINK PEAX+',
+    9 => 'CINK PEAX 2',
+    10 => 'CINK SLIM',
+    11 => 'Cink Slim A',
+    12 => 'Cink Slim B',
+    13 => 'CINK SLIM 2',
+  ),
+  '@CJ' => 
+  array (
+    0 => '(CJ-)?ThL!!',
+  ),
+  '@CL' => 
+  array (
+    0 => 'Clarion Mirage 2',
+    1 => '(Cloudfone|CloudPad|Excite|Thrill)!!',
+    2 => 'Clanga 079-1016',
+    3 => 'Clanga 097-2016',
+    4 => 'Clanga SE 097-1008',
+    5 => 'CLP281X',
+    6 => 'Click',
+    7 => '(Intex )?Cloud!!',
+    8 => 'CLIQ',
+    9 => 'CLIQ XT',
+    10 => 'CLIQ2',
+  ),
+  '@CM' => 
+  array (
+    0 => 'CMP!!',
+    1 => '(cm|aokp) tenderloin!',
+    2 => 'CM980',
+    3 => 'CM990',
+  ),
+  '@CN' => 
+  array (
+    0 => 'CnM!!',
+    1 => 'CN51 [NQ]!',
+  ),
+  '@CO' => 
+  array (
+    0 => 'Colibri-T20',
+    1 => 'Commodore!!',
+    2 => 'Commtiva-HD710',
+    3 => 'Commtiva-N700',
+    4 => 'Connspeed IP71',
+    5 => '(Colorfly|CT[0-9]{3,3})!!',
+    6 => 'Colors!!',
+    7 => 'ConCorde!!',
+    8 => 'Coolgen!!',
+    9 => 'Coolpad!!',
+    10 => 'COSHIP F2',
+    11 => 'COWON!!',
+    12 => 'COZCO C1 Plus',
+    13 => 'Collo DG100',
+    14 => 'Collo 2 DG120',
+    15 => 'Connect-2G-2.0',
+    16 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!',
+    17 => 'Coquettish Red',
+    18 => 'Comet',
+    19 => 'Corvair',
+    20 => 'COOLPIX S800c',
+    21 => 'COOLPIX S810c',
+    22 => 'Constellation V',
+  ),
+  '@CP' => 
+  array (
+    0 => 'CP-DX!!',
+    1 => 'CP3700A',
+    2 => 'CP8298 I00',
+    3 => 'CPH1701',
+    4 => 'CPH1613',
+    5 => 'CPH1611',
+  ),
+  '@CR' => 
+  array (
+    0 => 'Crespo!',
+    1 => 'CRESTA.CTP888',
+    2 => 'Cross!!',
+    3 => 'Crosscall!!',
+    4 => '(HUAWEI )?(CRR|LON|MATE|MHA|MT1|MT2|MT7|M200|NXT|Z100)!!',
+    5 => 'CRONO 22',
+    6 => 'Crescent',
+  ),
+  '@CS' => 
+  array (
+    0 => 'CS-1A13',
+    1 => '(CSL[- ])?(Spice[- ]?)?Mi(-| )?[0-9]{3,3}!!',
+  ),
+  '@CT' => 
+  array (
+    0 => 'CT[0-9]{3,4}!!',
+    1 => 'CT-1',
+    2 => 'CT910',
+    3 => '(Colorfly|CT[0-9]{3,3})!!',
+    4 => 'CTP828BT',
+    5 => '(GIO-)?(GiONEE[- ])?Ctrl V1!',
+    6 => '(GIO-)?(GiONEE[- ])?Ctrl V2!',
+    7 => '(GIO-)?(GiONEE[- ])?Ctrl V3!',
+    8 => '(GIO-)?(GiONEE[- ])?Ctrl V4!',
+    9 => '(GIO-)?(GiONEE[- ])?Ctrl V5!',
+    10 => 'CT50',
+    11 => 'CT720G',
+    12 => 'CT720HD',
+    13 => 'CT920',
+    14 => 'CT1006',
+  ),
+  '@CU' => 
+  array (
+    0 => 'CUBOT!!',
+    1 => '(CUBE ?)?(K8|U1|U2|U3|U5|U6|U8|U9)[0-9]?GT!!',
+    2 => 'CUBE!!',
+    3 => '(HW-|HUAWEI )?(LUA|CUN|SCC|CAM|LYO)!!',
+  ),
+  '@CW' => 
+  array (
+    0 => 'CW[- ]!!',
+  ),
+  '@CX' => 
+  array (
+    0 => 'CX-919',
+    1 => 'CX-921',
+    2 => 'CX-921B',
+    3 => 'CX-929',
+    4 => 'CX-950',
+    5 => 'CX-958',
+  ),
+  '@CY' => 
+  array (
+    0 => 'Cydle M7!',
+    1 => 'Cynus!!',
+    2 => 'Cyclone!!',
+  ),
+  '@D0' => 
+  array (
+    0 => 'D000-0000(13|18|19)-[0-9]{3,3}!',
+    1 => 'D000-0000(01|07)-[A-Z][0-9]{2,2}!',
+    2 => 'D000-000002-[W0][0-9]{2,2}!',
+    3 => 'D000-0000(10|11)-N!',
+    4 => 'D000 000043',
+  ),
+  '@D2' => 
+  array (
+    0 => 'D2-[0-9]{3,3}!!',
+    1 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+  ),
+  '@D5' => 
+  array (
+    0 => 'D530',
+    1 => 'D539',
+  ),
+  '@D7' => 
+  array (
+    0 => 'D709',
+    1 => 'D7800AD',
+    2 => 'D75E',
+    3 => 'D70W',
+  ),
+  '@D8' => 
+  array (
+    0 => 'D820X',
+    1 => 'D816(d|t|v|w|x)!',
+    2 => 'D816G',
+    3 => 'D820mt',
+    4 => 'D80',
+  ),
+  '@D9' => 
+  array (
+    0 => 'D9702',
+    1 => 'D91',
+  ),
+  '@DA' => 
+  array (
+    0 => 'DA2[0-9]{2,2}[A-Z]+!!',
+    1 => '(BLU|DASH|LIFE|NEO|STUDIO|VIVO)!!',
+    2 => 'Dakele A380',
+    3 => 'DAKELE MC001',
+    4 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    5 => 'DATAM803HC',
+    6 => 'DATAM805HC',
+    7 => 'DATAM819HD!',
+    8 => 'DARKFULL',
+    9 => 'DARKMOON',
+    10 => 'DARKNIGHT',
+    11 => 'DARKSIDE',
+  ),
+  '@DE' => 
+  array (
+    0 => 'Dell!!',
+    1 => 'Dell XCD35',
+    2 => 'DEM752HCF',
+    3 => '(DENVER-)?TA[CD]-[0-9]{4,5}!!',
+    4 => 'deovo V5',
+    5 => 'DESAY!!',
+    6 => 'desire200',
+    7 => 'Desire 310 dual sim',
+    8 => 'Desire 500',
+    9 => 'Desire 500 Plus',
+    10 => 'Desire 510',
+    11 => 'Desire 610',
+    12 => 'Desire 619d',
+    13 => 'Desire 816',
+    14 => 'Desire 816 dual sim',
+    15 => 'Desire ?HD!',
+    16 => 'desirec',
+    17 => 'Desire L by HTC',
+    18 => 'Desire ?S!',
+    19 => 'Desire X',
+    20 => 'Desire Z',
+    21 => 'Desire!',
+    22 => 'DEOX',
+    23 => 'DEFY',
+    24 => 'Defy(\\+| Plus)!',
+    25 => 'DEDY+',
+    26 => 'Dext',
+    27 => 'Devour',
+    28 => 'DEM752NC',
+  ),
+  '@DI' => 
+  array (
+    0 => 'Dialog!!',
+    1 => 'DIT[0-9]{4,6}!!',
+    2 => 'DIGICELDL1plus',
+    3 => 'DIGICEL DL800',
+    4 => 'DIGICEL DL1000',
+    5 => '(Digma )?iD[jmnsx][DQ]?[0-9]*!!',
+    6 => 'DISTAB9000R',
+    7 => 'DishTV Smartvu A2020',
+    8 => 'Discovery DG500',
+    9 => 'Discovery2-DG500C',
+    10 => 'DIAMOND D1',
+    11 => 'DIAMOND S3',
+  ),
+  '@DJ' => 
+  array (
+    0 => 'DJC Touchtab3',
+    1 => 'DJC Touchtab4',
+  ),
+  '@DK' => 
+  array (
+    0 => 'Dk1031',
+  ),
+  '@DL' => 
+  array (
+    0 => 'DLX',
+    1 => 'DLXU',
+    2 => 'dL1',
+  ),
+  '@DM' => 
+  array (
+    0 => 'DM0[0-9]{2,2}(K|SH)!!',
+    1 => 'DM-01G',
+    2 => 'DM-02H',
+    3 => 'DMC-CM1',
+    4 => 'DM-01H',
+  ),
+  '@DN' => 
+  array (
+    0 => 'DNS Airbook TYT701',
+    1 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!',
+    2 => 'DNS S!!',
+    3 => 'DNS4502M',
+  ),
+  '@DO' => 
+  array (
+    0 => 'Dooderbutt!',
+    1 => 'domod G20',
+    2 => 'DOOGEE-TITANS-DG150',
+    3 => 'DOOV!!',
+    4 => 'Doro Liberto!!',
+    5 => 'Doro 8030',
+    6 => 'Doro 824',
+    7 => 'Dolphin 70e Black',
+    8 => 'Docomo HT-03A',
+  ),
+  '@DP' => 
+  array (
+    0 => 'DPS Dream 7',
+    1 => 'DPS Dream 9',
+    2 => 'DP-X1',
+    3 => 'DPH-D710',
+  ),
+  '@DR' => 
+  array (
+    0 => 'Dream',
+    1 => '(GIO-)?(GiONEE[- ])?Dream D1!',
+    2 => 'Droid Incredible',
+    3 => 'DroniX-0.5',
+    4 => 'Droid',
+    5 => 'DROID',
+    6 => 'DROID ?2!',
+    7 => 'DROID ?3!',
+    8 => 'DROID ?4!',
+    9 => 'DroidPro',
+    10 => 'DROID Pro',
+    11 => 'DROID HD',
+    12 => 'DROID BIONIC!',
+    13 => 'DROID RAZR HD!',
+    14 => 'DROID ?RAZR!',
+    15 => 'DROID SPYDER',
+    16 => 'DROID ?X2!',
+    17 => 'DROID ?X!',
+    18 => 'DROIDZ Duo',
+    19 => 'DROIDZ Active 3G',
+    20 => 'DROIDZ ATOM S',
+    21 => 'DROIDZ Beat TV',
+    22 => 'DROIDZ Drive+',
+    23 => 'DROIDZ Excel',
+    24 => 'DROIDZ Excite',
+    25 => 'DROIDZ Force',
+    26 => 'DROIDZ Match TV',
+    27 => 'DROIDZ Mini Q',
+    28 => 'DROIDZ Portal X',
+    29 => 'DROIDZ Quad',
+    30 => 'DROIDZ Race',
+    31 => 'DROIDZ Race X',
+    32 => 'DROIDZ Sport',
+    33 => 'DROIDZ Ultimate',
+  ),
+  '@DS' => 
+  array (
+    0 => 'Dslide!!',
+  ),
+  '@DT' => 
+  array (
+    0 => 'dtab01',
+  ),
+  '@DY' => 
+  array (
+    0 => 'dyno 7.80',
+    1 => 'dyno 7.85',
+    2 => 'Dynamic Fun',
+    3 => 'Dynamic Jump',
+    4 => 'Dynamic Maxi',
+    5 => 'Dynamic Milo',
+    6 => 'Dynamic Racing 2',
+    7 => 'Dynamic Raging Go',
+    8 => 'Dynamic Shake',
+    9 => 'Dynamic Wide',
+    10 => 'Dynamic Wing',
+    11 => 'Dynamic Racing 3',
+  ),
+  '@E' => 
+  array (
+    0 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!',
+  ),
+  '@E-' => 
+  array (
+    0 => '(E-Boda|Eruption|Essential|Supreme|Storm|Revo)!!',
+  ),
+  '@E1' => 
+  array (
+    0 => 'E1 v360',
+    1 => 'E170BS',
+    2 => 'E1031',
+    3 => 'e1808 v75!',
+    4 => 'e1109 v73!',
+  ),
+  '@E2' => 
+  array (
+    0 => 'E2 Jump',
+    1 => 'E239',
+    2 => 'E270BSA',
+    3 => 'E2281',
+    4 => '(Moto)?E2$!',
+    5 => '(Moto)?E2\\(4G-LTE\\)$!',
+  ),
+  '@E3' => 
+  array (
+    0 => 'E3 Living',
+    1 => 'E3 Sign',
+    2 => '(GIO-)?(GiONEE[- ])?E3T!',
+    3 => '(GIO-)?(GiONEE[- ])?E3$!',
+  ),
+  '@E4' => 
+  array (
+    0 => 'E4',
+    1 => 'E4 Lite',
+  ),
+  '@E5' => 
+  array (
+    0 => '(GIO-)?(GiONEE[- ])?E5$!',
+  ),
+  '@E6' => 
+  array (
+    0 => '(GIO-)?(GiONEE[- ])?E6mini!',
+    1 => '(GIO-)?(GiONEE[- ])?E6$!',
+    2 => '(GIO-)?(GiONEE[- ])?E6T$!',
+    3 => 'E6782',
+    4 => 'E650',
+    5 => 'E60w',
+  ),
+  '@E7' => 
+  array (
+    0 => 'E70[0-9]{2,2}H[DG]!!',
+    1 => '(GIO-)?(GiONEE[- ])?E7$!',
+    2 => 'E780',
+    3 => 'E731',
+  ),
+  '@E8' => 
+  array (
+    0 => 'E80[0-9]{2,2}H[DG]!!',
+    1 => 'E860',
+    2 => 'E800',
+    3 => 'E815',
+    4 => 'E812',
+    5 => 'E810',
+  ),
+  '@E9' => 
+  array (
+    0 => 'E900',
+    1 => 'E912',
+  ),
+  '@EA' => 
+  array (
+    0 => 'eagle75v1 2',
+    1 => 'EasyPhone EP5',
+    2 => 'EasyPad 971',
+  ),
+  '@EB' => 
+  array (
+    0 => 'EBEN!!',
+    1 => 'EBEST!!',
+    2 => 'EB-4063-X',
+    3 => 'EB-A71GJ',
+    4 => 'EB-W51GJ',
+    5 => 'EB-WX1GJ',
+    6 => 'EB-L76G-B',
+  ),
+  '@EC' => 
+  array (
+    0 => '(Hisense )?(LED[0-9]{2,2}(G|K|L|EC|XT)[0-9]{2,3})!',
+    1 => 'Eco9 v1',
+    2 => 'Eco9 v2',
+    3 => 'Eco11 v2',
+  ),
+  '@ED' => 
+  array (
+    0 => '(bq|Aquaris|Edison|Maxwell)!!',
+    1 => 'edgejr',
+    2 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    3 => 'edenTAB ET-701',
+  ),
+  '@EE' => 
+  array (
+    0 => 'eeepc',
+    1 => 'eee 701',
+    2 => '(Eee Pad )?Transformer Prime TF201!',
+  ),
+  '@EF' => 
+  array (
+    0 => 'EFM710A',
+  ),
+  '@EG' => 
+  array (
+    0 => 'EG98',
+    1 => 'EG680',
+    2 => 'EG968B',
+  ),
+  '@EI' => 
+  array (
+    0 => 'EIS01PT',
+  ),
+  '@EK' => 
+  array (
+    0 => 'EK-[GK][CN][0-9]{3,3}!!',
+  ),
+  '@EL' => 
+  array (
+    0 => 'EL72B',
+    1 => 'ELF-II',
+    2 => 'Elephone!!',
+    3 => 'ELIYA S1',
+    4 => 'Elektra L',
+    5 => 'Elektra XL',
+    6 => 'Electrify',
+    7 => 'Eluga A2',
+    8 => 'ELUGA I2',
+    9 => 'ELUGA Note',
+    10 => 'ELUGA Turbo',
+    11 => 'Elite',
+    12 => 'Elite 11',
+    13 => '(SENCOR )?ELEMENT!!',
+  ),
+  '@EM' => 
+  array (
+    0 => 'EMBT3C',
+    1 => 'EM63',
+    2 => 'EM01F',
+    3 => 'EMR1879',
+  ),
+  '@EN' => 
+  array (
+    0 => 'Endeavour!!',
+    1 => 'ENR U',
+    2 => 'EndeavorU',
+    3 => 'Enjoy 71',
+    4 => 'Enjoy 7 Plus',
+  ),
+  '@EP' => 
+  array (
+    0 => 'EPAD',
+    1 => 'epade!!',
+  ),
+  '@EQ' => 
+  array (
+    0 => 'equiso.smart.tv.pro',
+  ),
+  '@ER' => 
+  array (
+    0 => '(E-Boda|Eruption|Essential|Supreme|Storm|Revo)!!',
+    1 => 'Eris',
+    2 => 'ERIS ADR6200',
+    3 => 'era1X',
+    4 => 'era 4K',
+  ),
+  '@ES' => 
+  array (
+    0 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!',
+    1 => '(E-Boda|Eruption|Essential|Supreme|Storm|Revo)!!',
+    2 => 'eSTAR!!',
+  ),
+  '@ET' => 
+  array (
+    0 => 'ETBW11AA',
+    1 => 'Etel!!',
+    2 => 'ET1',
+    3 => 'Etisalat Smartphone',
+  ),
+  '@EV' => 
+  array (
+    0 => 'EVOKE HDI Box',
+    1 => 'EVDO1000',
+    2 => 'EvoPAD!!',
+    3 => '(EVAS )?EVERCOSS[- ]A!!',
+    4 => 'EVERPAD SC-710',
+    5 => 'Ever!!',
+    6 => 'EVO',
+    7 => 'Evo HD2',
+    8 => 'EVO ?3D!',
+    9 => 'EVO 4G',
+    10 => 'Evo V 4G',
+    11 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    12 => '(EV|KM)-[ES][0-9]{3,3}!!',
+    13 => 'Event',
+    14 => 'EVERY35',
+  ),
+  '@EX' => 
+  array (
+    0 => 'Exynos5410',
+    1 => '(Cloudfone|CloudPad|Excite|Thrill)!!',
+    2 => '(Explay|X-tremer|ActiveD|Informer|Surfer)!!',
+    3 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!',
+    4 => 'Explorer A310e',
+  ),
+  '@EZ' => 
+  array (
+    0 => 'Ezcast',
+    1 => 'eZee!!',
+  ),
+  '@F&' => 
+  array (
+    0 => 'F&U ETB!!',
+  ),
+  '@F-' => 
+  array (
+    0 => 'F-[0-9]{2,2}[A-Z]!!',
+    1 => 'F-074',
+  ),
+  '@F1' => 
+  array (
+    0 => 'f12[a-z]{3,3}!!',
+    1 => '(GIO-)?(GiONEE[- ])?F103!',
+    2 => 'F100',
+    3 => 'F1f',
+    4 => 'F13',
+    5 => 'F15',
+  ),
+  '@F3' => 
+  array (
+    0 => '(GIO-)?(GiONEE[- ])?F301!',
+  ),
+  '@F5' => 
+  array (
+    0 => 'F50Q',
+  ),
+  '@F6' => 
+  array (
+    0 => 'F600',
+  ),
+  '@FA' => 
+  array (
+    0 => 'FAR7',
+    1 => 'FAR70B',
+    2 => 'FARTM933KZ',
+    3 => 'Fablet F3',
+    4 => '(Amazing|Fantastic)!!',
+  ),
+  '@FC' => 
+  array (
+    0 => 'FC6100',
+  ),
+  '@FD' => 
+  array (
+    0 => 'FDT!!',
+    1 => 'FDR-A01w',
+  ),
+  '@FH' => 
+  array (
+    0 => 'FHMD001',
+  ),
+  '@FI' => 
+  array (
+    0 => 'FIH-FB0',
+    1 => 'FIH-!!',
+    2 => 'Find 5',
+    3 => 'FIND7',
+  ),
+  '@FJ' => 
+  array (
+    0 => 'FJ[LT][0-9]{2,2}!!',
+    1 => 'FJJB091',
+  ),
+  '@FL' => 
+  array (
+    0 => 'Flo',
+    1 => 'Flounder',
+    2 => 'Flame2',
+    3 => 'Flare S100',
+    4 => 'Flare 2.0',
+    5 => 'Flare 2.1',
+    6 => 'Flare2X',
+    7 => 'Flare J1',
+    8 => 'FLARE J1 PLUS',
+    9 => 'Flare J3 Plus',
+    10 => 'Flare S4 Max',
+    11 => 'Fly F[0-9]{2,3}!!',
+    12 => 'Fly Phoenix 2',
+    13 => 'Fly Ego Art 2',
+    14 => '(Fly )?IQ ?[0-9]{3,4}!!',
+    15 => 'Flylife!!',
+    16 => 'Fly Flylife Web 7.85 Slim',
+    17 => 'Flyer',
+    18 => 'FlairE3',
+    19 => 'Flair P8',
+    20 => 'Flair Z1',
+  ),
+  '@FN' => 
+  array (
+    0 => '(tablet )?fnac!!',
+  ),
+  '@FO' => 
+  array (
+    0 => 'Forward Active',
+    1 => 'Forward Art',
+    2 => 'Forward Escape',
+    3 => 'Forward Endurance',
+    4 => 'ForwardEndurance',
+    5 => 'FORWARD EVOLVE',
+    6 => 'Forward Infinity',
+    7 => 'Forward Next',
+    8 => 'Forward Prime',
+    9 => 'Forward Racing 3',
+    10 => 'Forward Ruby',
+    11 => 'ForwardRuby',
+    12 => 'Forward Shake',
+    13 => 'ForwardXtreme',
+    14 => 'Forward Young',
+    15 => 'ForwardZero',
+    16 => 'Forward 5 5',
+    17 => 'Forward 5.5',
+    18 => 'Folio 100',
+    19 => 'folio100',
+  ),
+  '@FP' => 
+  array (
+    0 => 'FP1',
+    1 => 'FP1U',
+    2 => 'FP2',
+  ),
+  '@FR' => 
+  array (
+    0 => 'Freelander I20',
+    1 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    2 => '(MODECOM )?FreeTAB!!',
+  ),
+  '@FS' => 
+  array (
+    0 => 'FS403',
+    1 => 'FS407',
+  ),
+  '@FU' => 
+  array (
+    0 => 'full Android on Microsoft Windows, pad, pc, n*books',
+    1 => 'Fusion Bolt',
+    2 => 'FUSIONideos',
+    3 => 'Fuel F2',
+  ),
+  '@FW' => 
+  array (
+    0 => 'FWS[0-9]{3,3}!!',
+  ),
+  '@FZ' => 
+  array (
+    0 => 'FZ-A1(A|B)!',
+    1 => 'FZ-B2(B|D)!',
+    2 => 'FZ-N1',
+    3 => 'FZ-X1',
+  ),
+  '@G ' => 
+  array (
+    0 => 'G Watch',
+    1 => 'G Watch R',
+  ),
+  '@G0' => 
+  array (
+    0 => 'G0775',
+  ),
+  '@G1' => 
+  array (
+    0 => 'G1-715',
+    1 => 'G1-725',
+    2 => 'G100W',
+    3 => 'G17(B5DV)',
+    4 => 'G17(B7DV)',
+    5 => 'G17h 3G??(K5E2)',
+    6 => 'G17h 3G??(K6E2',
+    7 => 'G17h 3G四核(K5E2)',
+    8 => 'G17h 3G四核(K6E2)',
+    9 => 'G17s 3G',
+    10 => 'G17s 3G??(K5E5)',
+    11 => 'G17s 3G四核(K5E5)',
+    12 => 'G17s 3G四核(K5E4)',
+    13 => 'G17s 3G四核(K5E3)',
+    14 => 'G18 3G四核(C6B9)',
+    15 => 'G18mini(C5B9)',
+    16 => 'G18d 3G四核(D3A2)',
+    17 => 'G18d mini(FV2C)',
+  ),
+  '@G2' => 
+  array (
+    0 => 'G2S',
+    1 => 'G2SMNT',
+  ),
+  '@G3' => 
+  array (
+    0 => '(Moto)?G3$!',
+    1 => '(Moto)?G3-TE$!',
+    2 => 'G3SMNTS22',
+    3 => 'G3SMNTS23',
+  ),
+  '@G6' => 
+  array (
+    0 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+  ),
+  '@G7' => 
+  array (
+    0 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+  ),
+  '@G9' => 
+  array (
+    0 => 'G9',
+  ),
+  '@GA' => 
+  array (
+    0 => '(Google )?Galaxy Nexus!',
+    1 => 'Galaxy S4 Google Editon',
+    2 => 'Garmin!!',
+    3 => 'Galaxy!!',
+  ),
+  '@GE' => 
+  array (
+    0 => 'generic',
+    1 => 'generic x86',
+    2 => 'Gear Live',
+    3 => 'Genius!!',
+    4 => '(GP-|Geeksphone)!!',
+    5 => 'Gemei!!',
+    6 => 'GEM[0-9]{4,4}!!',
+    7 => 'GETAWAY',
+  ),
+  '@GF' => 
+  array (
+    0 => 'GFIVE!!',
+  ),
+  '@GH' => 
+  array (
+    0 => 'Ghost',
+    1 => 'GHIA!!',
+  ),
+  '@GI' => 
+  array (
+    0 => '(Gsmart|Gigabyte|Rio)!!',
+    1 => 'Gigaset!!',
+    2 => '(GIO-)?(GiONEE[- ])?A9$!',
+    3 => '(GIO-)?(GiONEE[- ])?C500!',
+    4 => '(GIO-)?(GiONEE[- ])?C600!',
+    5 => '(GIO-)?(GiONEE[- ])?C610!',
+    6 => '(GIO-)?(GiONEE[- ])?C620!',
+    7 => '(GIO-)?(GiONEE[- ])?C700!',
+    8 => '(GIO-)?(GiONEE[- ])?C800!',
+    9 => '(GIO-)?(GiONEE[- ])?Dream D1!',
+    10 => '(GIO-)?(GiONEE[- ])?E3T!',
+    11 => '(GIO-)?(GiONEE[- ])?E3$!',
+    12 => '(GIO-)?(GiONEE[- ])?E5$!',
+    13 => '(GIO-)?(GiONEE[- ])?E6mini!',
+    14 => '(GIO-)?(GiONEE[- ])?E6$!',
+    15 => '(GIO-)?(GiONEE[- ])?E6T$!',
+    16 => '(GIO-)?(GiONEE[- ])?E7$!',
+    17 => '(GIO-)?(GiONEE[- ])?F103!',
+    18 => '(GIO-)?(GiONEE[- ])?F301!',
+    19 => '(GIO-)?(GiONEE[- ])?GN5001!',
+    20 => '(GIO-)?(GiONEE[- ])?GN5002!',
+    21 => '(GIO-)?(GiONEE[- ])?GN8001!',
+    22 => '(GIO-)?(GiONEE[- ])?GN9000!',
+    23 => '(GIO-)?(GiONEE[- ])?GN9001!',
+    24 => '(GIO-)?(GiONEE[- ])?GN9002!',
+    25 => '(GIO-)?(GiONEE[- ])?GN9004!',
+    26 => '(GIO-)?(GiONEE[- ])?GN9005!',
+    27 => '(GIO-)?(GiONEE[- ])?GN9006!',
+    28 => '(GIO-)?(GiONEE[- ])?GN9007!',
+    29 => '(GIO-)?(GiONEE[- ])?GN9008!',
+    30 => '(GIO-)?(GiONEE[- ])?GN9010!',
+    31 => '(GIO-)?(GiONEE[- ])?GN100T!',
+    32 => '(GIO-)?(GiONEE[- ])?GN100!',
+    33 => '(GIO-)?(GiONEE[- ])?GN105!',
+    34 => '(GIO-)?(GiONEE[- ])?GN106!',
+    35 => '(GIO-)?(GiONEE[- ])?GN107!',
+    36 => '(GIO-)?(GiONEE[- ])?GN108!',
+    37 => '(GIO-)?(GiONEE[- ])?GN109!',
+    38 => '(GIO-)?(GiONEE[- ])?GN135!',
+    39 => '(GIO-)?(GiONEE[- ])?GN136!',
+    40 => '(GIO-)?(GiONEE[- ])?GN137!',
+    41 => '(GIO-)?(GiONEE[- ])?GN139!',
+    42 => '(GIO-)?(GiONEE[- ])?GN150!',
+    43 => '(GIO-)?(GiONEE[- ])?GN151!',
+    44 => '(GIO-)?(GiONEE[- ])?GN152!',
+    45 => '(GIO-)?(GiONEE[- ])?GN160T!',
+    46 => '(GIO-)?(GiONEE[- ])?GN160!',
+    47 => '(GIO-)?(GiONEE[- ])?GN168T!',
+    48 => '(GIO-)?(GiONEE[- ])?GN170!',
+    49 => '(GIO-)?(GiONEE[- ])?GN180!',
+    50 => '(GIO-)?(GiONEE[- ])?GN181!',
+    51 => '(GIO-)?(GiONEE[- ])?GN200!',
+    52 => '(GIO-)?(GiONEE[- ])?GN205!',
+    53 => '(GIO-)?(GiONEE[- ])?GN210!',
+    54 => '(GIO-)?(GiONEE[- ])?GN305!',
+    55 => '(GIO-)?(GiONEE[- ])?GN320!',
+    56 => '(GIO-)?(GiONEE[- ])?GN360!',
+    57 => '(GIO-)?(GiONEE[- ])?GN380!',
+    58 => '(GIO-)?(GiONEE[- ])?GN600!',
+    59 => '(GIO-)?(GiONEE[- ])?GN700T!',
+    60 => '(GIO-)?(GiONEE[- ])?GN700W!',
+    61 => '(GIO-)?(GiONEE[- ])?GN705T!',
+    62 => '(GIO-)?(GiONEE[- ])?GN705W!',
+    63 => '(GIO-)?(GiONEE[- ])?GN706L!',
+    64 => '(GIO-)?(GiONEE[- ])?GN708T!',
+    65 => '(GIO-)?(GiONEE[- ])?GN708W!',
+    66 => '(GIO-)?(GiONEE[- ])?GN787!',
+    67 => '(GIO-)?(GiONEE[- ])?GN800!',
+    68 => '(GIO-)?(GiONEE[- ])?GN810!',
+    69 => '(GIO-)?(GiONEE[- ])?GN818T!',
+    70 => '(GIO-)?(GiONEE[- ])?GN858!',
+    71 => '(GIO-)?(GiONEE[- ])?GN868!',
+    72 => '(GIO-)?(GiONEE[- ])?GN878!',
+    73 => 'Gionee M1',
+    74 => 'Gionee M2',
+    75 => 'Gionee-M2',
+    76 => 'Gionee M3S',
+    77 => 'Gionee M5',
+    78 => '(GIO-)?(GiONEE[- ])?S101!',
+    79 => 'GiONEE TD500',
+    80 => '(GIO-)?(GiONEE[- ])?V182!',
+    81 => '(GIO-)?(GiONEE[- ])?V185!',
+    82 => '(GIO-)?(GiONEE[- ])?V188!',
+    83 => '(GIO-)?(GiONEE[- ])?W800!',
+    84 => '(GIO-)?(GiONEE[- ])?X817!',
+    85 => '(GIO-)?(GiONEE[- ])?Ctrl V1!',
+    86 => '(GIO-)?(GiONEE[- ])?Ctrl V2!',
+    87 => '(GIO-)?(GiONEE[- ])?Ctrl V3!',
+    88 => '(GIO-)?(GiONEE[- ])?Ctrl V4!',
+    89 => '(GIO-)?(GiONEE[- ])?Ctrl V5!',
+    90 => '(GIO-)?(GiONEE[- ])?Pioneer P1!',
+    91 => '(GIO-)?(GiONEE[- ])?Pioneer P2!',
+    92 => '(GIO-)?(GiONEE[- ])?Pioneer P3!',
+    93 => '(GIO-)?(GiONEE[- ])?Pioneer P4!',
+    94 => 'Gionee P3',
+    95 => 'Gionee P4',
+    96 => 'GiONEE S7',
+    97 => '(GIO-)?(GiONEE[- ])?Gpad G1!',
+    98 => '(GIO-)?(GiONEE[- ])?Gpad G2!',
+    99 => '(GIO-)?(GiONEE[- ])?Gpad G3!',
+    100 => 'GinDream/GinMagic',
+  ),
+  '@GK' => 
+  array (
+    0 => 'GK802',
+  ),
+  '@GL' => 
+  array (
+    0 => 'Glass 1',
+    1 => 'GLADIATOR',
+    2 => 'GLADIATOR-2',
+    3 => 'GLADIATOR 3',
+    4 => 'GLADIATOR 4',
+    5 => 'Glory',
+    6 => 'Glory 2',
+    7 => 'Glory3',
+    8 => 'GLORY 4',
+    9 => 'GloryG1000',
+    10 => 'GL-900',
+    11 => 'GLX!!',
+    12 => 'GL07S',
+  ),
+  '@GM' => 
+  array (
+    0 => 'GM FOX',
+    1 => 'GM 5 Plus d',
+  ),
+  '@GN' => 
+  array (
+    0 => '(GIO-)?(GiONEE[- ])?GN5001!',
+    1 => '(GIO-)?(GiONEE[- ])?GN5002!',
+    2 => '(GIO-)?(GiONEE[- ])?GN8001!',
+    3 => '(GIO-)?(GiONEE[- ])?GN9000!',
+    4 => '(GIO-)?(GiONEE[- ])?GN9001!',
+    5 => '(GIO-)?(GiONEE[- ])?GN9002!',
+    6 => '(GIO-)?(GiONEE[- ])?GN9004!',
+    7 => '(GIO-)?(GiONEE[- ])?GN9005!',
+    8 => '(GIO-)?(GiONEE[- ])?GN9006!',
+    9 => '(GIO-)?(GiONEE[- ])?GN9007!',
+    10 => '(GIO-)?(GiONEE[- ])?GN9008!',
+    11 => '(GIO-)?(GiONEE[- ])?GN9010!',
+    12 => '(GIO-)?(GiONEE[- ])?GN100T!',
+    13 => '(GIO-)?(GiONEE[- ])?GN100!',
+    14 => '(GIO-)?(GiONEE[- ])?GN105!',
+    15 => '(GIO-)?(GiONEE[- ])?GN106!',
+    16 => '(GIO-)?(GiONEE[- ])?GN107!',
+    17 => '(GIO-)?(GiONEE[- ])?GN108!',
+    18 => '(GIO-)?(GiONEE[- ])?GN109!',
+    19 => '(GIO-)?(GiONEE[- ])?GN135!',
+    20 => '(GIO-)?(GiONEE[- ])?GN136!',
+    21 => '(GIO-)?(GiONEE[- ])?GN137!',
+    22 => '(GIO-)?(GiONEE[- ])?GN139!',
+    23 => '(GIO-)?(GiONEE[- ])?GN150!',
+    24 => '(GIO-)?(GiONEE[- ])?GN151!',
+    25 => '(GIO-)?(GiONEE[- ])?GN152!',
+    26 => '(GIO-)?(GiONEE[- ])?GN160T!',
+    27 => '(GIO-)?(GiONEE[- ])?GN160!',
+    28 => '(GIO-)?(GiONEE[- ])?GN168T!',
+    29 => '(GIO-)?(GiONEE[- ])?GN170!',
+    30 => '(GIO-)?(GiONEE[- ])?GN180!',
+    31 => '(GIO-)?(GiONEE[- ])?GN181!',
+    32 => '(GIO-)?(GiONEE[- ])?GN200!',
+    33 => '(GIO-)?(GiONEE[- ])?GN205!',
+    34 => '(GIO-)?(GiONEE[- ])?GN210!',
+    35 => '(GIO-)?(GiONEE[- ])?GN305!',
+    36 => '(GIO-)?(GiONEE[- ])?GN320!',
+    37 => '(GIO-)?(GiONEE[- ])?GN360!',
+    38 => '(GIO-)?(GiONEE[- ])?GN380!',
+    39 => '(GIO-)?(GiONEE[- ])?GN600!',
+    40 => '(GIO-)?(GiONEE[- ])?GN700T!',
+    41 => '(GIO-)?(GiONEE[- ])?GN700W!',
+    42 => '(GIO-)?(GiONEE[- ])?GN705T!',
+    43 => '(GIO-)?(GiONEE[- ])?GN705W!',
+    44 => '(GIO-)?(GiONEE[- ])?GN706L!',
+    45 => '(GIO-)?(GiONEE[- ])?GN708T!',
+    46 => 'GN 708T',
+    47 => '(GIO-)?(GiONEE[- ])?GN708W!',
+    48 => '(GIO-)?(GiONEE[- ])?GN787!',
+    49 => '(GIO-)?(GiONEE[- ])?GN800!',
+    50 => '(GIO-)?(GiONEE[- ])?GN810!',
+    51 => '(GIO-)?(GiONEE[- ])?GN818T!',
+    52 => '(GIO-)?(GiONEE[- ])?GN858!',
+    53 => '(GIO-)?(GiONEE[- ])?GN868!',
+    54 => '(GIO-)?(GiONEE[- ])?GN878!',
+    55 => 'Gnappo Ideos',
+  ),
+  '@GO' => 
+  array (
+    0 => 'google sdk',
+    1 => 'Google Ion',
+    2 => '(Google )?Nexus S!',
+    3 => '(Google )?Galaxy Nexus!',
+    4 => '(Google )?Nexus ?4!',
+    5 => '(Google )?Nexus ?5!',
+    6 => '(Google )?Nexus ?6P!',
+    7 => '(Google )?Nexus ?6!',
+    8 => '(Google )?Nexus ?7 2013!',
+    9 => '(Google )?Nexus ?7!',
+    10 => '(Google )?Nexus ?9!',
+    11 => '(Google )?Nexus ?10!',
+    12 => 'Google Pixel',
+    13 => 'Google Pixel XL',
+    14 => 'google cube',
+    15 => 'GOCL!!',
+    16 => 'GO Live!!',
+    17 => 'GOOPHONE!!',
+    18 => 'GO !!',
+    19 => 'GOA',
+    20 => 'GO778',
+    21 => 'GO980',
+    22 => 'GO984',
+    23 => 'Gomobile GO1001',
+  ),
+  '@GP' => 
+  array (
+    0 => '(GP-|Geeksphone)!!',
+    1 => 'GP-431',
+    2 => 'GP-720',
+    3 => 'GPLUS GN708W',
+    4 => 'GPLUS N809',
+    5 => '(GIO-)?(GiONEE[- ])?Gpad G1!',
+    6 => '(GIO-)?(GiONEE[- ])?Gpad G2!',
+    7 => '(GIO-)?(GiONEE[- ])?Gpad G3!',
+  ),
+  '@GR' => 
+  array (
+    0 => 'Grouper',
+    1 => 'GR-TB!!',
+    2 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    3 => 'greenridge',
+    4 => 'Graphos A10',
+    5 => '(ZTE )?(Grand|Mimosa)!!',
+  ),
+  '@GS' => 
+  array (
+    0 => 'GS01',
+    1 => '(Gsmart|Gigabyte|Rio)!!',
+    2 => 'GS02',
+    3 => 'GS03',
+  ),
+  '@GT' => 
+  array (
+    0 => 'GT-I9505G',
+    1 => 'GT-810',
+    2 => 'GT-I7105',
+    3 => 'GT-I9810',
+    4 => 'GT-[HN][0-9]{4,4}!!',
+    5 => 'GT-9000',
+    6 => 'GT-[0-9]{4,4}!!',
+    7 => 'GT-i9377',
+    8 => 'GT-T9500',
+    9 => 'GT540',
+    10 => 'GT540f',
+    11 => 'GTV100',
+    12 => 'GT-B[0-9]{4,4}!!',
+    13 => 'GT-I[0-9]{3,4}!!',
+    14 => 'GT-N[0-9]{4,4}!!',
+    15 => 'GT-P[0-9]{4,4}!!',
+    16 => 'GT-S[0-9]{4,4}!!',
+    17 => 'GT-T959!',
+    18 => 'GT9100',
+    19 => 'GTablet',
+    20 => 'GtabComb',
+  ),
+  '@GV' => 
+  array (
+    0 => 'GVON 898',
+  ),
+  '@GW' => 
+  array (
+    0 => 'GW620',
+  ),
+  '@GX' => 
+  array (
+    0 => 'GX1210V TV',
+  ),
+  '@H1' => 
+  array (
+    0 => 'H120',
+  ),
+  '@H2' => 
+  array (
+    0 => 'H2000+',
+  ),
+  '@H3' => 
+  array (
+    0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+  ),
+  '@H6' => 
+  array (
+    0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+  ),
+  '@H7' => 
+  array (
+    0 => 'H701',
+    1 => 'H7100',
+    2 => 'H7500+',
+  ),
+  '@H8' => 
+  array (
+    0 => 'H8 Life',
+    1 => 'H866C',
+    2 => 'H882L',
+  ),
+  '@H9' => 
+  array (
+    0 => 'H9500',
+  ),
+  '@HA' => 
+  array (
+    0 => 'HammerHead',
+    1 => '(Haier[- ])?H[ETW]- ?[A-Z][0-9]!!',
+    2 => 'Haier-W700',
+    3 => 'Haier-SY0880',
+    4 => 'HannsComb',
+    5 => 'Hannspadd',
+    6 => 'Hayabusa',
+  ),
+  '@HB' => 
+  array (
+    0 => 'HB-100 DASAN',
+    1 => 'HB-100 DASAN Networks, Inc.',
+    2 => 'HB-1000',
+  ),
+  '@HD' => 
+  array (
+    0 => 'HD2',
+    1 => 'HD2 LEO',
+    2 => 'HD7  Pro',
+  ),
+  '@HE' => 
+  array (
+    0 => 'HEDY!!',
+    1 => 'HERO H7500+',
+    2 => 'Hero',
+    3 => 'HERO CDMA',
+    4 => 'HERO200',
+  ),
+  '@HI' => 
+  array (
+    0 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!',
+    1 => 'HIKe!!',
+    2 => 'HILIVE H7',
+    3 => '(HS-)?Hisense!!',
+    4 => 'Hisense AD686G',
+    5 => '(Hisense )?(LED[0-9]{2,2}(G|K|L|EC|XT)[0-9]{2,3})!',
+    6 => 'Hisense Google TV TV',
+    7 => 'hisense gx1200v',
+    8 => '(Amaze|Hitech)!!',
+    9 => 'HITO HT-3',
+    10 => 'Hikari-iFrame!',
+    11 => 'HIGHWAY',
+    12 => 'HIGHWAY PURE',
+    13 => 'HIGHWAY SIGNS',
+  ),
+  '@HK' => 
+  array (
+    0 => 'HKPHONE H8-3G',
+  ),
+  '@HL' => 
+  array (
+    0 => 'HLV-T!!',
+  ),
+  '@HM' => 
+  array (
+    0 => 'HMP8100 ATV 93',
+    1 => 'HMP8100 ATV INT',
+    2 => 'HM 1',
+    3 => 'HM 1A',
+    4 => 'HM 1AC',
+    5 => 'HM 1S',
+    6 => 'HM 1SLTE',
+    7 => 'HM 1SC',
+    8 => 'HM 1SLTETD',
+    9 => 'HM 1STD',
+    10 => 'HM 1SW',
+    11 => 'HM 2',
+    12 => 'HM 2LTE!',
+    13 => 'HM 2A!',
+    14 => 'HM NOTE',
+    15 => 'HM Note 4G!',
+    16 => 'HM NOTE LTE',
+    17 => 'HM NOTE 1LTE!',
+    18 => 'HM NOTE 1TD',
+    19 => 'HM Note1 TD',
+    20 => 'HM NOTE 1S!',
+    21 => 'HM NOTE 1W',
+    22 => 'HM NOTE1W',
+    23 => 'HM Note 2',
+  ),
+  '@HN' => 
+  array (
+    0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+  ),
+  '@HO' => 
+  array (
+    0 => 'HOSIN!!',
+    1 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    2 => 'Honor3c2G-T',
+    3 => 'HOMESYNCT2WIFI',
+  ),
+  '@HP' => 
+  array (
+    0 => '(HP|Slate)!!',
+    1 => 'HP!!',
+    2 => 'HP-TouchPad',
+    3 => '(HP )?Touchpad!',
+  ),
+  '@HS' => 
+  array (
+    0 => 'HS-[0-9]{1,2}DTB!!',
+    1 => 'HS-[EFHITUX][0-9]!!',
+    2 => 'HS-E[GT][0-9]{3,3}!!',
+    3 => '(HS-)?Hisense!!',
+  ),
+  '@HT' => 
+  array (
+    0 => '(HTC )?Nexus ?One!',
+    1 => 'HTC One',
+    2 => 'HT17Pro',
+    3 => 'HT20Pro',
+    4 => 'HTC!!',
+    5 => '(HTC|PCD|USCC)?ADR[0-9]{4,4}!!',
+    6 => '(HTC )?HT[LV][0-9]{2,2}!!',
+    7 => 'HTX21',
+    8 => 'HTC Dream',
+    9 => 'HTC Dream G1',
+    10 => 'HTC Dream SparksMod ',
+    11 => 'HTC Vision',
+    12 => 'HTC T-Mobile myTouch 3G Slide',
+    13 => 'HTC my ?Touch 3G Slide!',
+    14 => 'HTC Glacier',
+    15 => 'HTC Panache',
+    16 => 'HTC My ?Touch ?4G$!',
+    17 => 'HTC S910m',
+    18 => 'HTC myTouch 4G Slide',
+    19 => 'HTC Doubleshot',
+  ),
+  '@HU' => 
+  array (
+    0 => 'HUAWEI WATCH',
+    1 => 'Huawei MediaPad',
+    2 => 'Huawei OsiMood MediaPad',
+    3 => 'HUAWEI MediaPad M1 8.0',
+    4 => 'Huawei MediaPad T1 7.0 3G',
+    5 => 'Huawei MediaPad T1 8.0 4G',
+    6 => 'Huawei MediaPad T1 10 4G',
+    7 => '(Huawei )?[MSTX](1|2|7|8|10)\\-[A-Z0-9][0-9]{2,2}!!',
+    8 => 'HUAWEI GEM-703L',
+    9 => '(HUAWEI )?(CRR|LON|MATE|MHA|MT1|MT2|MT7|M200|NXT|Z100)!!',
+    10 => '(HW-|HUAWEI )?(TIT|TAG|NCE)!!',
+    11 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    12 => '(HW-|HUAWEI )?(CHC|TAG|KII)!!',
+    13 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    14 => '(HW-|HUAWEI )?(LUA|CUN|SCC|CAM|LYO)!!',
+    15 => '(HW-|HUAWEI )?CAZ-(AL10|TL10)!',
+    16 => '(HW-|HUAWEI )?CAN-(L01|L11)!',
+    17 => '(HW-|HUAWEI )?MLA-(L01|L03|L11|L12)!',
+    18 => '(HW-|HUAWEI )?MLA-(AL00|AL10)!',
+    19 => '(HW-|HUAWEI )?MLA-(TL00|TL10|UL00)!',
+    20 => 'Huawei P7 mini',
+    21 => 'Huawei P8max',
+    22 => '(Huawei|Ascend|HW-)!!',
+    23 => 'HUAWEI Honor 3c w',
+    24 => 'Huawei S7',
+    25 => 'Hudl HT7S3',
+    26 => 'Hudl 2',
+    27 => 'HUAWEI U8686',
+    28 => 'Huawei 858',
+  ),
+  '@HW' => 
+  array (
+    0 => '(HW-|HUAWEI )?(TIT|TAG|NCE)!!',
+    1 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    2 => '(HW-|HUAWEI )?(CHC|TAG|KII)!!',
+    3 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    4 => '(HW-|HUAWEI )?(LUA|CUN|SCC|CAM|LYO)!!',
+    5 => '(HW-|HUAWEI )?CAZ-(AL10|TL10)!',
+    6 => '(HW-|HUAWEI )?CAN-(L01|L11)!',
+    7 => '(HW-|HUAWEI )?MLA-(L01|L03|L11|L12)!',
+    8 => '(HW-|HUAWEI )?MLA-(AL00|AL10)!',
+    9 => '(HW-|HUAWEI )?MLA-(TL00|TL10|UL00)!',
+    10 => '(Huawei|Ascend|HW-)!!',
+    11 => 'hwu8812D',
+    12 => 'HW-01E',
+    13 => 'HW-03E',
+  ),
+  '@HY' => 
+  array (
+    0 => 'HY5001',
+    1 => 'HYUNDAI!!',
+    2 => 'Hydro',
+    3 => 'Hydro PLUS',
+    4 => 'HYPER X BLADE',
+  ),
+  '@I ' => 
+  array (
+    0 => 'I 7520',
+  ),
+  '@I-' => 
+  array (
+    0 => 'i-Joy i-Call',
+    1 => 'i-Call 300',
+    2 => 'i-Call 300v2',
+    3 => 'i-Call 504',
+    4 => '(i-mobile|i-style|IQ)!!',
+  ),
+  '@I1' => 
+  array (
+    0 => 'I110',
+    1 => 'i1',
+  ),
+  '@I3' => 
+  array (
+    0 => 'i3000',
+  ),
+  '@I5' => 
+  array (
+    0 => 'i5300',
+    1 => 'i5350',
+  ),
+  '@I6' => 
+  array (
+    0 => 'i6000',
+  ),
+  '@I7' => 
+  array (
+    0 => 'I7500',
+  ),
+  '@I8' => 
+  array (
+    0 => 'i8400',
+    1 => 'i8450',
+    2 => 'i803w',
+    3 => 'I897',
+  ),
+  '@I9' => 
+  array (
+    0 => 'I9220',
+    1 => 'i9400',
+    2 => 'i9430',
+    3 => 'i9480',
+    4 => 'i9500',
+    5 => 'i9570',
+    6 => 'I9000',
+    7 => 'I9300 Galaxy SIII ',
+    8 => 'I9300',
+  ),
+  '@IB' => 
+  array (
+    0 => '(iBall )?Andi!!',
+    1 => 'iBall!!',
+    2 => '(Aura|iberry|AUXUS)!!',
+  ),
+  '@IC' => 
+  array (
+    0 => 'ICONIA!!',
+    1 => 'IconBit NetTab Thor Mini',
+  ),
+  '@ID' => 
+  array (
+    0 => '(Digma )?iD[jmnsx][DQ]?[0-9]*!!',
+    1 => 'IDEOS!!',
+    2 => 'IdeaPad A1',
+    3 => 'IdeaPadA10',
+    4 => 'Ideapad K1!',
+    5 => 'Ideapad S10-3T',
+    6 => '(Lenovo ?)?(IdeaTab ?)?[AB][0-9]{4,4}!!',
+    7 => '(Lenovo ?)?(IdeaTab ?)?[KSV][0-9]{4,4}!!',
+    8 => 'idea ?tv!!',
+  ),
+  '@IF' => 
+  array (
+    0 => 'ifive!!',
+  ),
+  '@IG' => 
+  array (
+    0 => 'IGGY',
+  ),
+  '@IL' => 
+  array (
+    0 => '(Ilium )?Avvio!!',
+    1 => 'ILT-MX100',
+    2 => '(Lanix )?(Ilium|llium)!!',
+  ),
+  '@IM' => 
+  array (
+    0 => 'imx50!',
+    1 => 'imx51!',
+    2 => 'imx53!',
+    3 => 'imx6q!',
+    4 => 'IMO!!',
+    5 => 'Im(Smart|PAD)!!',
+    6 => '(SKY )?IM[- ][A-Z][0-9]{3,3}!!',
+  ),
+  '@IN' => 
+  array (
+    0 => '(Explay|X-tremer|ActiveD|Informer|Surfer)!!',
+    1 => 'INSIGNIA 5',
+    2 => 'INSIGNIA 5X',
+    3 => 'Inspire HD',
+    4 => 'Incredible',
+    5 => 'Incredible 2',
+    6 => 'Incredible ?S!',
+    7 => 'Incredible ?2!',
+    8 => 'Incredible 4G LTE',
+    9 => 'Inspire 4G',
+    10 => 'INFOBAR!!',
+    11 => 'Infinix!!',
+    12 => 'IN[0-9]{3,3}!!',
+    13 => 'Infocus!!',
+    14 => 'INHON PAPILIO G1',
+    15 => 'intki E86',
+    16 => 'Innos!!',
+    17 => '(Intex )?Aqua!!',
+    18 => '(Intex )?Cloud!!',
+    19 => 'INTEX IRIS-II',
+    20 => 'INQ Cloud Touch',
+    21 => 'INQ Mayfair (EU)',
+    22 => '(iNote|itel)!!',
+    23 => 'Infinity',
+    24 => 'Internet TV',
+    25 => 'Internet TV Box',
+  ),
+  '@IO' => 
+  array (
+    0 => 'iOCEAN!!',
+  ),
+  '@IP' => 
+  array (
+    0 => 'iP977',
+    1 => 'IPRO i5S',
+  ),
+  '@IQ' => 
+  array (
+    0 => '(Fly )?IQ ?[0-9]{3,4}!!',
+    1 => 'iQ(Talk|Tab)!!',
+    2 => 'iQ7 8GB',
+    3 => '(i-mobile|i-style|IQ)!!',
+  ),
+  '@IR' => 
+  array (
+    0 => 'Iris!!',
+  ),
+  '@IS' => 
+  array (
+    0 => 'IS11CA',
+    1 => 'ISW?[0-9]{2,2}F!!',
+    2 => 'ISW[0-9]{2,2}HT!!',
+    3 => 'ISW11K',
+    4 => 'IS11LG',
+    5 => 'ISW11M',
+    6 => 'IS12M',
+    7 => 'IS11N',
+    8 => 'IS06',
+    9 => 'IS11PT',
+    10 => 'IS703C',
+    11 => 'IS801C',
+    12 => 'ISW11SC',
+    13 => 'IS0[0-9]!!',
+    14 => 'ISW?1[0-9]SH!!',
+    15 => 'IS[0-9]{2,2}S!!',
+    16 => 'IS04',
+    17 => 'IS11T',
+  ),
+  '@IT' => 
+  array (
+    0 => '(iNote|itel)!!',
+  ),
+  '@IV' => 
+  array (
+    0 => 'IVIO!!',
+  ),
+  '@IW' => 
+  array (
+    0 => 'iwoo i900',
+  ),
+  '@IX' => 
+  array (
+    0 => 'iX101T1',
+    1 => 'iX101T1-2G',
+    2 => 'iX101T1-XS',
+  ),
+  '@JA' => 
+  array (
+    0 => 'Jaguar3',
+    1 => 'Jaguar7',
+  ),
+  '@JC' => 
+  array (
+    0 => 'JC-S9220',
+    1 => 'JC-A[0-9]{3,3}!!',
+    2 => 'JC-KSP8000',
+  ),
+  '@JI' => 
+  array (
+    0 => '(JIAYU|JY-)!!',
+    1 => 'JIMMY',
+  ),
+  '@JJ' => 
+  array (
+    0 => 'JJ5S+',
+  ),
+  '@JO' => 
+  array (
+    0 => 'Jolla',
+    1 => 'Joy',
+  ),
+  '@JT' => 
+  array (
+    0 => 'JT SmartPC02',
+    1 => 'JT-Smart PC01',
+    2 => 'JT-H580VT',
+    3 => 'JT-H581VT',
+    4 => 'JT-B1',
+  ),
+  '@JX' => 
+  array (
+    0 => 'JXD!!',
+  ),
+  '@JY' => 
+  array (
+    0 => '(JIAYU|JY-)!!',
+  ),
+  '@K-' => 
+  array (
+    0 => 'K-?Touch!!',
+  ),
+  '@K0' => 
+  array (
+    0 => 'K00C',
+    1 => 'K010',
+    2 => 'K010E',
+    3 => 'K018',
+    4 => 'K014',
+    5 => 'K01B',
+    6 => 'K00G',
+    7 => 'K00E',
+    8 => 'K00Y',
+    9 => 'K00Z',
+    10 => 'K012',
+    11 => 'K019',
+    12 => 'K01F',
+    13 => 'K01N',
+    14 => 'K01Q',
+    15 => 'K016',
+    16 => 'K01E',
+    17 => 'K00X',
+    18 => 'K00R',
+    19 => 'K007',
+    20 => 'K013',
+    21 => 'K013C',
+    22 => 'K017',
+    23 => 'K01A',
+    24 => 'K012 2',
+    25 => 'K01U',
+    26 => 'K00S',
+    27 => 'K00U',
+    28 => 'K011',
+    29 => 'K015',
+    30 => 'K01H',
+    31 => 'K00L',
+    32 => 'K00F',
+    33 => 'K080',
+  ),
+  '@K1' => 
+  array (
+    0 => 'K11',
+    1 => 'K1',
+  ),
+  '@K3' => 
+  array (
+    0 => 'K3',
+    1 => 'K3 Note',
+  ),
+  '@K8' => 
+  array (
+    0 => '(CUBE ?)?(K8|U1|U2|U3|U5|U6|U8|U9)[0-9]?GT!!',
+  ),
+  '@K9' => 
+  array (
+    0 => 'K9 Smart 4G',
+  ),
+  '@KA' => 
+  array (
+    0 => 'Karbonn!!',
+    1 => '(Karbonn|Titanium)!!',
+    2 => '(KAZAM|Thunder|Tornado|Trooper)!!',
+    3 => '(KATBL|Agora)!!',
+  ),
+  '@KB' => 
+  array (
+    0 => 'KB901',
+  ),
+  '@KC' => 
+  array (
+    0 => 'KC-01',
+    1 => 'KC-S301AE',
+    2 => 'KC-S701',
+    3 => 'KCP01K',
+  ),
+  '@KE' => 
+  array (
+    0 => 'KENEKSI',
+  ),
+  '@KF' => 
+  array (
+    0 => 'KFOTE?!',
+    1 => 'KFTT',
+    2 => 'KFJW(I|A)!',
+    3 => 'KFJMWI',
+    4 => 'KFSOWI',
+    5 => 'KFTHW(I|A)!',
+    6 => 'KFAPW(I|A)!',
+    7 => 'KFARWI',
+    8 => 'KFASWI',
+    9 => 'KFSAW(I|A)!',
+    10 => 'KFFOWI',
+    11 => 'KFMEWI',
+    12 => 'KFTBWI',
+  ),
+  '@KI' => 
+  array (
+    0 => 'Kindle Fire',
+    1 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    2 => '(HW-|HUAWEI )?(CHC|TAG|KII)!!',
+    3 => 'KIOTO 793',
+    4 => 'KITE',
+    5 => '(ZTE )?Kis!!',
+  ),
+  '@KM' => 
+  array (
+    0 => '(EV|KM)-[ES][0-9]{3,3}!!',
+  ),
+  '@KN' => 
+  array (
+    0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+  ),
+  '@KO' => 
+  array (
+    0 => 'Konka Amber3',
+    1 => 'KOMU!!',
+    2 => 'KONKA!!',
+    3 => 'koobee-T550',
+    4 => 'Koobe!!',
+    5 => 'KORIDY H15',
+    6 => 'KORIDY H16',
+  ),
+  '@KP' => 
+  array (
+    0 => 'KPT!!',
+    1 => 'KPN!!',
+  ),
+  '@KS' => 
+  array (
+    0 => 'KSP8000',
+  ),
+  '@KU' => 
+  array (
+    0 => 'Kurio!!',
+    1 => 'KU9500',
+    2 => 'KUNO4',
+    3 => 'KUNO 4+',
+  ),
+  '@KY' => 
+  array (
+    0 => 'KYV33',
+    1 => 'Kyobo mirasol eReader',
+    2 => 'KYL[0-9]{2,2}!!',
+    3 => '(USCC-|KYOCERA-)?E[0-9]{4,4}!!',
+    4 => '(USCC-|KYOCERA-)?C[0-9]{4,4}!!',
+    5 => 'KY[FLTYV][0-9]{2,2}!!',
+    6 => 'Kyivstar!!',
+  ),
+  '@L' => 
+  array (
+    0 => '(Hisense )?(LED[0-9]{2,2}(G|K|L|EC|XT)[0-9]{2,3})!',
+  ),
+  '@L-' => 
+  array (
+    0 => 'L-0[0-9][A-Z]!!',
+  ),
+  '@L3' => 
+  array (
+    0 => 'L3',
+  ),
+  '@L9' => 
+  array (
+    0 => 'l97D',
+  ),
+  '@LA' => 
+  array (
+    0 => 'LA-!!',
+    1 => '(Lanix )?(Ilium|llium)!!',
+    2 => 'Lark!!',
+    3 => 'LAVA iris 351',
+    4 => 'LAVA iRIS 504q',
+    5 => 'Lava A89',
+    6 => 'LAVA S12',
+    7 => 'LAVA V5',
+    8 => 'LAP250U',
+    9 => 'LAP255U',
+    10 => 'LaVieTab!!',
+    11 => 'LA-I Dual core',
+    12 => 'LA-M3',
+    13 => 'LA1-L',
+    14 => 'LA2-E',
+    15 => 'LA2-E1',
+    16 => 'LA2-L',
+    17 => 'LA2-T',
+    18 => 'LA2-T1',
+    19 => 'LA2-W',
+    20 => 'LA2-W1',
+    21 => 'LA3-W',
+    22 => 'LA3S',
+    23 => 'LA5-W',
+  ),
+  '@LC' => 
+  array (
+    0 => '(AC|BC|LC|MT|RC|QS|VM|TS|OC)[0-9]{4,4}[A-Z]!!',
+    1 => 'LC-Ux30US',
+    2 => 'LC-[0-9]{2,2}((LE|UE)[0-9]{1,3}[A-Z])!',
+    3 => 'LC-((A|S|LX)[0-9]{1,3}[A-Z])!',
+    4 => 'LCD-((S|V|LX|UF)[0-9]{1,3}[A-Z])!',
+  ),
+  '@LD' => 
+  array (
+    0 => 'LDK-ICK v1.4',
+  ),
+  '@LE' => 
+  array (
+    0 => '(LE[0-9]{2,2}[BMU][0-9]{4,4}[A-Z]+)!',
+    1 => '(Hisense )?(LED[0-9]{2,2}(G|K|L|EC|XT)[0-9]{2,3})!',
+    2 => 'Legend',
+    3 => 'LEAGOOLG13',
+    4 => 'Le 1S',
+    5 => 'Le X500',
+    6 => 'Le X501',
+    7 => 'Le X506',
+    8 => 'Le X507',
+    9 => 'Le X509',
+    10 => 'Le X520',
+    11 => 'Le X522',
+    12 => 'Le X526',
+    13 => 'Le X527',
+    14 => 'Le X528',
+    15 => 'Le X620',
+    16 => 'Le X621',
+    17 => 'Le X625',
+    18 => 'LEX720',
+    19 => 'Le X820',
+    20 => 'Le X821',
+    21 => 'Le X822',
+    22 => 'Le X829',
+    23 => 'Le X829M',
+    24 => 'Le X920',
+    25 => 'leepoo!!',
+    26 => 'LEMON P7',
+    27 => 'Lemon S3',
+    28 => 'Lemon S8',
+    29 => 'Lenco!!',
+    30 => 'LENCM900HZ',
+    31 => 'Lenovo A1-32AB0',
+    32 => 'Lenovo A1-32AJ0',
+    33 => 'Lenovo IdeaPad Yoga 11S',
+    34 => 'Lenovo IdeaPad Yoga 13',
+    35 => '(Lenovo ?)?(IdeaTab ?)?[AB][0-9]{4,4}!!',
+    36 => 'Lenovo YB1-X90L',
+    37 => 'Lenovo YT3-X50F',
+    38 => 'Lenovo YT3-X90L',
+    39 => '(Lenovo )?(Tab ?)?(2 ?)?[AS](7|8|10)!!',
+    40 => '(Lenovo ?)?(IdeaTab ?)?[KSV][0-9]{4,4}!!',
+    41 => 'Lenovo Pad A4',
+    42 => 'Lenovo',
+    43 => 'lepad 001b',
+    44 => 'lepad 001n',
+    45 => '(Lenovo |Lephone )?3GC101!',
+    46 => '(Lenovo |Lephone )?3GW100!',
+    47 => '(Lenovo |Lephone )?3GW101!',
+    48 => '(Lenovo )?S1[- ]37AH0!',
+    49 => '(Lenovo )?S2[- ]38A(H0|T0)!',
+    50 => 'Lenovo!!',
+    51 => 'LenovoTV 40S9',
+    52 => 'LenovoTV 50S52',
+    53 => '(BLF-)?lephone!!',
+    54 => 'Le Pan TC802A',
+    55 => 'Le Pan TC1010',
+    56 => 'Le Pan TC1020',
+    57 => 'LePanII',
+    58 => 'Le Pan S',
+    59 => 'LENNY',
+    60 => 'LENNY2',
+  ),
+  '@LG' => 
+  array (
+    0 => 'LGE-lap crespo',
+    1 => 'LGE-lap maguro',
+    2 => 'LGE-maguro cappuccino',
+    3 => 'LGE-lap mako',
+    4 => 'LG-Nexus5',
+    5 => 'LG-Watch Urbane',
+    6 => 'LG-AN160',
+    7 => 'LG-?AS[0-9]{3,3}!!',
+    8 => 'LG-?C[0-9]{3,3}!!',
+    9 => 'LG-CX670',
+    10 => 'LG-?D[0-9]{3,3}!!',
+    11 => 'LG-DS1203',
+    12 => 'LG-?E[0-9]{3,3}!!',
+    13 => 'LG-F[0-9]{3,3}!!',
+    14 => 'LG-GT540!',
+    15 => 'LG-GW620!',
+    16 => 'LG-H[0-9]{3,3}!!',
+    17 => 'LG-K[0-9]{3,3}!!',
+    18 => 'LG-KH5200',
+    19 => 'LG-KS1024',
+    20 => 'LG-KU[0-9]{4,4}!!',
+    21 => 'LG-?L[0-9]{2,3}[A-Z]!!',
+    22 => 'LG-LG[0-9]{3,3}!!',
+    23 => 'LGLK430',
+    24 => 'LG-?LS[0-9]{3,3}!!',
+    25 => 'LG-LU[0-9]{4,4}!!',
+    26 => 'LG-LW690',
+    27 => 'LG-LW770',
+    28 => 'LG-M[0-9]{3,3}!!',
+    29 => 'LG-?MS[0-9]{3,3}!!',
+    30 => 'LG-P[0-9]{3,3}!!',
+    31 => 'LG-SU[0-9]{3,3}!!',
+    32 => 'LG-TP260',
+    33 => 'LG-SU-760',
+    34 => 'LGUK410',
+    35 => 'LG-UK495',
+    36 => 'LGUK750',
+    37 => 'LGUK932',
+    38 => 'LG-UN350',
+    39 => 'LG-?US[0-9]{3,3}!!',
+    40 => 'LG-V[0-9]{3,3}!!',
+    41 => 'LG-VK[0-9]{3,3}!!',
+    42 => 'LG-VN[0-9]{3,3}!!',
+    43 => 'LG-VM[0-9]{3,3}!!',
+    44 => 'LG-VS[0-9]{3,3}!!',
+    45 => 'LG-X[0-9]{3,3}!!',
+    46 => 'lge-F160!',
+    47 => 'LGE-E988!',
+    48 => 'lgp-970',
+    49 => 'LG[LSTV][0-9]{2,2}!!',
+    50 => 'LG!!',
+    51 => 'LG-Google TV!!',
+    52 => 'LG-ANDROID MINI BOX',
+    53 => 'LG-P999',
+    54 => 'LG-E739',
+    55 => 'LG-C800',
+  ),
+  '@LI' => 
+  array (
+    0 => 'Liquid!!',
+    1 => '(BLU|DASH|LIFE|NEO|STUDIO|VIVO)!!',
+    2 => 'Liberty',
+    3 => '(MEDION|(MD )?LIFETAB)!!',
+    4 => 'Life',
+    5 => 'Liberty Tab G100',
+    6 => 'Live ?With ?Walkman!',
+    7 => 'Light Tab',
+    8 => 'Light Tab 2',
+    9 => 'Light Tab 2W',
+  ),
+  '@LL' => 
+  array (
+    0 => '(Lanix )?(Ilium|llium)!!',
+  ),
+  '@LO' => 
+  array (
+    0 => 'LogicPD Zoom2',
+    1 => '(HUAWEI )?(CRR|LON|MATE|MHA|MT1|MT2|MT7|M200|NXT|Z100)!!',
+    2 => 'Loox',
+  ),
+  '@LS' => 
+  array (
+    0 => 'LS670',
+    1 => 'LS740',
+    2 => 'LS-4001',
+    3 => 'LS-4002',
+    4 => 'LS-4003',
+    5 => 'LS-4004',
+    6 => 'LS-4005',
+    7 => 'LS-4006',
+    8 => 'LS-4008',
+    9 => 'LS-4503',
+    10 => 'LS-4505',
+    11 => 'LS-5002',
+    12 => 'LS-5004',
+    13 => 'LS-5005',
+    14 => 'LS-5006',
+    15 => 'LS-5007',
+    16 => 'LS-5008',
+    17 => 'LS-5009',
+    18 => 'LS-5010',
+    19 => 'LS-5013',
+    20 => 'LS-5014',
+    21 => 'LS-5015',
+    22 => 'LS-5016',
+    23 => 'LS-5017',
+    24 => 'LS-5018',
+    25 => 'LS-5020',
+    26 => 'LS-5021',
+    27 => 'LS-5201',
+    28 => 'LS-5501',
+    29 => 'LS-5502',
+    30 => 'LS-5503',
+    31 => 'LS-5504',
+    32 => 'LS-5505',
+    33 => 'LS-5506',
+    34 => 'LS-5507',
+    35 => 'LS-6001',
+  ),
+  '@LT' => 
+  array (
+    0 => 'LT[0-9]{4,4}!!',
+    1 => 'LTB-HS',
+    2 => 'LT-TLA',
+    3 => 'LT-NA7',
+    4 => 'LT-NA7F',
+    5 => '(SNM\\-)?LT[0-9]{2,2}[a-z]?!!',
+  ),
+  '@LU' => 
+  array (
+    0 => 'LUXURY',
+    1 => 'LUXURY 3',
+    2 => 'LUXURY 4',
+    3 => 'LUXURY 5',
+    4 => '(HW-|HUAWEI )?(LUA|CUN|SCC|CAM|LYO)!!',
+    5 => 'Lucky Ultra Sonic U8650',
+    6 => 'LU2300',
+    7 => 'Lumia800',
+    8 => 'Lumia 900',
+    9 => 'Luna TAB07-920N',
+    10 => 'Luna TAB07-100',
+    11 => 'Luna TAB07-101',
+    12 => 'Luna TAB274',
+    13 => 'Luna TAB374',
+    14 => 'Luna TAB474',
+    15 => 'Luna TAB10-150',
+    16 => 'Luno',
+  ),
+  '@LY' => 
+  array (
+    0 => '(HW-|HUAWEI )?(LUA|CUN|SCC|CAM|LYO)!!',
+    1 => 'LYF LS-4006',
+    2 => 'LYF LS-5009',
+  ),
+  '@M' => 
+  array (
+    0 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!',
+  ),
+  '@M ' => 
+  array (
+    0 => 'M POP 5020A',
+    1 => 'M POP',
+  ),
+  '@M-' => 
+  array (
+    0 => 'M-270',
+    1 => 'M-PAD N8',
+  ),
+  '@M0' => 
+  array (
+    0 => 'M01',
+    1 => 'M02',
+    2 => 'M01T',
+    3 => 'M009F',
+    4 => 'M030',
+    5 => 'M031',
+    6 => 'M032',
+    7 => 'M040',
+    8 => 'M045',
+  ),
+  '@M1' => 
+  array (
+    0 => 'M19',
+    1 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    2 => 'M1050S',
+    3 => 'm1 note',
+    4 => 'M1001',
+    5 => 'M12',
+  ),
+  '@M2' => 
+  array (
+    0 => '(HUAWEI )?(CRR|LON|MATE|MHA|MT1|MT2|MT7|M200|NXT|Z100)!!',
+    1 => 'M210',
+    2 => 'm2 note',
+  ),
+  '@M3' => 
+  array (
+    0 => 'M3 Enjoy TV Box',
+    1 => 'M3-2200',
+    2 => 'M305',
+    3 => 'M350',
+    4 => 'M363',
+    5 => 'M310',
+    6 => 'M370i',
+    7 => 'M351',
+    8 => 'M353',
+    9 => 'M355',
+    10 => 'M356',
+  ),
+  '@M4' => 
+  array (
+    0 => 'M4301',
+    1 => 'M470BSA',
+    2 => 'M470BSE',
+    3 => 'M4(TEL)? SS[0-9]{3,4}!!',
+  ),
+  '@M5' => 
+  array (
+    0 => 'M555',
+    1 => 'M532',
+    2 => 'M571C',
+    3 => 'M578C',
+  ),
+  '@M6' => 
+  array (
+    0 => 'M650',
+    1 => 'M660',
+    2 => 'M6',
+  ),
+  '@M7' => 
+  array (
+    0 => 'M701C',
+    1 => 'M702',
+    2 => 'M758A',
+    3 => 'M7CDTU',
+    4 => 'M70',
+    5 => 'M785',
+    6 => 'M726HC',
+    7 => 'M70014',
+  ),
+  '@M8' => 
+  array (
+    0 => 'M801',
+    1 => 'M860',
+    2 => 'M865',
+    3 => 'M886',
+    4 => 'M8',
+    5 => 'M8 pro',
+  ),
+  '@M9' => 
+  array (
+    0 => 'M975',
+    1 => 'M9300',
+    2 => 'M9',
+    3 => 'M9-unlocked',
+    4 => 'M9 pro',
+    5 => 'M9000',
+  ),
+  '@MA' => 
+  array (
+    0 => 'Maguro',
+    1 => 'Mako',
+    2 => 'manta',
+    3 => '(bq|Aquaris|Edison|Maxwell)!!',
+    4 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!',
+    5 => '(HUAWEI )?(CRR|LON|MATE|MHA|MT1|MT2|MT7|M200|NXT|Z100)!!',
+    6 => 'Malata!!',
+    7 => 'Masstel!!',
+    8 => 'MASTONE!!',
+    9 => 'Maxtron!!',
+    10 => 'magi',
+    11 => 'MagicBox',
+  ),
+  '@MB' => 
+  array (
+    0 => 'MBX DVBT reference board (c03ref)',
+    1 => 'MBX Dongle board!',
+    2 => 'MBX reference board!',
+    3 => '(NMP|MBR|XDK|XDS|XMP)\\-!!',
+    4 => 'MBS BEAN 454',
+    5 => 'MB[0-9]{3,3}!!',
+  ),
+  '@MC' => 
+  array (
+    0 => 'MC002',
+    1 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!',
+    2 => 'MC32N0',
+    3 => 'MC40N0',
+    4 => 'MC67NA',
+  ),
+  '@MD' => 
+  array (
+    0 => '(MEDION|(MD )?LIFETAB)!!',
+    1 => 'MD-[0-9]{4,4}!!',
+  ),
+  '@ME' => 
+  array (
+    0 => 'ME102A',
+    1 => 'ME180A',
+    2 => 'ME171',
+    3 => 'ME172V',
+    4 => 'ME173X',
+    5 => 'ME301T',
+    6 => 'ME302C',
+    7 => 'ME302KL',
+    8 => 'ME370T',
+    9 => 'ME371MG',
+    10 => 'ME372CG',
+    11 => 'ME372CL-FF',
+    12 => 'ME560CG',
+    13 => 'ME581CL',
+    14 => 'MeMO Pad 7',
+    15 => 'MediaPad!!',
+    16 => 'Mediacom 810C',
+    17 => '(MEDION|(MD )?LIFETAB)!!',
+    18 => 'MEEG!!',
+    19 => 'meizu m1note',
+    20 => 'MEIZU M5',
+    21 => 'MEIZU M9',
+    22 => 'MEIZU MX',
+    23 => '(MEO )?Smart A!!',
+    24 => 'MEU AN!!',
+    25 => 'ME[0-9]{3,3}!!',
+    26 => 'MEM02',
+    27 => 'MegaFon SP-AI',
+    28 => 'MegaFon SP-A3',
+    29 => 'MegaFon SP-A5',
+    30 => 'MegaFon SP-A10',
+    31 => 'MegaFon V9',
+    32 => 'MegaFon V9+',
+    33 => 'MegaFon SIM+',
+    34 => 'MegaFon Login 3',
+  ),
+  '@MF' => 
+  array (
+    0 => 'mfld (dv10|dv20|gi|lw00|pr2|pr3)!',
+    1 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!',
+    2 => 'MFC[0-9]!!',
+  ),
+  '@MH' => 
+  array (
+    0 => 'MH350',
+    1 => '(HUAWEI )?(CRR|LON|MATE|MHA|MT1|MT2|MT7|M200|NXT|Z100)!!',
+  ),
+  '@MI' => 
+  array (
+    0 => 'MID1040C',
+    1 => 'MID[0-9]{4,4}!!',
+    2 => 'Mini 3iG',
+    3 => 'MINT-DG330',
+    4 => 'MID1018',
+    5 => 'MID1028',
+    6 => 'MID Ser(ai|ia)ls!',
+    7 => 'MIUI.us Sensation 4G',
+    8 => 'MID[0-9]!!',
+    9 => 'Mi-A402',
+    10 => 'Micromax!!',
+    11 => 'Mio!!',
+    12 => 'MITO!!',
+    13 => 'MIZ Z2',
+    14 => 'Milestone XT711',
+    15 => 'Milestone XT720',
+    16 => 'Milestone',
+    17 => 'Milestone X',
+    18 => 'Milestone X2',
+    19 => 'Milestone MAXX',
+    20 => 'MILESTONE3',
+    21 => 'MID7C',
+    22 => 'MID43C',
+    23 => 'MID74C',
+    24 => 'MID77C',
+    25 => 'MID82C',
+    26 => 'MID84C',
+    27 => 'MID102C',
+    28 => 'MID103C',
+    29 => 'MID104C',
+    30 => 'MID114C',
+    31 => 'MID[C012]!!',
+    32 => 'Mi438S',
+    33 => '(CSL[- ])?(Spice[- ]?)?Mi(-| )?[0-9]{3,3}!!',
+    34 => 'miTab!!',
+    35 => 'MI-ONE',
+    36 => 'MI-ONEC1',
+    37 => 'MI-ONE C1',
+    38 => 'MI-ONE Plus!',
+    39 => 'mione plus',
+    40 => 'MI ONE plus',
+    41 => 'MI-ONEPlus',
+    42 => 'MI 1S',
+    43 => 'MI 1SC',
+    44 => 'MI1/1s',
+    45 => 'MI-TWO',
+    46 => 'MI-TWOPlus',
+    47 => 'MI2',
+    48 => 'MI 2',
+    49 => 'MI 2C',
+    50 => 'MI 2A!',
+    51 => 'MI2A',
+    52 => 'MI 2S',
+    53 => 'MI 2SC',
+    54 => 'MI 2/2S',
+    55 => 'Mi3',
+    56 => 'MI-Three',
+    57 => 'MI-ThreePlus',
+    58 => 'MI 3',
+    59 => 'MI 3C',
+    60 => 'MI 3W',
+    61 => 'Mi3W',
+    62 => 'MI 4',
+    63 => 'MI 4LTE',
+    64 => 'MI 4C',
+    65 => 'MI 4W',
+    66 => 'Mi-4c',
+    67 => 'Mi 4i',
+    68 => 'MI 5',
+    69 => 'MI 5s',
+    70 => 'MI 5s Plus',
+    71 => 'MI MAX',
+    72 => 'MI NOTE LTE',
+    73 => 'Mi Note 2',
+    74 => 'MI NOTE Pro',
+    75 => 'MI PAD',
+    76 => 'MI PAD 3',
+    77 => 'MiBOX iCNTV',
+    78 => 'MiBOX1S',
+    79 => 'MiBOX2',
+    80 => '(ZTE )?(Grand|Mimosa)!!',
+  ),
+  '@MK' => 
+  array (
+    0 => 'MK808',
+    1 => 'MK808B',
+    2 => 'MK809',
+    3 => 'MK809B',
+    4 => 'MK809IV',
+    5 => 'MK818B',
+    6 => 'MK908',
+    7 => 'MK908II',
+    8 => 'MK16(a|i|$)!',
+  ),
+  '@ML' => 
+  array (
+    0 => '(HW-|HUAWEI )?MLA-(L01|L03|L11|L12)!',
+    1 => '(HW-|HUAWEI )?MLA-(AL00|AL10)!',
+    2 => '(HW-|HUAWEI )?MLA-(TL00|TL10|UL00)!',
+    3 => 'MLLED!!',
+  ),
+  '@MO' => 
+  array (
+    0 => 'Moto E',
+    1 => 'Moto G',
+    2 => 'Moto G LTE',
+    3 => 'Moto G 2014',
+    4 => 'Moto G 2014 LTE',
+    5 => 'Moto G (2014)',
+    6 => 'Moto X',
+    7 => 'Moto 360',
+    8 => 'Mobile Sosh',
+    9 => 'Monterra',
+    10 => 'Mobiistar!!',
+    11 => 'MOCHE SMART A16',
+    12 => '(MODECOM )?FreeTAB!!',
+    13 => 'MOGU!!',
+    14 => 'moii!!',
+    15 => 'MORAL N01',
+    16 => 'Moto Droid',
+    17 => 'Motorola Pro XT610',
+    18 => 'Motorola Milestone MAXX',
+    19 => 'Motorola Backflip Me600',
+    20 => 'Moto ME860',
+    21 => '(Moto)?E2$!',
+    22 => '(Moto)?E2\\(4G-LTE\\)$!',
+    23 => 'Moto E (4) Plus',
+    24 => '(Moto)?G3$!',
+    25 => '(Moto)?G3-TE$!',
+    26 => 'MOTOROLA MOTOG',
+    27 => 'Moto G Play',
+    28 => 'Moto G4',
+    29 => 'Moto G (4)',
+    30 => 'Moto G4 Plus',
+    31 => 'Moto G (5)',
+    32 => 'Moto G (5) Plus',
+    33 => 'Moto Backflip',
+    34 => 'MOTOROLA XOOM MZ606',
+    35 => 'MOTOROLA RAZR',
+    36 => 'MOTWX435KT',
+    37 => '(PLOYER-)?MOMO!!',
+    38 => 'MOB-5045',
+    39 => 'Mobii 7',
+    40 => 'MoFing',
+    41 => 'Movistar Express',
+    42 => 'Movistar Link',
+    43 => 'Movistar Motion',
+    44 => 'Movistar Prime',
+    45 => 'MOVE',
+  ),
+  '@MP' => 
+  array (
+    0 => 'MP[0-9]{3,3}C!!',
+    1 => 'MP717',
+    2 => 'MP843',
+    3 => 'MP888',
+    4 => 'MP959',
+    5 => 'MP969',
+    6 => 'MP1010',
+    7 => 'MP7007',
+    8 => 'MPDC100 BT',
+    9 => 'MPDC110 BT IPS',
+    10 => 'MPDC112 BT IPS',
+    11 => 'MPDC8 BT',
+    12 => 'MPDC88 BT IPS',
+    13 => 'MPDC706',
+    14 => 'MPDC903',
+    15 => 'MPQC704 HD',
+    16 => 'MPQC784 IPS',
+    17 => 'MPQC804HD',
+    18 => 'MPQC1010',
+  ),
+  '@MS' => 
+  array (
+    0 => 'MStar Amber3',
+    1 => 'MSM',
+    2 => 'msm(7227|7627)!',
+    3 => 'msm7630!',
+    4 => 'msm8660!',
+    5 => 'msm(8x25|8625|8960)!',
+    6 => 'msm8x30!',
+    7 => 'msm8610!',
+    8 => 'msm8909!',
+    9 => 'msm(8226|8228)!',
+    10 => 'MSM8926!',
+    11 => 'msm8916!',
+    12 => 'msm8952!',
+    13 => 'msm8974!',
+    14 => 'MSM8992!',
+    15 => 'msm8994!',
+    16 => 'MS840 4G',
+    17 => 'MS3B',
+    18 => 'MS4A',
+    19 => 'MS3A',
+  ),
+  '@MT' => 
+  array (
+    0 => 'mt5396!',
+    1 => 'mt5399!',
+    2 => 'mt5861!',
+    3 => 'mt5880!',
+    4 => 'mt5882!',
+    5 => 'mt5890!',
+    6 => 'mt6515!',
+    7 => 'MTK6515',
+    8 => 'mt6517!',
+    9 => 'mt6571!',
+    10 => 'mt6572!',
+    11 => 'mt6575!',
+    12 => 'mt6577!',
+    13 => 'mt6582!',
+    14 => 'mt6589!',
+    15 => 'MTK-MT6589',
+    16 => 'MTK6589!',
+    17 => 'mt6592!',
+    18 => 'MTK-MT6592',
+    19 => 'MTK6592',
+    20 => 'mt6595!',
+    21 => 'mt6599!',
+    22 => 'mt8125!',
+    23 => 'mt8127!',
+    24 => 'mt8135!',
+    25 => 'MTK--8312',
+    26 => 'mt8377!',
+    27 => 'mt8389!',
+    28 => 'mt8580!',
+    29 => 'mt8658!',
+    30 => '(AC|BC|LC|MT|RC|QS|VM|TS|OC)[0-9]{4,4}[A-Z]!!',
+    31 => '(HUAWEI )?(CRR|LON|MATE|MHA|MT1|MT2|MT7|M200|NXT|Z100)!!',
+    32 => 'MTC Android',
+    33 => 'MT791',
+    34 => 'MT70[0-9]{2,2}!!',
+    35 => 'MTK6516',
+    36 => 'MT[0-9]{3,3}!!',
+    37 => 'MTS-SP100',
+    38 => 'MTS-SP101',
+    39 => 'MT[0-9]{2,2}[a-z]!!',
+    40 => 'MT7A',
+    41 => 'MTC!!',
+  ),
+  '@MU' => 
+  array (
+    0 => 'Multilaser Diamond',
+    1 => 'Multilaser Orion',
+    2 => 'Multilaser Oxy',
+    3 => 'Multilaser Titanium',
+  ),
+  '@MW' => 
+  array (
+    0 => 'MWND1',
+    1 => 'mw07',
+    2 => 'MW0710',
+    3 => 'MW0711',
+    4 => 'MW0712',
+    5 => 'MW0731',
+    6 => 'MW0731PLUS',
+    7 => 'MW0733',
+    8 => 'MW0811',
+    9 => 'MW0812',
+    10 => 'MW0812 V2.0',
+    11 => 'MW0821',
+    12 => 'MW0821 V2.0',
+    13 => 'MW0821+',
+    14 => 'MW0831',
+    15 => 'MW0831Plus',
+    16 => 'MW0922',
+    17 => 'MW0931',
+    18 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!',
+    19 => 'MW1031',
+  ),
+  '@MX' => 
+  array (
+    0 => 'MX Enjoy TV BOX',
+    1 => 'MX2',
+    2 => 'MX4',
+    3 => 'MX4 Pro',
+  ),
+  '@MY' => 
+  array (
+    0 => 'MyPhone A818g Duo',
+    1 => 'MyPhone A818 Slim Duo',
+    2 => 'MyPhone A848 Duo',
+    3 => 'MyPhone A848i Duo',
+    4 => 'MyPhone A848g Duo',
+    5 => 'MyPhone A888',
+    6 => 'MyPhone A888 Duo',
+    7 => 'My|Phone A888 Duo',
+    8 => 'MyPhone A919 Duo',
+    9 => 'MyPhone A919 3D Duo',
+    10 => 'MyPhone A919i',
+    11 => 'MyPhone A919i Duo',
+    12 => 'MyPhone Agua Cyclone',
+    13 => 'MyPhone Agua Hail',
+    14 => 'MyPhone Agua Iceberg',
+    15 => 'MyPhone Agua Iceberg Mini',
+    16 => 'MyPhone Agua Iceberg Slim',
+    17 => 'MyPhone Agua Infinity',
+    18 => 'MyPhone Agua Ocean Lite',
+    19 => 'MyPhone Agua Ocean Mini',
+    20 => 'MyPhone Agua Ocean Pro',
+    21 => 'MyPhone Agua Rain 2G',
+    22 => 'MyPhone Agua Rain 3G',
+    23 => 'MyPhone Agua Rio',
+    24 => 'MyPhone Agua Rio Fun',
+    25 => 'MyPhone Agua Rio Lite',
+    26 => 'MyPhone Agua Storm',
+    27 => 'MyPhone Agua Vortex',
+    28 => 'myPhone C Smart',
+    29 => 'myPhone Cube',
+    30 => 'myPhone Cube 16GB',
+    31 => 'myPhone Duosmart',
+    32 => 'myPhone FUN 2',
+    33 => 'myPhone Funky',
+    34 => 'myPhone Hammer',
+    35 => 'myPhone INFINITY 3G',
+    36 => 'myPhone NEXT',
+    37 => 'myPhone NEXTS',
+    38 => 'myPhone NEXT S',
+    39 => 'myPhone Smart',
+    40 => 'myPhone S-line',
+    41 => 'MyPhone Rio Craze',
+    42 => 'MyPhone Rio Grande',
+    43 => 'MyPhone Rio Junior TV',
+    44 => 'MyPhone Rio 2',
+    45 => 'MyPhone Rio 2 Fun',
+    46 => 'MyPhone UNO',
+    47 => 'MyPhone Xperia Rain 3G',
+    48 => 'Myphone MY25',
+    49 => 'MyPhone MY26',
+    50 => 'MyPhone MY28S',
+    51 => 'MyPad 2',
+    52 => 'MyPad 750HD',
+    53 => 'MyPad 1000 HD',
+    54 => 'MY ?SAGA!!',
+    55 => 'My ?Touch ?4G$!',
+    56 => 'myTouch 4G Slide',
+    57 => 'myTouch Slide 4G',
+  ),
+  '@MZ' => 
+  array (
+    0 => 'MZ-m2 note',
+    1 => 'MZ-M571C',
+    2 => 'MZ-MX4',
+    3 => 'MZ[0-9]{3,3}!!',
+  ),
+  '@N-' => 
+  array (
+    0 => 'N-0[0-9][A-Z]!!',
+  ),
+  '@N1' => 
+  array (
+    0 => 'N1',
+    1 => 'N12',
+    2 => 'N12R',
+    3 => 'N101 DUAL CORE!',
+  ),
+  '@N2' => 
+  array (
+    0 => 'N2T',
+  ),
+  '@N3' => 
+  array (
+    0 => 'N3-2200',
+    1 => 'N320',
+  ),
+  '@N5' => 
+  array (
+    0 => 'N51(10|11|16|17)!',
+    1 => 'N52(06|07|09)!',
+    2 => 'N5PRO2jingying',
+    3 => 'N50',
+    4 => 'N50DT!',
+    5 => 'N50GT',
+    6 => 'N50GT A',
+  ),
+  '@N6' => 
+  array (
+    0 => 'N612',
+    1 => 'N6',
+  ),
+  '@N7' => 
+  array (
+    0 => 'N700',
+    1 => 'N710',
+    2 => 'N70',
+    3 => 'N70 3G',
+    4 => 'N70 C',
+    5 => 'N70DC',
+    6 => 'N70-S',
+    7 => 'N70HD',
+    8 => 'N70 DUAL CORE',
+    9 => 'N70DC-S',
+    10 => 'N70DC-T',
+  ),
+  '@N8' => 
+  array (
+    0 => 'N8730-411',
+    1 => 'N8730-41101',
+    2 => 'N8730-41102',
+    3 => 'N80($| from moage.com)!',
+    4 => 'N80DC',
+    5 => 'N80IPS',
+    6 => 'N861',
+  ),
+  '@N9' => 
+  array (
+    0 => 'N930',
+    1 => 'N9600',
+    2 => 'N90',
+    3 => 'N90 DUAL CORE!',
+    4 => 'N90FHDRK',
+    5 => 'N918St',
+  ),
+  '@NA' => 
+  array (
+    0 => 'NABI!!',
+    1 => 'NaviPad TM-7055HD 3G',
+    2 => 'NaviPad TM-7855 3G',
+    3 => 'NaviPad TM-7858 3G (revision 1)',
+    4 => 'NATCOM N8302',
+  ),
+  '@NB' => 
+  array (
+    0 => 'NB036',
+    1 => 'NBX-T7013N',
+    2 => 'NBX-T7023N',
+  ),
+  '@NC' => 
+  array (
+    0 => '(HW-|HUAWEI )?(TIT|TAG|NCE)!!',
+  ),
+  '@NE' => 
+  array (
+    0 => '(HTC )?Nexus ?One!',
+    1 => '(Google )?Nexus S!',
+    2 => '(Google )?Nexus ?4!',
+    3 => 'Nexus 5X',
+    4 => '(Google )?Nexus ?5!',
+    5 => 'Nexus 6P',
+    6 => '(Google )?Nexus ?6P!',
+    7 => '(Google )?Nexus ?6!',
+    8 => '(Google )?Nexus ?7 2013!',
+    9 => '(Google )?Nexus ?7!',
+    10 => '(Google )?Nexus ?9!',
+    11 => '(Google )?Nexus ?10!',
+    12 => 'Nexus Player',
+    13 => 'NEO-G4',
+    14 => 'NEO-G4-108A',
+    15 => 'NEO-G4 a',
+    16 => 'NEO-U9-H',
+    17 => 'NEO-X5',
+    18 => 'NEO X5',
+    19 => 'Neo-X5-B',
+    20 => 'NEO-X5-116A',
+    21 => 'NEO-X5-mini',
+    22 => 'NEO X5 mini',
+    23 => 'NEO-X6',
+    24 => 'NEO-X7-216A',
+    25 => 'NEO-X7-mini',
+    26 => 'NEO-X8',
+    27 => 'NEO-X8-H',
+    28 => 'NEO-X8H-PLUS',
+    29 => 'Neon',
+    30 => '(BLU|DASH|LIFE|NEO|STUDIO|VIVO)!!',
+    31 => 'NexusHD2',
+    32 => 'Nexus HD2',
+    33 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    34 => 'Neon7',
+    35 => 'Neon9',
+    36 => '(NetTab|NT-)!!',
+    37 => 'Newman K1',
+    38 => 'NewmanK1',
+    39 => 'Newman K2',
+    40 => 'Newman N1',
+    41 => 'Newman N2!',
+    42 => 'Newman-N2!',
+    43 => 'Newpad',
+    44 => 'Newpad-K97',
+    45 => 'Newpad-NP900',
+    46 => 'Newpad P9',
+    47 => 'Newpad P72',
+    48 => 'Newsmy P72',
+    49 => 'Newsmy P72-C',
+    50 => 'Newsmy T3',
+    51 => 'Newsmy T7II',
+    52 => 'NEC-STR',
+    53 => 'NEC-0912',
+    54 => 'NEC-101S',
+    55 => 'NECTEL-101S',
+    56 => 'NEC-101T',
+    57 => 'NEC-101TH',
+    58 => 'NEC-102',
+    59 => 'NE-103T',
+    60 => 'NEC909e',
+    61 => 'NE-202',
+    62 => 'NE-201A1A',
+    63 => 'NEC-NE-201A1A',
+    64 => 'NEC-NEC-NE-201A1A',
+    65 => 'NEC PC-TE508S1',
+    66 => 'neken!!',
+    67 => 'NEO!!',
+    68 => '(Nexian )?NX-A[0-9]{3,3}!!',
+    69 => 'Nextbook Premium 7',
+    70 => 'Next7C12!',
+    71 => 'Next7D12!',
+    72 => 'Next7P12!',
+    73 => 'Next7Q12!',
+    74 => 'Next7P',
+    75 => 'Next7S',
+    76 => 'Nextbook Premium 7 SE',
+    77 => 'NEXT8P',
+    78 => 'Next8P11',
+    79 => 'Next8P12',
+    80 => 'Next9P',
+    81 => 'Next10P12',
+    82 => 'NEXT',
+    83 => 'New Andromax-i',
+    84 => 'Neo V',
+    85 => 'NEBULA6.9',
+  ),
+  '@NG' => 
+  array (
+    0 => 'NGM Black Hole',
+    1 => 'NGM Dynamic Racing 2',
+    2 => 'NGM Dynamic Racing 3',
+    3 => 'NGM Dynamic Star',
+    4 => 'NGM Dynamic Stylo',
+    5 => 'NGM Forward Infinity',
+    6 => 'NGM Forward Racing HD',
+    7 => 'NGM Forward Young',
+    8 => 'NGM Harley',
+    9 => 'NGM Orion',
+    10 => 'NGM Spirit',
+    11 => 'NGM Time',
+    12 => 'NGM Vanity Smart',
+    13 => 'NGM Action',
+    14 => 'NGM Legend',
+    15 => 'NGM-Legend/Legend',
+    16 => 'NGM Legend2',
+    17 => 'NGM LegendXL',
+    18 => 'NGM Miracle',
+    19 => 'NGM P0laris',
+    20 => 'NGM Wilco',
+    21 => 'NGM WINN',
+  ),
+  '@NI' => 
+  array (
+    0 => 'NITROGEN6X',
+    1 => 'NID 7010',
+    2 => 'Nibiru H1',
+    3 => 'nine i7400',
+  ),
+  '@NM' => 
+  array (
+    0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    1 => '(NMP|MBR|XDK|XDS|XMP)\\-!!',
+  ),
+  '@NO' => 
+  array (
+    0 => 'Novo7',
+    1 => 'Novo7 -?Aurora!',
+    2 => 'novo Aurora',
+    3 => 'Novo 7 Aurora',
+    4 => 'Novo7 Advanced',
+    5 => 'Novo7Advanced!',
+    6 => 'Novo7 Advanced2',
+    7 => 'Novo7 Basic',
+    8 => 'NovoCrystal',
+    9 => 'Novo 7 Crystal!',
+    10 => 'Novo7 ELF',
+    11 => 'Novo7 Fire',
+    12 => 'Novo7 Flame',
+    13 => 'Novo7 Grace',
+    14 => 'Novo7 Legend',
+    15 => 'novo7Legend!',
+    16 => 'NOVO7 Mars',
+    17 => 'Novo7 PALADIN',
+    18 => 'Novo7 Rainbow',
+    19 => 'Novo7 -Rainbow',
+    20 => 'NOVO7 Tornados',
+    21 => 'Novo7 Venus',
+    22 => 'Novo 7 Venus',
+    23 => 'Novo7 Venus QuadCore',
+    24 => 'Novo 7 Venus QuadCore',
+    25 => 'Novo8 Advanced',
+    26 => 'Novo8 Discover Quadcore',
+    27 => 'Novo8 Disover Quadcore',
+    28 => 'Novo8 Dream QuadCore',
+    29 => 'Novo8mini',
+    30 => 'novo9-Spark',
+    31 => 'NOVO9 Spark II',
+    32 => 'Novo 10 Hero',
+    33 => 'Novo10 ?Hero!',
+    34 => 'Novo 10 Hero QuadCore',
+    35 => 'Novo Captain',
+    36 => 'Novo10 captain QuadCore',
+    37 => 'NOOK',
+    38 => 'Nook ?Color!',
+    39 => '(NOOK )?BNRV(200|300)!',
+    40 => 'Nook ?Tablet!',
+    41 => 'NOOK Slate',
+    42 => '(NOOK )?BNTV250!',
+    43 => '(NOOK )?BNRV350!',
+    44 => '(NOOK )?BNTV(400)!',
+    45 => '(NOOK )?BNTV(600)!',
+    46 => '(NOOK )?BNTV(800)!',
+    47 => 'Nook HD',
+    48 => 'Nook HD+',
+    49 => 'Novapad!!',
+    50 => 'Nova!!',
+    51 => 'Now',
+    52 => 'NO1 S6',
+    53 => 'NOAIN!!',
+    54 => 'Nokia N9',
+    55 => 'Nokia N900',
+    56 => 'Nokia X',
+    57 => 'Nokia X Dual SIM',
+    58 => 'Nokia X+',
+    59 => 'Nokia Xplus',
+    60 => 'Nokia XL 4G',
+    61 => 'Nokia XL',
+    62 => 'Nokia XL Dual SIM',
+    63 => 'Nokia X2',
+    64 => 'NokiaX2DS',
+    65 => 'Notion Ink ADAM',
+    66 => 'Note III',
+    67 => 'Nozomi',
+    68 => 'Noble TAB07-485',
+    69 => '(QMobile|QTab|Q-Smart|Noir)!!',
+  ),
+  '@NP' => 
+  array (
+    0 => 'npm702-NOVO7PALADIN',
+  ),
+  '@NS' => 
+  array (
+    0 => 'NS115',
+    1 => 'NS2816',
+    2 => 'NS-14T002',
+    3 => 'NS-13T001',
+    4 => 'NSZ-G[A-Z][0-9]!!',
+  ),
+  '@NT' => 
+  array (
+    0 => '(NetTab|NT-)!!',
+  ),
+  '@NU' => 
+  array (
+    0 => 'Numy!!',
+    1 => 'nuvi!!',
+    2 => 'NuclearSX-SP5',
+    3 => 'nubia Z5',
+    4 => 'Nura 2',
+  ),
+  '@NW' => 
+  array (
+    0 => 'NWZ?-Z1000Series!',
+  ),
+  '@NX' => 
+  array (
+    0 => '(HUAWEI )?(CRR|LON|MATE|MHA|MT1|MT2|MT7|M200|NXT|Z100)!!',
+    1 => '(Nexian )?NX-A[0-9]{3,3}!!',
+    2 => 'NXM726',
+    3 => 'NXM726HN',
+    4 => 'NXM726HN C030',
+    5 => 'NXM726HN HASTINGS',
+    6 => 'NXM727KC!',
+    7 => 'NXM803HC',
+    8 => 'NXM803HD',
+    9 => 'NX868QW8G',
+    10 => 'NXM805ND',
+    11 => 'NXM805ND EN',
+    12 => 'NXM908HC',
+    13 => 'NXM703U',
+    14 => 'NXM901',
+    15 => 'NXM736',
+    16 => 'NX700QC',
+    17 => 'NX785QC8G',
+    18 => 'NXM900MC',
+    19 => '(ZXY-)?NX[0-9]{2,3}!!',
+  ),
+  '@NY' => 
+  array (
+    0 => 'NYX!!',
+  ),
+  '@O2' => 
+  array (
+    0 => 'O2 Joggler',
+  ),
+  '@OB' => 
+  array (
+    0 => 'OB-OPPO A31c',
+    1 => 'OB-OPPO 3005',
+    2 => 'Obreey SURFpad',
+  ),
+  '@OC' => 
+  array (
+    0 => '(AC|BC|LC|MT|RC|QS|VM|TS|OC)[0-9]{4,4}[A-Z]!!',
+  ),
+  '@OD' => 
+  array (
+    0 => 'odroida',
+    1 => 'ODROID-A',
+    2 => 'ODROIDC',
+    3 => 'ODROIDC2',
+    4 => 'ODROID-U',
+    5 => 'ODROID-U2',
+    6 => 'ODROID-X',
+    7 => 'ODROID-XU',
+    8 => 'ODROID-XU3',
+    9 => 'ODROID-XU3-ATV',
+    10 => 'ODROID-XU4',
+    11 => 'ODROID-X2',
+    12 => 'ODYS-Chrono',
+    13 => 'ODYS-EVO',
+    14 => 'Odys-Loox',
+    15 => 'ODYS-NOON',
+    16 => 'ODYS-Q',
+    17 => 'ODYS Space',
+    18 => 'ODYS Space TKI BRR233v7',
+    19 => 'ODYS Space TKI BRR233v9',
+    20 => 'ODYS-Xpress',
+    21 => 'ODYS Xtreme',
+  ),
+  '@OL' => 
+  array (
+    0 => 'Olivetti Olipad 100',
+  ),
+  '@OM' => 
+  array (
+    0 => 'Omap5panda',
+    1 => 'OMAP',
+    2 => 'OMAP SS',
+    3 => 'omap3evm',
+    4 => 'OMAP3ETPP',
+    5 => 'Omap5sevm',
+    6 => 'OMS TTD',
+    7 => 'OMS1 6',
+    8 => 'Omega 5.0',
+    9 => 'Omega 5.5',
+  ),
+  '@ON' => 
+  array (
+    0 => 'OnePAD 785I',
+    1 => 'OnePAD 900HD',
+    2 => 'OnePAD 970',
+    3 => 'OnePAD 1100x2',
+    4 => 'ONETOUCH Flash Plus',
+    5 => 'one touch 890!',
+    6 => 'one touch 891!',
+    7 => 'one touch 900!',
+    8 => 'one touch 903!',
+    9 => 'one touch 906!',
+    10 => 'one touch 908!',
+    11 => 'one touch 909!',
+    12 => 'one touch 910!',
+    13 => 'one touch 913!',
+    14 => 'one touch 916!',
+    15 => 'one touch 918!',
+    16 => 'one touch 922!',
+    17 => 'one touch 927!',
+    18 => 'one touch 928!',
+    19 => 'one touch 930!',
+    20 => 'one touch 960!',
+    21 => 'one touch 976!',
+    22 => 'one touch 978!',
+    23 => 'one touch 979 HelloKitty',
+    24 => 'one touch 979!',
+    25 => 'one touch 980!',
+    26 => 'one touch 981!',
+    27 => 'one touch 983!',
+    28 => 'one touch 985!',
+    29 => 'one touch 986!',
+    30 => 'one touch 988!',
+    31 => 'one touch 990!',
+    32 => 'one touch 991!',
+    33 => 'one touch 992!',
+    34 => 'ONE TOCH 992D',
+    35 => 'one touch 993!',
+    36 => 'one touch 995!',
+    37 => 'one touch 997!',
+    38 => 'one touch 998!',
+    39 => 'one touch D662',
+    40 => 'one touch D668',
+    41 => 'one touch D820',
+    42 => 'one touch D920',
+    43 => 'one touch J320',
+    44 => 'one ?touch 40(05|10|11)!',
+    45 => 'one ?touch 4007!',
+    46 => 'one ?touch 4008!',
+    47 => 'one ?touch 4009!',
+    48 => 'one ?touch 4013!',
+    49 => 'one ?touch 4014!',
+    50 => 'one ?touch 40(15|16)!',
+    51 => 'one ?touch 4024!',
+    52 => 'one ?touch 4027!',
+    53 => 'one ?touch 4029!',
+    54 => 'one ?touch 4030!',
+    55 => 'one ?touch 4031!',
+    56 => 'one ?touch 4032!',
+    57 => 'one ?touch 4033!',
+    58 => 'ONETOUCH POPC3',
+    59 => 'one ?touch 40(35|36|37)!',
+    60 => 'one ?touch 5045!',
+    61 => 'one ?touch 5020!',
+    62 => 'one ?touch 5021!',
+    63 => 'one ?touch 5035!',
+    64 => 'one ?touch 50(36|37)!',
+    65 => 'ONETOUCH POPC5',
+    66 => 'one ?touch 50(38)!',
+    67 => 'one ?touch 5042!',
+    68 => 'one ?touch 5050!',
+    69 => 'one ?touch 6010!',
+    70 => 'one ?touch 6012!',
+    71 => 'ONE TOUCH IDOL MINI',
+    72 => 'one ?touch 6014!',
+    73 => 'one ?touch 6016!',
+    74 => 'one ?touch 6030!',
+    75 => 'one ?touch 6032!',
+    76 => 'one ?touch 6033!',
+    77 => 'one ?touch 60(34|35)!',
+    78 => 'one ?touch 6036!',
+    79 => 'one ?touch 6037!',
+    80 => 'one ?touch 6039!',
+    81 => 'one ?touch 6040!',
+    82 => 'one ?touch 6043!',
+    83 => 'one ?touch 6045!',
+    84 => 'one ?touch 6050!',
+    85 => 'one ?touch 7024!',
+    86 => 'one touch fierce!',
+    87 => 'one ?touch 70(25|30)!',
+    88 => 'one ?touch 70(40|41)!',
+    89 => 'one ?touch 7042!',
+    90 => 'one ?touch 7043!',
+    91 => 'one ?touch 7044!',
+    92 => 'one ?touch 7045!',
+    93 => 'one ?touch 7047!',
+    94 => 'one ?touch 7050!',
+    95 => 'one ?touch 8000!',
+    96 => 'one ?touch 8008!',
+    97 => 'one ?touch 8020!',
+    98 => 'one ?touch 8030!',
+    99 => 'one ?touch T10!',
+    100 => 'one ?touch T20!',
+    101 => 'one ?touch T60!',
+    102 => 'ONE TOUCH TAB 7',
+    103 => 'ONE TOUCH TAB 7HD',
+    104 => 'ONE TOUCH TAB 8HD',
+    105 => 'ONE TOUCH EVO7',
+    106 => 'onetouch EVO7',
+    107 => 'ONE TOUCH E710',
+    108 => 'ONE TOUCH EVO 7HD',
+    109 => 'ONE TOUCH EVO7HD',
+    110 => 'ONE TOUCH EVO8HD',
+    111 => 'ONETOUCH POP 7 LTE',
+    112 => 'ONE ?TOUCH P310(A|X)!',
+    113 => 'ONE ?TOUCH P320(A|X)!',
+    114 => 'ONE ?TOUCH P321!',
+    115 => 'ONE ?TOUCH POP 8S P350X!',
+    116 => 'One S',
+    117 => 'One X',
+    118 => 'One X+',
+    119 => 'One XL',
+    120 => 'One V',
+    121 => 'One',
+    122 => 'One M7',
+    123 => 'one m8',
+    124 => 'One A0001',
+    125 => 'OnePlus One',
+    126 => 'OnePlus One A0001',
+    127 => 'ONE A2001',
+    128 => 'ONE A2003',
+    129 => 'ONE A2005',
+    130 => 'OnePlus2',
+    131 => 'ONE A3000',
+    132 => 'ONE A3003',
+    133 => 'ONEPLUS A3000',
+    134 => 'ONEPLUS A3003',
+    135 => 'OnePlus3',
+    136 => 'ONEPLUS A3010',
+    137 => 'ONE E1000',
+    138 => 'ONE E1001',
+    139 => 'ONE E1003',
+    140 => 'ONE E1005',
+    141 => 'ONDA MID',
+    142 => 'ONDA A9 Core4',
+    143 => 'ONDA VI10',
+    144 => 'Onda V812',
+    145 => 'ONDA v975m',
+    146 => 'ONDA V989',
+    147 => 'ONDA V989 Core8',
+  ),
+  '@OP' => 
+  array (
+    0 => 'OPPOLenovo A60',
+    1 => 'Optimus!!',
+    2 => 'Opus One',
+    3 => 'OPS-DRD Digital Signage Player',
+    4 => 'OP110',
+    5 => 'OPPO A33',
+    6 => 'OPPO A53m',
+    7 => 'OPPO A57',
+    8 => 'OPPO A59m',
+    9 => 'OPPO A59s',
+    10 => 'OPPO A800',
+    11 => 'OPPOX905',
+    12 => 'OPPOX907',
+    13 => 'OPPO Find5',
+    14 => 'OPPOX909',
+    15 => 'OPPO X909',
+    16 => 'OPPOX9015',
+    17 => 'OPPOX9017',
+    18 => 'OPPO find7',
+    19 => 'OPPOR601',
+    20 => 'OPPOR801',
+    21 => 'OPPOR803',
+    22 => 'OPPOR805',
+    23 => 'OPPOR807',
+    24 => 'OPPO R811',
+    25 => 'OPPO R813T',
+    26 => 'OPPO R815',
+    27 => 'OPPOR817',
+    28 => 'Oppo R819',
+    29 => 'OPPO R821',
+    30 => 'OPPO R831',
+    31 => 'Oppo R831 Limited Edition',
+    32 => 'OPPO R1001',
+    33 => 'OPPOR8015',
+    34 => 'OPPOR8111',
+    35 => 'OPPOT29',
+    36 => '(OPPO-?)?T703!',
+    37 => 'OPPOU701',
+    38 => 'OPPOU7011',
+    39 => 'OPPOU7015',
+    40 => 'OPPO N1',
+    41 => 'OPPO R7',
+    42 => 'OPPO R7s',
+    43 => 'OPPO R7st',
+    44 => 'OPPO R9tm',
+    45 => 'OPPO R7 Plus',
+    46 => 'OPPO R9 Plusm A',
+    47 => 'OPPO R9s Plus',
+    48 => 'OPSSON!!',
+    49 => 'OP0118-12',
+    50 => 'Optimus Barcelona',
+    51 => 'Optimus Boston',
+    52 => 'Optimus Madrid',
+    53 => 'Optimus Monte Carlo',
+    54 => 'Optimus San Francisco',
+    55 => 'Optimus San Remo',
+    56 => 'Optimus Zali',
+  ),
+  '@OR' => 
+  array (
+    0 => 'Orange HUAWEI GRA-L09',
+    1 => 'Orange Boston',
+    2 => 'Orange Covo',
+    3 => 'Orange Daytona',
+    4 => 'Orange Dublin',
+    5 => 'Orange Fova',
+    6 => 'Orange Gova',
+    7 => 'Orange Hi 4G',
+    8 => 'Orange Hiro',
+    9 => 'Orange infinity 996',
+    10 => 'Orange Infinity 8008X',
+    11 => 'Orange Kivo',
+    12 => 'Orange Monte Carlo',
+    13 => 'Orange Neva 80',
+    14 => 'Orange Niva',
+    15 => 'Orange Nura',
+    16 => 'Orange Novi',
+    17 => 'Orange Reyo',
+    18 => 'Orange Rise 30',
+    19 => 'Orange Rono',
+    20 => 'Orange Roya',
+    21 => 'Orange Runo',
+    22 => 'Orange San Francisco',
+    23 => 'Orange Sego',
+    24 => 'Orange Tactile internet 2',
+    25 => 'Orange Tado',
+    26 => 'Orange Yomi',
+    27 => 'Orange Yumo',
+    28 => 'Orange Zali',
+  ),
+  '@OT' => 
+  array (
+    0 => 'OT 918',
+    1 => 'OT 919',
+    2 => 'OT 919 HelloKitty',
+    3 => 'OT-990C',
+    4 => 'OT 990M',
+    5 => 'OT-995',
+  ),
+  '@OU' => 
+  array (
+    0 => 'OUYA( Console)?!',
+  ),
+  '@OV' => 
+  array (
+    0 => '(OV-|Overmax|Vertis)!!',
+  ),
+  '@OY' => 
+  array (
+    0 => 'Oysters Pacific 800',
+    1 => 'Oysters T3 3G',
+    2 => 'Oysters T7B 3G',
+    3 => 'Oysters T7X 3G',
+    4 => 'OYSTERS T14N 3G',
+    5 => 'Oysters T37',
+    6 => 'Oysters T72H 3G',
+    7 => 'Oysters T72HRi 3G',
+    8 => 'OYSTERS T80 3G',
+  ),
+  '@OZ' => 
+  array (
+    0 => 'OZZY',
+  ),
+  '@P' => 
+  array (
+    0 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!',
+  ),
+  '@P-' => 
+  array (
+    0 => 'P-0[0-9][A-Z]!!',
+  ),
+  '@P0' => 
+  array (
+    0 => 'P001',
+    1 => 'P001 2',
+    2 => 'P002',
+    3 => 'P00C',
+    4 => 'P00I',
+    5 => 'P01M',
+    6 => 'P01MA',
+    7 => 'P01T',
+    8 => 'P01T 1',
+    9 => 'P01V',
+    10 => 'P01W',
+    11 => 'P01Y',
+    12 => 'P01Z',
+    13 => 'P021',
+    14 => 'P022',
+    15 => 'P023',
+    16 => 'P024',
+  ),
+  '@P1' => 
+  array (
+    0 => 'P10AN',
+    1 => 'P105',
+    2 => 'P1050X',
+    3 => 'P10HD??(E6NA)',
+    4 => 'P11HD',
+    5 => 'P11HD四核(G9X6)',
+    6 => 'P11HD??(G9X6)',
+    7 => 'P11HD四核(G9X7)',
+    8 => 'P19HD(E1K3)',
+    9 => 'P19HD(E1K5)',
+  ),
+  '@P2' => 
+  array (
+    0 => 'P2A700',
+    1 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+  ),
+  '@P3' => 
+  array (
+    0 => 'P330X',
+    1 => 'P350X',
+    2 => 'P360X',
+    3 => 'P300(Funbook)',
+  ),
+  '@P4' => 
+  array (
+    0 => 'P4i',
+    1 => 'P4D Sirius',
+  ),
+  '@P5' => 
+  array (
+    0 => 'P5 Energy',
+    1 => 'P5Life',
+    2 => 'P5Life TM',
+    3 => 'P5',
+  ),
+  '@P6' => 
+  array (
+    0 => 'P6 Energy',
+    1 => 'P6 Energy TM',
+    2 => 'P6 Pro',
+    3 => 'P6 Qmax',
+    4 => 'P6 Quad',
+    5 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+  ),
+  '@P7' => 
+  array (
+    0 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    1 => 'P700i',
+    2 => 'P701',
+    3 => 'P7',
+    4 => 'P70 3G八核(C2B7)',
+    5 => 'P70h(A5C2)',
+    6 => 'P72',
+    7 => 'P72w',
+    8 => 'P75a(G7E3)',
+    9 => 'P75HD(M3E5)',
+    10 => 'P76a(K3G5)',
+    11 => 'P76a双核(M4Q5)',
+    12 => 'P76e(A3E1)',
+    13 => 'P76e(G6R8)',
+    14 => 'P76h双核(K8V1)',
+    15 => 'P76s双核(DKH5)',
+    16 => 'P76TI',
+    17 => 'P76v(A3V5)',
+    18 => 'P78双核(G1M5)',
+    19 => 'P78s(G1M5)',
+    20 => 'P78s(G1M6)',
+    21 => 'P78s(G1M7)',
+    22 => 'P78HD四核(C4A5)',
+    23 => 'P78HD??(C4A5)',
+    24 => 'P79HD(A3V9)',
+    25 => 'P79HD 3G(C4K5)',
+    26 => 'p7901a',
+  ),
+  '@P8' => 
+  array (
+    0 => 'P8 Energy',
+    1 => 'P8 Energy mini',
+    2 => 'P8 Energy mini TM',
+    3 => 'P80 四核 (BV8K)',
+    4 => 'P80 四核 (BV9K)',
+    5 => 'P80s 四核(EF6W)',
+    6 => 'P80 3G四核 (B1KC)',
+    7 => 'P80 3G四核 (B4KC)',
+    8 => 'P80 3G八核(A4LL)',
+    9 => 'P80 3G八核(A5LL)',
+    10 => 'P80 3G八核(A6LL)',
+    11 => 'P80 4G(K2G3)',
+    12 => 'P81HD',
+    13 => 'P85(A9D3)',
+    14 => 'P85(A9D5)',
+    15 => 'P85(R8A1)',
+    16 => 'P85mini(DT8W)',
+    17 => 'P85s mini(EWE8)',
+    18 => 'P85t mini(KW8P)',
+    19 => 'P85HD双核(K6N2)',
+    20 => 'P86(F8G6)',
+    21 => 'P88双核(H3D7)',
+    22 => 'P88(H3D7)',
+    23 => 'P88(GT4K)',
+    24 => 'P88s mini??(F2V6)',
+    25 => 'P88s mini四核(F2V7)',
+    26 => 'P88HD(C5GV)',
+    27 => 'P89 3G八核(D1H8)',
+    28 => 'P89 3Gk8(D1H8)',
+    29 => 'P89mini(E2W6)',
+    30 => 'P89 mini(E2W6)',
+    31 => 'P89s(F8A5)',
+    32 => 'P89s mini(F8A2)',
+  ),
+  '@P9' => 
+  array (
+    0 => 'P940',
+    1 => 'P990',
+    2 => 'P90(H3U6)',
+    3 => 'P90(H3U7)',
+    4 => 'P98(F2K9)',
+    5 => 'P98 八核(B9A3)',
+    6 => 'P98 3Gk8(A4HY)',
+    7 => 'P98 3G??(A4HY)',
+    8 => 'P98 3G(M1Q2)',
+    9 => 'P98 3G八核(A3HY)',
+    10 => 'P98 3G八核(A4HY)',
+    11 => 'P98 4G??(A8H6)',
+    12 => 'P98 Air?? (C6V8)',
+    13 => 'P98Air(C6V8)',
+    14 => 'P98HD(A2Q6)',
+    15 => 'P98HD+M6',
+    16 => 'P98T(K3C4)',
+  ),
+  '@PA' => 
+  array (
+    0 => 'Panda(Board)?!',
+    1 => 'Passion',
+    2 => '(Transformer )?(Pad )?TF300(T|TG|TL)!',
+    3 => '(Transformer )?(Pad )?TF502(T)!',
+    4 => '(Transformer )?(Pad )?TF700(T|K)!',
+    5 => 'PadFone',
+    6 => 'PadFone 2',
+    7 => 'PadFone Infinity',
+    8 => 'PadFone Infinity A86',
+    9 => 'PadFone T004',
+    10 => 'PadFone-T004',
+    11 => 'PadFone T008',
+    12 => 'PadFone T00C',
+    13 => 'PadFone X',
+    14 => 'PadFone X mini',
+    15 => 'Patio100',
+    16 => 'Patio100 3G',
+    17 => 'PAD[0-9]{3,3}!!',
+    18 => 'Panasonic!!',
+    19 => 'pandigital9hr',
+    20 => 'pandigital9hr2',
+    21 => 'pandigitalopc1',
+    22 => 'pandigitalopp1',
+    23 => 'pandigitalp1hr',
+    24 => 'PantechP!!',
+    25 => 'PAT712W',
+    26 => 'PATG7506HD',
+    27 => 'PAP[0-9]{4,4}!!',
+    28 => 'PAD1001',
+  ),
+  '@PB' => 
+  array (
+    0 => 'PB99400',
+  ),
+  '@PC' => 
+  array (
+    0 => 'PC1038',
+    1 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!',
+    2 => '(HTC|PCD|USCC)?ADR[0-9]{4,4}!!',
+    3 => 'PC36100!',
+    4 => 'PC-TE307N1W',
+    5 => 'PC-TE508BAW',
+    6 => 'PC-TS508T1W',
+    7 => 'PC-TS708T1W',
+  ),
+  '@PD' => 
+  array (
+    0 => 'PD10-DYD',
+    1 => 'PD6D1J',
+  ),
+  '@PE' => 
+  array (
+    0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    1 => 'PEDI',
+    2 => 'Penta!!',
+    3 => 'Pentagram!!',
+    4 => 'pepper',
+  ),
+  '@PF' => 
+  array (
+    0 => '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!',
+  ),
+  '@PG' => 
+  array (
+    0 => 'PG06100',
+    1 => 'PG41200',
+    2 => 'PG86100!',
+    3 => 'PGM 398',
+  ),
+  '@PH' => 
+  array (
+    0 => 'PH7M EU 5596',
+    1 => 'PHA-3850',
+    2 => 'PHA-3880',
+    3 => 'PHA-4850',
+    4 => 'PHA-5850',
+    5 => 'photon',
+    6 => 'PH44100',
+    7 => 'Photon',
+    8 => 'Photon 4G',
+    9 => 'Photon Q',
+    10 => 'Photon Q LTE',
+    11 => 'PH350',
+    12 => 'PH520',
+    13 => 'PHICOMM!!',
+    14 => 'Philips I908',
+    15 => 'Philips I928',
+    16 => 'Philips S301',
+    17 => 'Philips S307',
+    18 => 'Philips S308',
+    19 => 'Philips S309',
+    20 => 'Philips S316T',
+    21 => 'Philips S326',
+    22 => 'Philips S337',
+    23 => 'Philips S358',
+    24 => 'Philips S388!',
+    25 => 'Philips S396',
+    26 => 'Philips S398',
+    27 => 'Philips S616',
+    28 => 'Philips T3500',
+    29 => 'Philips T3566',
+    30 => 'Philips V377',
+    31 => 'Philips V387',
+    32 => 'Philips V526',
+    33 => 'Philips V787',
+    34 => 'Philips Xenium V787',
+    35 => 'Philips X588',
+    36 => 'Philips W336',
+    37 => 'Philips W536',
+    38 => 'Philips W626',
+    39 => 'Philips W632',
+    40 => 'Philips W635',
+    41 => 'PhilipsW635',
+    42 => 'Philips W737',
+    43 => 'Philips W832',
+    44 => 'Philips W3500',
+    45 => 'Philips W3509',
+    46 => 'Philips W3550',
+    47 => 'Philips W3568',
+    48 => 'Philips W6350',
+    49 => 'PhilipsW6350',
+    50 => 'Philips W6610',
+    51 => 'Philips W6618',
+    52 => 'Philips W7555',
+    53 => 'Philips-W7555',
+    54 => 'Philips-W8500',
+    55 => 'Philips W8510',
+    56 => 'Philips W8555',
+    57 => 'Philips W8560',
+    58 => 'Philips GoGear Connect',
+    59 => 'Philips PI5000',
+    60 => 'PHABLET 4S',
+    61 => 'Phablet 4.5Q',
+    62 => 'Phablet 5,3 Q',
+  ),
+  '@PI' => 
+  array (
+    0 => 'Pixel C',
+    1 => 'Pixel',
+    2 => 'Pixel XL',
+    3 => '(Axioo[\\- ])?PICO!!',
+    4 => '(GIO-)?(GiONEE[- ])?Pioneer P1!',
+    5 => '(GIO-)?(GiONEE[- ])?Pioneer P2!',
+    6 => '(GIO-)?(GiONEE[- ])?Pioneer P3!',
+    7 => '(GIO-)?(GiONEE[- ])?Pioneer P4!',
+    8 => 'PixelV1',
+    9 => 'Pixel V2',
+    10 => 'Pixel V2+',
+    11 => 'PI2000',
+    12 => 'PI2010',
+    13 => 'PI2011',
+    14 => 'PI3100',
+    15 => 'PI3100-93',
+    16 => 'PI3100Z3 93',
+    17 => 'PI3105',
+    18 => 'PI3106',
+    19 => 'PI3110',
+    20 => 'PI3205G',
+    21 => 'PI3210G',
+    22 => 'PI3900',
+    23 => 'PI3900-93',
+    24 => 'PI3910',
+    25 => 'PI4010G',
+    26 => 'PI7000',
+    27 => 'PI7100 93',
+    28 => '(PNR-)?Pioneer!!',
+    29 => 'PIRANHA!!',
+  ),
+  '@PJ' => 
+  array (
+    0 => 'PJ83100',
+    1 => 'PJ35100',
+  ),
+  '@PL' => 
+  array (
+    0 => 'PLE-703L',
+    1 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    2 => 'Planet II v2',
+    3 => 'PLANET',
+    4 => 'Playboy PB-S3',
+    5 => '(PLOYER-)?MOMO!!',
+    6 => 'PlayTabPro',
+    7 => 'PLT!!',
+    8 => 'PlayBook',
+    9 => 'Play 6X-1000',
+    10 => 'Play8X-1100',
+  ),
+  '@PM' => 
+  array (
+    0 => 'PM36100',
+    1 => 'PM63100',
+    2 => 'PMID!!',
+    3 => 'PMP[0-9]{4,4}!!',
+    4 => 'PMT[0-9]{4,4}!!',
+  ),
+  '@PN' => 
+  array (
+    0 => 'pnx8473 kiryung',
+    1 => 'PNDPP4MT9G2',
+    2 => 'PNDPP44QC7',
+    3 => 'PNDPP48GP',
+    4 => 'PNDPP4MT9G3',
+    5 => 'PNDPP410GP',
+    6 => '(PNR-)?Pioneer!!',
+  ),
+  '@PO' => 
+  array (
+    0 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!',
+    1 => 'PocketBook A7',
+    2 => 'PocketBook A10',
+    3 => 'PocketBook A10 3G',
+    4 => 'PocketBook SURFpad2',
+    5 => 'PocketBook SURFpad 3 (7,85")',
+    6 => 'PocketBook SURFpad 4 S',
+    7 => 'PocketBook SURFpad 4 M',
+    8 => 'PocketBook SURFpad 4 L',
+    9 => 'POV-Mobii-7',
+    10 => 'POV Mobii 7',
+    11 => 'POV TAB-P506!',
+    12 => 'POV TAB-P517!',
+    13 => 'POV TAB-P527!',
+    14 => 'POV TAB-P629!',
+    15 => 'POV TAB-P701!',
+    16 => 'POV TAB-P703!',
+    17 => 'POV TAB-P720!',
+    18 => 'POV TAB-P721A!',
+    19 => 'POV TAB-P721!',
+    20 => 'POV TAB-P722C!',
+    21 => 'POV TAB-P731N!',
+    22 => 'POV TAB-P825!',
+    23 => 'POV TAB-P925!',
+    24 => 'POV TAB-PR945!',
+    25 => 'POV TAB-P1025!',
+    26 => 'POV TAB-P1030!',
+    27 => 'POV TAB-PI1045!',
+    28 => 'POV TAB-P1325!',
+    29 => '(POV )?TAB-PLAYTABPRO!',
+    30 => '(POV )?TAB-PROTAB25!',
+    31 => '(POV )?TAB-PROTAB26!',
+    32 => 'POV TAB-PROTAB27',
+    33 => '(POV )?TAB-PROTAB30!',
+    34 => '(POV )?TAB-PROTAB2XXL(4)!',
+    35 => '(POV )?TAB NAVI7 3G M!',
+    36 => 'POV_TAB-NAVI7-3G-M',
+    37 => 'POV TAB-P547(v1.0)',
+    38 => 'POV TV-HDMI-200BT',
+    39 => 'POV TV-HDMI-200BT(V2.0)',
+    40 => 'POV TV-HDMI-210',
+    41 => 'POV TV-HDMI-KB-01',
+    42 => 'POV TV-SMARTTV-500',
+    43 => 'Polaroid PSPT401',
+    44 => 'Polaroid PSPC505',
+    45 => 'Polaroid P4005A',
+    46 => 'POLY ?PAD!!',
+    47 => 'POLYTRON!!',
+    48 => 'POMP!!',
+    49 => 'Positivo Mini',
+    50 => 'POSITIVO YPY 07FTB',
+    51 => 'Positivo Ypy AB7E',
+    52 => 'Positivo Ypy AB7EC',
+    53 => 'Positivo Ypy AB7F',
+    54 => 'Positivo AB7F',
+    55 => 'Positivo Ypy AB7H',
+    56 => 'Positivo Ypy AB10E',
+    57 => 'Positivo Ypy AB10EC',
+    58 => 'Positivo Ypy AB10H',
+    59 => 'Positivo BGH Ypy L700',
+    60 => 'Positivo Ypy L700',
+    61 => 'Positivo Ypy L700 Ed. Especial',
+    62 => 'Positivo Ypy L700+',
+    63 => 'Positivo Ypy L700 Kids',
+    64 => 'Positivo BGH Ypy L700 Kids',
+    65 => 'Positivo Ypy L700+ Kids',
+    66 => 'Positivo Ypy L1000',
+    67 => 'Positivo Ypy L1000AB',
+    68 => 'Positivo Ypy L1000F',
+    69 => 'Positivo Ypy L1050',
+    70 => 'Positivo Ypy L1050E',
+    71 => 'Positivo Ypy L1050F',
+    72 => 'Positivo S380',
+    73 => 'Positivo S440',
+    74 => 'Positivo S480',
+    75 => 'Positivo S550',
+    76 => 'Positivo X400',
+    77 => 'Positivo X800',
+  ),
+  '@PP' => 
+  array (
+    0 => 'PP4MT-7',
+    1 => 'PP4MT-9',
+  ),
+  '@PR' => 
+  array (
+    0 => 'Project Tango Tablet Development Kit',
+    1 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!',
+    2 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    3 => 'Pro 10 dual core',
+    4 => 'Prada 3.0',
+    5 => 'Primo76',
+    6 => 'Primo 91',
+    7 => 'PRIME PLUS 3G',
+    8 => 'PROTAB2XXL',
+    9 => 'PROV!!',
+    10 => 'PRO!!',
+    11 => 'Prestigio PAP5000TDUO',
+    12 => 'PRBT 100',
+    13 => 'printer-tablet',
+    14 => 'PRS-T1',
+    15 => 'PRIMO7',
+    16 => 'PRIMO8',
+    17 => 'PRO7D',
+    18 => 'Primo C2',
+    19 => 'Primo C3 3G',
+    20 => 'Primo C3',
+    21 => 'PrimoC4',
+    22 => 'Primo-D1',
+    23 => 'Primo D2',
+    24 => 'Primo D3',
+    25 => 'Primo D4',
+    26 => 'Primo D5',
+    27 => 'Primo D6',
+    28 => 'Primo D7',
+    29 => 'Primo E1',
+    30 => 'Primo E2',
+    31 => 'PRIMO E3',
+    32 => 'Primo E4',
+    33 => 'Primo E4+',
+    34 => 'Primo E5',
+    35 => 'Primo E6',
+    36 => 'Primo E7',
+    37 => 'Primo E7 Plus',
+    38 => 'Primo EF',
+    39 => 'Primo EF2',
+    40 => 'Primo EF3',
+    41 => 'Primo EF4',
+    42 => 'Primo EM',
+    43 => 'Primo F1',
+    44 => 'Primo F2',
+    45 => 'Primo-F2',
+    46 => 'Primo F3',
+    47 => 'Primo F3i',
+    48 => 'Primo F4',
+    49 => 'Primo F5',
+    50 => 'Primo F6',
+    51 => 'Primo F7',
+    52 => 'Primo-G1',
+    53 => 'Primo G1',
+    54 => 'Primo G2',
+    55 => 'Primo-G3',
+    56 => 'Primo G4',
+    57 => 'Primo G5',
+    58 => 'Primo G6',
+    59 => 'Primo-GF',
+    60 => 'Primo GF2',
+    61 => 'Primo GF3',
+    62 => 'Primo GF4',
+    63 => 'Primo GH',
+    64 => 'Primo GH+',
+    65 => 'Primo-GH2',
+    66 => 'Primo GH2',
+    67 => 'Primo GH2 [AOSP]',
+    68 => 'Primo-GH2 (AOSP KITKAT)',
+    69 => 'Primo GH3',
+    70 => 'Primo-GH3',
+    71 => 'Primo GH4',
+    72 => 'Primo GH5',
+    73 => 'Primo GH5 Plus',
+    74 => 'Primo GH5 mini',
+    75 => 'Primo GH6',
+    76 => 'Primo GH6+',
+    77 => 'Primo GM',
+    78 => 'Primo GM mini',
+    79 => 'Primo H2',
+    80 => 'Primo-H3',
+    81 => 'Primo H3',
+    82 => 'Primo H4',
+    83 => 'Primo H5',
+    84 => 'Primo H6',
+    85 => 'Primo HM',
+    86 => 'Primo HM2',
+    87 => 'Primo HM3',
+    88 => 'Primo HM3+',
+    89 => 'Primo-N',
+    90 => 'Primo-N1',
+    91 => 'Primo N2',
+    92 => 'Primo NF',
+    93 => 'Primo NF+',
+    94 => 'Primo NF2',
+    95 => 'Primo NF2+',
+    96 => 'Primo NH',
+    97 => 'Primo NH Lite',
+    98 => 'Primo NH2 Lite',
+    99 => 'Primo NX',
+    100 => 'Primo NX2',
+    101 => 'Primo NX3',
+    102 => 'Primo NX3 Plus',
+    103 => 'Primo NX4 mini',
+    104 => 'Primo R1',
+    105 => 'Primo R2',
+    106 => 'Primo R3',
+    107 => 'Primo R4',
+    108 => 'Primo R4 Plus',
+    109 => 'Primo R4s',
+    110 => 'Primo RH',
+    111 => 'Primo RH2',
+    112 => 'Primo RM',
+    113 => 'Primo RM2',
+    114 => 'Primo RM2 mini',
+    115 => 'Primo RX',
+    116 => 'Primo RX2',
+    117 => 'PrimoRX2',
+    118 => 'Primo RX3',
+    119 => 'Primo RX4',
+    120 => 'Primo RX5',
+    121 => 'Primo S1',
+    122 => 'PrimoS2',
+    123 => 'Primo S3',
+    124 => 'Primo S3 mini',
+    125 => 'Primo S4',
+    126 => 'Primo V1',
+    127 => 'Primo V2',
+    128 => 'Primo VX',
+    129 => 'Primo VX+',
+    130 => '(WALTON )?Primo-X1!',
+    131 => 'Primo-X2',
+    132 => 'Primo X2mini',
+    133 => 'Primo X3',
+    134 => 'Primo X3mini',
+    135 => 'Primo X4',
+    136 => 'Primo Z',
+    137 => 'Primo-ZX',
+    138 => 'Primo ZX2',
+    139 => 'Primo ZX2 Lite',
+    140 => 'Primo ZX2 mini',
+    141 => 'Primo Walpad 1',
+    142 => 'Primo Walpad 7',
+    143 => 'Primo Walpad 8',
+    144 => 'Primo Walpad 8W',
+    145 => 'Proton Lite',
+    146 => 'Prism',
+    147 => 'Prism II',
+  ),
+  '@PS' => 
+  array (
+    0 => 'PSPT350',
+    1 => 'PSP[0-9]{4,4}!!',
+    2 => 'PS47',
+  ),
+  '@PT' => 
+  array (
+    0 => 'PTL21',
+  ),
+  '@PU' => 
+  array (
+    0 => 'PURE XL',
+    1 => 'PULID F6',
+    2 => 'PULID F7',
+    3 => 'PULID F11',
+    4 => 'PULID T3',
+    5 => 'Pulse',
+    6 => 'Pulse Mini',
+  ),
+  '@PY' => 
+  array (
+    0 => 'Pyramid',
+  ),
+  '@Q-' => 
+  array (
+    0 => 'Q-Wave!!',
+    1 => '(QMobile|QTab|Q-Smart|Noir)!!',
+  ),
+  '@Q0' => 
+  array (
+    0 => 'Q07CL01',
+  ),
+  '@Q1' => 
+  array (
+    0 => '(BB )?Q10$!',
+  ),
+  '@Q5' => 
+  array (
+    0 => '(BB )?Q5$!',
+  ),
+  '@QI' => 
+  array (
+    0 => 'Qilive!!',
+  ),
+  '@QM' => 
+  array (
+    0 => 'QM151E',
+    1 => 'QM152E',
+    2 => 'QM163E',
+    3 => 'QM734-8G',
+    4 => 'QM735-8G',
+    5 => '(QMobile|QTab|Q-Smart|Noir)!!',
+    6 => 'QMV7A',
+    7 => 'QMV7B',
+  ),
+  '@QO' => 
+  array (
+    0 => 'QOOQ',
+  ),
+  '@QS' => 
+  array (
+    0 => '(AC|BC|LC|MT|RC|QS|VM|TS|OC)[0-9]{4,4}[A-Z]!!',
+  ),
+  '@QT' => 
+  array (
+    0 => '(QMobile|QTab|Q-Smart|Noir)!!',
+    1 => 'QTAQZ3',
+    2 => 'QTAQZ3KID',
+    3 => 'QTAIR7',
+  ),
+  '@QU' => 
+  array (
+    0 => 'Quest',
+    1 => 'Quicki[ -]?([0-9]+)!',
+    2 => 'QUANTUM 4',
+    3 => 'QUANTUM 700m',
+    4 => 'QUANTUM 1010N',
+    5 => 'Quechua Phone 5',
+    6 => 'QUBE[ -](B[0-9]S?\\+?)!',
+    7 => 'QUBE[ -](T[0-9])!',
+    8 => 'QUMO[ -]QUEST[ -]?([0-9]+i?)!',
+    9 => 'QUMO Altair ([0-9]+i?)!',
+    10 => 'QUMO Vega ([0-9]+i?)!',
+    11 => 'QuickFone Mini',
+    12 => 'QuickFone-Mini',
+    13 => 'QuickFone ([NXZ][0-9]\\+?)!',
+  ),
+  '@QV' => 
+  array (
+    0 => 'QV151E',
+  ),
+  '@QW' => 
+  array (
+    0 => 'QW ?TB-[0-9]{4,4}!!',
+  ),
+  '@R1' => 
+  array (
+    0 => 'R1001',
+    1 => 'R1011',
+  ),
+  '@R2' => 
+  array (
+    0 => 'R2001',
+    1 => 'R2010',
+    2 => 'R2017',
+  ),
+  '@R3' => 
+  array (
+    0 => 'R30GT',
+  ),
+  '@R6' => 
+  array (
+    0 => 'R6006',
+    1 => 'R6007',
+  ),
+  '@R7' => 
+  array (
+    0 => 'R7005',
+    1 => 'R7007',
+    2 => 'R7f',
+    3 => 'R7i',
+    4 => 'R7plusf',
+    5 => 'R7Plusm',
+  ),
+  '@R8' => 
+  array (
+    0 => 'R801',
+    1 => 'R801T',
+    2 => 'R803',
+    3 => 'R805',
+    4 => 'R807',
+    5 => 'R809T',
+    6 => 'R811',
+    7 => 'R813T',
+    8 => 'R815',
+    9 => 'R815T',
+    10 => 'R815W',
+    11 => 'R817',
+    12 => 'R817T',
+    13 => 'R819',
+    14 => 'R819T!',
+    15 => 'R821',
+    16 => 'R821T',
+    17 => 'R823T',
+    18 => 'R827',
+    19 => 'R827T',
+    20 => 'R829',
+    21 => 'R829T',
+    22 => 'R830',
+    23 => 'R830S',
+    24 => 'R831K',
+    25 => 'R831L',
+    26 => 'R831T',
+    27 => 'R831S',
+    28 => 'R831',
+    29 => 'R833T',
+    30 => 'R850',
+    31 => 'R883T',
+    32 => 'R8000',
+    33 => 'R8001',
+    34 => 'R8006',
+    35 => 'R8007',
+    36 => 'R8015',
+    37 => 'R8106',
+    38 => 'R8107',
+    39 => 'R8109',
+    40 => 'R8111',
+    41 => 'R8113',
+    42 => 'R8200',
+    43 => 'R8201',
+    44 => 'R8205',
+    45 => 'R8206',
+    46 => 'R8207',
+    47 => 'R800(a|at|i|iv|x)!',
+  ),
+  '@RA' => 
+  array (
+    0 => 'Rage',
+    1 => 'RAPAXSE080-0508',
+    2 => 'RAZR',
+    3 => 'RAZR HD',
+    4 => 'RAZR M',
+    5 => 'RAZR MAXX',
+    6 => 'ramos i7s  ',
+    7 => 'Ramos i7s Series',
+    8 => 'Ramosi8',
+    9 => 'Ramosi8c',
+    10 => 'Ramosi9',
+    11 => 'Ramosi9-3G',
+    12 => 'Ramos i9s',
+    13 => 'Ramos i9s Series',
+    14 => 'Ramos i9s pro',
+    15 => 'Ramosi10',
+    16 => 'Ramos i11 pro',
+    17 => 'Ramosi12c',
+    18 => 'Ramos i100 pro',
+    19 => 'Ramos K100',
+    20 => 'Ramos K300',
+    21 => 'Ramos M7',
+    22 => 'ramos R9',
+    23 => 'Ramos W6HD',
+    24 => 'Ramos W12',
+    25 => 'Ramos W12HD',
+    26 => 'Ramos W17Pro V3.0',
+    27 => 'Ramos W21',
+    28 => 'Ramos W25HD',
+    29 => 'Ramos W27Pro',
+    30 => 'Ramos W31',
+    31 => 'Ramos w36',
+    32 => 'Ramos W41',
+    33 => 'Ramos W41 QuadCore',
+    34 => 'Ramos X10 PRO!',
+    35 => 'Rayhov!!',
+    36 => 'RAINBOW',
+    37 => 'RAINBOW 4G',
+    38 => '(ZTE )?Racer!!',
+  ),
+  '@RB' => 
+  array (
+    0 => 'RBK-490',
+  ),
+  '@RC' => 
+  array (
+    0 => '(AC|BC|LC|MT|RC|QS|VM|TS|OC)[0-9]{4,4}[A-Z]!!',
+    1 => 'RCT6973W43',
+  ),
+  '@RE' => 
+  array (
+    0 => 'redhookbay',
+    1 => '(E-Boda|Eruption|Essential|Supreme|Storm|Revo)!!',
+    2 => 'Rezound',
+    3 => 'Renesas!',
+    4 => 'Readboy!!',
+    5 => 'ReederA8R',
+    6 => 'reeder A8i Quad 2',
+    7 => 'Redmi',
+    8 => 'Redmi 1S',
+    9 => 'Redmi 3',
+    10 => 'Redmi 3S',
+    11 => 'Redmi 3X',
+    12 => 'Redmi 4',
+    13 => 'Redmi 4A',
+    14 => 'Redmi 4X',
+    15 => 'Redmi 4 Prime',
+    16 => 'REDMI NOTE',
+    17 => 'Redmi Note 4G (LTE)',
+    18 => 'Redmi Note 2',
+    19 => 'Redmi Note 3',
+    20 => 'Redmi Note 3 Pro',
+    21 => 'Redmi Note 4',
+    22 => 'Redmi Note 4X',
+    23 => 'Redmi Pro',
+    24 => 'RedRice',
+  ),
+  '@RH' => 
+  array (
+    0 => '(?:RIVO )?RHYTHM RX ?([0-9]+)!',
+  ),
+  '@RI' => 
+  array (
+    0 => 'Rikomagic MK802',
+    1 => 'Rikomagic MK802 ?II!',
+    2 => 'Rikomagic MK802III',
+    3 => 'Rikomagic MK802IIIS',
+    4 => '(Gsmart|Gigabyte|Rio)!!',
+    5 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    6 => 'Rise',
+    7 => '(Ritmix )?RM[DP]-?[0-9]{3,3}!!',
+    8 => 'RIDGE',
+    9 => 'RIDGE 4G',
+    10 => 'RIDGE FAB 4G',
+  ),
+  '@RK' => 
+  array (
+    0 => 'rksdk',
+    1 => 'rk2808(sdk)?!',
+    2 => 'rk2818(sdk)?!',
+    3 => 'RK2906',
+    4 => 'RK2918',
+    5 => 'rk2926-q8',
+    6 => 'rk2928sdk',
+    7 => 'rk29sdk',
+    8 => 'rk30sdk!',
+    9 => 'rk30mtk',
+    10 => 'rk3026',
+    11 => 'rk3028a',
+    12 => 'rk3028sdk',
+    13 => 'rk3036',
+    14 => 'rk3066',
+    15 => 'rk31sdk',
+    16 => 'rk31 5931',
+    17 => 'rk31 8089',
+    18 => 'rk31 872xu',
+    19 => 'rk31au',
+    20 => 'rk31rtl',
+    21 => 'rk312x',
+    22 => 'rk3188!',
+    23 => 'rk3288!',
+    24 => 'rk3990!',
+    25 => 'RKM MK602',
+    26 => 'RKM MK802IIIS',
+    27 => 'RKM MK802IV',
+    28 => 'RKM MK902',
+    29 => 'RKM MK902II',
+  ),
+  '@RM' => 
+  array (
+    0 => 'RM02',
+    1 => 'RM-980',
+    2 => 'RM-1061',
+    3 => '(Ritmix )?RM[DP]-?[0-9]{3,3}!!',
+    4 => 'RMD-[0-9]{2,3}G!!',
+  ),
+  '@RO' => 
+  array (
+    0 => 'roiX',
+    1 => 'RoverPad 3W T71D',
+    2 => 'ROAR',
+    3 => 'Roar A50',
+  ),
+  '@RP' => 
+  array (
+    0 => 'RP-UDM01A',
+  ),
+  '@RT' => 
+  array (
+    0 => 'RTC-700A',
+  ),
+  '@RW' => 
+  array (
+    0 => 'RW107',
+  ),
+  '@S-' => 
+  array (
+    0 => 'S-F16',
+  ),
+  '@S0' => 
+  array (
+    0 => 'S01',
+  ),
+  '@S1' => 
+  array (
+    0 => '(GIO-)?(GiONEE[- ])?S101!',
+    1 => '(Lenovo )?S1[- ]37AH0!',
+    2 => 'S1005KTAB',
+  ),
+  '@S2' => 
+  array (
+    0 => 'S222',
+    1 => '(Lenovo )?S2[- ]38A(H0|T0)!',
+    2 => 'S2',
+  ),
+  '@S3' => 
+  array (
+    0 => 's3c6410',
+    1 => 'S30',
+    2 => 'S308',
+    3 => 'S3',
+  ),
+  '@S4' => 
+  array (
+    0 => 'S40',
+    1 => 'S4503Q',
+    2 => 'S4505M',
+    3 => 'S4',
+  ),
+  '@S5' => 
+  array (
+    0 => 'S5PV210',
+    1 => 'S5-F',
+    2 => 'S50',
+    3 => 'S50c',
+    4 => 'S5',
+    5 => 'S5 Mini!',
+    6 => 'S51SE',
+  ),
+  '@S6' => 
+  array (
+    0 => 'S658t',
+    1 => 'S6 Edge+!',
+  ),
+  '@S7' => 
+  array (
+    0 => 'S710d',
+    1 => 'S710D',
+    2 => 'S720i',
+    3 => 'S7',
+    4 => 's732',
+  ),
+  '@S8' => 
+  array (
+    0 => 'S8600',
+    1 => 'S88 DISCOVERY',
+    2 => 'S880',
+  ),
+  '@SA' => 
+  array (
+    0 => 'sama5d3',
+    1 => 'SABRESD-MX6DQ',
+    2 => 'saltbay',
+    3 => 'SA3CNT',
+    4 => 'Salora E1',
+    5 => 'Sansui[ -]([A-Z]{1,2}[0-9]+[A-Z]?\\+?)!',
+    6 => 'Sansui Cosmic SP ([0-9]+)!',
+    7 => 'SANSUI ETAB ([0-9]+) ?VP!',
+    8 => 'Satellite!!',
+    9 => 'San Remo Mini',
+    10 => 'San Francisco',
+    11 => 'San Francisco for',
+    12 => 'San Francisco II',
+  ),
+  '@SB' => 
+  array (
+    0 => 'SBM[0-9]0[0-9]SH!!',
+  ),
+  '@SC' => 
+  array (
+    0 => '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!',
+    1 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    2 => '(HW-|HUAWEI )?(LUA|CUN|SCC|CAM|LYO)!!',
+    3 => 'SCH-[iI][0-9]{3,3}!!',
+    4 => 'SCH-L710!',
+    5 => 'SCH-M828!',
+    6 => 'SCH-N719',
+    7 => 'SCH-P[0-9]{3,3}!!',
+    8 => 'SCH-R[0-9]{3,3}!!',
+    9 => 'SCH-S[0-9]{3,3}!!',
+    10 => 'SCH-V727',
+    11 => 'SCH-W[0-9]{3,4}!!',
+    12 => 'SC-?0[0-9][A-Z]!!',
+    13 => 'SC[LTV][23][0-9]!!',
+    14 => 'Scroll!!',
+    15 => 'SC-!!',
+  ),
+  '@SD' => 
+  array (
+    0 => 'sdk',
+    1 => 'SD4930UR',
+  ),
+  '@SE' => 
+  array (
+    0 => 'sec smdkc210',
+    1 => 'sec smdkv210',
+    2 => 'SENSUELLE',
+    3 => 'SensationXE!',
+    4 => 'SensationXL!',
+    5 => 'Sensation XL with Beats Audio',
+    6 => 'Sensation!',
+    7 => '(SENCOR )?ELEMENT!!',
+    8 => 'SENSEIT R390',
+    9 => 'SENWA S970',
+  ),
+  '@SF' => 
+  array (
+    0 => 'SFR-G8800',
+    1 => 'SFR-G8800 TV',
+    2 => 'SFR StarTab',
+  ),
+  '@SG' => 
+  array (
+    0 => 'SGH-[EILNMS][0-9]{3,4}!!',
+    1 => 'SGH-T[0-9]{3,3}!!',
+    2 => 'SGH-U468!',
+    3 => 'SGH-W2013!',
+    4 => 'SGP[ST0-9][0-9]{2,2}!!',
+  ),
+  '@SH' => 
+  array (
+    0 => 'Shark Bay Client platform',
+    1 => 'shamu',
+    2 => 'SHIELD Console',
+    3 => 'SHIELD Android TV',
+    4 => 'SHIELD Andr0id TV',
+    5 => 'SHIELD',
+    6 => 'shieldtablet',
+    7 => 'SHIELD Tablet',
+    8 => 'SHIELD Tablet K1',
+    9 => 'SHIELD Tablet X1',
+    10 => 'SHIELD Tablet II',
+    11 => 'Shine',
+    12 => 'SH940C-LN',
+    13 => 'SH940C-LN TV',
+    14 => 'SH960C-LN',
+    15 => 'Sholes',
+    16 => 'SHV-E[0-9]{3,3}!!',
+    17 => 'SHW-M[0-9]{3,3}!!',
+    18 => 'SH01D',
+    19 => 'SH-M01',
+    20 => 'SH-M02',
+    21 => 'SH-M02-EVA20',
+    22 => 'SH-M03',
+    23 => 'SH-RM02',
+    24 => 'SH-[01][0-9][A-Z]!!',
+    25 => '(SHP-)?(SHARP )?SH[0-9]{2,3}!!',
+    26 => 'SH[FLTV][0-9]{2,2}!!',
+    27 => 'SHARP-ADS1',
+  ),
+  '@SI' => 
+  array (
+    0 => 'SiRF Dream',
+    1 => 'simvalley SP-142',
+    2 => 'Signature Touch',
+    3 => 'Signature Touch L',
+  ),
+  '@SK' => 
+  array (
+    0 => 'SK351',
+    1 => 'SKT01',
+    2 => '(SKY )?IM[- ][A-Z][0-9]{3,3}!!',
+    3 => 'Skyworth!!',
+    4 => 'SK17(a|i|iv|i-o)!',
+    5 => 'SK-Mtek GT7305',
+    6 => '(ZTE )?Skate!!',
+  ),
+  '@SL' => 
+  array (
+    0 => 'Slider SL101',
+    1 => 'SL930',
+    2 => '(HP|Slate)!!',
+    3 => 'Slidepad!!',
+    4 => 'SLIDE',
+  ),
+  '@SM' => 
+  array (
+    0 => 'smdk6410',
+    1 => 'SMDKC110',
+    2 => 'SMDKV210',
+    3 => 'SMDK4x12',
+    4 => 'SMDK4412',
+    5 => 'SMDK5250',
+    6 => 'SMDK5410',
+    7 => 'smp86xx',
+    8 => 'smp8734',
+    9 => 'smp8756',
+    10 => 'SM-G900FG',
+    11 => 'SmartWatch 3',
+    12 => 'Smart!!',
+    13 => 'SM-H900A',
+    14 => 'SmartTab1',
+    15 => 'SmartPad!!',
+    16 => '(MEO )?Smart A!!',
+    17 => 'Smart Monitor 17',
+    18 => 'SMARTTVBOX',
+    19 => 'SMT-E5015',
+    20 => 'SMT-i9100',
+    21 => 'SM-A[0-9]{3,3}!!',
+    22 => 'SM-C[0-9]{3,3}!!',
+    23 => 'SM-E[0-9]{3,3}!!',
+    24 => 'SM-G[0-9]{3,3}!!',
+    25 => 'SM-I9500',
+    26 => 'SM-J[0-9]{3,3}!!',
+    27 => 'SM-N[0-9]{3,4}!!',
+    28 => 'SM-P[0-9]{3,3}!!',
+    29 => 'SM-S[0-9]{3,3}!!',
+    30 => 'SM-T[0-9]{3,3}!!',
+    31 => 'SM-V700',
+    32 => 'SM-W[0-9]{4,4}!!',
+    33 => 'Smartphone Android by SFR STARADDICT II',
+    34 => '(Smartfren|Andromax)!!',
+    35 => 'Smartfren Tab 7',
+    36 => 'SmartQ!!',
+    37 => 'SMART Sprint',
+    38 => 'SMART Start',
+    39 => 'SmartTab!!',
+  ),
+  '@SN' => 
+  array (
+    0 => 'SN[0-9]!!',
+    1 => 'Snexian!!',
+    2 => '(SNM\\-)?LT[0-9]{2,2}[a-z]?!!',
+    3 => '(SNM\\-)?M[0-9]{2,2}[a-z]!!',
+  ),
+  '@SO' => 
+  array (
+    0 => 'SoftwinerEvb',
+    1 => 'SoftwinerEvb0308',
+    2 => 'SoftwinerEvd',
+    3 => 'Softwinerkf026',
+    4 => 'Softwinerf721',
+    5 => 'Softwinerf761',
+    6 => 'Softwinerf761I',
+    7 => 'Softwinerf900',
+    8 => 'SoftwinerEvbV13',
+    9 => 'soho',
+    10 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    11 => 'SONIC',
+    12 => 'Sonim!!',
+    13 => 'SO-0[0-9][A-Z]!!',
+    14 => 'SO[LTV][0-9]{2,2}!!',
+    15 => 'Sony Xperia Ray',
+    16 => 'SonyEricssonMT15',
+    17 => 'SonyEricssonST15',
+    18 => 'Soshphone 4G',
+    19 => 'soft stone',
+  ),
+  '@SP' => 
+  array (
+    0 => 'Sprint!!',
+    1 => 'Sparkle V',
+    2 => 'SPNG9716DC',
+    3 => 'SPH-D[0-9]{3,3}!!',
+    4 => 'SPH-L[0-9]{3,3}!!',
+    5 => 'SPH-M[0-9]{3,3}!!',
+    6 => 'SPH-P[0-9]{3,3}!!',
+    7 => 'SP-120',
+    8 => 'SPX-5',
+    9 => 'SPX-5 3G',
+    10 => 'SPX-6',
+    11 => 'SPX-12',
+    12 => 'SpeedUp S3',
+    13 => '(CSL[- ])?(Spice[- ]?)?Mi(-| )?[0-9]{3,3}!!',
+    14 => 'Spice N-300',
+    15 => 'Spice N-500',
+    16 => 'Spice Xlife-425 3G',
+    17 => 'Spice Xlife-435Q',
+    18 => 'Spice Xlife-451Q',
+    19 => 'Spice-Xlife-511Pro',
+    20 => 'Spice Xlife-512',
+    21 => 'Spice Xlife-520HD',
+    22 => 'Spice Xlife-M5+',
+    23 => 'Spice Xlife-M45q',
+    24 => 'Spice Xlife-M46q',
+    25 => 'Spice Xlife-Proton4',
+    26 => 'Spice Xplor-Proton5',
+    27 => 'SPICE IV',
+    28 => 'SP-A20i',
+    29 => 'SpringBoard',
+  ),
+  '@SR' => 
+  array (
+    0 => 'SRT!!',
+  ),
+  '@ST' => 
+  array (
+    0 => 'ste l8540!',
+    1 => 'ste u8500',
+    2 => 'ste u9540',
+    3 => 'Stingray',
+    4 => 'Stream',
+    5 => 'Status',
+    6 => 'Style',
+    7 => 'STV100-[0-9]!',
+    8 => 'STH100-[0-9]!',
+    9 => '(BLU|DASH|LIFE|NEO|STUDIO|VIVO)!!',
+    10 => 'streak7',
+    11 => '(E-Boda|Eruption|Essential|Supreme|Storm|Revo)!!',
+    12 => 'ST7001',
+    13 => 'ST8000',
+    14 => 'ST9001',
+    15 => 'ST10',
+    16 => 'ST940I-UP',
+    17 => 'STM[0-9]{3,3}H!!',
+    18 => 'Stylo',
+    19 => 'STARACTIVE',
+    20 => 'STARACTIVE 2',
+    21 => 'STARADDICT II',
+    22 => 'STARADDICT II Plus',
+    23 => 'STARADDICT III',
+    24 => 'STARADDICT 4',
+    25 => 'STARADDICT 5',
+    26 => 'STARNAUTE II',
+    27 => 'STARNAUTE3',
+    28 => 'STARNAUTE4',
+    29 => 'Starshine',
+    30 => 'STARSHINE II',
+    31 => 'STARSHINE III',
+    32 => 'STARSHINE 4',
+    33 => 'STARSHINE5',
+    34 => 'STARTEXT II',
+    35 => 'STARTRAIL II',
+    36 => 'StarTrail III',
+    37 => 'STARTRAIL4',
+    38 => 'STARTRAIL 4',
+    39 => 'STARTRAIL5',
+    40 => 'STARTRAIL 6 4G',
+    41 => 'STARTRAIL6',
+    42 => 'STARTRAIL7',
+    43 => 'STARTRAIL 8',
+    44 => 'STARTRAIL 9',
+    45 => 'STARXTREM',
+    46 => 'STARXTREM II',
+    47 => 'STARXTREM3',
+    48 => 'STARXTREM 4',
+    49 => 'STARXTREM5',
+    50 => 'STARXTREM 6',
+    51 => 'STARTAB',
+    52 => 'ST[0-9]{2,2}[a-z]?!!',
+    53 => 'Star N8000',
+    54 => 'Star N9500',
+    55 => 'Star N9589',
+    56 => 'Star Q9000',
+    57 => 'STAR S5',
+    58 => 'STAR S7589',
+    59 => 'Starmobile!!',
+    60 => '(Starway )?Andromeda!!',
+    61 => 'STX!!',
+    62 => 'STOREX LinkBox',
+    63 => 'StarTab 715x',
+    64 => 'ST[0-9]{5,5}-[0-9]!!',
+    65 => 'STAIRWAY',
+    66 => 'StarTrail TT',
+  ),
+  '@SU' => 
+  array (
+    0 => 'Surfing TAB B 9.7 3G',
+    1 => 'Surfing Tab C 3G',
+    2 => '(E-Boda|Eruption|Essential|Supreme|Storm|Revo)!!',
+    3 => '(Explay|X-tremer|ActiveD|Informer|Surfer)!!',
+    4 => 'surnia',
+    5 => 'SUGAR ([A-Z][0-9]?(?: Pro)?)!',
+    6 => 'SUPRA (M[0-9]{2,3}[A-Z]{0,2})!',
+    7 => 'SUBLIM',
+    8 => 'SUNSET',
+  ),
+  '@SV' => 
+  array (
+    0 => 'sv8860',
+    1 => 'SVP-DTV15',
+  ),
+  '@SW' => 
+  array (
+    0 => 'Swift',
+    1 => 'Swift Plus',
+    2 => 'Swift 2 Plus',
+    3 => 'Swift 2 X',
+  ),
+  '@SX' => 
+  array (
+    0 => 'SXZ-PD!!',
+    1 => 'SX9701W',
+  ),
+  '@SY' => 
+  array (
+    0 => 'Sygnus',
+    1 => 'SYTABEX7-2',
+    2 => '(Symphony|Xplorer)!!',
+    3 => 'Synrgic Uno M1',
+  ),
+  '@SZ' => 
+  array (
+    0 => 'SZJ-JS101',
+    1 => 'SZENIO!!',
+  ),
+  '@T-' => 
+  array (
+    0 => 'T-07B',
+    1 => 'T-800',
+    2 => 'T-200',
+    3 => 'T-Smart!!',
+    4 => 'T-01C',
+    5 => 'T-01D',
+    6 => 'T-02D',
+    7 => 'T-Mobile G1',
+    8 => 'T-Mobile G2',
+    9 => 'T-Mobile G2 Touch',
+    10 => 'T-Mobile HTC G2',
+    11 => 'T-Mobile myTouch',
+    12 => 'T-Mobile myTouch 3G',
+    13 => 'T-Mobile myTouch 3G Slide',
+    14 => 'T-mobile my touch 3g slide',
+    15 => 'T-Mobile Espresso',
+    16 => 'T-Mobile myTouch 4G',
+    17 => 'T-Mobile myTouch Q',
+    18 => 'T-Mobile Opal',
+    19 => 'T-Mobile Vivacity',
+    20 => 'T-Hub2',
+  ),
+  '@T0' => 
+  array (
+    0 => 'T01',
+    1 => 'T012',
+    2 => 'T02',
+    3 => 'T05',
+    4 => 'T03',
+    5 => 'T04',
+    6 => 'T00C',
+    7 => 'T00E',
+    8 => 'T00N',
+    9 => 'T00D',
+    10 => 'T00S',
+    11 => 'T00T',
+    12 => 'T001',
+    13 => 'T00I',
+    14 => 'T00I-D',
+    15 => 'T00F',
+    16 => 'T00J',
+    17 => 'T00J-D',
+    18 => 'T00K',
+    19 => 'T00P',
+    20 => 'T00G',
+    21 => 'T00Q',
+  ),
+  '@T1' => 
+  array (
+    0 => 'T1-B',
+    1 => 'T1-D',
+    2 => 'T1-E',
+    3 => 'T1K Plus',
+    4 => 'T1 7.0',
+    5 => 'T11AD!',
+  ),
+  '@T2' => 
+  array (
+    0 => 'T20',
+  ),
+  '@T3' => 
+  array (
+    0 => 'T320a',
+    1 => 'T30',
+    2 => 'T3696',
+    3 => 'T301',
+  ),
+  '@T6' => 
+  array (
+    0 => 'T6',
+  ),
+  '@T7' => 
+  array (
+    0 => '(OPPO-?)?T703!',
+    1 => 'T720 SE',
+    2 => 'T760 from moage.com',
+  ),
+  '@T8' => 
+  array (
+    0 => 'T8[0-9]{3,3}!!',
+  ),
+  '@T9' => 
+  array (
+    0 => 'T9108',
+    1 => 'T92',
+    2 => 'T9199h',
+    3 => 'T9[0-9]{3,3}!!',
+    4 => 'T959',
+    5 => 'T98 4G??(C6R2)',
+  ),
+  '@TA' => 
+  array (
+    0 => 'TA272HUL',
+    1 => 'Tablet P1801-T',
+    2 => 'Tablet P1802-T',
+    3 => '(DENVER-)?TA[CD]-[0-9]{4,5}!!',
+    4 => 'Tablet-P27',
+    5 => 'TA10CA3',
+    6 => '(tablet )?fnac!!',
+    7 => '(HW-|HUAWEI )?(TIT|TAG|NCE)!!',
+    8 => '(HW-|HUAWEI )?(CHC|TAG|KII)!!',
+    9 => 'TA-FONE!!',
+    10 => 'TAB1011',
+    11 => 'TAB-1030',
+    12 => '(Lenovo )?(Tab ?)?(2 ?)?[AS](7|8|10)!!',
+    13 => 'TAB950',
+    14 => 'TAB1062',
+    15 => 'TAB192',
+    16 => '(POV )?TAB-PLAYTABPRO!',
+    17 => '(POV )?TAB-PROTAB25!',
+    18 => '(POV )?TAB-PROTAB26!',
+    19 => '(POV )?TAB-PROTAB30!',
+    20 => 'TAB-PROTAB2-IPS9',
+    21 => 'TAB-PROTAB2-IPS-3G',
+    22 => 'TAB-PROTAB2-IPS-16',
+    23 => 'TAB-PROTAB2.4',
+    24 => 'TAB-PROTAB2XL',
+    25 => 'TAB-PROTAB2.4XL',
+    26 => 'TAB-PROTAB2XXL',
+    27 => 'TAB-PROTAB2XXL(4)',
+    28 => '(POV )?TAB-PROTAB2XXL(4)!',
+    29 => '(POV )?TAB NAVI7 3G M!',
+    30 => 'Tablet P',
+    31 => 'Tablet S',
+    32 => 'Tabra QAV801',
+    33 => 'TAB 7 3G V8',
+    34 => 'TAB 8 3G V8',
+    35 => 'TAB9 3G',
+    36 => 'TAB9 3G V8',
+    37 => 'TAB 10 3G V16',
+    38 => 'TAB 7i 3G',
+    39 => 'TAB 10Q',
+    40 => 'TAB09-410',
+    41 => 'TAB10-410',
+    42 => 'TAB07-485',
+    43 => 'TAB07-200',
+    44 => 'TAB9-200',
+    45 => 'TAB10-201',
+    46 => 'TAB210',
+    47 => 'TAB220',
+    48 => 'TAB224',
+    49 => 'TAB250',
+    50 => 'TAB275',
+    51 => 'TAB260',
+    52 => 'TAB264',
+    53 => 'TAB360',
+    54 => 'TAB364',
+    55 => 'TAB410',
+    56 => 'TAB411',
+    57 => 'TAB420',
+    58 => 'TAB424',
+    59 => 'TAB450',
+    60 => 'TAB460',
+    61 => 'TAB461',
+    62 => 'TAB464',
+    63 => 'TAB465EUK',
+    64 => 'TAB468',
+    65 => 'TAB469',
+    66 => 'TAB466EUK',
+    67 => 'TAB467',
+    68 => 'TAB462',
+  ),
+  '@TB' => 
+  array (
+    0 => 'TB07FTA',
+    1 => 'TB100',
+    2 => 'TB782B',
+    3 => 'TBD753B',
+    4 => 'TBDB763',
+    5 => 'TBDB863',
+    6 => 'TBDC1093',
+    7 => 'TBDG734',
+    8 => 'TBDG874',
+    9 => 'TBDG1073',
+    10 => 'TBQC1063',
+  ),
+  '@TC' => 
+  array (
+    0 => 'TCC8920 STB!',
+    1 => 'TCC893X!',
+    2 => 'TCC8935 HDMI!',
+    3 => 'TCC8975 STB!',
+    4 => 'TCC8920 EVM',
+    5 => 'TCC8925 HDMI DONGLE',
+    6 => 'TCC8930 STB EV',
+    7 => 'TCC8930 STB1',
+    8 => 'TCC8935 HDMI DONGLE',
+    9 => 'TCL ONE TOUCH 990',
+    10 => 'TC970',
+    11 => 'TC970 (Wi-Fi)',
+    12 => 'TC975',
+    13 => 'TC55',
+    14 => 'TC55CH',
+    15 => 'TC70',
+    16 => 'TC75',
+    17 => 'TCL!!',
+  ),
+  '@TD' => 
+  array (
+    0 => 'TD070VA1',
+    1 => 'TD600',
+    2 => 'TD-1010',
+    3 => 'TD506',
+  ),
+  '@TE' => 
+  array (
+    0 => 'Telechips M801 Evaluation Board',
+    1 => 'Telechips TCC8800 eMMC Evaluation Board',
+    2 => 'Telechips TCC8800 Evaluation Board',
+    3 => 'Telechips TCC8900 Evaluation Board',
+    4 => 'Telechips TCC8900 Evaluation Board (US)',
+    5 => 'Telechips TCC8902 Tablet-PC (DE)',
+    6 => 'Telechips TCC9300 Evaluation Board',
+    7 => 'Tegra!!',
+    8 => 'TECNO!!',
+    9 => 'Teclast A10',
+    10 => 'Teclast P76e!',
+    11 => 'Teclast P85!',
+    12 => 'Teclast X80h',
+    13 => 'tegav2',
+    14 => 'Tele2fon V3',
+    15 => 'Tele2fon v5',
+    16 => 'TELEFUNKEN Diamond TD1',
+    17 => 'Telpad Dual S',
+    18 => 'Telpad Quad S',
+    19 => 'Telpad QS',
+    20 => 'Tensent S9000',
+    21 => 'teXet X-alpha',
+    22 => 'teXet X-start',
+    23 => 'teXet iX-mini',
+    24 => 'teXet X-navi',
+    25 => 'TEXET TM-4677',
+    26 => 'teXet X-medium plus',
+    27 => 'teXet X-maxi qHD',
+    28 => 'TeamDRH ICS for GTablet',
+    29 => 'Telenor!!',
+  ),
+  '@TF' => 
+  array (
+    0 => 'TF101',
+    1 => 'TF101-WiMAX',
+    2 => 'TF201',
+    3 => 'tf201t',
+    4 => '(Transformer )?(Pad )?TF300(T|TG|TL)!',
+    5 => '(Transformer )?(Pad )?TF502(T)!',
+    6 => '(Transformer )?(Pad )?TF700(T|K)!',
+  ),
+  '@TH' => 
+  array (
+    0 => 'thor',
+    1 => 'Thunder S220',
+    2 => '(Cloudfone|CloudPad|Excite|Thrill)!!',
+    3 => '(KAZAM|Thunder|Tornado|Trooper)!!',
+    4 => 'ThinkPad( Tablet)?!',
+    5 => '(CJ-)?ThL!!',
+    6 => 'THRiVE',
+  ),
+  '@TI' => 
+  array (
+    0 => 'Tilapia',
+    1 => 'Titan TV S320',
+    2 => '(HW-|HUAWEI )?(TIT|TAG|NCE)!!',
+    3 => '(Karbonn|Titanium)!!',
+    4 => 'TI320-DU',
+    5 => 'TI320-DU TV',
+    6 => 'TizzBird!!',
+  ),
+  '@TL' => 
+  array (
+    0 => 'TLINK[0-9]{3,3}!!',
+  ),
+  '@TM' => 
+  array (
+    0 => 'TM400',
+    1 => 'TM105',
+    2 => 'TM105A',
+    3 => 'TM-3200R',
+    4 => 'TM-3204R',
+    5 => 'TM-3500',
+    6 => 'TM-4003',
+    7 => 'TM-4004',
+    8 => 'TM-4071',
+    9 => 'TM-4082R/X-driver',
+    10 => 'TM-4377',
+    11 => 'TM-4515',
+    12 => 'TM-4577',
+    13 => 'TM-4677',
+    14 => 'TM-4982',
+    15 => 'TM-5005',
+    16 => 'TM-5200',
+    17 => 'TM-5377',
+    18 => 'TM-7011',
+    19 => 'TM-7016',
+    20 => 'TM-7021',
+    21 => 'TM-7023',
+    22 => 'TM-7024',
+    23 => 'TM-7025',
+    24 => 'TM-7026',
+    25 => 'TM-7026 (revision 4)',
+    26 => 'TM-7037W',
+    27 => 'TM-7038W',
+    28 => 'TM-7041',
+    29 => 'TM-7043XD',
+    30 => 'TM-7047HD 3G',
+    31 => 'TM-7096',
+    32 => 'TM-7099',
+    33 => 'TM-7854',
+    34 => 'TM-8041HD',
+    35 => 'TM-8048 revision1',
+    36 => 'TM-8051',
+    37 => 'TM-9720',
+    38 => 'TM-9725',
+    39 => 'TM-9740',
+    40 => 'TM-9741',
+    41 => 'TM-9743W',
+    42 => 'TM-9747!',
+    43 => 'TM-9748 3G',
+    44 => 'TM-9750HD',
+    45 => 'TM-9751HD',
+    46 => 'TM-9757',
+    47 => 'TM-9757 3G rev1',
+    48 => 'TM-9767',
+    49 => 'TM-1058',
+    50 => 'tmn!!',
+  ),
+  '@TO' => 
+  array (
+    0 => 'Toro',
+    1 => 'Toro-VZW',
+    2 => 'TOUCAN Stick HD',
+    3 => 'TOUCAN Stick G4',
+    4 => 'Toucan Stick 4K',
+    5 => 'TOUCAN Stick 3D mk2',
+    6 => 'TOUCAN Stick 3D Pro',
+    7 => 'TOUCHBOOK7.0 3G',
+    8 => '(HP )?Touchpad!',
+    9 => 'Touch Pro 2',
+    10 => '(KAZAM|Thunder|Tornado|Trooper)!!',
+    11 => 'Torque',
+    12 => 'Touchlet X10.dual',
+    13 => 'tolino tab!!',
+    14 => 'TomTom Bridge',
+    15 => 'TomTom PRO 8275',
+    16 => 'TOOKY!!',
+    17 => 'TOSHIBA AC AND AZ',
+    18 => 'TOSHIBA FOLIO AND A',
+    19 => 'Tostab03',
+  ),
+  '@TP' => 
+  array (
+    0 => 'TPA60W',
+    1 => 'TPC-7151',
+  ),
+  '@TQ' => 
+  array (
+    0 => 'TQ150',
+  ),
+  '@TR' => 
+  array (
+    0 => 'Transformer',
+    1 => 'Transformer TF101(G)?!',
+    2 => '(Eee Pad )?Transformer Prime TF201!',
+    3 => 'Transformer TF201',
+    4 => 'Transformer TF201G',
+    5 => 'Transformer Prime',
+    6 => 'Transformer Prime TF300T',
+    7 => 'Transformer 300',
+    8 => 'Transformer Pad',
+    9 => '(Transformer )?(Pad )?TF300(T|TG|TL)!',
+    10 => '(Transformer )?(Pad )?TF502(T)!',
+    11 => 'Transformer Pad TF600T',
+    12 => '(Transformer )?(Pad )?TF700(T|K)!',
+    13 => 'Transformer (Pad )?Infinity!',
+    14 => 'TR720F',
+    15 => 'TR10CS1',
+    16 => 'TripNiCE Pyramid',
+    17 => '(KAZAM|Thunder|Tornado|Trooper)!!',
+    18 => 'Triumph',
+    19 => 'TRACER OXYGEN GS1',
+    20 => 'Trevi PHABLET 4C',
+    21 => 'Trevi PHABLET 5 S',
+    22 => 'TREQ!!',
+    23 => 'Trevi REVERSE 5.5Q',
+    24 => 'Trevi PHABLET 6 S',
+    25 => 'TRUE BEYOND 3G',
+  ),
+  '@TS' => 
+  array (
+    0 => '(AC|BC|LC|MT|RC|QS|VM|TS|OC)[0-9]{4,4}[A-Z]!!',
+    1 => 'TSP21',
+    2 => 'TSB CLOUD COMPANION;TOSHIBA AC AND AZ',
+  ),
+  '@TT' => 
+  array (
+    0 => 'TT101',
+  ),
+  '@TU' => 
+  array (
+    0 => 'TURBO DG2014',
+    1 => 'Turbo-X pi',
+    2 => 'Turbo-X Ice',
+    3 => 'Turbo-X Tablet Spice III',
+    4 => 'Turkcell!!',
+  ),
+  '@TV' => 
+  array (
+    0 => 'TVE9603I',
+    1 => 'TVPAD Slim K3409',
+  ),
+  '@TX' => 
+  array (
+    0 => 'TX201LA',
+    1 => 'TX201LAF',
+    2 => 'TX85',
+    3 => 'TX18',
+  ),
+  '@U1' => 
+  array (
+    0 => '(CUBE ?)?(K8|U1|U2|U3|U5|U6|U8|U9)[0-9]?GT!!',
+    1 => 'U1',
+    2 => 'U1203',
+  ),
+  '@U2' => 
+  array (
+    0 => '(CUBE ?)?(K8|U1|U2|U3|U5|U6|U8|U9)[0-9]?GT!!',
+    1 => 'U20(a|i|iv)!',
+  ),
+  '@U3' => 
+  array (
+    0 => '(CUBE ?)?(K8|U1|U2|U3|U5|U6|U8|U9)[0-9]?GT!!',
+  ),
+  '@U5' => 
+  array (
+    0 => '(CUBE ?)?(K8|U1|U2|U3|U5|U6|U8|U9)[0-9]?GT!!',
+  ),
+  '@U6' => 
+  array (
+    0 => '(CUBE ?)?(K8|U1|U2|U3|U5|U6|U8|U9)[0-9]?GT!!',
+  ),
+  '@U7' => 
+  array (
+    0 => 'U701',
+    1 => 'U701T',
+    2 => 'U702',
+    3 => 'U705',
+    4 => 'U705T',
+    5 => 'U705W',
+    6 => 'U707',
+    7 => 'U707T',
+    8 => 'U708',
+    9 => 'U7011',
+    10 => 'U7015',
+  ),
+  '@U8' => 
+  array (
+    0 => '(CUBE ?)?(K8|U1|U2|U3|U5|U6|U8|U9)[0-9]?GT!!',
+    1 => 'U8[0-9]{3,3}!!',
+    2 => 'U8220',
+  ),
+  '@U9' => 
+  array (
+    0 => '(CUBE ?)?(K8|U1|U2|U3|U5|U6|U8|U9)[0-9]?GT!!',
+    1 => 'U9[0-9]{3,3}!!',
+  ),
+  '@UL' => 
+  array (
+    0 => 'Ultra',
+    1 => 'Ultra Flare v2',
+    2 => 'Ultimix!!',
+    3 => 'Ultra Air',
+    4 => 'Ultra Charm',
+    5 => 'Ultra Energy',
+    6 => 'Ultra Energy Lite',
+    7 => 'Ultra Energy Plus',
+    8 => 'Ultra Latitude',
+    9 => 'Ultra Style',
+    10 => 'Ultra Wave',
+    11 => 'Ultimate10',
+    12 => 'Ultimate10-Android4.0',
+    13 => 'Ultimate 10',
+    14 => 'ultrafone!!',
+    15 => 'Ultym 5',
+    16 => 'Ultym 5L',
+    17 => 'Ultym 5.2',
+  ),
+  '@UM' => 
+  array (
+    0 => 'UM840',
+    1 => 'UMI!!',
+  ),
+  '@UN' => 
+  array (
+    0 => 'unknown M200-L09',
+    1 => 'UNO X8',
+    2 => 'UNO X10',
+    3 => 'Unusual!!',
+  ),
+  '@UO' => 
+  array (
+    0 => 'UOOGOU!!',
+  ),
+  '@UR' => 
+  array (
+    0 => 'URBANO PROGRESSO',
+  ),
+  '@US' => 
+  array (
+    0 => 'USCC ALCATEL one touch 909B',
+    1 => 'USCC ALCATEL one touch 988',
+    2 => '(HTC|PCD|USCC)?ADR[0-9]{4,4}!!',
+    3 => 'USCCADR[0-9]{4,4}!!',
+    4 => '(USCC-|KYOCERA-)?E[0-9]{4,4}!!',
+    5 => '(USCC-|KYOCERA-)?C[0-9]{4,4}!!',
+    6 => 'USCC-(LG)?US!!',
+    7 => 'Usmart!!',
+  ),
+  '@UT' => 
+  array (
+    0 => 'UTime!!',
+  ),
+  '@V ' => 
+  array (
+    0 => '(ZTE ?)?V ?[0-9]{3,3}!!',
+  ),
+  '@V-' => 
+  array (
+    0 => 'V-T100',
+  ),
+  '@V1' => 
+  array (
+    0 => 'V1 Viper',
+    1 => 'V1 Viper E',
+    2 => 'V1 Viper I',
+    3 => 'V1 Viper I4G',
+    4 => 'V1 Viper I4G PL',
+    5 => 'V1 Viper I4G TM',
+    6 => 'V1 Viper L',
+    7 => 'V1 ViperS',
+    8 => 'V1 Viper S4G',
+    9 => 'V1 Viper S4G TM',
+    10 => 'V11',
+    11 => 'V17HD',
+    12 => '(GIO-)?(GiONEE[- ])?V182!',
+    13 => '(GIO-)?(GiONEE[- ])?V185!',
+    14 => '(GIO-)?(GiONEE[- ])?V188!',
+    15 => 'V1',
+    16 => 'V1277',
+  ),
+  '@V2' => 
+  array (
+    0 => 'V2 Viper',
+    1 => 'V2 Viper I',
+    2 => 'V2 Viper I TM',
+    3 => 'V2 Viper I4G',
+    4 => 'V2 Viper S',
+    5 => 'V2 Viper X',
+    6 => 'V2 Viper X plus',
+  ),
+  '@V3' => 
+  array (
+    0 => 'v360 E1',
+  ),
+  '@V5' => 
+  array (
+    0 => 'V5U-simvalley SP-142',
+    1 => 'V55',
+  ),
+  '@V7' => 
+  array (
+    0 => 'V701s Core4',
+    1 => 'V711s Core4',
+    2 => 'V712 Core4',
+    3 => 'V719 3G',
+  ),
+  '@V8' => 
+  array (
+    0 => 'V801 Core4',
+    1 => 'V801s Core4',
+    2 => 'V811 Core4',
+    3 => 'V812 Core4',
+    4 => 'V813 Core4',
+    5 => 'V813s Core4',
+    6 => 'V818',
+    7 => 'V818mini',
+    8 => 'V819mini',
+    9 => 'V819 3G',
+    10 => 'V819i',
+    11 => 'V8000 USA Cricket',
+    12 => 'V8110',
+    13 => 'V8403',
+    14 => 'V8405',
+    15 => 'V8408',
+    16 => 'V8409',
+    17 => 'V8412',
+    18 => 'V8413',
+    19 => 'V8501',
+    20 => 'V8502',
+    21 => 'V8503',
+    22 => 'V8505',
+    23 => 'V8507',
+    24 => 'V8508',
+    25 => 'V8510',
+    26 => 'V8511',
+    27 => 'V8602',
+    28 => 'V8603',
+  ),
+  '@V9' => 
+  array (
+    0 => 'V99',
+    1 => 'V936',
+    2 => 'V971 Core4',
+    3 => 'V971s Core4',
+    4 => 'V972 Core4',
+    5 => 'V973 Core4',
+    6 => 'V975 Core4',
+    7 => 'V975i',
+    8 => 'V975m',
+    9 => 'V975m Core4',
+    10 => 'V975s Core4',
+    11 => 'V961',
+    12 => 'V9',
+    13 => 'V9S',
+    14 => 'V9e',
+    15 => 'V9e+',
+    16 => 'V9A',
+    17 => 'V9C',
+  ),
+  '@VA' => 
+  array (
+    0 => 'Vandroid S5E',
+    1 => 'Vandroid T1J',
+    2 => 'Vandroid T3-A',
+    3 => 'Vandroid T3i',
+    4 => 'Vandroid T',
+    5 => 'VAP430',
+  ),
+  '@VE' => 
+  array (
+    0 => 'vexpress a9',
+    1 => 'Ventana',
+    2 => 'Vendor Optimus',
+    3 => 'VEOLO',
+    4 => 'VEOLO2',
+    5 => 'Vega',
+    6 => 'VegaBean!',
+    7 => 'Venture',
+    8 => 'Venue!!',
+    9 => '(OV-|Overmax|Vertis)!!',
+    10 => 'VEGA NO.6',
+    11 => 'Verifone Carbon-8',
+    12 => 'verykool!!',
+    13 => 'Vertu Aster T',
+    14 => 'VERTU Ti',
+    15 => 'Venus V3 5570',
+  ),
+  '@VF' => 
+  array (
+    0 => 'VF685',
+    1 => 'VF695',
+    2 => 'VF-696',
+    3 => 'VF-795',
+    4 => 'VF-895N',
+    5 => 'VFD 300',
+    6 => 'VFD 900',
+    7 => 'VF-1397',
+    8 => 'VF-1497',
+  ),
+  '@VI' => 
+  array (
+    0 => 'VirtualBox!',
+    1 => 'victoriabay',
+    2 => 'Viva C701',
+    3 => 'Viva H701',
+    4 => 'Viva H701 LTE CZ',
+    5 => 'VivaH7LTE',
+    6 => 'VivaH8LTE',
+    7 => 'VivaH10LTE',
+    8 => 'Viva i7G',
+    9 => 'VIVA i7',
+    10 => 'Viva i10HD',
+    11 => 'Viva i701G TM',
+    12 => '(BLU|DASH|LIFE|NEO|STUDIO|VIVO)!!',
+    13 => 'VICTORY',
+    14 => 'Victory 2',
+    15 => 'Victory 3',
+    16 => 'VICTORY 4',
+    17 => 'Victory 5',
+    18 => 'Vibo-A688',
+    19 => 'VitMod ExtraLite 1.6.5.fullodex for HTC HD7 Pro',
+    20 => 'Vivid 4G',
+    21 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    22 => 'VIBE X2 (X2)',
+    23 => 'VIBE X3',
+    24 => 'VIBE Z2 Pro (K920)',
+    25 => 'Vibrantmtd',
+    26 => 'Vibrant T959',
+    27 => 'victorys s8',
+    28 => 'Victorys V8',
+    29 => 'Videocon!!',
+    30 => 'ViewSonic-V350',
+    31 => 'ViewSonic V500',
+    32 => 'ViewPhone3',
+    33 => 'ViewPad 4',
+    34 => 'ViewSonic-ViewPad4',
+    35 => 'ViewPad7',
+    36 => 'ViewPad 7D',
+    37 => 'ViewPad 7D Pro',
+    38 => 'ViewSonic-ViewPad7e',
+    39 => 'ViewPad7e',
+    40 => 'ViewPad 7Q',
+    41 => 'ViewPad 7Q Plus',
+    42 => 'ViewPad 7Q Pro',
+    43 => 'ViewPad7X',
+    44 => 'ViewPad 8E',
+    45 => 'ViewPad 9Q',
+    46 => 'ViewPad 10e',
+    47 => 'ViewPad 10S',
+    48 => 'ViewPad 70Q',
+    49 => 'ViewPad97A',
+    50 => 'ViewPad97a K1',
+    51 => 'ViewPad97a Pro',
+    52 => 'ViewPad 97Q',
+    53 => 'ViewPad 100Q',
+    54 => 'ViewPad 100N Pro',
+    55 => 'ViewPad 701N',
+    56 => 'ViewPad i7D',
+    57 => 'ViewPad E100',
+    58 => 'ViewSonic VB733',
+    59 => 'VINUS!!',
+    60 => '(BBG-|VIV-)?vivo!!',
+    61 => 'Viettel i5',
+    62 => 'Viettel I8',
+    63 => 'VIETTEL V8404!',
+    64 => 'Viettel V8410',
+    65 => 'VIETTEL V8411',
+    66 => 'Viettel V8502',
+    67 => 'VIETTEL V8506',
+    68 => 'VIETTEL V8509',
+  ),
+  '@VK' => 
+  array (
+    0 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    1 => 'VK410',
+    2 => 'VK700',
+    3 => 'VK810 4G',
+    4 => 'VK815',
+  ),
+  '@VL' => 
+  array (
+    0 => 'VL-[0-9]{3,3}!!',
+  ),
+  '@VM' => 
+  array (
+    0 => 'VMware Virtual Platform',
+    1 => '(AC|BC|LC|MT|RC|QS|VM|TS|OC)[0-9]{4,4}[A-Z]!!',
+    2 => 'VM670',
+  ),
+  '@VN' => 
+  array (
+    0 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+  ),
+  '@VO' => 
+  array (
+    0 => 'Vogue',
+    1 => 'Volantis',
+    2 => 'Volantisg',
+    3 => 'VOYAGER DG300',
+    4 => 'VOYAGER2 DG310',
+    5 => 'Vox',
+    6 => 'Vortex',
+    7 => 'vollo Vi86',
+    8 => 'VOTO GT2++',
+    9 => 'VOTO GT7',
+    10 => 'VOTO GT11',
+    11 => 'VOTO GT11 Pro',
+    12 => 'VOTO GT18',
+    13 => 'VOTO V5',
+    14 => 'VOTO VT868',
+    15 => 'VOTO VT888',
+    16 => 'VOTO VT898',
+    17 => 'VOTO VT898S',
+    18 => 'VOTO W5300',
+    19 => 'VOTO X2',
+    20 => 'VOYO A15',
+    21 => 'voyo X6',
+    22 => 'Vodafone!!',
+  ),
+  '@VS' => 
+  array (
+    0 => 'VS[0-9]{3,3}!!',
+    1 => 'VS TOUCH!!',
+    2 => 'VSD220',
+    3 => 'VSD221',
+    4 => 'VSD224',
+    5 => 'VSD231',
+    6 => 'VSD241',
+    7 => 'Vsun HEXA',
+    8 => 'VSUN ILLUSION',
+    9 => 'VSUN RACE',
+    10 => 'Vsun SPARK',
+    11 => 'VSUN TOUCH',
+    12 => 'Vsun D3B',
+    13 => 'Vsun H3',
+    14 => 'Vsun H9',
+    15 => 'Vsun i1',
+    16 => 'Vsun i5',
+    17 => 'Vsun i9',
+    18 => 'Vsun V9',
+  ),
+  '@VT' => 
+  array (
+    0 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    1 => 'VT6078',
+    2 => 'VT75C',
+    3 => 'VT77C',
+    4 => 'VT79C',
+    5 => 'VT87C+',
+    6 => 'VTAB1008',
+    7 => 'VTAB3010',
+  ),
+  '@VW' => 
+  array (
+    0 => 'VW RCBKK1',
+  ),
+  '@VX' => 
+  array (
+    0 => 'VX-100',
+    1 => 'VX580A',
+    2 => 'VX580W',
+    3 => 'VX610A',
+  ),
+  '@W1' => 
+  array (
+    0 => 'W10',
+    1 => 'W10 V2.0',
+    2 => 'w13pro',
+    3 => 'W13PRO V2.0',
+    4 => 'W17PRO(Dualcore)',
+    5 => 'W17PRO JB Dualcore',
+    6 => 'W100',
+  ),
+  '@W2' => 
+  array (
+    0 => 'W200',
+    1 => 'W22PRO',
+    2 => 'W22PRO 3G',
+    3 => 'W27(Dualcore)',
+    4 => 'W28(Dualcore)',
+    5 => 'W20',
+  ),
+  '@W3' => 
+  array (
+    0 => 'W337',
+    1 => 'W3620',
+    2 => 'W30(QuadCore)',
+    3 => 'w30hd(QuadCore)',
+    4 => 'W30HDPRO',
+  ),
+  '@W4' => 
+  array (
+    0 => 'w42(QuadCore)',
+  ),
+  '@W5' => 
+  array (
+    0 => 'W5510',
+  ),
+  '@W6' => 
+  array (
+    0 => 'W606',
+    1 => 'W619',
+    2 => 'W686',
+    3 => 'W626',
+    4 => 'W6350',
+    5 => 'W6360',
+    6 => 'W6500',
+    7 => 'W6620',
+    8 => 'W6',
+    9 => 'W6HD ICS',
+    10 => 'W6HD ICS FULL',
+  ),
+  '@W7' => 
+  array (
+    0 => 'W711',
+    1 => 'W757',
+    2 => 'W700',
+    3 => 'W732',
+  ),
+  '@W8' => 
+  array (
+    0 => 'W820',
+    1 => '(GIO-)?(GiONEE[- ])?W800!',
+    2 => 'W800',
+    3 => 'W806',
+    4 => 'W808',
+    5 => 'W810',
+    6 => 'W880',
+    7 => 'W8',
+    8 => 'W8 beyond',
+  ),
+  '@W9' => 
+  array (
+    0 => 'W900',
+    1 => 'W990',
+  ),
+  '@WA' => 
+  array (
+    0 => '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!',
+    1 => 'WA-U420D',
+    2 => 'WALSUN S1 Pro',
+    3 => 'WALSUN S2',
+    4 => 'Walton Primo',
+    5 => 'WALTON Primo C1',
+    6 => 'WALTON Primo-D1',
+    7 => 'Walton F2',
+    8 => 'Walton Primo F2',
+    9 => 'WALTON Primo-G1',
+    10 => 'WALTON Primo G1',
+    11 => 'Walton Primo H1',
+    12 => 'Walton Primo H3',
+    13 => 'WALTON H3',
+    14 => 'WALTON Primo HMmini',
+    15 => 'WALTON Primo-N1',
+    16 => 'Walton Primo R1',
+    17 => 'Walton RM2',
+    18 => 'WALTON Primo S3',
+    19 => 'Walton Primo VX+',
+    20 => '(WALTON )?Primo-X1!',
+    21 => 'Walpad 8b',
+    22 => 'Walpad 8x',
+    23 => 'Walpad 10x',
+    24 => 'Walpad C',
+    25 => 'Walpad G',
+    26 => 'Walpad G2',
+    27 => 'Walpad G2i',
+    28 => 'Walpad M',
+    29 => 'WAX',
+  ),
+  '@WE' => 
+  array (
+    0 => 'WellcoM-A86',
+    1 => 'WellcoM-A88',
+    2 => 'WellcoM-A89',
+    3 => 'WellcoM-A89-Plus',
+    4 => 'WellcoM-A99',
+    5 => 'WellcoM-A800',
+    6 => 'WEXLER. ZEN 5',
+    7 => 'WEXLER TAB7ID',
+    8 => 'WEXLER-TAB-7iS',
+    9 => 'WEXLER-TAB-7T',
+    10 => 'WEXLER.BOOK T7008',
+  ),
+  '@WF' => 
+  array (
+    0 => 'WF7C',
+  ),
+  '@WH' => 
+  array (
+    0 => 'WHAM WG40',
+  ),
+  '@WI' => 
+  array (
+    0 => 'Wingray',
+    1 => 'Wildfire S!',
+    2 => 'Wildfire!',
+    3 => 'Wiko Cink Five',
+    4 => 'Wiko Cink Peax',
+    5 => 'WIKO-CINK PEAX',
+    6 => 'Wiko Cink Slim',
+    7 => 'WIKO-CINK SLIM',
+    8 => 'Wiko Rainbow',
+    9 => 'Wiko Stairway',
+    10 => 'Wileyfox Spark',
+    11 => 'Wileyfox Spark +',
+    12 => 'Wileyfox Spark X',
+    13 => 'Wileyfox Storm',
+    14 => 'Wileyfox Swift',
+    15 => 'Wink City S',
+  ),
+  '@WL' => 
+  array (
+    0 => 'WL-101GQC',
+  ),
+  '@WM' => 
+  array (
+    0 => 'WM8650',
+    1 => 'WM8650-mid',
+    2 => 'wm8710-tvbox',
+    3 => 'WM8850-mid',
+  ),
+  '@WO' => 
+  array (
+    0 => 'Woxter!!',
+  ),
+  '@WS' => 
+  array (
+    0 => 'WS171',
+  ),
+  '@WT' => 
+  array (
+    0 => 'WT[0-9]{2,2}[a-z]!!',
+  ),
+  '@WX' => 
+  array (
+    0 => 'WX04K',
+    1 => 'WX06K',
+    2 => 'WX10K',
+    3 => 'WX[0-9]{3,3}!!',
+    4 => 'WX04SH',
+    5 => 'WX05SH',
+    6 => 'Wxt Tab PC 65CXi',
+  ),
+  '@X-' => 
+  array (
+    0 => '(Explay|X-tremer|ActiveD|Informer|Surfer)!!',
+    1 => 'X-treme PQ11',
+    2 => 'X-treme PQ15',
+    3 => 'X-tremePQ22',
+    4 => 'X-treme-PQ30',
+    5 => 'X-basic',
+    6 => 'X-basic2',
+    7 => 'X-maxi',
+    8 => 'X-medium',
+  ),
+  '@X0' => 
+  array (
+    0 => 'X007D',
+    1 => 'X008D',
+    2 => 'X008DA',
+    3 => 'X008DB',
+    4 => 'X008DC',
+    5 => 'X009D',
+    6 => 'X009DA',
+    7 => 'X009DB',
+    8 => 'X009DD',
+    9 => 'X00AD',
+    10 => 'X00ADC',
+    11 => 'X00BD',
+    12 => 'X00DD',
+    13 => 'X00DDA',
+    14 => 'X00DDB',
+    15 => 'X013D',
+    16 => 'X013DA',
+    17 => 'X013DB',
+    18 => 'X013DC',
+    19 => 'X015D',
+    20 => 'X014D',
+    21 => 'X002',
+    22 => 'X003',
+    23 => 'X005',
+    24 => 'X008',
+  ),
+  '@X1' => 
+  array (
+    0 => 'X1 Soul',
+    1 => 'X1 Soul Mini',
+    2 => 'X1 mini Soul',
+    3 => 'X1 Soul Xtreme',
+    4 => 'X1 Xtreme Mini',
+    5 => 'X1',
+    6 => 'X1 7.0',
+    7 => 'X1 atom',
+    8 => 'X1 atom L',
+    9 => 'X1 Atom s',
+    10 => 'X1 Beats',
+    11 => 'X1 Grand',
+    12 => 'X1 mini',
+    13 => 'X1 Selfie',
+    14 => 'X1010',
+    15 => 'X10(a|i|iv|i-o|s)?$!',
+    16 => 'X10 ?(Mini ?Pro)$!',
+    17 => 'X10 ?(Mini)$!',
+    18 => 'X10H(G3C5)',
+    19 => 'X10HD 3G(M6K6)',
+    20 => 'X16 Plus(D3A5)',
+    21 => 'X16 Power(D6F7)',
+    22 => 'X16 PRO(D6F8)',
+    23 => 'X16HD (K3J3)',
+    24 => 'X16HD 3G(M5J4)',
+    25 => 'X16HD 3G(M5J5)',
+    26 => 'X16HD 3G(M5J5',
+    27 => 'X16HD 3G(M5J6)',
+  ),
+  '@X2' => 
+  array (
+    0 => 'X2 Soul',
+    1 => 'X2 Soul Lite',
+    2 => 'X2 Soul Lite TM',
+    3 => 'X2 Soul Mini',
+    4 => 'X2 Soul Mini TM',
+    5 => 'X2 Soul PRO',
+    6 => 'X2 Soul Style',
+    7 => 'X2 Soul Style TM',
+    8 => 'X2 Soul Style Plus',
+    9 => 'X2 Soul Xtreme',
+    10 => 'X2 Twin',
+  ),
+  '@X3' => 
+  array (
+    0 => 'X3 Soul',
+    1 => 'X3 Soul Lite',
+    2 => 'X3 Soul Lite TM',
+    3 => 'X3 Soul mini',
+    4 => 'X3 Soul PLUS',
+    5 => 'X3 Soul PRO',
+    6 => 'X3 Soul Style',
+    7 => 'X325a',
+    8 => 'X3-Ice MIUI XT720 Memorila Classics',
+  ),
+  '@X4' => 
+  array (
+    0 => 'X403',
+  ),
+  '@X5' => 
+  array (
+    0 => 'X550',
+    1 => 'X515d',
+    2 => 'X515e',
+    3 => 'X525a',
+    4 => 'X527',
+    5 => 'X505',
+    6 => 'X506',
+    7 => 'X506S',
+    8 => 'X507Q',
+  ),
+  '@X7' => 
+  array (
+    0 => 'X710d',
+    1 => 'X720D',
+    2 => 'X710E',
+    3 => 'X7G',
+    4 => 'X720',
+    5 => 'X70(C6F9)',
+    6 => 'X70 3G (C5D9)',
+    7 => 'X70 R(C7F9)',
+    8 => 'X708S',
+  ),
+  '@X8' => 
+  array (
+    0 => '(GIO-)?(GiONEE[- ])?X817!',
+    1 => 'X8',
+    2 => 'X80(C4M5)',
+    3 => 'X80h',
+    4 => 'X80h(FB5M)',
+    5 => 'X80h(FB6M)',
+    6 => 'X80HD',
+    7 => 'X80HD(G2N3)',
+    8 => 'X80HD(G2N4)',
+    9 => 'X80HD(G2N5)',
+    10 => 'X80HD(G2N6)',
+    11 => 'X80HD(G2N8)',
+    12 => 'X80HD(G2N9)',
+    13 => 'X80HD(G2N9',
+    14 => 'X80 Plus(H5C5)',
+    15 => 'X80 Plus(H6C3)',
+    16 => 'X80 Plus(H6C3',
+    17 => 'X80 Power(B2N3)',
+    18 => 'X80 Power(B2N4)',
+    19 => 'X80 Power(B2N6)',
+    20 => 'X80 Pro(E3E6)',
+    21 => 'X80 Pro(E3E7)',
+    22 => 'X80 Pro(E3E8)',
+    23 => 'X81-8G3D',
+    24 => 'X89 (E7ED)',
+    25 => 'X89HD (H21C)',
+  ),
+  '@X9' => 
+  array (
+    0 => 'X920e',
+    1 => 'X9',
+    2 => 'X903',
+    3 => 'X903S',
+    4 => 'X905',
+    5 => 'X906',
+    6 => 'X907',
+    7 => 'X909',
+    8 => 'X909T',
+    9 => 'X9000',
+    10 => 'X9006',
+    11 => 'X9007',
+    12 => 'X9009',
+    13 => 'X9015',
+    14 => 'X9017',
+    15 => 'X9070',
+    16 => 'X9076',
+    17 => 'X9077',
+    18 => 'X9079',
+    19 => 'X90HD (M2PC)',
+    20 => 'X98 3G(HKC1)',
+    21 => 'X98 3G(HKC2)',
+    22 => 'X98 3G(HKC3',
+    23 => 'X98 3G(HKC3)',
+    24 => 'X98 3G(lite)',
+    25 => 'X98 Air(C5KN)',
+    26 => 'X98 Air Smile',
+    27 => 'X98 Air 3G',
+    28 => 'X98 Air 3G(Smile)',
+    29 => 'X98 Air 3G(C5J5)',
+    30 => 'X98 Air 3G(C5J6)',
+    31 => 'X98 Air 3G(C5J8)',
+    32 => 'X98 Air 3G(C6J6)',
+    33 => 'X98 Air 3G(C6J6',
+    34 => 'X98 Air 3G(C8J6)',
+    35 => 'X98 Air 3G(C8J7)',
+    36 => 'X98 Air 3G(C9J6)',
+    37 => 'X98 Air 3G(C9J7)',
+    38 => 'X98 Air 3G(C9J8)',
+    39 => 'X98 Air II',
+    40 => 'X98 Air II(HG5N)',
+    41 => 'X98 Air II(HG6M)',
+    42 => 'X98 Air II(HG7N)',
+    43 => 'X98 Air II(HG8N)',
+    44 => 'X98 Air II(HG9M)',
+    45 => 'X98 Air II(HG9N)',
+    46 => 'X98 Air II(HG9N',
+    47 => 'X98 Air ? HG9M',
+    48 => 'X98 Air Ⅱ HG9M',
+    49 => 'X98 Air II(Smile)',
+    50 => 'X98 Air III',
+    51 => 'X98 Air III(M5C5)',
+    52 => 'X98 Air III(M5C5',
+    53 => 'X98 Air III(M5C6)',
+    54 => 'X98 Plus',
+    55 => 'X98 Plus(A6C7)',
+    56 => 'X98 Plus(A5C8)',
+    57 => 'X98 Plus 3G(A6C9)',
+    58 => 'X98 Plus II (C2D4)',
+    59 => 'X98 Plus II (C2D6)',
+    60 => 'X98 Plus II (C2E3)',
+    61 => 'X98 Pro',
+    62 => 'X98 Pro (K9C6)',
+    63 => 'X98 Pro (K9C6',
+  ),
+  '@XA' => 
+  array (
+    0 => 'Xamarin Android Player!',
+  ),
+  '@XC' => 
+  array (
+    0 => 'XCD 28',
+    1 => 'XCD35',
+  ),
+  '@XD' => 
+  array (
+    0 => '(NMP|MBR|XDK|XDS|XMP)\\-!!',
+    1 => 'XDP-100R',
+  ),
+  '@XE' => 
+  array (
+    0 => 'XELIO',
+    1 => 'XELIO7PHONETAB',
+    2 => 'Xelio 7 pro',
+    3 => 'XELIO7PRO',
+    4 => 'XELIO10 QUAD',
+    5 => 'XELIO10 PLUS 3G',
+    6 => 'XELIO10EXTREME',
+    7 => 'Xelio 10 Pro',
+    8 => 'Xelio10Pro',
+    9 => 'XELIOPT2',
+    10 => 'XelioPT2Pro',
+    11 => 'Xelio PT4 Pro',
+    12 => 'XELIO P900A',
+    13 => 'Xenta-TAB07-210',
+    14 => 'Xenta-TAB07-211',
+    15 => 'Xenta TAB07-200',
+    16 => 'Xenta TAB08-200',
+    17 => 'Xenta TAB08-201-3G',
+    18 => 'Xenta TAB9-200',
+    19 => 'Xenta TAB09-211',
+    20 => 'Xenta TAB10-211',
+    21 => 'Xenta TAB10-201',
+    22 => 'Xenta TAB13-201',
+  ),
+  '@XI' => 
+  array (
+    0 => 'Xiaomi M1',
+    1 => 'Xiaomi MI-2S',
+    2 => 'xiaomi M3',
+    3 => 'Xiaomi Mi 4',
+    4 => 'xiaomi M4',
+    5 => 'XIAOMI MI 4W',
+    6 => 'Xiaomi M5',
+    7 => 'Xiaomi Redmi',
+    8 => 'Xiaomi Redmi 1s',
+    9 => 'Xiaomi Redmi One S',
+    10 => 'Xiaomi Note 4G',
+    11 => 'Xiaomi Note2',
+    12 => 'Xiaomi Redmi Note 3',
+    13 => '(Xiaomi )?20130(22|23)!',
+  ),
+  '@XL' => 
+  array (
+    0 => 'XL39h',
+    1 => 'Xlife-348E+',
+    2 => 'Xlife-350',
+    3 => 'Xlife-364 3G+',
+    4 => 'Xlife-405',
+    5 => 'Xlife-410 3G',
+    6 => 'Xlife-415',
+    7 => 'Xlife-431Q',
+    8 => 'Xlife-431Q Lite',
+    9 => 'Xlife-480q',
+    10 => 'Xlife-481q',
+    11 => 'Xlife-482q',
+    12 => 'Xlife-514Q',
+    13 => 'Xlife-515Q',
+    14 => 'Xlife-M5q+',
+    15 => 'Xlife-M44Q',
+    16 => 'Xlife-Electro55HD',
+    17 => 'Xlife-Ezy',
+    18 => 'Xlife-Victor4',
+  ),
+  '@XM' => 
+  array (
+    0 => '(NMP|MBR|XDK|XDS|XMP)\\-!!',
+    1 => 'XM50h',
+    2 => 'XM50t',
+  ),
+  '@XO' => 
+  array (
+    0 => 'XOOM',
+    1 => 'XOOM 2!',
+    2 => 'XOOM MZ606',
+    3 => 'Xoom Wifi',
+    4 => 'Xoom LTE',
+    5 => 'Xoom 3G',
+    6 => 'XO Learning tablet',
+    7 => '(XOLO )?[ABQX][0-9]{3,4}!!',
+    8 => 'XOLO One',
+    9 => 'XOLO One16',
+    10 => 'XOLO One HD',
+    11 => 'XOLO One LFC',
+    12 => 'XOLO Play',
+    13 => 'XOLO PLAY T1000',
+    14 => 'XOLO T1000',
+    15 => 'Xolo QC800',
+  ),
+  '@XP' => 
+  array (
+    0 => 'Xperia Z Ultra',
+    1 => 'XPRESS PRO',
+    2 => 'Xperia!!',
+    3 => '(Symphony|Xplorer)!!',
+    4 => 'xPAD-70',
+  ),
+  '@XT' => 
+  array (
+    0 => 'Xtreme X2',
+    1 => 'XT751',
+    2 => 'XT[0-9]{3,3}!!',
+    3 => 'xt880b',
+    4 => '(Hisense )?(LED[0-9]{2,2}(G|K|L|EC|XT)[0-9]{2,3})!',
+    5 => 'Xteam Smartpad 810c',
+    6 => 'Xteam 4.8 Smartpad 810c',
+    7 => 'XT[0-9]{3,4}!!',
+    8 => 'Xtab1081HD',
+    9 => 'Xtreme V10',
+    10 => 'Xtreme V10i',
+    11 => 'Xtreme V12',
+    12 => 'Xtreme V15',
+    13 => 'Xtreme V20',
+    14 => 'Xtreme V21',
+    15 => 'Xtreme V22',
+    16 => 'Xtreme V25',
+    17 => 'Xtreme-V30',
+    18 => 'Xtreme V40i',
+    19 => 'Xtreme V44',
+    20 => 'xTAB-7X',
+    21 => 'xTAB-9',
+    22 => 'xTAB-70!',
+    23 => 'xTAB-100!',
+    24 => 'Xtouch X405',
+    25 => 'Xtreamer Mobile AiKi',
+    26 => 'Xtreamer Mobile AiKi a7*',
+    27 => 'Xtreamer Mobile Aiki5s',
+    28 => 'Xtreamer Joyz',
+    29 => 'Xtreamer Wonder',
+  ),
+  '@XW' => 
+  array (
+    0 => 'XW-I8',
+  ),
+  '@Y2' => 
+  array (
+    0 => 'Y2',
+  ),
+  '@YD' => 
+  array (
+    0 => 'YD201',
+    1 => 'YD202',
+    2 => 'YD203',
+    3 => 'YD206',
+  ),
+  '@YE' => 
+  array (
+    0 => 'Yellowstone',
+    1 => '(Andy|Yezz)!!',
+  ),
+  '@YO' => 
+  array (
+    0 => 'youwave custom',
+    1 => 'YOGA Tablet!!',
+  ),
+  '@YP' => 
+  array (
+    0 => 'YPY-72SIM',
+    1 => 'YPY-73G',
+    2 => 'Ypy 7 - TB07FTA',
+    3 => 'YPY 07FTA',
+    4 => 'YPY 07FTAB',
+    5 => 'YPY 07FTAB PA',
+    6 => 'YPY 07FTB',
+    7 => 'YPY 07FTBF',
+    8 => 'Ypy 7 - TB07STA',
+    9 => 'YPY 07STB',
+    10 => 'YPY 07STBF',
+    11 => 'YPY 10FTA',
+    12 => 'YPY10FTA',
+    13 => 'YPY 10FTB',
+    14 => 'YPY 10FTBF',
+    15 => 'YPY 10STB',
+    16 => 'YPY 10STBF',
+    17 => 'YPY AB7D',
+    18 => 'YPY AB7DC',
+    19 => 'YPY AB10D',
+    20 => 'YPY AB10DC',
+    21 => 'YPY ABXD',
+    22 => 'YPY J213',
+    23 => 'YPY S350',
+    24 => 'YPY S350 PLUS',
+    25 => 'YPY S400',
+    26 => 'YPY S405',
+    27 => 'YPY S450',
+    28 => 'YPY S460',
+    29 => 'YPY S500',
+    30 => 'YPY TQ7',
+    31 => 'YP-G!!',
+    32 => 'YP712',
+  ),
+  '@YU' => 
+  array (
+    0 => 'yukkabeach',
+    1 => 'YU4711',
+    2 => 'YU5010',
+    3 => 'YU5010A',
+    4 => 'YU5050',
+    5 => 'YUREKA',
+    6 => 'YU5200',
+    7 => 'YUreka+',
+    8 => 'YU5510',
+    9 => 'YU5510A',
+    10 => 'YU5530',
+    11 => 'YU 6000',
+    12 => 'YUSUN E98',
+    13 => 'YUSUN L71',
+    14 => 'YUSUN L88',
+    15 => 'YUSUN LA2-T',
+    16 => 'YUSUN LA2 T',
+    17 => 'YUSUN LA2-T1',
+    18 => 'YUSUN LA2 T1',
+    19 => 'YUSUN LA2-W',
+    20 => 'YUSUN LA2 W1',
+    21 => 'YUSUN LA5-W',
+    22 => 'YUSUN T22',
+    23 => 'YUSUN-T22',
+    24 => 'YUSUN T29',
+    25 => 'YUSUN T30',
+    26 => 'YUSUN T31',
+    27 => 'YUSUN T35!',
+    28 => 'YUSUN T50',
+    29 => 'YUSUN T85',
+    30 => 'YUSUN W35',
+    31 => 'YUSUN W90',
+    32 => 'YUSUN W91',
+    33 => 'YUSUN W306',
+    34 => 'yusun W702',
+    35 => 'YUSUN W706',
+    36 => 'YUSUN W708',
+    37 => 'YUSUN - W 800',
+    38 => 'YUSUN--W 800',
+    39 => 'YUSUN W808',
+    40 => 'YUSUN -- W 900',
+  ),
+  '@YX' => 
+  array (
+    0 => 'YX-YUSUN E80',
+    1 => 'YX-YUSUN E89',
+    2 => 'YX-YUSUN E96',
+  ),
+  '@Z0' => 
+  array (
+    0 => 'Z002',
+    1 => 'Z007',
+    2 => 'Z008',
+    3 => 'Z008D',
+    4 => 'Z00A',
+    5 => 'Z00AD',
+    6 => 'Z00ADA',
+    7 => 'Z00ADB',
+    8 => 'Z00AS',
+    9 => 'Z00D',
+    10 => 'Z00ED',
+    11 => 'Z00EDB',
+    12 => 'Z00LD',
+    13 => 'Z00LDC',
+    14 => 'Z00LDD',
+    15 => 'Z00MD',
+    16 => 'Z00RD',
+    17 => 'Z00TD',
+    18 => 'Z00TDA',
+    19 => 'Z00WD',
+    20 => 'Z011D',
+    21 => 'Z011DD',
+    22 => 'Z00UD',
+    23 => 'Z00UDA',
+    24 => 'Z00UDB',
+    25 => 'Z00UDC',
+    26 => 'Z00UDH',
+    27 => 'Z00SD',
+    28 => 'Z00VD',
+    29 => 'Z00XS',
+    30 => 'Z00XSA',
+    31 => 'Z00XSB',
+    32 => 'Z010D',
+    33 => 'Z010DA',
+    34 => 'Z010DB',
+    35 => 'Z010DD',
+    36 => 'Z012D',
+    37 => 'Z012DA',
+    38 => 'Z012DB',
+    39 => 'Z012DC',
+    40 => 'Z012DE',
+    41 => 'Z012S',
+    42 => 'Z016D',
+    43 => 'Z016S',
+    44 => 'Z017D',
+    45 => 'Z017DA',
+    46 => 'Z017DB',
+    47 => 'Z017DC',
+    48 => 'Z01BD',
+    49 => 'Z01BDA',
+    50 => 'Z01BDB',
+    51 => 'Z01BDC',
+    52 => 'Z01BS',
+    53 => 'Z01FD',
+    54 => 'Z01HD',
+    55 => 'Z01HDA',
+    56 => 'Z00YD',
+  ),
+  '@Z1' => 
+  array (
+    0 => '(BB )?Z10$!',
+    1 => 'Z1-H39LW',
+    2 => '(HUAWEI )?(CRR|LON|MATE|MHA|MT1|MT2|MT7|M200|NXT|Z100)!!',
+    3 => 'Z1i',
+  ),
+  '@Z2' => 
+  array (
+    0 => 'Z2 Plus',
+    1 => 'Z282 C91',
+  ),
+  '@Z3' => 
+  array (
+    0 => '(BB )?Z30$!',
+    1 => 'Z30Aire',
+    2 => 'Z30Dart',
+    3 => 'Z30Lite',
+    4 => 'Z30PACE',
+  ),
+  '@Z4' => 
+  array (
+    0 => 'Z4',
+    1 => 'Z40Lite+',
+    2 => 'Z40Pro',
+    3 => 'Z4OPro',
+    4 => 'Z40ProLite',
+    5 => 'Z4OProLite',
+    6 => 'Z40QStar',
+    7 => 'Z41 AIRE',
+    8 => 'Z41Aire',
+    9 => 'Z41Lite+',
+    10 => 'Z42 Nova',
+    11 => 'Z45 Amaze',
+    12 => 'Z45 Dazzle',
+    13 => 'Z45 Nova',
+    14 => 'Z45 Nova+',
+    15 => 'Z45 Quad',
+    16 => 'Z45Q Star',
+    17 => 'Z45Q Star+',
+    18 => 'Z4 mini',
+  ),
+  '@Z5' => 
+  array (
+    0 => 'Z520e',
+    1 => 'Z520m',
+    2 => 'Z50 Nova',
+    3 => 'Z50Pro',
+    4 => 'Z50 Quad',
+    5 => 'Z50Q Lite',
+    6 => 'Z50Q Star',
+    7 => 'Z51 blaze',
+    8 => 'Z51 Nova',
+    9 => 'Z51 Nova+',
+    10 => 'Z51 PUNCH',
+    11 => 'Z51 Quad',
+    12 => 'Z51Q Star',
+    13 => 'Z52 Inspire',
+    14 => 'Z52 Thunder',
+    15 => 'Z52 Thunder+',
+  ),
+  '@Z7' => 
+  array (
+    0 => 'Z71',
+    1 => 'Z710',
+    2 => 'Z710e',
+    3 => 'Z715e',
+  ),
+  '@ZA' => 
+  array (
+    0 => 'Zaffire 785',
+    1 => 'Zaffire 970',
+    2 => 'ZA400',
+    3 => 'ZA402',
+    4 => 'ZA450',
+    5 => 'ZA451',
+    6 => 'ZA459',
+    7 => 'ZA500',
+    8 => 'ZA501',
+    9 => 'ZA705',
+    10 => 'ZA935',
+    11 => 'ZA940',
+    12 => 'ZA945',
+    13 => 'ZA950',
+    14 => 'ZA955',
+    15 => 'ZA990',
+    16 => 'ZA966',
+    17 => 'ZA977',
+    18 => 'ZA985',
+    19 => 'ZA987',
+  ),
+  '@ZB' => 
+  array (
+    0 => 'ZB551KL',
+    1 => 'ZBOX-ID18',
+    2 => 'ZBOX-ID81',
+  ),
+  '@ZE' => 
+  array (
+    0 => 'ZenWatch',
+    1 => 'ZenWatch 2',
+    2 => 'Zenith',
+    3 => 'Zenfone 5 LTE',
+    4 => 'ZenFone 2',
+    5 => 'ZenFone 2E',
+    6 => 'ZEN Touch 2',
+    7 => '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!',
+    8 => 'ZEN 4.5',
+    9 => 'ZEN 4.7',
+    10 => 'ZEN 5+',
+    11 => 'ZENITHINK C94!',
+    12 => 'Zen PO neo',
+    13 => 'ZEN U1',
+    14 => 'ZEN U4',
+    15 => 'ZEN U5',
+    16 => 'ZEN 303 3G',
+  ),
+  '@ZI' => 
+  array (
+    0 => 'Zii!!',
+    1 => 'Zio P2',
+    2 => 'Zio',
+    3 => 'ZiiLABS ViewBook 730',
+    4 => 'ZIGO EON5I',
+    5 => 'Zigo Eon6i',
+    6 => 'Zigo Eon7i',
+    7 => 'Zigo Eon52i',
+    8 => 'Zigo Eon 53',
+    9 => 'Zigo Nebula6 9',
+    10 => 'Zigo Nebula Tab 7.1',
+    11 => 'Zigo N81',
+    12 => 'Ziss Ranger HD',
+    13 => 'Zilo',
+  ),
+  '@ZO' => 
+  array (
+    0 => 'Zoom',
+    1 => '(Zopo )?ZP ?[0-9]{3,3}!!',
+  ),
+  '@ZP' => 
+  array (
+    0 => '(Zopo )?ZP ?[0-9]{3,3}!!',
+  ),
+  '@ZT' => 
+  array (
+    0 => 'zt180',
+    1 => 'ZTE A[0-9]{3,3}!!',
+    2 => 'ZTE B[0-9]{3,3}!!',
+    3 => 'ZTE BA[0-9]{3,3}!!',
+    4 => 'ZTE BV0[0-9]{3,3}!!',
+    5 => 'ZTE C[0-9]{3,3}!!',
+    6 => 'ZTE C N[0-9]{3,3}!!',
+    7 => 'ZTE C R[0-9]{3,3}!!',
+    8 => 'ZTE C X[0-9]{3,3}!!',
+    9 => 'ZTE ?G[0-9]{3,3}!!',
+    10 => '(ZTE ?)?N[0-9]{3,3}!!',
+    11 => '(ZXY-)?(ZTE )?N[0-9]{4,4}!!',
+    12 => 'ZTE M[0-9]{3,3}!!',
+    13 => 'ZTE P[0-9]{3,3}!!',
+    14 => 'ZTE ?Q[0-9]{3,3}!!',
+    15 => 'ZTE Q[0-9]!!',
+    16 => 'ZTE R[0-9]{3,3}!!',
+    17 => 'ZTE S[0-9]{3,3}!!',
+    18 => 'ZTE T[0-9]!!',
+    19 => 'ZTE T ?U[0-9]{3,3}!!',
+    20 => '(ZTE ?)?U[0-9]{3,3}!!',
+    21 => 'ZTE U N[0-9]{3,3}!!',
+    22 => 'ZTE U[ \\(\\-]V[\\)\\-]?[0-9]{3,3}!!',
+    23 => 'ZTE U X[0-9]{3,3}!!',
+    24 => '(ZTE ?)?V[0-9]{3,3}[A-Z]!!',
+    25 => '(ZTE ?)?V ?[0-9]{3,3}!!',
+    26 => '(ZTE ?)?X[0-9]{3,3}!!',
+    27 => '(ZTE )?Z[0-9]!!',
+    28 => '(ZTE )?Blade!!',
+    29 => 'ZTE Geek!!',
+    30 => '(ZTE )?(Grand|Mimosa)!!',
+    31 => '(ZTE )?Kis!!',
+    32 => '(ZTE )?Racer!!',
+    33 => '(ZTE )?Skate!!',
+    34 => 'ZTE Libra',
+    35 => 'ZTE LINK',
+    36 => 'ZTE T T9',
+    37 => 'ZTE V7073',
+    38 => 'ZTE V9',
+    39 => 'ZTE V9A',
+    40 => 'ZTE C V9E',
+    41 => 'ZTE V7273',
+    42 => 'ZTE e-Learning PAD E8Q',
+    43 => 'ZTE E10T',
+    44 => 'ZTE R22',
+    45 => 'ZTE R84',
+    46 => 'ZTE V10',
+    47 => 'ZTE V70',
+    48 => 'ZTE V72',
+    49 => 'ZTE V72A',
+    50 => 'ZTE K88',
+    51 => 'ZTE K97',
+    52 => 'ZTE T T98',
+    53 => 'ZTE TT98',
+    54 => 'ZTE Crescent',
+    55 => 'ZTE JOE',
+    56 => 'ZTE 975',
+    57 => 'ZTE Tureis',
+    58 => 'ZTE CLARO Q1',
+    59 => 'ZTE LEO M1',
+    60 => 'ZTE LEO S1',
+    61 => 'ZTE LEO S2',
+    62 => 'ZTE LEO Q1',
+    63 => 'ZTE LEO Q2',
+    64 => 'ZTE GV821',
+    65 => 'ZTE-860U',
+    66 => 'ZTE Roamer',
+    67 => 'ZTE V9800',
+    68 => 'ZTE U9810',
+    69 => 'ZTE U9815',
+    70 => 'ZTE V9815',
+    71 => 'ZTE Grand Memo LTE',
+    72 => 'ZTE V9820',
+    73 => 'ZTE Nubia Z7',
+    74 => 'ZTE Nubia X6',
+    75 => 'ZTE Switch X1',
+    76 => 'ZTE Switch X2',
+    77 => 'ZTE Maxx',
+    78 => 'ZTE Fit 4G Smart',
+    79 => 'ZTE N5',
+    80 => 'ZTE N5L',
+    81 => 'ZTE N5S',
+    82 => 'ZTE U5',
+    83 => 'ZTE U5S',
+    84 => 'ZTEU5S',
+    85 => 'ZTE V5S',
+    86 => 'ZTEV5S',
+    87 => 'ZTE A2015',
+    88 => 'ZTE A2016',
+    89 => 'ZTE A2017',
+    90 => 'ZTE A2017G',
+    91 => 'ZTE A2017U',
+    92 => 'ZTE B2015',
+    93 => 'ZTE B2016',
+    94 => 'ZTE B2017',
+    95 => 'ZTE B2017G',
+    96 => 'ZTE C2016',
+    97 => 'ZTE C2017',
+    98 => 'ZTE STAR',
+    99 => 'ZTE Star 1',
+    100 => 'ZTE S2004',
+    101 => 'ZTE S2005',
+    102 => 'ZTE S2007',
+    103 => 'ZTE S2010',
+    104 => 'ZTE S2014',
+    105 => 'ZTE U9180',
+    106 => 'ZTE U9370',
+    107 => 'ZTE V6500',
+    108 => 'ZTE V8110',
+    109 => 'ZTE B860A',
+    110 => 'ZTE W1010',
+  ),
+  '@ZU' => 
+  array (
+    0 => 'ZUK Z1',
+    1 => 'ZUK Z2',
+    2 => 'ZUK Z2131',
+    3 => 'ZUK Z2151',
+    4 => 'ZUK Z2132',
+    5 => 'ZUK Z2121',
+  ),
+  '@ZV' => 
+  array (
+    0 => 'ZVII',
+  ),
+  '@ZX' => 
+  array (
+    0 => '(ZXY-)?(ZTE )?N[0-9]{4,4}!!',
+    1 => '(ZXY-)?NX[0-9]{2,3}!!',
+    2 => 'ZXY-ZTE-C X920',
+    3 => 'ZXY-ZTE V6700',
+  ),
+);

+ 24 - 0
Qii/Library/Third/data/indices/models-asha.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$ASHA_INDEX = array (
+  '@50' => 
+  array (
+    0 => 500,
+    1 => 501,
+    2 => '501s',
+    3 => '501.1',
+    4 => '501.2',
+    5 => 502,
+    6 => 503,
+    7 => '503s',
+  ),
+  '@AS' => 
+  array (
+    0 => 'Asha230SingleSIM',
+    1 => 'Asha230DualSIM',
+    2 => 'Asha500SingleSIM',
+    3 => 'Asha500DualSIM',
+  ),
+);

+ 27 - 0
Qii/Library/Third/data/indices/models-bada.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$BADA_INDEX = array (
+  '@GT' => 
+  array (
+    0 => 'GT- ?S52(50|53)!',
+    1 => 'GT-S53(30|33)!',
+    2 => 'GT-S5380!',
+    3 => 'GT-S57(50|53)!',
+    4 => 'GT-S57(80)!',
+    5 => 'GT-S72(30|33)!',
+    6 => 'GT-S7250!',
+    7 => 'GT-S8500!',
+    8 => 'GT- ?S8530!',
+    9 => 'GT- ?S8600!',
+  ),
+  '@SC' => 
+  array (
+    0 => 'SCH-F859!',
+  ),
+  '@SH' => 
+  array (
+    0 => 'SHW-M410',
+  ),
+);

+ 118 - 0
Qii/Library/Third/data/indices/models-brew.php

@@ -0,0 +1,118 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$BREW_INDEX = array (
+  '@CD' => 
+  array (
+    0 => 'CDM8999',
+    1 => 'CDM8992',
+  ),
+  '@CO' => 
+  array (
+    0 => 'Coolpad D508',
+    1 => 'Coolpad E600',
+  ),
+  '@E4' => 
+  array (
+    0 => 'E4255',
+  ),
+  '@EX' => 
+  array (
+    0 => 'EX200!',
+  ),
+  '@HS' => 
+  array (
+    0 => 'HS-E316!',
+  ),
+  '@HU' => 
+  array (
+    0 => 'HUAWEI U2801!',
+    1 => 'HUAWEI U5200!',
+  ),
+  '@LG' => 
+  array (
+    0 => 'LG272',
+    1 => 'LG510',
+  ),
+  '@LN' => 
+  array (
+    0 => 'LN510',
+  ),
+  '@LX' => 
+  array (
+    0 => 'LX610',
+  ),
+  '@M2' => 
+  array (
+    0 => 'M260!',
+  ),
+  '@M3' => 
+  array (
+    0 => 'M390!',
+  ),
+  '@M5' => 
+  array (
+    0 => 'M550!',
+  ),
+  '@P5' => 
+  array (
+    0 => 'P5000',
+  ),
+  '@P6' => 
+  array (
+    0 => 'P6020',
+    1 => 'P6030',
+  ),
+  '@PL' => 
+  array (
+    0 => 'PLS M330',
+  ),
+  '@S2' => 
+  array (
+    0 => 'S2151!',
+  ),
+  '@SA' => 
+  array (
+    0 => 'sam-r631',
+  ),
+  '@SC' => 
+  array (
+    0 => 'SCH-B309!',
+    1 => 'SCH-F839',
+    2 => 'SCH-M519!',
+    3 => 'SCH-S559!',
+    4 => 'SCH-S579!',
+    5 => 'SCH-U380',
+    6 => 'SCH-U485',
+    7 => 'SCH-U820',
+    8 => 'SCH-W709!',
+    9 => 'SCP-6750',
+    10 => 'SCP6760',
+    11 => 'SCP-6760',
+    12 => 'SCP6780',
+  ),
+  '@SP' => 
+  array (
+    0 => 'SPH M330',
+    1 => 'Sprint M850',
+  ),
+  '@TX' => 
+  array (
+    0 => 'TXT8045',
+  ),
+  '@VN' => 
+  array (
+    0 => 'VN170',
+    1 => 'VN271',
+    2 => 'VN280',
+    3 => 'VN360',
+    4 => 'VN530',
+  ),
+  '@VX' => 
+  array (
+    0 => 'VX9200!',
+    1 => 'VX9600!',
+    2 => 'VX11000',
+  ),
+);

+ 229 - 0
Qii/Library/Third/data/indices/models-feature.php

@@ -0,0 +1,229 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$FEATURE_INDEX = array (
+  '@AM' => 
+  array (
+    0 => 'Amstrad Gamma',
+  ),
+  '@BE' => 
+  array (
+    0 => 'Benefon Q',
+  ),
+  '@CK' => 
+  array (
+    0 => 'CK13[ai]?$!',
+    1 => 'CK15[ai]?$!',
+  ),
+  '@CO' => 
+  array (
+    0 => 'COCOON',
+  ),
+  '@EF' => 
+  array (
+    0 => 'EF71',
+  ),
+  '@EX' => 
+  array (
+    0 => 'EX115',
+    1 => 'EX118',
+    2 => 'EX119',
+    3 => 'EX128',
+    4 => 'EX225',
+    5 => 'EX226',
+    6 => 'EX430',
+  ),
+  '@F1' => 
+  array (
+    0 => 'F100[ai]?$!',
+  ),
+  '@GM' => 
+  array (
+    0 => 'GM360',
+  ),
+  '@GR' => 
+  array (
+    0 => 'GR700',
+  ),
+  '@GS' => 
+  array (
+    0 => 'GS290',
+    1 => 'GS500',
+  ),
+  '@GT' => 
+  array (
+    0 => 'GT500!',
+    1 => 'GT550',
+    2 => 'GT-B2710',
+    3 => 'GT-B3210',
+    4 => 'GT-B3313',
+    5 => 'GT-C3200',
+    6 => 'GT-C3222',
+    7 => 'GT-C3322',
+    8 => 'GT-C3500',
+    9 => 'GT-C5010!',
+    10 => 'GT-E1282!',
+    11 => 'GT-E2152',
+    12 => 'GT-E2220',
+    13 => 'GT-E2222',
+    14 => 'GT-E2202',
+    15 => 'GT-E2250',
+    16 => 'GT-E2252',
+    17 => 'GT-E3213',
+    18 => 'GT-E3309I',
+    19 => 'GT-M8910',
+    20 => 'GT-S3332',
+    21 => 'GT-S33(50|53)!',
+    22 => 'GT-S35(70|72)!',
+    23 => 'GT-S5229',
+    24 => 'GT-S5270!',
+    25 => 'GT-S5610!',
+    26 => 'GT-I6410!',
+    27 => 'GT-I8320!',
+    28 => 'GT-I8330!',
+  ),
+  '@J1' => 
+  array (
+    0 => 'J105[ai]?$!',
+    1 => 'J108[ai]?$!',
+    2 => 'J10(i2?)?$!',
+  ),
+  '@J2' => 
+  array (
+    0 => 'J20[ai]?$!',
+  ),
+  '@K6' => 
+  array (
+    0 => 'K612',
+  ),
+  '@KC' => 
+  array (
+    0 => 'KC910i',
+  ),
+  '@KP' => 
+  array (
+    0 => 'KP500!',
+    1 => 'KP570!',
+  ),
+  '@KU' => 
+  array (
+    0 => 'KU990i',
+  ),
+  '@LG' => 
+  array (
+    0 => 'LG-KU380',
+    1 => 'LG-KU580',
+    2 => 'LG-KU990',
+  ),
+  '@LI' => 
+  array (
+    0 => 'Lightpipe',
+  ),
+  '@M3' => 
+  array (
+    0 => 'm3510c',
+  ),
+  '@MO' => 
+  array (
+    0 => 'MOTOQA1',
+  ),
+  '@P7' => 
+  array (
+    0 => 'P7000',
+  ),
+  '@P9' => 
+  array (
+    0 => 'P9020',
+    1 => 'P9050',
+  ),
+  '@PL' => 
+  array (
+    0 => 'PLS6600KJ',
+  ),
+  '@PM' => 
+  array (
+    0 => 'PM-8200',
+  ),
+  '@S7' => 
+  array (
+    0 => 'S7350',
+  ),
+  '@SA' => 
+  array (
+    0 => 'sam-r560',
+  ),
+  '@SC' => 
+  array (
+    0 => 'SCP-5500',
+    1 => 'SCP-6600',
+    2 => 'SCH-W169',
+    3 => 'SCH-W279',
+  ),
+  '@SE' => 
+  array (
+    0 => 'Sendo Wap',
+  ),
+  '@SG' => 
+  array (
+    0 => 'SGH-A667',
+    1 => 'SGH-A697',
+    2 => 'SGH-A877',
+    3 => 'SGH-A927',
+    4 => 'SGH-A997',
+    5 => 'SGH-D880',
+    6 => 'SGH-E250i',
+    7 => 'SGH-E250V',
+    8 => 'SGH-G600',
+    9 => 'SGH-J700i',
+    10 => 'SGH-J700V',
+    11 => 'SGH-M200',
+    12 => 'SGH-S150G',
+    13 => 'SGH-S390G',
+    14 => 'SGH-T189N',
+    15 => 'SGHX660V',
+    16 => 'SGH-Z107!',
+    17 => 'SGH-Z130!',
+    18 => 'SGH-Z500!',
+  ),
+  '@SM' => 
+  array (
+    0 => 'SM-B313E',
+    1 => 'SM-B350E',
+    2 => 'SM-B780(A|W)!',
+  ),
+  '@TE' => 
+  array (
+    0 => 'tecnot36',
+  ),
+  '@U1' => 
+  array (
+    0 => 'U100[ai]?$!',
+    1 => 'U10[ai]?$!',
+  ),
+  '@VO' => 
+  array (
+    0 => 'Vodafone 575',
+  ),
+  '@W1' => 
+  array (
+    0 => 'W100i?$!',
+    1 => 'W150i?$!',
+  ),
+  '@W2' => 
+  array (
+    0 => 'W20i?$!',
+  ),
+  '@WI' => 
+  array (
+    0 => 'WIDETEL WCX150',
+  ),
+  '@WT' => 
+  array (
+    0 => 'WT13i$!',
+  ),
+  '@X5' => 
+  array (
+    0 => 'X5i$!',
+  ),
+);

+ 55 - 0
Qii/Library/Third/data/indices/models-firefoxos.php

@@ -0,0 +1,55 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$FIREFOXOS_INDEX = array (
+  '@AL' => 
+  array (
+    0 => 'ALCATEL ONE TOUCH FIRE',
+    1 => 'ALCATEL ONE TOUCH 4012A',
+    2 => 'ALCATEL ONE TOUCH 4012X',
+    3 => 'ALCATELOneTouch4012A!',
+    4 => 'ALCATELOneTouch4012X!',
+    5 => 'ALCATELOneTouch4019A!',
+    6 => 'ALCATELOneTouch4019X!',
+    7 => 'ALCATELOneTouch4020D!',
+    8 => 'ALCATELOneTouch4022!',
+    9 => 'ALCATELOneTouch4023!',
+    10 => 'ALCATELOneTouch6015X!',
+  ),
+  '@HU' => 
+  array (
+    0 => 'HUAWEI Ascend Y300-F1',
+    1 => 'HUAWEIY300-F1',
+  ),
+  '@LG' => 
+  array (
+    0 => 'LG-D3(00|01)!',
+    1 => 'LGL25',
+  ),
+  '@MA' => 
+  array (
+    0 => 'madai',
+  ),
+  '@ON' => 
+  array (
+    0 => 'OneTouch4019A',
+  ),
+  '@OP' => 
+  array (
+    0 => 'OPEN',
+    1 => 'OpenC',
+    2 => 'Open C',
+    3 => 'OPENC2',
+    4 => 'OPEN2',
+  ),
+  '@OR' => 
+  array (
+    0 => 'Orange KLIF',
+    1 => 'Orange KLIFD',
+  ),
+  '@ZT' => 
+  array (
+    0 => 'ZTEOPEN',
+  ),
+);

+ 393 - 0
Qii/Library/Third/data/indices/models-kddi.php

@@ -0,0 +1,393 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$KDDI_INDEX = array (
+  '@CA' => 
+  array (
+    0 => 'CA11',
+    1 => 'CA12',
+    2 => 'CA13',
+    3 => 'CA14',
+    4 => 'CA21',
+    5 => 'CA22',
+    6 => 'CA23',
+    7 => 'CA24',
+    8 => 'CA25',
+    9 => 'CA26',
+    10 => 'CA27',
+    11 => 'CA28',
+    12 => 'CA31',
+    13 => 'CA32',
+    14 => 'CA33',
+    15 => 'CA34',
+    16 => 'CA35',
+    17 => 'CA36',
+    18 => 'CA37',
+    19 => 'CA38',
+    20 => 'CA39',
+    21 => 'CA3A',
+    22 => 'CA3B',
+    23 => 'CA3C',
+    24 => 'CA3D',
+    25 => 'CA3E',
+    26 => 'CA3F',
+    27 => 'CA3G',
+    28 => 'CA3H',
+    29 => 'CA3I',
+    30 => 'CA3J',
+    31 => 'CA3K',
+  ),
+  '@DN' => 
+  array (
+    0 => 'DN01',
+    1 => 'DN11',
+  ),
+  '@ER' => 
+  array (
+    0 => 'ERK0',
+  ),
+  '@FJ' => 
+  array (
+    0 => 'FJ31',
+  ),
+  '@HI' => 
+  array (
+    0 => 'HI01',
+    1 => 'HI02',
+    2 => 'HI11',
+    3 => 'HI12',
+    4 => 'HI13',
+    5 => 'HI14',
+    6 => 'HI21',
+    7 => 'HI23',
+    8 => 'HI24',
+    9 => 'HI31',
+    10 => 'HI32',
+    11 => 'HI33',
+    12 => 'HI34',
+    13 => 'HI35',
+    14 => 'HI36',
+    15 => 'HI37',
+    16 => 'HI38',
+    17 => 'HI39',
+    18 => 'HI3A',
+    19 => 'HI3B',
+    20 => 'HI3C',
+    21 => 'HI3D',
+    22 => 'HI3E',
+    23 => 'HI3F',
+    24 => 'HI3G',
+    25 => 'HI3H',
+  ),
+  '@KC' => 
+  array (
+    0 => 'KC3Q',
+    1 => 'KC3S',
+    2 => 'KC3V',
+    3 => 'KC11',
+    4 => 'KC12',
+    5 => 'KC13',
+    6 => 'KC14',
+    7 => 'KC15',
+    8 => 'KC21',
+    9 => 'KC22',
+    10 => 'KC23',
+    11 => 'KC24',
+    12 => 'KC25',
+    13 => 'KC26',
+    14 => 'KC27',
+    15 => 'KC28',
+    16 => 'KC29',
+    17 => 'KC2A',
+    18 => 'KC31',
+    19 => 'KC32',
+    20 => 'KC33',
+    21 => 'KC34',
+    22 => 'KC35',
+    23 => 'KC36',
+    24 => 'KC37',
+    25 => 'KC38',
+    26 => 'KC39',
+    27 => 'KC3A',
+    28 => 'KC3B',
+    29 => 'KC3D',
+    30 => 'KC3E',
+    31 => 'KC3G',
+    32 => 'KC3H',
+    33 => 'KC3I',
+    34 => 'KC3K',
+    35 => 'KC3M',
+    36 => 'KC3N',
+    37 => 'KC3O',
+    38 => 'KC3P',
+    39 => 'KC3R',
+    40 => 'KC3T',
+    41 => 'KC3U',
+    42 => 'KC3W',
+    43 => 'KC3X',
+    44 => 'KC3Y',
+    45 => 'KC3Z',
+    46 => 'KC41',
+    47 => 'KC42',
+    48 => 'KC43',
+    49 => 'KC44',
+    50 => 'KC45',
+    51 => 'KC46',
+    52 => 'KC47',
+    53 => 'KC48',
+    54 => 'KC4A',
+    55 => 'KCC1',
+    56 => 'KCC2',
+    57 => 'KCI1',
+    58 => 'KCI2',
+    59 => 'KCT1',
+    60 => 'KCT2',
+    61 => 'KCT3',
+    62 => 'KCT4',
+    63 => 'KCT5',
+    64 => 'KCT6',
+    65 => 'KCT7',
+    66 => 'KCT8',
+    67 => 'KCT9',
+    68 => 'KCTA',
+    69 => 'KCTB',
+    70 => 'KCTC',
+  ),
+  '@MA' => 
+  array (
+    0 => 'MA11',
+    1 => 'MA12',
+    2 => 'MA13',
+    3 => 'MA21',
+    4 => 'MA31',
+    5 => 'MA32',
+    6 => 'MA33',
+    7 => 'MA34',
+    8 => 'MA35',
+    9 => 'MAC1',
+    10 => 'MAC2',
+    11 => 'MAI1',
+    12 => 'MAI2',
+    13 => 'MAT1',
+    14 => 'MAT2',
+    15 => 'MAT3',
+  ),
+  '@MI' => 
+  array (
+    0 => 'MIT1',
+  ),
+  '@PT' => 
+  array (
+    0 => 'PT21',
+    1 => 'PT23',
+    2 => 'PT33',
+    3 => 'PT34',
+    4 => 'PT35',
+    5 => 'PT36',
+  ),
+  '@SA' => 
+  array (
+    0 => 'SA21',
+    1 => 'SA22',
+    2 => 'SA24',
+    3 => 'SA25',
+    4 => 'SA26',
+    5 => 'SA27',
+    6 => 'SA28',
+    7 => 'SA29',
+    8 => 'SA2A',
+    9 => 'SA31',
+    10 => 'SA32',
+    11 => 'SA33',
+    12 => 'SA34',
+    13 => 'SA35',
+    14 => 'SA36',
+    15 => 'SA37',
+    16 => 'SA38',
+    17 => 'SA39',
+    18 => 'SA3A',
+    19 => 'SA3B',
+    20 => 'SA3C',
+    21 => 'SA3D',
+    22 => 'SA3E',
+  ),
+  '@SH' => 
+  array (
+    0 => 'SH31',
+    1 => 'SH32',
+    2 => 'SH33',
+    3 => 'SH34',
+    4 => 'SH35',
+    5 => 'SH36',
+    6 => 'SH37',
+    7 => 'SH38',
+    8 => 'SH39',
+    9 => 'SH3A',
+    10 => 'SH3B',
+    11 => 'SH3C',
+    12 => 'SH3D',
+    13 => 'SH3E',
+    14 => 'SH3F',
+    15 => 'SH3G',
+    16 => 'SH3H',
+    17 => 'SH3I',
+    18 => 'SH3J',
+    19 => 'SH3K',
+    20 => 'SH3L',
+  ),
+  '@SN' => 
+  array (
+    0 => 'SN3K',
+    1 => 'SN3T',
+    2 => 'SN11',
+    3 => 'SN13',
+    4 => 'SN14',
+    5 => 'SN15',
+    6 => 'SN16',
+    7 => 'SN17',
+    8 => 'SN21',
+    9 => 'SN22',
+    10 => 'SN23',
+    11 => 'SN24',
+    12 => 'SN25',
+    13 => 'SN26',
+    14 => 'SN27',
+    15 => 'SN28',
+    16 => 'SN29',
+    17 => 'SN31',
+    18 => 'SN32',
+    19 => 'SN33',
+    20 => 'SN34',
+    21 => 'SN35',
+    22 => 'SN36',
+    23 => 'SN37',
+    24 => 'SN38',
+    25 => 'SN39',
+    26 => 'SN3A',
+    27 => 'SN3B',
+    28 => 'SN3C',
+    29 => 'SN3D',
+    30 => 'SN3E',
+    31 => 'SN3F',
+    32 => 'SN3G',
+    33 => 'SN3H',
+    34 => 'SN3I',
+    35 => 'SN3J',
+    36 => 'SN3L',
+    37 => 'SN3M',
+    38 => 'SN3N',
+    39 => 'SN3O',
+    40 => 'SN3P',
+    41 => 'SN3Q',
+    42 => 'SN3R',
+    43 => 'SN3S',
+    44 => 'SN3U',
+    45 => 'SN3V',
+  ),
+  '@ST' => 
+  array (
+    0 => 'ST22',
+    1 => 'ST33',
+    2 => 'ST11',
+    3 => 'ST12',
+    4 => 'ST13',
+    5 => 'ST14',
+    6 => 'ST21',
+    7 => 'ST23',
+    8 => 'ST24',
+    9 => 'ST25',
+    10 => 'ST26',
+    11 => 'ST27',
+    12 => 'ST28',
+    13 => 'ST29',
+    14 => 'ST2A',
+    15 => 'ST2C',
+    16 => 'ST2D',
+    17 => 'ST31',
+    18 => 'ST32',
+    19 => 'ST34',
+  ),
+  '@SY' => 
+  array (
+    0 => 'SY12',
+    1 => 'SY13',
+    2 => 'SY14',
+    3 => 'SY15',
+    4 => 'SYC1',
+    5 => 'SYT1',
+    6 => 'SYT2',
+    7 => 'SYT3',
+    8 => 'SYT4',
+    9 => 'SY01',
+    10 => 'SY02',
+    11 => 'SY03',
+    12 => 'SY11',
+  ),
+  '@TS' => 
+  array (
+    0 => 'TS3Q',
+    1 => 'TS3U',
+    2 => 'TS3W',
+    3 => 'TS01',
+    4 => 'TS11',
+    5 => 'TS12',
+    6 => 'TS13',
+    7 => 'TS14',
+    8 => 'TS21',
+    9 => 'TS22',
+    10 => 'TS23',
+    11 => 'TS24',
+    12 => 'TS25',
+    13 => 'TS26',
+    14 => 'TS27',
+    15 => 'TS28',
+    16 => 'TS29',
+    17 => 'TS2A',
+    18 => 'TS2B',
+    19 => 'TS2C',
+    20 => 'TS2D',
+    21 => 'TS2E',
+    22 => 'TS31',
+    23 => 'TS32',
+    24 => 'TS33',
+    25 => 'TS34',
+    26 => 'TS35',
+    27 => 'TS36',
+    28 => 'TS37',
+    29 => 'TS38',
+    30 => 'TS39',
+    31 => 'TS3A',
+    32 => 'TS3B',
+    33 => 'TS3C',
+    34 => 'TS3D',
+    35 => 'TS3E',
+    36 => 'TS3G',
+    37 => 'TS3H',
+    38 => 'TS3I',
+    39 => 'TS3J',
+    40 => 'TS3K',
+    41 => 'TS3L',
+    42 => 'TS3M',
+    43 => 'TS3N',
+    44 => 'TS3O',
+    45 => 'TS3P',
+    46 => 'TS3R',
+    47 => 'TS3S',
+    48 => 'TS3T',
+    49 => 'TS3V',
+    50 => 'TS3X',
+    51 => 'TS3Y',
+    52 => 'TS3Z',
+    53 => 'TS41',
+    54 => 'TSC1',
+    55 => 'TSI1',
+    56 => 'TST1',
+    57 => 'TST2',
+    58 => 'TST3',
+    59 => 'TST4',
+    60 => 'TST5',
+    61 => 'TST6',
+    62 => 'TST7',
+  ),
+);

+ 115 - 0
Qii/Library/Third/data/indices/models-palmos.php

@@ -0,0 +1,115 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$PALMOS_INDEX = array (
+  '@AC' => 
+  array (
+    0 => 'acer-momo',
+    1 => 'acer-coco',
+    2 => 'Acea-MZ01',
+    3 => 'Acea-PD01',
+  ),
+  '@GR' => 
+  array (
+    0 => 'grmn-3200',
+    1 => 'grmn-3600',
+    2 => 'grmn-3700',
+  ),
+  '@GS' => 
+  array (
+    0 => 'gsRl-zicn',
+    1 => 'gsRl-zcn2',
+    2 => 'gsRl-zcn5',
+  ),
+  '@HS' => 
+  array (
+    0 => 'hspr-H101',
+    1 => 'hspr-H102',
+  ),
+  '@KW' => 
+  array (
+    0 => 'kwc.-7135',
+  ),
+  '@PA' => 
+  array (
+    0 => 'Palm-D061',
+    1 => 'Palm-D062',
+    2 => 'Palm-TunX',
+    3 => 'Palm-stuj',
+    4 => 'Palm-hbbs',
+    5 => 'Palm-trnd',
+    6 => 'Palm-ecty',
+    7 => 'Palm-lith',
+    8 => 'Palm-sky1',
+    9 => 'Palm-D053',
+    10 => 'Palm-D052',
+    11 => 'Palm-D060',
+    12 => 'Palm-MT64',
+    13 => 'Palm-Cct1',
+    14 => 'Palm-Zir4',
+    15 => 'Palm-Frg1',
+    16 => 'Palm-Frg2',
+    17 => 'Palm-Arz1',
+    18 => 'Palm-TnT5',
+    19 => 'Palm-atc1',
+    20 => 'Palm-D050',
+    21 => 'Palm-Cubs',
+    22 => 'Palm-Zi21',
+    23 => 'Palm-D051',
+    24 => 'Palm-Zi22',
+    25 => 'Palm-Zpth',
+    26 => 'Palm-Zi72',
+  ),
+  '@QC' => 
+  array (
+    0 => 'qcom-qc20',
+  ),
+  '@SM' => 
+  array (
+    0 => 'smsn-phix',
+    1 => 'smsn-Phx2',
+    2 => 'smsn-blch',
+    3 => 'smsn-BLFM',
+    4 => 'smsn-glxy',
+  ),
+  '@SO' => 
+  array (
+    0 => 'sony-ystn',
+    1 => 'sony-ysmt',
+    2 => 'sony-ysm2',
+    3 => 'sony-nsca',
+    4 => 'sony-nsc2',
+    5 => 'sony-vnce',
+    6 => 'sony-mdna',
+    7 => 'sony-npls',
+    8 => 'sony-rdwd',
+    9 => 'sony-crdb',
+    10 => 'sony-tldo',
+    11 => 'sony-mdrd',
+    12 => 'sony-grnd',
+    13 => 'sony-frta',
+    14 => 'sony-cocs',
+    15 => 'sony-glps',
+    16 => 'sony-mcnd',
+    17 => 'sony-vrna',
+    18 => 'sony-atom',
+    19 => 'sony-goha',
+    20 => 'sony-leia',
+    21 => 'sony-hwai',
+    22 => 'sony-goku',
+    23 => 'sony-luke',
+    24 => 'sony-amno',
+    25 => 'sony-prmr',
+    26 => 'sony-ancy',
+  ),
+  '@TP' => 
+  array (
+    0 => 'Tpwv-Rdog',
+  ),
+  '@TR' => 
+  array (
+    0 => 'trgp-trg1',
+    1 => 'trgp-trg2',
+  ),
+);

+ 20 - 0
Qii/Library/Third/data/indices/models-s30plus.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$S30PLUS_INDEX = array (
+  '@21' => 
+  array (
+    0 => 215,
+  ),
+  '@22' => 
+  array (
+    0 => 220,
+    1 => 222,
+    2 => 225,
+  ),
+  '@23' => 
+  array (
+    0 => 230,
+  ),
+);

+ 249 - 0
Qii/Library/Third/data/indices/models-s40.php

@@ -0,0 +1,249 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$S40_INDEX = array (
+  '@10' => 
+  array (
+    0 => 109,
+  ),
+  '@11' => 
+  array (
+    0 => 110,
+    1 => 111,
+    2 => '111.1',
+    3 => 112,
+    4 => 114,
+  ),
+  '@16' => 
+  array (
+    0 => '1682c',
+  ),
+  '@20' => 
+  array (
+    0 => 200,
+    1 => 201,
+    2 => 202,
+    3 => 203,
+    4 => 205,
+    5 => '205.1',
+    6 => '205.3',
+    7 => 206,
+    8 => '206.1',
+    9 => 208,
+    10 => '208.1',
+    11 => '208.2',
+    12 => '208.3',
+    13 => '208.4',
+    14 => 2055,
+    15 => 2060,
+  ),
+  '@21' => 
+  array (
+    0 => 210,
+    1 => '210.2',
+    2 => '210.3',
+    3 => '210.4',
+    4 => '210.5',
+  ),
+  '@22' => 
+  array (
+    0 => '2220s!',
+  ),
+  '@23' => 
+  array (
+    0 => '2320c!',
+    1 => '2322c!',
+    2 => '2323c!',
+    3 => '2330c!',
+  ),
+  '@26' => 
+  array (
+    0 => '2600c!',
+    1 => '2680s!',
+    2 => 2690,
+    3 => 2692,
+  ),
+  '@27' => 
+  array (
+    0 => '2700c!',
+    1 => '2710c',
+    2 => '2710c-2',
+    3 => '2720a!',
+    4 => '2730c!',
+  ),
+  '@30' => 
+  array (
+    0 => 300,
+    1 => 301,
+    2 => '301.1',
+    3 => 302,
+    4 => 303,
+    5 => 305,
+    6 => 306,
+    7 => 308,
+    8 => 309,
+    9 => 3020,
+  ),
+  '@31' => 
+  array (
+    0 => 310,
+    1 => 311,
+    2 => '3109c',
+    3 => '3110c',
+    4 => '3120c',
+    5 => '3120classic',
+  ),
+  '@32' => 
+  array (
+    0 => '3208c',
+  ),
+  '@35' => 
+  array (
+    0 => '3500c',
+    1 => '3555b',
+  ),
+  '@36' => 
+  array (
+    0 => '3600s',
+    1 => '3610a',
+  ),
+  '@37' => 
+  array (
+    0 => '3710fold',
+    1 => '3720c',
+  ),
+  '@50' => 
+  array (
+    0 => '5000!',
+  ),
+  '@51' => 
+  array (
+    0 => 515,
+    1 => '515.2',
+    2 => '5130!',
+    3 => '5130c!',
+    4 => 5132,
+  ),
+  '@52' => 
+  array (
+    0 => '5200!',
+    1 => '5220!',
+  ),
+  '@53' => 
+  array (
+    0 => '5300!',
+    1 => '5310!',
+    2 => 5330,
+    3 => '5330-1d',
+  ),
+  '@56' => 
+  array (
+    0 => '5610d!',
+  ),
+  '@60' => 
+  array (
+    0 => '6070!',
+  ),
+  '@62' => 
+  array (
+    0 => '6208c',
+    1 => '6212c',
+    2 => '6260s!',
+    3 => '6230i!',
+    4 => 6233,
+    5 => 6234,
+    6 => '6263!',
+    7 => 6280,
+  ),
+  '@63' => 
+  array (
+    0 => 6300,
+    1 => '6300i',
+    2 => 6301,
+    3 => '6303c',
+    4 => '6303classic',
+    5 => '6303iclassic',
+    6 => '6303ci',
+    7 => 6350,
+  ),
+  '@65' => 
+  array (
+    0 => '6500s!',
+  ),
+  '@66' => 
+  array (
+    0 => '6600f!',
+    1 => '6600s!',
+    2 => '6600i!',
+  ),
+  '@67' => 
+  array (
+    0 => '6700c!',
+    1 => '6750c',
+  ),
+  '@70' => 
+  array (
+    0 => '7070!',
+  ),
+  '@71' => 
+  array (
+    0 => '7100s!',
+  ),
+  '@72' => 
+  array (
+    0 => '7210s!',
+    1 => '7210Supernova!',
+    2 => '7230!',
+  ),
+  '@73' => 
+  array (
+    0 => '7310c!',
+  ),
+  '@75' => 
+  array (
+    0 => 7500,
+    1 => '7510Supernova!',
+  ),
+  '@76' => 
+  array (
+    0 => '7610Supernova!',
+  ),
+  '@88' => 
+  array (
+    0 => '8800!',
+  ),
+  '@C1' => 
+  array (
+    0 => 'C1-01!',
+    1 => 'C1-02!',
+    2 => 'C1-03!',
+  ),
+  '@C2' => 
+  array (
+    0 => 'C2-00!',
+    1 => 'C2-01!',
+    2 => 'C2-02!',
+    3 => 'C2-03!',
+    4 => 'C2-05!',
+    5 => 'C2-06!',
+  ),
+  '@C3' => 
+  array (
+    0 => 'C3-00!',
+    1 => 'C3-01!',
+  ),
+  '@X2' => 
+  array (
+    0 => 'X2-00!',
+    1 => 'X2-01!',
+    2 => 'X2-02!',
+    3 => 'X2-03!',
+    4 => 'X2-05!',
+  ),
+  '@X3' => 
+  array (
+    0 => 'X3-00!',
+    1 => 'X3-02!',
+  ),
+);

+ 344 - 0
Qii/Library/Third/data/indices/models-symbian.php

@@ -0,0 +1,344 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$SYMBIAN_INDEX = array (
+  '@' => 
+  array (
+    0 => '(?i)U1(a|i|iv)?$!',
+    1 => '(?i)U5(a|i|iv)?$!',
+    2 => '(?i)U8(a|i)?$!',
+  ),
+  '@32' => 
+  array (
+    0 => 3230,
+    1 => 3250,
+  ),
+  '@36' => 
+  array (
+    0 => 3650,
+    1 => 3660,
+  ),
+  '@50' => 
+  array (
+    0 => 500,
+  ),
+  '@52' => 
+  array (
+    0 => 5228,
+    1 => '5233!',
+    2 => '5230!',
+    3 => 5232,
+    4 => '5235!',
+    5 => 5236,
+    6 => 5238,
+    7 => 5250,
+  ),
+  '@53' => 
+  array (
+    0 => '5320!',
+  ),
+  '@55' => 
+  array (
+    0 => '5500d!',
+    1 => '5530!',
+  ),
+  '@56' => 
+  array (
+    0 => '5630!',
+  ),
+  '@57' => 
+  array (
+    0 => '5700!',
+    1 => '5730!',
+  ),
+  '@58' => 
+  array (
+    0 => '5800!',
+  ),
+  '@60' => 
+  array (
+    0 => 600,
+    1 => 603,
+  ),
+  '@61' => 
+  array (
+    0 => '6110Navigator',
+    1 => '6120c!',
+    2 => '6121c!',
+    3 => '6122c!',
+    4 => '6124c',
+  ),
+  '@62' => 
+  array (
+    0 => '6210 ?Navigator!',
+    1 => '6220c!',
+    2 => 6260,
+    3 => '6290!',
+  ),
+  '@66' => 
+  array (
+    0 => 6600,
+    1 => 6630,
+    2 => '6650d!',
+    3 => 6670,
+    4 => 6680,
+    5 => 6681,
+  ),
+  '@67' => 
+  array (
+    0 => '6700s',
+    1 => '6700s-1c',
+    2 => 6708,
+    3 => '6710s',
+    4 => '6720c!',
+    5 => '6730c!',
+    6 => '6760s!',
+    7 => 6788,
+    8 => '6788i',
+    9 => '6790s-1b!',
+    10 => '6790s-1c!',
+  ),
+  '@70' => 
+  array (
+    0 => 700,
+    1 => 701,
+    2 => '702T',
+  ),
+  '@76' => 
+  array (
+    0 => 7610,
+    1 => 7650,
+    2 => 7660,
+  ),
+  '@80' => 
+  array (
+    0 => '801T',
+    1 => 808,
+    2 => '808PureView',
+    3 => '808 PureView',
+  ),
+  '@A1' => 
+  array (
+    0 => 'A1000',
+  ),
+  '@A9' => 
+  array (
+    0 => 'A920',
+    1 => 'A925',
+  ),
+  '@BE' => 
+  array (
+    0 => 'BenQ P30',
+    1 => 'BenQ P31',
+  ),
+  '@C5' => 
+  array (
+    0 => 'C5-00!',
+    1 => 'C5-01',
+    2 => 'C5-03!',
+    3 => 'C5-04',
+    4 => 'C5-05',
+    5 => 'C5-06',
+  ),
+  '@C6' => 
+  array (
+    0 => 'C6-00!',
+    1 => 'C6-01!',
+  ),
+  '@C7' => 
+  array (
+    0 => 'C7-00!',
+  ),
+  '@CO' => 
+  array (
+    0 => 'ConstellationT',
+    1 => 'ConstellationQuest',
+  ),
+  '@E-' => 
+  array (
+    0 => 'E-90-1',
+  ),
+  '@E5' => 
+  array (
+    0 => 'E5-00!',
+    1 => 'E50(-[1-9])?$!',
+    2 => 'E51(-[1-9])?$!',
+    3 => 'E52(-[1-9])?$!',
+    4 => 'E55(-[1-9])?$!',
+  ),
+  '@E6' => 
+  array (
+    0 => 'E6',
+    1 => 'E6-00',
+    2 => 'E60(-[1-9])?$!',
+    3 => 'E61i!',
+    4 => 'E61(-[1-9])?$!',
+    5 => 'E62(-[1-9])?$!',
+    6 => 'E63(-[1-9])?$!',
+    7 => 'E65(-[1-9])?$!',
+    8 => 'E66(-[1-9])?$!',
+  ),
+  '@E7' => 
+  array (
+    0 => 'E7-00',
+    1 => 'E70(-[1-9])?$!',
+    2 => 'E71x',
+    3 => 'E71(-[1-9])?$!',
+    4 => 'E72(-[1-9])?$!',
+    5 => 'E73(-[1-9])?$!',
+    6 => 'E75(-[1-9])?$!',
+  ),
+  '@E9' => 
+  array (
+    0 => 'E90(-[1-9])?$!',
+  ),
+  '@G7' => 
+  array (
+    0 => 'G700',
+  ),
+  '@G9' => 
+  array (
+    0 => 'G900',
+  ),
+  '@I7' => 
+  array (
+    0 => 'I7710',
+  ),
+  '@I8' => 
+  array (
+    0 => 'I8510',
+    1 => 'I8910',
+  ),
+  '@LG' => 
+  array (
+    0 => 'LG KS10',
+    1 => 'LGKT610',
+    2 => 'LGKT615',
+  ),
+  '@M1' => 
+  array (
+    0 => 'M1000',
+  ),
+  '@M6' => 
+  array (
+    0 => 'M600i',
+  ),
+  '@N-' => 
+  array (
+    0 => 'N-Gage',
+    1 => 'N-GageQD',
+  ),
+  '@N5' => 
+  array (
+    0 => 'N5233!',
+  ),
+  '@N7' => 
+  array (
+    0 => 'N70(-[1-9])?$!',
+    1 => 'N71(-[1-9])?$!',
+    2 => 'N72(-[1-9])?$!',
+    3 => 'N73(-[1-9])?$!',
+    4 => 'N75(-[1-9])?$!',
+    5 => 'N76(-[1-9])?$!',
+    6 => 'N77(-[1-9])?$!',
+    7 => 'N78(-[1-9])?$!',
+    8 => 'N79(-[1-9])?$!',
+  ),
+  '@N8' => 
+  array (
+    0 => 'N8-00',
+    1 => 'N80(-[1-9])?$!',
+    2 => 'N81(-[1-9])?$!',
+    3 => 'N82(-[1-9])?$!',
+    4 => 'N85(-[1-9])?$!',
+    5 => 'N86(-[1-9])?$!',
+    6 => 'N86 ?8MP$!',
+  ),
+  '@N9' => 
+  array (
+    0 => 'N90(-[1-9])?$!',
+    1 => 'N91(-[1-9])?$!',
+    2 => 'N92(-[1-9])?$!',
+    3 => 'N93(-[1-9])?$!',
+    4 => 'N93i',
+    5 => 'N95(-[1-9])?$!',
+    6 => 'N95[ -]8GB(-[1-9])?!',
+    7 => 'N96(-[1-9])?$!',
+    8 => 'N97(-[1-3])?$!',
+    9 => 'N97i',
+    10 => 'N97(-[4-5])?$!',
+    11 => 'N97 ?mini!',
+  ),
+  '@NO' => 
+  array (
+    0 => 'Nokia N81',
+    1 => 'Nokia N81 8GB',
+  ),
+  '@OR' => 
+  array (
+    0 => 'Oro',
+  ),
+  '@P1' => 
+  array (
+    0 => 'P1i',
+  ),
+  '@P9' => 
+  array (
+    0 => 'P910i',
+    1 => 'P990i',
+  ),
+  '@PA' => 
+  array (
+    0 => 'Panasonic-X700',
+    1 => 'Panasonic-X800',
+  ),
+  '@RI' => 
+  array (
+    0 => 'RIZR-Z8',
+    1 => 'RIZR-Z10',
+  ),
+  '@SG' => 
+  array (
+    0 => 'SGH-D720',
+    1 => 'SGH-D728',
+    2 => 'SGH-D730',
+    3 => 'SGH-i400!',
+    4 => 'SGH-i408!',
+    5 => 'SGH-i450!',
+    6 => 'SGH-i455!',
+    7 => 'SGH-i458!',
+    8 => 'SGH-i520!',
+    9 => 'SGH-i550!',
+    10 => 'SGH-i560!',
+    11 => 'SGH-i568!',
+    12 => 'SGH-i570!',
+    13 => 'SGH-G810',
+  ),
+  '@T7' => 
+  array (
+    0 => 'T7-00',
+  ),
+  '@U' => 
+  array (
+    0 => 'U',
+  ),
+  '@W9' => 
+  array (
+    0 => 'W950i',
+    1 => 'W960i',
+  ),
+  '@X5' => 
+  array (
+    0 => 'X5-00',
+    1 => 'X5-01',
+  ),
+  '@X6' => 
+  array (
+    0 => 'X6-00!',
+  ),
+  '@X7' => 
+  array (
+    0 => 'X7-00!',
+  ),
+);

+ 98 - 0
Qii/Library/Third/data/indices/models-tizen.php

@@ -0,0 +1,98 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$TIZEN_INDEX = array (
+  '@AR' => 
+  array (
+    0 => '(ARMV7 )?SM-Z9005!',
+  ),
+  '@BA' => 
+  array (
+    0 => 'Baltic',
+  ),
+  '@EM' => 
+  array (
+    0 => 'Emulator',
+  ),
+  '@FA' => 
+  array (
+    0 => 'FamilyHub',
+  ),
+  '@GT' => 
+  array (
+    0 => 'GT-I8800!',
+    1 => 'GT-I8805!',
+    2 => 'GT-I9500!',
+  ),
+  '@HA' => 
+  array (
+    0 => 'hawkp',
+  ),
+  '@KI' => 
+  array (
+    0 => 'KIRAN',
+  ),
+  '@MO' => 
+  array (
+    0 => 'Mobile-RD-PQ',
+    1 => 'Mobile-Emulator',
+  ),
+  '@NX' => 
+  array (
+    0 => 'NX300',
+  ),
+  '@SC' => 
+  array (
+    0 => 'SC-03F',
+  ),
+  '@SD' => 
+  array (
+    0 => 'sdk',
+  ),
+  '@SE' => 
+  array (
+    0 => 'SEC SC-001',
+    1 => 'SEC SC-03F',
+  ),
+  '@SG' => 
+  array (
+    0 => 'SGH-N099',
+  ),
+  '@SM' => 
+  array (
+    0 => 'SM-HIGGS',
+    1 => '(ARMV7 )?SM-Z9005!',
+    2 => 'SM-Z130!',
+    3 => 'SM-Z200!',
+    4 => 'SM-Z300!',
+    5 => 'SM-Z500!',
+    6 => 'SM-Z700!',
+    7 => 'SM-Z900!',
+    8 => 'SM-Z910!',
+    9 => 'SM-G870F0',
+    10 => 'SM-R720!',
+    11 => 'SM-R730!',
+    12 => 'SM-R750!',
+    13 => 'SM-R760!',
+    14 => 'SM-R765!',
+  ),
+  '@TI' => 
+  array (
+    0 => 'TIZEN SM-Z130!',
+    1 => 'TIZEN SM-Z300!',
+    2 => 'TIZEN Emulator',
+  ),
+  '@TM' => 
+  array (
+    0 => 'TM1',
+  ),
+  '@XU' => 
+  array (
+    0 => 'xu3',
+  ),
+  '@Z3' => 
+  array (
+    0 => 'Z3 Z910F',
+  ),
+);

+ 55 - 0
Qii/Library/Third/data/indices/models-touchwiz.php

@@ -0,0 +1,55 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$TOUCHWIZ_INDEX = array (
+  '@GT' => 
+  array (
+    0 => 'GT-B5310!',
+    1 => 'GT-B3410',
+    2 => 'GT-B7722',
+    3 => 'GT-C3262',
+    4 => 'GT-C33(00|03)!',
+    5 => 'GT-C3312R',
+    6 => 'GT-C3312!',
+    7 => 'GT-C3330',
+    8 => 'GT-C6712',
+    9 => 'GT-E2652!',
+    10 => 'GT-I6230!',
+    11 => 'GT-I6712!',
+    12 => 'GT-M3710',
+    13 => 'GT-M5650',
+    14 => 'GT-S3370!',
+    15 => 'GT-S36(50|53)!',
+    16 => 'GT-S3770!',
+    17 => 'GT-S38(00|02)!',
+    18 => 'GT-S3850',
+    19 => 'GT-S5220',
+    20 => 'GT-S5222R',
+    21 => 'GT-S5222',
+    22 => 'GT-S52(30|33)!',
+    23 => 'GT-S5260P',
+    24 => 'GT-S52(60|63)!',
+    25 => 'GT-S5292R',
+    26 => 'GT-S5292',
+    27 => 'GT-S5560!',
+    28 => 'GT-S5600',
+    29 => 'GT-S5603',
+    30 => 'GT-S5620!',
+    31 => 'GT-S5680',
+    32 => 'GT-S7550',
+    33 => 'GT-S8000c',
+    34 => 'GT-S8003',
+  ),
+  '@S8' => 
+  array (
+    0 => 'S80(00|03)!',
+  ),
+  '@SG' => 
+  array (
+    0 => 'SGH-A597',
+    1 => 'SGH-F480',
+    2 => 'SGH-F480I',
+    3 => 'SGH-T528g',
+  ),
+);

+ 534 - 0
Qii/Library/Third/data/indices/models-wm.php

@@ -0,0 +1,534 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$WM_INDEX = array (
+  '@' => 
+  array (
+    0 => '.*T5555!',
+    1 => '.*T8585!',
+    2 => '.*S521!',
+    3 => '.*T33(20|33|35)!',
+    4 => '.*T5353!',
+    5 => '.*P3700!',
+    6 => '.*T82(82|83)!',
+    7 => '.*T73(73|80)!',
+    8 => '.*T7272!',
+    9 => '.*T2223!',
+  ),
+  '@-G' => 
+  array (
+    0 => '-GalaxyII',
+    1 => '-GalaxyMini',
+  ),
+  '@-P' => 
+  array (
+    0 => '-P525!',
+    1 => '-P526!',
+    2 => '-P527!',
+    3 => '-P552w!',
+    4 => '-P552!',
+    5 => '-P565!',
+    6 => '-P735!',
+  ),
+  '@12' => 
+  array (
+    0 => 1210,
+  ),
+  '@A3' => 
+  array (
+    0 => 'A3100',
+    1 => 'A3300c',
+  ),
+  '@A4' => 
+  array (
+    0 => 'A4500!',
+  ),
+  '@AL' => 
+  array (
+    0 => 'Alltel HTC PPC6800',
+    1 => 'Alltel HTC Touch',
+    2 => 'Alltel HTC Touch Diamond',
+  ),
+  '@AM' => 
+  array (
+    0 => 'Ameo!',
+  ),
+  '@BI' => 
+  array (
+    0 => 'Bird T900',
+  ),
+  '@C6' => 
+  array (
+    0 => 'C6625',
+  ),
+  '@CH' => 
+  array (
+    0 => 'CHT 9100!',
+  ),
+  '@CO' => 
+  array (
+    0 => 'Coolpad F800',
+  ),
+  '@DA' => 
+  array (
+    0 => 'Datalogic Memor',
+  ),
+  '@DO' => 
+  array (
+    0 => 'Dopod838Pro',
+    1 => 'DopodD810',
+    2 => 'dopod-S900c',
+    3 => 'dopodT5588',
+    4 => 'dopodT8388',
+    5 => 'dopodT8588',
+  ),
+  '@DX' => 
+  array (
+    0 => 'DX900',
+  ),
+  '@E1' => 
+  array (
+    0 => 'E100',
+  ),
+  '@ES' => 
+  array (
+    0 => 'ES405B!',
+  ),
+  '@F9' => 
+  array (
+    0 => 'F900',
+  ),
+  '@GA' => 
+  array (
+    0 => 'garmin-asus-Nuvifone-M10',
+  ),
+  '@GI' => 
+  array (
+    0 => 'GIGABYTE-MS800',
+  ),
+  '@GM' => 
+  array (
+    0 => 'GM730',
+    1 => 'GM750Q',
+  ),
+  '@GT' => 
+  array (
+    0 => 'GT-B5722',
+    1 => 'GT-B6520',
+    2 => 'GT-B7300',
+    3 => 'GT-B7320!',
+    4 => 'GT-B7330!',
+    5 => 'GT-B7350',
+    6 => 'GT-B7610',
+    7 => 'GT-C6625',
+    8 => 'GT-I8000!',
+  ),
+  '@GW' => 
+  array (
+    0 => 'GW550',
+    1 => 'GW825',
+  ),
+  '@H-' => 
+  array (
+    0 => 'H-21',
+  ),
+  '@HD' => 
+  array (
+    0 => '(HTC )?HD mini!',
+    1 => '(HTC )?HD2!',
+  ),
+  '@HP' => 
+  array (
+    0 => 'HP iPAQ 510',
+    1 => 'HPiPAQ510!',
+    2 => 'HPiPAQ610',
+    3 => 'HPiPAQ910!',
+    4 => 'HP iPAQ h6300',
+    5 => 'HP iPAQ hw6500!',
+    6 => 'HPiPAQhw6900!',
+    7 => 'HPiPAQrw6800!',
+    8 => 'HPiPAQrw6815!',
+    9 => 'HPiPAQDataMessenger!',
+    10 => 'HPiPAQVoiceMessenger!',
+    11 => 'HPiPAQGlisten',
+    12 => 'HP KB1',
+  ),
+  '@HT' => 
+  array (
+    0 => 'HTC8500',
+    1 => 'HTC P3300',
+    2 => 'HTC love',
+    3 => 'HTC P3350',
+    4 => 'HTC P3400!',
+    5 => 'HTC P3450!',
+    6 => 'HTC HERALD',
+    7 => 'HTC P6300',
+    8 => 'HTC P6500',
+    9 => 'HTC X7500',
+    10 => 'HTC X7510',
+    11 => '(HTC )?HD mini!',
+    12 => '(HTC )?HD2!',
+    13 => 'HTC T8290',
+    14 => 'HTC MAX 4G',
+    15 => 'HTC MTeoR',
+    16 => 'HTC Prophet',
+    17 => 'HTC Snap!',
+    18 => 'HTC Maple S520',
+    19 => 'HTC S620!',
+    20 => 'HTC Excalibur',
+    21 => 'HTC S630',
+    22 => 'HTC S710',
+    23 => 'HTC S730',
+    24 => 'HTC S740',
+    25 => 'HTC Touch',
+    26 => 'HTC Elf',
+    27 => 'HTC 6900',
+    28 => 'HTC6900',
+    29 => 'HTC6900-MR1',
+    30 => 'HTC TouchDual',
+    31 => 'HTC Touch 3G!',
+    32 => 'HTC Jade',
+    33 => 'HTC Mega!',
+    34 => 'HTC Touch2!',
+    35 => 'HTC Touch Cruise!',
+    36 => 'HTC P3650',
+    37 => 'HTC P3651',
+    38 => 'HTC Polaris',
+    39 => 'HTC Touch Diamond2!',
+    40 => 'HTC Touch Diamond!',
+    41 => 'HTC Diamond',
+    42 => 'HTC P3701',
+    43 => 'HTC P5500',
+    44 => 'HTC P5310!',
+    45 => 'HTC Touch HD2!',
+    46 => 'HTC Touch HD!',
+    47 => 'HTC Touch Pro2!',
+    48 => 'HTC Touch Pro!',
+    49 => 'HTC P4600',
+    50 => 'HTC Raphael',
+    51 => 'HTC Touch Viva!',
+    52 => 'HTC Trinity',
+    53 => 'HTC P3600',
+    54 => 'HTC P3600i',
+    55 => 'HTC v3600',
+    56 => 'HTC TyTN II',
+    57 => 'HTC Kaiser',
+    58 => 'HTC TyTN!',
+    59 => 'HTC Mercury',
+    60 => 'HTC wizard',
+    61 => 'HTCPPC6850!',
+    62 => 'HTC VDA V',
+    63 => 'HTC v1510',
+    64 => 'HTC VPACompactIV',
+    65 => 'HT01A',
+  ),
+  '@I-' => 
+  array (
+    0 => 'i-mate JAMA',
+    1 => 'i-mate JAMAQ',
+    2 => 'i-mate JAMin',
+    3 => 'i-mate JASJAM',
+    4 => 'i-mate JAQ',
+    5 => 'i-mate JAQ3',
+    6 => 'i-mate K-JAM',
+    7 => 'i-mate PDAL',
+    8 => 'i-mate 6150',
+    9 => 'i-mate 8150!',
+    10 => 'i-mate 8502',
+    11 => 'i-mate 9502!',
+  ),
+  '@K-' => 
+  array (
+    0 => 'K-Touch W366!',
+  ),
+  '@KD' => 
+  array (
+    0 => 'KDDI-HT01',
+  ),
+  '@KY' => 
+  array (
+    0 => 'Kyocera-E4000',
+  ),
+  '@LE' => 
+  array (
+    0 => 'Lenovo ET860',
+    1 => 'LENOVO-ET980',
+  ),
+  '@LG' => 
+  array (
+    0 => 'LG-GM730!',
+    1 => 'LG-GM750!',
+    2 => 'LG-GW550!',
+    3 => 'LG-KS20',
+    4 => 'LG-MS25',
+    5 => 'LGE VS750',
+  ),
+  '@M1' => 
+  array (
+    0 => 'M1i',
+  ),
+  '@M5' => 
+  array (
+    0 => 'M530w!',
+  ),
+  '@M9' => 
+  array (
+    0 => 'M930!',
+  ),
+  '@MC' => 
+  array (
+    0 => 'MC45!',
+    1 => 'MC659B!',
+  ),
+  '@MD' => 
+  array (
+    0 => 'MDA III!',
+    1 => 'MDA compact II!',
+    2 => 'MDA compact!',
+    3 => 'MDA Pro!',
+    4 => 'MDA Touch!',
+    5 => 'MDA Vario!',
+  ),
+  '@NU' => 
+  array (
+    0 => 'Nuvifone-M10',
+    1 => 'Nuvifone-M20',
+  ),
+  '@O2' => 
+  array (
+    0 => 'o2 Xda comet',
+    1 => 'O2 Xda 2mini',
+    2 => 'O2 Xda 2s',
+  ),
+  '@P3' => 
+  array (
+    0 => 'P3470!',
+    1 => 'P3450',
+    2 => 'P3650',
+    3 => 'P3650t',
+    4 => 'P3600!',
+  ),
+  '@P4' => 
+  array (
+    0 => 'P400',
+    1 => 'P4350!',
+    2 => 'P4550',
+  ),
+  '@P5' => 
+  array (
+    0 => 'P550',
+  ),
+  '@P7' => 
+  array (
+    0 => 'P750',
+  ),
+  '@PA' => 
+  array (
+    0 => 'Palm500!',
+    1 => 'Palm750',
+    2 => 'Palm850!',
+    3 => 'Palm Treo850e',
+    4 => 'PANTECH-C810',
+  ),
+  '@PP' => 
+  array (
+    0 => 'PPC6850!',
+  ),
+  '@Q-' => 
+  array (
+    0 => 'Q-UMTS',
+  ),
+  '@Q8' => 
+  array (
+    0 => 'Q8',
+  ),
+  '@Q9' => 
+  array (
+    0 => 'Q9',
+    1 => 'Q9c!',
+    2 => 'Q9m!',
+  ),
+  '@S0' => 
+  array (
+    0 => 'S01SH',
+    1 => 'S01SH2',
+  ),
+  '@S1' => 
+  array (
+    0 => 'S11HT',
+    1 => 'S12HT',
+  ),
+  '@S2' => 
+  array (
+    0 => 'S200',
+    1 => 'S21HT',
+    2 => 'S22HT',
+  ),
+  '@SC' => 
+  array (
+    0 => 'SCH-M490',
+    1 => 'SCH-M710',
+    2 => 'SCH-M715',
+    3 => 'SCH-i220!',
+    4 => 'SCH-i225!',
+    5 => 'SCH-i760!',
+    6 => 'SCH-i770!',
+    7 => 'SCHI910!',
+    8 => 'SCH-i920',
+    9 => 'SC-01B',
+  ),
+  '@SF' => 
+  array (
+    0 => 'SFR v3650!',
+  ),
+  '@SG' => 
+  array (
+    0 => 'SGH-i600!',
+    1 => 'SGH-i601!',
+    2 => 'SGH-I607',
+    3 => 'SGH-i608!',
+    4 => 'SGH-I617',
+    5 => 'SGH-I637',
+    6 => 'SGH-i640!',
+    7 => 'SGH-i718',
+    8 => 'SGH-i718plus',
+    9 => 'SGH-i728',
+    10 => 'SGH-i780!',
+    11 => 'SGH-i900!',
+    12 => 'SGH-i908E',
+  ),
+  '@SI' => 
+  array (
+    0 => 'SIE-SX66',
+    1 => 'sigmarion3',
+  ),
+  '@SP' => 
+  array (
+    0 => 'Sprint:MotoQ9c',
+    1 => 'Sprint Treo850e',
+    2 => 'SPH-M7200',
+    3 => 'SPH-M7350',
+    4 => 'SPH-M8400',
+    5 => 'SPHI325!',
+    6 => 'Spice D1100',
+    7 => 'SPV E600',
+    8 => 'SPV E650',
+    9 => 'SPV M700',
+    10 => 'SPV M2000',
+    11 => 'SPV M3100',
+    12 => 'Sprint S511',
+    13 => 'Sprint:SPH-ip830w',
+    14 => 'Sprint:PPC6600-1',
+    15 => 'Sprint:PPC-6700',
+    16 => 'Sprint:PPC6800',
+    17 => 'Sprint PPC6850SP',
+    18 => 'Sprint MP6850SP',
+    19 => 'Sprint MP6900SP',
+    20 => 'Sprint MP6950SP',
+  ),
+  '@T-' => 
+  array (
+    0 => 'T-Mobile Atlas',
+    1 => 'T-Mobile Dash',
+    2 => 'T-Mobile LEO',
+    3 => 'T-Mobile Cleopatra',
+    4 => 'T-01A!',
+    5 => 'T-01B!',
+  ),
+  '@T5' => 
+  array (
+    0 => 'T5388',
+  ),
+  '@T9' => 
+  array (
+    0 => 'T9188',
+    1 => 'T9199',
+  ),
+  '@TG' => 
+  array (
+    0 => '(Toshiba[- ])?TG01!',
+  ),
+  '@TO' => 
+  array (
+    0 => '(Toshiba[- ])?TG01!',
+  ),
+  '@TR' => 
+  array (
+    0 => 'Treo800w',
+  ),
+  '@V1' => 
+  array (
+    0 => 'v1415',
+    1 => 'v1240',
+    2 => 'v1210',
+    3 => 'v1640',
+  ),
+  '@VE' => 
+  array (
+    0 => 'Velocity',
+  ),
+  '@VI' => 
+  array (
+    0 => 'VIP12!',
+  ),
+  '@VP' => 
+  array (
+    0 => 'VPA Touch',
+  ),
+  '@W3' => 
+  array (
+    0 => 'W366',
+  ),
+  '@WS' => 
+  array (
+    0 => 'WS003SH',
+    1 => 'WS004SH',
+    2 => 'WS007SH',
+    3 => 'WS011SH',
+    4 => 'WS020SH',
+    5 => 'WS027SH',
+  ),
+  '@X0' => 
+  array (
+    0 => 'X01T',
+    1 => 'X02T!',
+    2 => 'X01HT',
+    3 => 'X02HT',
+    4 => 'X03HT',
+    5 => 'X04HT',
+    6 => 'X05HT',
+    7 => 'X01SC',
+  ),
+  '@X1' => 
+  array (
+    0 => 'X1',
+    1 => 'X1[ia]!',
+  ),
+  '@X2' => 
+  array (
+    0 => 'X2',
+    1 => 'X2[ia]!',
+  ),
+  '@XD' => 
+  array (
+    0 => 'Xda diamond',
+    1 => 'Xda neo',
+    2 => 'Xda nova',
+    3 => 'Xda orbit',
+    4 => 'Xda terra',
+    5 => 'Xda trion',
+  ),
+  '@XV' => 
+  array (
+    0 => 'XV6175!',
+    1 => 'XV6875!',
+    2 => 'XV6900',
+    3 => 'XV6975',
+  ),
+  '@ZT' => 
+  array (
+    0 => 'ZTE E N72',
+    1 => 'ZTE E X70',
+  ),
+);

+ 516 - 0
Qii/Library/Third/data/indices/models-wp.php

@@ -0,0 +1,516 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$WP_INDEX = array (
+  '@' => 
+  array (
+    0 => '(HD7|.*T92(92|95|96))!',
+    1 => '((7 )?Mozart|.*T86(97|98))!',
+    2 => '(7 Pro|.*T75(75|76))!',
+    3 => '.*T8788!',
+    4 => '((7 )?Trophy|.*T8686)!',
+    5 => '(Radar|.*C110e)!',
+    6 => '.*X310e!',
+    7 => '(Lumia ?|Nokia ?)?[0-9]{3,4}!!',
+  ),
+  '@- ' => 
+  array (
+    0 => '- BUSH Windows Phone',
+    1 => '- Lazer SMART WIND',
+  ),
+  '@0P' => 
+  array (
+    0 => '0P6B140',
+    1 => '0P6B180',
+  ),
+  '@40' => 
+  array (
+    0 => '40 Cesium',
+  ),
+  '@47' => 
+  array (
+    0 => 47,
+  ),
+  '@4A' => 
+  array (
+    0 => '4Afrika',
+  ),
+  '@69' => 
+  array (
+    0 => '6990LVW',
+  ),
+  '@7 ' => 
+  array (
+    0 => '((7 )?Mozart|.*T86(97|98))!',
+    1 => '7 HTC MOZART',
+    2 => '(7 Pro|.*T75(75|76))!',
+    3 => '7 Surround',
+    4 => '((7 )?Trophy|.*T8686)!',
+  ),
+  '@75' => 
+  array (
+    0 => '75eL0N',
+  ),
+  '@8S' => 
+  array (
+    0 => '8S',
+    1 => '8S by HTC',
+  ),
+  '@8X' => 
+  array (
+    0 => '8X',
+    1 => '8X by HTC',
+  ),
+  '@;H' => 
+  array (
+    0 => ';HD2',
+  ),
+  '@;P' => 
+  array (
+    0 => ';PD67100',
+  ),
+  '@<M' => 
+  array (
+    0 => '<model>!',
+  ),
+  '@A6' => 
+  array (
+    0 => 'A620(b|d|e|m|t)!',
+  ),
+  '@AC' => 
+  array (
+    0 => 'AC50CE',
+    1 => 'ACD U',
+    2 => 'Accord',
+  ),
+  '@AL' => 
+  array (
+    0 => 'Allegro',
+  ),
+  '@AN' => 
+  array (
+    0 => 'Andi4L',
+    1 => 'Android!',
+  ),
+  '@AT' => 
+  array (
+    0 => 'Ativ S',
+    1 => 'ATIV S Neo',
+  ),
+  '@BI' => 
+  array (
+    0 => 'Billy 4.7',
+  ),
+  '@BP' => 
+  array (
+    0 => 'BP30.BM180',
+  ),
+  '@C6' => 
+  array (
+    0 => 'C620(d|e|t)!',
+    1 => 'C625(a|b)!',
+  ),
+  '@CE' => 
+  array (
+    0 => 'CETUS',
+  ),
+  '@DO' => 
+  array (
+    0 => 'DolphinCT50',
+  ),
+  '@E2' => 
+  array (
+    0 => 'E260T+',
+  ),
+  '@E6' => 
+  array (
+    0 => 'E600',
+  ),
+  '@ET' => 
+  array (
+    0 => 'Eternity',
+  ),
+  '@FI' => 
+  array (
+    0 => 'FierceXL',
+  ),
+  '@FO' => 
+  array (
+    0 => 'Focus i917!',
+    1 => 'FOCUS S',
+  ),
+  '@FT' => 
+  array (
+    0 => 'FTJ152E',
+    1 => 'FTJ152F',
+  ),
+  '@FZ' => 
+  array (
+    0 => 'FZ-E1',
+  ),
+  '@GA' => 
+  array (
+    0 => 'Galaxy6',
+  ),
+  '@GO' => 
+  array (
+    0 => 'Gold',
+  ),
+  '@GT' => 
+  array (
+    0 => 'GT-[IS][0-9]{4,4}!!',
+  ),
+  '@GW' => 
+  array (
+    0 => 'GW910',
+  ),
+  '@H8' => 
+  array (
+    0 => 'H883G',
+  ),
+  '@HA' => 
+  array (
+    0 => 'Harley Davidson',
+    1 => 'Harley-Davidson',
+    2 => 'Haden',
+  ),
+  '@HD' => 
+  array (
+    0 => 'HD2',
+    1 => 'HD2(Leo',
+    2 => 'HD2 LEO',
+    3 => '(HD7|.*T92(92|95|96))!',
+  ),
+  '@HE' => 
+  array (
+    0 => 'HELSINKI',
+  ),
+  '@HT' => 
+  array (
+    0 => 'HTC HD2',
+    1 => 'HTC Mozart',
+    2 => 'htc mpw6958',
+    3 => 'htcmpw6958',
+    4 => 'HTC 7 Trophy',
+    5 => 'HTC Trophy',
+    6 => 'HTC6690LVW',
+    7 => 'HTC6990LVW',
+    8 => 'HTC6990LVW 4G',
+    9 => 'htc 8x',
+    10 => 'HTCPO881',
+    11 => 'HTC6995LVW',
+  ),
+  '@HU' => 
+  array (
+    0 => 'HUAWEI Ascend W1!',
+    1 => 'HUAWEI ?W1-(C00|U00|U34)!',
+    2 => 'HUAWEI ?W2-(T00|T01|U00|U051)!',
+  ),
+  '@I9' => 
+  array (
+    0 => 'I917',
+  ),
+  '@ID' => 
+  array (
+    0 => 'id[0-9]{3,3}!!',
+  ),
+  '@IM' => 
+  array (
+    0 => 'Impera I',
+    1 => 'Impera M',
+    2 => 'Impera S',
+  ),
+  '@IN' => 
+  array (
+    0 => 'InfoPath!',
+  ),
+  '@IQ' => 
+  array (
+    0 => 'IQ400W',
+  ),
+  '@IR' => 
+  array (
+    0 => 'iris Win 1',
+  ),
+  '@IS' => 
+  array (
+    0 => 'IS12T',
+  ),
+  '@IX' => 
+  array (
+    0 => 'Ixion W 5',
+  ),
+  '@LE' => 
+  array (
+    0 => 'LEO',
+  ),
+  '@LG' => 
+  array (
+    0 => 'LG-E740!',
+    1 => 'LG-E-?900!',
+    2 => 'LG-E906',
+    3 => 'LG-C900!',
+  ),
+  '@LI' => 
+  array (
+    0 => 'Linux!',
+  ),
+  '@LU' => 
+  array (
+    0 => '(Lumia ?|Nokia ?)?[0-9]{3,4}!!',
+  ),
+  '@M2' => 
+  array (
+    0 => 'M220',
+  ),
+  '@M3' => 
+  array (
+    0 => 'M310',
+  ),
+  '@M5' => 
+  array (
+    0 => 'M5w',
+  ),
+  '@MA' => 
+  array (
+    0 => 'Mazaa',
+  ),
+  '@ME' => 
+  array (
+    0 => 'MegaFon SP-W1',
+  ),
+  '@MI' => 
+  array (
+    0 => 'MICROMAX-W121',
+    1 => 'MI4',
+    2 => 'Microsoft!',
+  ),
+  '@MO' => 
+  array (
+    0 => 'MOBILE Alpha Luxe',
+    1 => 'MOBILE Alpha Style',
+    2 => 'Mondrian',
+    3 => '((7 )?Mozart|.*T86(97|98))!',
+    4 => 'MouseComputer MADOSMA Q501',
+  ),
+  '@MW' => 
+  array (
+    0 => 'MWP6885',
+    1 => 'mwp6985',
+    2 => 'MWP-47!',
+  ),
+  '@N8' => 
+  array (
+    0 => 'N880e!',
+  ),
+  '@NE' => 
+  array (
+    0 => 'NEO',
+  ),
+  '@NO' => 
+  array (
+    0 => '(Lumia ?|Nokia ?)?[0-9]{3,4}!!',
+  ),
+  '@OM' => 
+  array (
+    0 => 'Omega',
+    1 => 'OM(NI|IN)A ?7!',
+    2 => 'Omnia W',
+  ),
+  '@ON' => 
+  array (
+    0 => 'ONE TOUCH 5040X',
+  ),
+  '@PC' => 
+  array (
+    0 => 'PC93100',
+    1 => 'PC40100',
+  ),
+  '@PD' => 
+  array (
+    0 => 'PD67100',
+  ),
+  '@PI' => 
+  array (
+    0 => 'PI39100',
+    1 => 'PI86100',
+  ),
+  '@PK' => 
+  array (
+    0 => 'PKT-407',
+  ),
+  '@PM' => 
+  array (
+    0 => 'PM23300',
+  ),
+  '@PR' => 
+  array (
+    0 => 'PRESTIGIO-PSP8500DUO',
+  ),
+  '@PS' => 
+  array (
+    0 => 'PSP8400DUO',
+    1 => 'PSP8500DUO',
+  ),
+  '@QS' => 
+  array (
+    0 => 'QSMART DREAM W473',
+  ),
+  '@QU' => 
+  array (
+    0 => 'Quantum',
+  ),
+  '@RA' => 
+  array (
+    0 => '(Radar|.*C110e)!',
+  ),
+  '@RI' => 
+  array (
+    0 => 'RIO U',
+  ),
+  '@RM' => 
+  array (
+    0 => 'RM-[0-9]{3,4}!!',
+  ),
+  '@S5' => 
+  array (
+    0 => 'S58',
+  ),
+  '@S6' => 
+  array (
+    0 => 'S606',
+  ),
+  '@SC' => 
+  array (
+    0 => 'Schubert!',
+    1 => 'SCH-R860U',
+    2 => 'SCH-I930',
+  ),
+  '@SE' => 
+  array (
+    0 => 'SeaRay',
+  ),
+  '@SG' => 
+  array (
+    0 => 'SGH-[IT][0-9]{3,3}!!',
+  ),
+  '@SM' => 
+  array (
+    0 => 'SM-W750V',
+  ),
+  '@SO' => 
+  array (
+    0 => 'SOUL2',
+  ),
+  '@SP' => 
+  array (
+    0 => 'Spark',
+    1 => 'SPH-I800',
+  ),
+  '@SU' => 
+  array (
+    0 => 'Surround',
+    1 => 'Surface Phone',
+  ),
+  '@TA' => 
+  array (
+    0 => 'Taylor',
+    1 => 'Tania',
+  ),
+  '@TC' => 
+  array (
+    0 => 'TC70',
+  ),
+  '@TG' => 
+  array (
+    0 => 'TG01',
+  ),
+  '@TH' => 
+  array (
+    0 => 'Thunder 450W',
+  ),
+  '@TI' => 
+  array (
+    0 => 'Titan',
+    1 => 'Titanium Wind W4',
+  ),
+  '@TO' => 
+  array (
+    0 => 'Touch-IT HD7',
+    1 => 'Touch-IT Trophy',
+  ),
+  '@TR' => 
+  array (
+    0 => '((7 )?Trophy|.*T8686)!',
+  ),
+  '@TS' => 
+  array (
+    0 => 'TSUNAGI',
+  ),
+  '@UL' => 
+  array (
+    0 => 'Ultimate',
+  ),
+  '@US' => 
+  array (
+    0 => 'USCCHTC-PC93100',
+    1 => 'USCCN859',
+  ),
+  '@V9' => 
+  array (
+    0 => 'V965W',
+  ),
+  '@VE' => 
+  array (
+    0 => 'Venue Pro',
+  ),
+  '@VI' => 
+  array (
+    0 => 'Virtual!',
+  ),
+  '@VW' => 
+  array (
+    0 => 'VW820',
+  ),
+  '@W1' => 
+  array (
+    0 => 'W10',
+    1 => 'W1-(C00|U00|U34)!',
+    2 => 'W121',
+  ),
+  '@W2' => 
+  array (
+    0 => 'W2-(T00|T01|U00)!',
+  ),
+  '@W4' => 
+  array (
+    0 => 'W4',
+  ),
+  '@WI' => 
+  array (
+    0 => 'WIN HD LTE',
+    1 => 'WIN HD W510l',
+    2 => 'WIN HD W510u',
+    3 => 'WIN JR LTE',
+    4 => 'WIN JR W410a',
+    5 => 'WIN JR W410i',
+    6 => 'WIN JR W410u',
+    7 => 'WIN 400',
+    8 => 'WINJOY',
+    9 => 'WinWin',
+    10 => 'Windows Phone 8X by HTC!',
+    11 => 'WindowsPhone8Xby',
+    12 => 'Windows Phone 8S by HTC!',
+    13 => 'WindowsPhone8Sby',
+    14 => 'Win1',
+    15 => 'Win-Q900S',
+    16 => 'Win Q1000',
+    17 => 'WinQ1000',
+    18 => 'Windows!',
+  ),
+  '@XX' => 
+  array (
+    0 => 'XXX!',
+  ),
+);

+ 40 - 0
Qii/Library/Third/data/manufacturer-names.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+Manufacturers::$GENERIC = [
+    'LG Electronics'                            => 'LG',
+    'LGE'                                       => 'LG',
+    'TOSHIBA'                                   => 'Toshiba',
+    'SAMSUNG'                                   => 'Samsung',
+    'SHARP'                                     => 'Sharp',
+    'SONY'                                      => 'Sony',
+];
+
+Manufacturers::$TELEVISION = [
+    'ALDISUED'                                  => 'Aldi',
+    'BANGOLUFSEN'                               => 'Bang & Olufsen',
+    'CHANGHONG'                                 => 'Changhong',
+    'changhong'                                 => 'Changhong',
+    'FINLUX'                                    => 'Finlux',
+    'HHW HAIER'                                 => 'Haier',
+    'HITACHI'                                   => 'Hitachi',
+    'HYUNDAI'                                   => 'Hyundai',
+    'inverto'                                   => 'Inverto',
+    'LOEWE'                                     => 'Loewe',
+    'MEDION'                                    => 'Medion',
+    'Nagra OpenTV'                              => 'NAGRA',
+    'PANASONIC'                                 => 'Panasonic',
+    'Sagemcom_Broadband_SAS'                    => 'Sagemcom',
+    'SERAPHIC'                                  => 'Seraphic',
+    'selevision'                                => 'Selevision',
+    'smart'                                     => 'Smart',
+    'Sky_worth'                                 => 'Skyworth',
+    'TechnoTrend Goerler'                       => 'TechnoTrend',
+    'TechnoTrend Goerler/Kathrein'              => 'TechnoTrend',
+    'TELEFUNKEN'                                => 'Telefunken',
+    'THOM'                                      => 'Thomson',
+    'THOMSON'                                   => 'Thomson',
+    'tv2n'                                      => 'TV2N',
+    'VESTEL'                                    => 'Vestel'
+];

+ 17380 - 0
Qii/Library/Third/data/models-android.php

@@ -0,0 +1,17380 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+use WhichBrowser\Constants\DeviceType;
+use WhichBrowser\Constants\DeviceSubType;
+use WhichBrowser\Constants\Flag;
+
+DeviceModels::$ANDROID_MODELS = [
+
+    /* Generic identifiers */
+    'Android'                                   => [ null, null ],
+    'google sdk'                                => [ null, null, DeviceType::EMULATOR ],
+    'sdk'                                       => [ null, null, DeviceType::EMULATOR ],
+    'generic'                                   => [ null, null ],
+    'generic x86'                               => [ null, null ],
+    'VirtualBox!'                               => [ null, null, DeviceType::EMULATOR ],
+
+    /* Development boards and kits */
+    'amd brazos'                                => [ 'AMD', 'Fusion based device', DeviceType::DEVBOARD ],
+    'amd persimmon'                             => [ 'AMD', 'Persimmon based device', DeviceType::DEVBOARD ],
+    'Amlogic M1 reference board'                => [ 'Amlogic', 'M1 reference board', DeviceType::DEVBOARD ],
+    'AML8726M'                                  => [ 'Amlogic', 'AML8726-M based device', DeviceType::DEVBOARD ],
+    'AMLOGIC8726MX'                             => [ 'Amlogic', 'AML8726-MX based device', DeviceType::DEVBOARD ],
+    'vexpress a9'                               => [ 'ARM', 'Versatile Express development platform', DeviceType::DEVBOARD ],
+    'sama5d3'                                   => [ 'Atmel', 'SAMA5D3 based device', DeviceType::DEVBOARD ],
+    'BEAGLEBONE'                                => [ 'BeagleBoard', 'BeagleBone', DeviceType::DEVBOARD ],
+    'BeagleBone Black'                          => [ 'BeagleBoard', 'BeagleBone Black', DeviceType::DEVBOARD ],
+    'BEAGLEBONEBLACK'                           => [ 'BeagleBoard', 'BeagleBone Black', DeviceType::DEVBOARD ],
+    'BEAGLEBONEBLACK.A5C'                       => [ 'BeagleBoard', 'BeagleBone Black', DeviceType::DEVBOARD ],
+    'NITROGEN6X'                                => [ 'Boundary Devices', 'Nitrogen6X', DeviceType::DEVBOARD ],
+    'bcm platform'                              => [ 'Broadcom', 'BCM based device', DeviceType::DEVBOARD ],
+    'bcm7231'                                   => [ 'Broadcom', 'BCM7231 based device', DeviceType::DEVBOARD ],
+    'bcm7425'                                   => [ 'Broadcom', 'BCM7425 based device', DeviceType::DEVBOARD ],
+    'bcm7429'                                   => [ 'Broadcom', 'BCM7429 based device', DeviceType::DEVBOARD ],
+    'bcm7435'                                   => [ 'Broadcom', 'BCM7435 based device', DeviceType::DEVBOARD ],
+    'bcm7439'                                   => [ 'Broadcom', 'BCM7439 based device', DeviceType::DEVBOARD ],
+    'bcm7445'                                   => [ 'Broadcom', 'BCM7445 based device', DeviceType::DEVBOARD ],
+    'bcm7584'                                   => [ 'Broadcom', 'BCM7584 based device', DeviceType::DEVBOARD ],
+    'BCM21654!'                                 => [ 'Broadcom', 'BCM21654 based device', DeviceType::DEVBOARD ],
+    'BCM21664!'                                 => [ 'Broadcom', 'BCM21664 based device', DeviceType::DEVBOARD ],
+    'BCM23550!'                                 => [ 'Broadcom', 'BCM23550 based device', DeviceType::DEVBOARD ],
+    'BCM28145!'                                 => [ 'Broadcom', 'BCM28145 based device', DeviceType::DEVBOARD ],
+    'BCM28155!'                                 => [ 'Broadcom', 'BCM28155 based device', DeviceType::DEVBOARD ],
+    'imx50!'                                    => [ 'Freescale', 'i.MX50 based device', DeviceType::DEVBOARD ],
+    'imx51!'                                    => [ 'Freescale', 'i.MX51 based device', DeviceType::DEVBOARD ],
+    'imx53!'                                    => [ 'Freescale', 'i.MX53 based device', DeviceType::DEVBOARD ],
+    'imx6q!'                                    => [ 'Freescale', 'i.MX6Q based device', DeviceType::DEVBOARD ],
+    'SABRESD-MX6DQ'                             => [ 'Freescale', 'i.MX6DQ based device', DeviceType::DEVBOARD ],
+    'odroida'                                   => [ 'Hardkernel', 'ODROID-A developer tablet', DeviceType::TABLET ],
+    'ODROID-A'                                  => [ 'Hardkernel', 'ODROID-A developer tablet', DeviceType::TABLET ],
+    'ODROIDC'                                   => [ 'Hardkernel', 'ODROID-C1 developer tablet', DeviceType::TABLET ],
+    'ODROIDC2'                                  => [ 'Hardkernel', 'ODROID-C2 developer tablet', DeviceType::TABLET ],
+    'ODROID-U'                                  => [ 'Hardkernel', 'ODROID-U developer board', DeviceType::DEVBOARD ],
+    'ODROID-U2'                                 => [ 'Hardkernel', 'ODROID-U2 developer board', DeviceType::DEVBOARD ],
+    'ODROID-X'                                  => [ 'Hardkernel', 'ODROID-X developer board', DeviceType::DEVBOARD ],
+    'ODROID-XU'                                 => [ 'Hardkernel', 'ODROID-XU developer board', DeviceType::DEVBOARD ],
+    'ODROID-XU3'                                => [ 'Hardkernel', 'ODROID-XU3 developer board', DeviceType::DEVBOARD ],
+    'ODROID-XU3-ATV'                            => [ 'Hardkernel', 'ODROID-XU3 developer board', DeviceType::DEVBOARD ],
+    'ODROID-XU4'                                => [ 'Hardkernel', 'ODROID-XU4 developer board', DeviceType::DEVBOARD ],
+    'ODROID-X2'                                 => [ 'Hardkernel', 'ODROID-X2 developer board', DeviceType::DEVBOARD ],
+    'Bay Trail Generic Platform'                => [ 'Intel', 'Bay Trail based device', DeviceType::DEVBOARD ],
+    'Bayley Bay'                                => [ 'Intel', 'Bay Trail based device', DeviceType::DEVBOARD ],
+    'cedartrail'                                => [ 'Intel', 'Cedar Trail based device', DeviceType::DEVBOARD ],
+    'mfld (dv10|dv20|gi|lw00|pr2|pr3)!'         => [ 'Intel', 'Medfield based device', DeviceType::DEVBOARD ],
+    'redhookbay'                                => [ 'Intel', 'Merrifield based device', DeviceType::DEVBOARD ],
+    'saltbay'                                   => [ 'Intel', 'Merrifield based device', DeviceType::DEVBOARD ],
+    'victoriabay'                               => [ 'Intel', 'Merrifield based device', DeviceType::DEVBOARD ],
+    'Shark Bay Client platform'                 => [ 'Intel', 'Haswell based device', DeviceType::DEVBOARD ],
+    'BP710A'                                    => [ 'Intel', 'Yukka Beach based device', DeviceType::DEVBOARD ],
+    'yukkabeach'                                => [ 'Intel', 'Yukka Beach based device', DeviceType::DEVBOARD ],
+    'berlin'                                    => [ 'Marvell', 'Armada based device', DeviceType::DEVBOARD ],
+    'berlin bg2!'                               => [ 'Marvell', 'Armada based device', DeviceType::DEVBOARD ],
+    'berlin generic!'                           => [ 'Marvell', 'Armada based device', DeviceType::DEVBOARD ],
+    'bg2 !'                                     => [ 'Marvell', 'Armada based device', DeviceType::DEVBOARD ],
+    'bg2ct !'                                   => [ 'Marvell', 'Armada based device', DeviceType::DEVBOARD ],
+    'bg2q4k !'                                  => [ 'Marvell', 'Armada based device', DeviceType::DEVBOARD ],
+    'bg2qa0v4 !'                                => [ 'Marvell', 'Armada based device', DeviceType::DEVBOARD ],
+    'bg2qv4 !'                                  => [ 'Marvell', 'Armada based device', DeviceType::DEVBOARD ],
+    'MStar Amber3'                              => [ 'MStar', 'Amber3 based device', DeviceType::DEVBOARD ],
+    'Konka Amber3'                              => [ 'MStar', 'Amber3 based device', DeviceType::DEVBOARD ],
+    'mt5396!'                                   => [ 'Mediatek', 'MT5396 based device', DeviceType::DEVBOARD ],
+    'mt5399!'                                   => [ 'Mediatek', 'MT5399 based device', DeviceType::DEVBOARD ],
+    'mt5861!'                                   => [ 'Mediatek', 'MT5861 based device', DeviceType::DEVBOARD ],
+    'mt5880!'                                   => [ 'Mediatek', 'MT5880 based device', DeviceType::DEVBOARD ],
+    'mt5882!'                                   => [ 'Mediatek', 'MT5882 based device', DeviceType::DEVBOARD ],
+    'mt5890!'                                   => [ 'Mediatek', 'MT5890 based device', DeviceType::DEVBOARD ],
+    'mt6515!'                                   => [ 'Mediatek', 'MT6515 based device', DeviceType::DEVBOARD ],
+    'MTK6515'                                   => [ 'Mediatek', 'MT6515 based device', DeviceType::DEVBOARD ],
+    'mt6517!'                                   => [ 'Mediatek', 'MT6517 based device', DeviceType::DEVBOARD ],
+    'mt6571!'                                   => [ 'Mediatek', 'MT6571 based device', DeviceType::DEVBOARD ],
+    'mt6572!'                                   => [ 'Mediatek', 'MT6572 based device', DeviceType::DEVBOARD ],
+    'baoxue'                                    => [ 'Mediatek', 'MT6573 based device', DeviceType::DEVBOARD ],
+    'bird75v2'                                  => [ 'Mediatek', 'MT6575 based device', DeviceType::DEVBOARD ],
+    'eagle75v1 2'                               => [ 'Mediatek', 'MT6575 based device', DeviceType::DEVBOARD ],
+    'mt6575!'                                   => [ 'Mediatek', 'MT6575 based device', DeviceType::DEVBOARD ],
+    'mt6577!'                                   => [ 'Mediatek', 'MT6577 based device', DeviceType::DEVBOARD ],
+    'mt6582!'                                   => [ 'Mediatek', 'MT6582 based device', DeviceType::DEVBOARD ],
+    'mt6589!'                                   => [ 'Mediatek', 'MT6589 based device', DeviceType::DEVBOARD ],
+    'MTK-MT6589'                                => [ 'Mediatek', 'MT6589 based device', DeviceType::DEVBOARD ],
+    'MTK6589!'                                  => [ 'Mediatek', 'MT6589 based device', DeviceType::DEVBOARD ],
+    'mt6592!'                                   => [ 'Mediatek', 'MT6592 based device', DeviceType::DEVBOARD ],
+    'MTK-MT6592'                                => [ 'Mediatek', 'MT6592 based device', DeviceType::DEVBOARD ],
+    'MTK6592'                                   => [ 'Mediatek', 'MT6592 based device', DeviceType::DEVBOARD ],
+    'mt6595!'                                   => [ 'Mediatek', 'MT6595 based device', DeviceType::DEVBOARD ],
+    'mt6599!'                                   => [ 'Mediatek', 'MT6599 based device', DeviceType::DEVBOARD ],
+    'mt8125!'                                   => [ 'Mediatek', 'MT8125 based device', DeviceType::DEVBOARD ],
+    'mt8127!'                                   => [ 'Mediatek', 'MT8127 based device', DeviceType::DEVBOARD ],
+    'mt8135!'                                   => [ 'Mediatek', 'MT8135 based device', DeviceType::DEVBOARD ],
+    'MTK--8312'                                 => [ 'Mediatek', 'MT8312 based device', DeviceType::DEVBOARD ],
+    'mt8377!'                                   => [ 'Mediatek', 'MT8377 based device', DeviceType::DEVBOARD ],
+    'mt8389!'                                   => [ 'Mediatek', 'MT8389 based device', DeviceType::DEVBOARD ],
+    'mt8580!'                                   => [ 'Mediatek', 'MT8580 based device', DeviceType::DEVBOARD ],
+    'mt8658!'                                   => [ 'Mediatek', 'MT8658 based device', DeviceType::DEVBOARD ],
+    'MBX DVBT reference board (c03ref)'         => [ 'MBX', 'DVBT reference board', DeviceType::DEVBOARD ],
+    'MBX Dongle board!'                         => [ 'MBX', 'Dongle board', DeviceType::DEVBOARD ],
+    'MBX reference board!'                      => [ 'MBX', 'Reference board', DeviceType::DEVBOARD ],
+    'NS115'                                     => [ 'Nufront', 'NuSmart 115 based device', DeviceType::DEVBOARD ],
+    'NS2816'                                    => [ 'Nufront', 'NuSmart 2816 based device', DeviceType::DEVBOARD ],
+    'Ventana'                                   => [ 'Nvidia', 'Tegra Ventana development kit', DeviceType::DEVBOARD ],
+    'Cardhu'                                    => [ 'Nvidia', 'Tegra 3 based device', DeviceType::DEVBOARD ],
+    'Panda(Board)?!'                            => [ 'Pandaboard', 'Development Kit', DeviceType::DEVBOARD ],
+    'Omap5panda'                                => [ 'Pandaboard', 'Development Kit', DeviceType::DEVBOARD ],
+    'MSM'                                       => [ 'Qualcomm', 'Snapdragon based device', DeviceType::DEVBOARD ],
+    'msm(7227|7627)!'                           => [ 'Qualcomm', 'Snapdragon S1 based device', DeviceType::DEVBOARD ],
+    'msm7630!'                                  => [ 'Qualcomm', 'Snapdragon S2 based device', DeviceType::DEVBOARD ],
+    'msm8660!'                                  => [ 'Qualcomm', 'Snapdragon S3 based device', DeviceType::DEVBOARD ],
+    'msm(8x25|8625|8960)!'                      => [ 'Qualcomm', 'Snapdragon S4 based device', DeviceType::DEVBOARD ],
+    'msm8x30!'                                  => [ 'Qualcomm', 'Snapdragon S4 Plus based device', DeviceType::DEVBOARD ],
+    'msm8610!'                                  => [ 'Qualcomm', 'Snapdragon 200 based device', DeviceType::DEVBOARD ],
+    'msm8909!'                                  => [ 'Qualcomm', 'Snapdragon 210 based device', DeviceType::DEVBOARD ],
+    'msm(8226|8228)!'                           => [ 'Qualcomm', 'Snapdragon 400 based device', DeviceType::DEVBOARD ],
+    'MSM8926!'                                  => [ 'Qualcomm', 'Snapdragon 400 based device', DeviceType::DEVBOARD ],
+    'msm8916!'                                  => [ 'Qualcomm', 'Snapdragon 410 based device', DeviceType::DEVBOARD ],
+    'msm8952!'                                  => [ 'Qualcomm', 'Snapdragon 615 based device', DeviceType::DEVBOARD ],
+    'msm8974!'                                  => [ 'Qualcomm', 'Snapdragon 800 based device', DeviceType::DEVBOARD ],
+    'MSM8992!'                                  => [ 'Qualcomm', 'Snapdragon 808 based device', DeviceType::DEVBOARD ],
+    'msm8994!'                                  => [ 'Qualcomm', 'Snapdragon 810 based device', DeviceType::DEVBOARD ],
+    'rksdk'                                     => [ 'Rockchip', 'based device', DeviceType::DEVBOARD ],
+    'rk2808(sdk)?!'                             => [ 'Rockchip', 'RK2808 based device', DeviceType::DEVBOARD ],
+    'rk2818(sdk)?!'                             => [ 'Rockchip', 'RK2818 based device', DeviceType::DEVBOARD ],
+    'Android-for-Rockchip-2818'                 => [ 'Rockchip', 'RK2818 based device', DeviceType::DEVBOARD ],
+    'RK2906'                                    => [ 'Rockchip', 'RK2906 based device', DeviceType::DEVBOARD ],
+    'RK2918'                                    => [ 'Rockchip', 'RK2918 based device', DeviceType::DEVBOARD ],
+    'rk2926-q8'                                 => [ 'Rockchip', 'RK2926 based device', DeviceType::DEVBOARD ],
+    'rk2928sdk'                                 => [ 'Rockchip', 'RK2928 based device', DeviceType::DEVBOARD ],
+    'rk29sdk'                                   => [ 'Rockchip', 'RK29 based device', DeviceType::DEVBOARD ],
+    'rk30sdk!'                                  => [ 'Rockchip', 'RK30 based device', DeviceType::DEVBOARD ],
+    'rk30mtk'                                   => [ 'Rockchip', 'RK30 based device', DeviceType::DEVBOARD ],
+    'rk3026'                                    => [ 'Rockchip', 'RK3026 based device', DeviceType::DEVBOARD ],
+    'rk3028a'                                   => [ 'Rockchip', 'RK3028 based device', DeviceType::DEVBOARD ],
+    'rk3028sdk'                                 => [ 'Rockchip', 'RK3028 based device', DeviceType::DEVBOARD ],
+    'rk3036'                                    => [ 'Rockchip', 'RK3036 based device', DeviceType::DEVBOARD ],
+    'rk3066'                                    => [ 'Rockchip', 'RK3066 based device', DeviceType::DEVBOARD ],
+    'rk31sdk'                                   => [ 'Rockchip', 'RK31 based device', DeviceType::DEVBOARD ],
+    'rk31 5931'                                 => [ 'Rockchip', 'RK31 based device', DeviceType::DEVBOARD ],
+    'rk31 8089'                                 => [ 'Rockchip', 'RK31 based device', DeviceType::DEVBOARD ],
+    'rk31 872xu'                                => [ 'Rockchip', 'RK31 based device', DeviceType::DEVBOARD ],
+    'rk31au'                                    => [ 'Rockchip', 'RK31 based device', DeviceType::DEVBOARD ],
+    'rk31rtl'                                   => [ 'Rockchip', 'RK31 based device', DeviceType::DEVBOARD ],
+    'rk312x'                                    => [ 'Rockchip', 'RK312X based device', DeviceType::DEVBOARD ],
+    'rk3188!'                                   => [ 'Rockchip', 'RK3188 based device', DeviceType::DEVBOARD ],
+    'rk3288!'                                   => [ 'Rockchip', 'RK3288 based device', DeviceType::DEVBOARD ],
+    'rk3990!'                                   => [ 'Rockchip', 'RK3990 based device', DeviceType::DEVBOARD ],
+    's3c6410'                                   => [ 'Samsung', 'S3C6410 based device', DeviceType::DEVBOARD ],
+    'smdk6410'                                  => [ 'Samsung', 'S3C6410 based device', DeviceType::DEVBOARD ],
+    'SMDKC110'                                  => [ 'Samsung', 'Exynos 3110 based device', DeviceType::DEVBOARD ],
+    'SMDKV210'                                  => [ 'Samsung', 'Exynos 4210 based device', DeviceType::DEVBOARD ],
+    'S5PV210'                                   => [ 'Samsung', 'Exynos 4210 based device', DeviceType::DEVBOARD ],
+    'sec smdkc210'                              => [ 'Samsung', 'Exynos 4210 based device', DeviceType::DEVBOARD ],
+    'sec smdkv210'                              => [ 'Samsung', 'Exynos 4210 based device', DeviceType::DEVBOARD ],
+    'SMDK4x12'                                  => [ 'Samsung', 'Exynos 4212 or 4412 based device', DeviceType::DEVBOARD ],
+    'SMDK4412'                                  => [ 'Samsung', 'Exynos 4412 based device', DeviceType::DEVBOARD ],
+    'SMDK5250'                                  => [ 'Samsung', 'Exynos 5250 based device', DeviceType::DEVBOARD ],
+    'SMDK5410'                                  => [ 'Samsung', 'Exynos 5410 based device', DeviceType::DEVBOARD ],
+    'Exynos5410'                                => [ 'Samsung', 'Exynos 5410 based device', DeviceType::DEVBOARD ],
+    'smp86xx'                                   => [ 'Sigma', 'SMP86xx based device', DeviceType::DEVBOARD ],
+    'smp8734'                                   => [ 'Sigma', 'SMP8734 based device', DeviceType::DEVBOARD ],
+    'smp8756'                                   => [ 'Sigma', 'SMP8756 based device', DeviceType::DEVBOARD ],
+    'sv8860'                                    => [ 'Skyviia', 'SV8860 based device', DeviceType::DEVBOARD ],
+    'ste l8540!'                                => [ 'ST Ericsson', 'Novathor L8540 based device', DeviceType::DEVBOARD ],
+    'ste u8500'                                 => [ 'ST Ericsson', 'Novathor U8500 based device', DeviceType::DEVBOARD ],
+    'ste u9540'                                 => [ 'ST Ericsson', 'Novathor U9540 based device', DeviceType::DEVBOARD ],
+    'Telechips M801 Evaluation Board'           => [ 'Telechips', 'M801 based device', DeviceType::DEVBOARD ],
+    'Telechips TCC8800 eMMC Evaluation Board'   => [ 'Telechips', 'TCC8800 based device', DeviceType::DEVBOARD ],
+    'Telechips TCC8800 Evaluation Board'        => [ 'Telechips', 'TCC8800 based device', DeviceType::DEVBOARD ],
+    'Telechips TCC8900 Evaluation Board'        => [ 'Telechips', 'TCC8900 based device', DeviceType::DEVBOARD ],
+    'Telechips TCC8900 Evaluation Board (US)'   => [ 'Telechips', 'TCC8900 based device', DeviceType::DEVBOARD ],
+    'Telechips TCC8902 Tablet-PC (DE)'          => [ 'Telechips', 'TCC8902 based device', DeviceType::DEVBOARD ],
+    'TCC8920 STB!'                              => [ 'Telechips', 'TCC8920 based device', DeviceType::DEVBOARD ],
+    'TCC893X!'                                  => [ 'Telechips', 'TCC893X based device', DeviceType::DEVBOARD ],
+    'TCC8935 HDMI!'                             => [ 'Telechips', 'TCC8935 based device', DeviceType::DEVBOARD ],
+    'TCC8975 STB!'                              => [ 'Telechips', 'TCC8975 based device', DeviceType::DEVBOARD ],
+    'Telechips TCC9300 Evaluation Board'        => [ 'Telechips', 'TCC9300 based device', DeviceType::DEVBOARD ],
+    'OMAP'                                      => [ 'Texas Instruments', 'OMAP based device', DeviceType::DEVBOARD ],
+    'OMAP SS'                                   => [ 'Texas Instruments', 'OMAP based device', DeviceType::DEVBOARD ],
+    'LogicPD Zoom2'                             => [ 'Texas Instruments', 'OMAP based device', DeviceType::DEVBOARD ],
+    'omap3evm'                                  => [ 'Texas Instruments', 'OMAP3 based device', DeviceType::DEVBOARD ],
+    'OMAP3ETPP'                                 => [ 'Texas Instruments', 'OMAP3 based device', DeviceType::DEVBOARD ],
+    'Omap5sevm'                                 => [ 'Texas Instruments', 'OMAP5 based device', DeviceType::DEVBOARD ],
+    'AM335XEVM'                                 => [ 'Texas Instruments', 'Sitara AM335 based device', DeviceType::DEVBOARD ],
+    'AM335XEVM SK'                              => [ 'Texas Instruments', 'Sitara AM335 based device', DeviceType::DEVBOARD ],
+    'am3517evm'                                 => [ 'Texas Instruments', 'Sitara AM351 based device', DeviceType::DEVBOARD ],
+    'AM437XEVM'                                 => [ 'Texas Instruments', 'Sitara AM437 based device', DeviceType::DEVBOARD ],
+    'Colibri-T20'                               => [ 'Toradex', 'Colibri T20', DeviceType::DEVBOARD ],
+    'pnx8473 kiryung'                           => [ 'Trident', 'PNX8473 based device', DeviceType::DEVBOARD ],
+
+    /* Official Google development devices */
+    'Bravo'                                     => [ 'HTC', 'Desire' ],
+    'Dream'                                     => [ 'HTC', 'Dream' ],
+    'Vogue'                                     => [ 'HTC', 'Touch' ],
+    'Vendor Optimus'                            => [ 'LG', 'Optimus' ],
+    'Stingray'                                  => [ 'Motorola', 'XOOM', DeviceType::TABLET ],
+    'Wingray'                                   => [ 'Motorola', 'XOOM', DeviceType::TABLET ],
+    'Blaze'                                     => [ 'Texas Instruments', 'Blaze Tablet', DeviceType::TABLET ],
+    'Blaze Tablet'                              => [ 'Texas Instruments', 'Blaze Tablet', DeviceType::TABLET ],
+    'Google Ion'                                => [ 'Google', 'Ion' ],
+    'Project Tango Tablet Development Kit'      => [ 'Google', 'Project Tango' ],
+    'Yellowstone'                               => [ 'Google', 'Project Tango' ],
+
+    /* Nexus Devices (without official model no. */
+    'Passion'                                   => [ 'HTC', 'Nexus One' ],
+    '(HTC )?Nexus ?One!'                        => [ 'HTC', 'Nexus One' ],
+    'Crespo!'                                   => [ 'Samsung', 'Nexus S' ],
+    '(Google )?Nexus S!'                        => [ 'Samsung', 'Nexus S' ],
+    'Dooderbutt!'                               => [ 'Samsung', 'Nexus S' ],
+    'LGE-lap crespo'                            => [ 'Samsung', 'Nexus S' ],
+    'Maguro'                                    => [ 'Samsung', 'Galaxy Nexus' ],
+    'Toro'                                      => [ 'Samsung', 'Galaxy Nexus' ],
+    'Toro-VZW'                                  => [ 'Samsung', 'Galaxy Nexus' ],
+    '(Google )?Galaxy Nexus!'                   => [ 'Samsung', 'Galaxy Nexus' ],
+    'LGE-lap maguro'                            => [ 'Samsung', 'Galaxy Nexus' ],
+    'LGE-maguro cappuccino'                     => [ 'Samsung', 'Galaxy Nexus' ],
+    '(Google )?Nexus ?4!'                       => [ 'LG', 'Nexus 4' ],
+    'Mako'                                      => [ 'LG', 'Nexus 4' ],
+    'LGE-lap mako'                              => [ 'LG', 'Nexus 4' ],
+    'Nexus 5X'                                  => [ 'LG', 'Nexus 5X' ],
+    '(Google )?Nexus ?5!'                       => [ 'LG', 'Nexus 5' ],
+    'HammerHead'                                => [ 'LG', 'Nexus 5' ],
+    'LG-Nexus5'                                 => [ 'LG', 'Nexus 5' ],
+    'Nexus 6P'                                  => [ 'Huawei', 'Nexus 6P' ],
+    '(Google )?Nexus ?6P!'                      => [ 'Huawei', 'Nexus 6P' ],
+    'shamu'                                     => [ 'Motorola', 'Nexus 6' ],
+    '(Google )?Nexus ?6!'                       => [ 'Motorola', 'Nexus 6' ],
+    '(Google )?Nexus ?7 2013!'                  => [ 'Asus', 'Nexus 7 (2013)', DeviceType::TABLET ],
+    'Flo'                                       => [ 'Asus', 'Nexus 7 (2013)', DeviceType::TABLET ],
+    'Grouper'                                   => [ 'Asus', 'Nexus 7', DeviceType::TABLET ],
+    'Tilapia'                                   => [ 'Asus', 'Nexus 7', DeviceType::TABLET ],
+    '(Google )?Nexus ?7!'                       => [ 'Asus', 'Nexus 7', DeviceType::TABLET ],
+    'Flounder'                                  => [ 'HTC', 'Nexus 9', DeviceType::TABLET ],
+    'Volantis'                                  => [ 'HTC', 'Nexus 9', DeviceType::TABLET ],
+    'Volantisg'                                 => [ 'HTC', 'Nexus 9', DeviceType::TABLET ],
+    '(Google )?Nexus ?9!'                       => [ 'HTC', 'Nexus 9', DeviceType::TABLET ],
+    'manta'                                     => [ 'Samsung', 'Nexus 10', DeviceType::TABLET ],
+    '(Google )?Nexus ?10!'                      => [ 'Samsung', 'Nexus 10', DeviceType::TABLET ],
+
+    /* Pixel Devices */
+    'Pixel C'                                   => [ 'Google', 'Pixel C', DeviceType::TABLET ],
+    'Pixel'                                     => [ 'Google', 'Pixel' ],
+    'Google Pixel'                              => [ 'Google', 'Pixel' ],
+    'Pixel XL'                                  => [ 'Google', 'Pixel XL' ],
+    'Google Pixel XL'                           => [ 'Google', 'Pixel XL' ],
+
+    /* Google Edition */
+    'HTC One'                                   => [ 'HTC', 'One (Google Edition)' ],
+    'Moto E'                                    => [ 'Motorola', 'Moto E (Google Edition)' ],
+    'Moto G'                                    => [ 'Motorola', 'Moto G (Google Edition)' ],
+    'Moto G LTE'                                => [ 'Motorola', 'Moto G (Google Edition)' ],
+    'Moto G 2014'                               => [ 'Motorola', 'Moto G (Google Edition, 2014)' ],
+    'Moto G 2014 LTE'                           => [ 'Motorola', 'Moto G (Google Edition, 2014)' ],
+    'Moto G (2014)'                             => [ 'Motorola', 'Moto G (Google Edition, 2014)' ],
+    'Moto X'                                    => [ 'Motorola', 'Moto X (Google Edition)' ],
+    'GT-I9505G'                                 => [ 'Samsung', 'Galaxy S4 (Google Edition)' ],
+    'Galaxy S4 Google Editon'                   => [ 'Samsung', 'Galaxy S4 (Google Edition)' ],
+    'SM-G900FG'                                 => [ 'Samsung', 'Galaxy S5 (Google Edition)' ],
+    'Xperia Z Ultra'                            => [ 'Sony', 'Xperia Z Ultra (Google Edition)' ],
+
+    /* Google Glass */
+    'Glass 1'                                   => [ 'Google', 'Glass', DeviceType::HEADSET, Flag::GOOGLEGLASS ],
+
+    /* Android Wear */
+    'ZenWatch'                                  => [ 'Asus', 'ZenWatch', DeviceType::WATCH, Flag::ANDROIDWEAR ],
+    'ZenWatch 2'                                => [ 'Asus', 'ZenWatch 2', DeviceType::WATCH, Flag::ANDROIDWEAR ],
+    'HUAWEI WATCH'                              => [ 'Huawei', 'Watch', DeviceType::WATCH, Flag::ANDROIDWEAR ],
+    'G Watch'                                   => [ 'LG', 'G Watch', DeviceType::WATCH, Flag::ANDROIDWEAR ],
+    'G Watch R'                                 => [ 'LG', 'G Watch R', DeviceType::WATCH, Flag::ANDROIDWEAR ],
+    'LG-Watch Urbane'                           => [ 'LG', 'G Watch Urbane', DeviceType::WATCH, Flag::ANDROIDWEAR ],
+    'Moto 360'                                  => [ 'Motorola', 'Moto 360', DeviceType::WATCH, Flag::ANDROIDWEAR ],
+    'Gear Live'                                 => [ 'Samsung', 'Gear Live', DeviceType::WATCH, Flag::ANDROIDWEAR ],
+    'SmartWatch 3'                              => [ 'Sony', 'SmartWatch 3', DeviceType::WATCH, Flag::ANDROIDWEAR ],
+
+    /* Android TV */
+    'Nexus Player'                              => [ 'Asus', 'Nexus Player', DeviceType::TELEVISION, Flag::ANDROIDTV],
+    'SVP-DTV15'                                 => [ 'Sony', 'Bravia Android TV (2015)', DeviceType::TELEVISION, Flag::ANDROIDTV],
+    'BRAVIA 2015'                               => [ 'Sony', 'Bravia Android TV (2015)', DeviceType::TELEVISION, Flag::ANDROIDTV],
+    'BRAVIA 4K 2015'                            => [ 'Sony', 'Bravia Android TV (2015)', DeviceType::TELEVISION, Flag::ANDROIDTV ],
+    'BRAVIA 4K GB'                              => [ 'Sony', 'Bravia Android TV (2016)', DeviceType::TELEVISION, Flag::ANDROIDTV ],
+    'QV151E'                                    => [ 'Philips', 'Android TV (2015)', DeviceType::TELEVISION, Flag::ANDROIDTV],
+    'QM151E'                                    => [ 'Philips', 'Android TV (2015)', DeviceType::TELEVISION, Flag::ANDROIDTV],
+    'QM152E'                                    => [ 'Philips', 'Android TV (2015)', DeviceType::TELEVISION, Flag::ANDROIDTV],
+    'QM163E'                                    => [ 'Philips', 'Android TV (2016)', DeviceType::TELEVISION, Flag::ANDROIDTV],
+    'PH7M EU 5596'                              => [ 'Philips', 'Android TV (2016)', DeviceType::TELEVISION, Flag::ANDROIDTV],
+    'SHIELD Console'                            => [ 'Nvidia', 'SHIELD Android TV', DeviceType::TELEVISION, Flag::ANDROIDTV],
+    'SHIELD Android TV'                         => [ 'Nvidia', 'SHIELD Android TV', DeviceType::TELEVISION, Flag::ANDROIDTV],
+    'SHIELD Andr0id TV'                         => [ 'Nvidia', 'SHIELD Android TV', DeviceType::TELEVISION, Flag::ANDROIDTV],
+
+    /* Middleware and emulators */
+    'BlueStacks!'                               => [ 'BlueStacks', 'App Player', DeviceType::DESKTOP ],
+    'App Runtime for Chrome'                    => [ 'Google', 'App Runtime for Chrome', DeviceType::DESKTOP ],
+    'youwave custom'                            => [ 'Youwave', 'Android on PC', DeviceType::DESKTOP ],
+    'BlackBerry Runtime for Android Apps'       => [ 'RIM', 'BlackBerry (Android Runtime)', DeviceType::MOBILE ],
+    'alien jolla bionic'                        => [ 'Jolla', 'Sailfish (Android Runtime)', DeviceType::MOBILE ],
+    'Jolla'                                     => [ 'Jolla', 'Sailfish (Android Runtime)', DeviceType::MOBILE ],
+    'alien ubuntu qt'                           => [ 'Ubuntu', 'Touch (Android Runtime)', DeviceType::MOBILE ],
+    'full Android on Microsoft Windows, pad, pc, n*books' => [ 'SocketeQ', 'WindowsAndroid', DeviceType::DESKTOP ],
+    'VMware Virtual Platform'                   => [ 'VMWare', 'Virtual Platform', DeviceType::DESKTOP ],
+    'Xamarin Android Player!'                   => [ 'Xamarin', 'Android Player', DeviceType::EMULATOR ],
+
+    /* TV sticks */
+    'CX-919'                                    => [ null, 'CX-919', DeviceType::TELEVISION ],
+    'CX-921'                                    => [ null, 'CX-921', DeviceType::TELEVISION ],
+    'CX-921B'                                   => [ null, 'CX-921B', DeviceType::TELEVISION ],
+    'CX-929'                                    => [ null, 'CX-929', DeviceType::TELEVISION ],
+    'CX-950'                                    => [ null, 'CX-950', DeviceType::TELEVISION ],
+    'CX-958'                                    => [ null, 'CX-958', DeviceType::TELEVISION ],
+    'VEOLO'                                     => [ 'A.C. Ryan', 'VEOLO Smart Android Hub', DeviceType::TELEVISION ],
+    'VEOLO2'                                    => [ 'A.C. Ryan', 'VEOLO2 Smart Android Hub', DeviceType::TELEVISION ],
+    'Astone A108'                               => [ 'Astone', 'A108', DeviceType::TELEVISION ],
+    'BenQ JD-130'                               => [ 'BenQ', 'JD-130', DeviceType::TELEVISION ],
+    'BenQ Android TV'                           => [ 'BenQ', 'JD-130', DeviceType::TELEVISION ],
+    'EVOKE HDI Box'                             => [ 'Evoke', 'HDI TV Box', DeviceType::TELEVISION ],
+    'Ezcast'                                    => [ 'Ezcast', 'Dongle', DeviceType::TELEVISION ],
+    'JT SmartPC02'                              => [ 'Joy-IT', 'Smart PC', DeviceType::TELEVISION ],
+    'M3 Enjoy TV Box'                           => [ 'Geniatech', 'Enjoy TV', DeviceType::TELEVISION ],
+    'MX Enjoy TV BOX'                           => [ 'Geniatech', 'Enjoy TV', DeviceType::TELEVISION ],
+    'TOUCAN Stick HD'                           => [ 'iconBit', 'Toucan Stick HD', DeviceType::TELEVISION ],
+    'TOUCAN Stick G4'                           => [ 'iconBit', 'Toucan Stick G4', DeviceType::TELEVISION ],
+    'Toucan Stick 4K'                           => [ 'iconBit', 'Toucan Stick 4K', DeviceType::TELEVISION ],
+    'TOUCAN Stick 3D mk2'                       => [ 'iconBit', 'Toucan Stick 3D', DeviceType::TELEVISION ],
+    'TOUCAN Stick 3D Pro'                       => [ 'iconBit', 'Toucan Stick 3D Pro', DeviceType::TELEVISION ],
+    'NEO-G4'                                    => [ 'Minix', 'Neo G4', DeviceType::TELEVISION ],
+    'NEO-G4-108A'                               => [ 'Minix', 'Neo G4', DeviceType::TELEVISION ],
+    'NEO-G4 a'                                  => [ 'Minix', 'Neo G4 a', DeviceType::TELEVISION ],
+    'NEO-U9-H'                                  => [ 'Minix', 'Neo U9-H', DeviceType::TELEVISION ],
+    'NEO-X5'                                    => [ 'Minix', 'Neo X5', DeviceType::TELEVISION ],
+    'NEO X5'                                    => [ 'Minix', 'Neo X5', DeviceType::TELEVISION ],
+    'Neo-X5-B'                                  => [ 'Minix', 'Neo X5', DeviceType::TELEVISION ],
+    'NEO-X5-116A'                               => [ 'Minix', 'Neo X5', DeviceType::TELEVISION ],
+    'NEO-X5-mini'                               => [ 'Minix', 'Neo X5 mini', DeviceType::TELEVISION ],
+    'NEO X5 mini'                               => [ 'Minix', 'Neo X5 mini', DeviceType::TELEVISION ],
+    'NEO-X6'                                    => [ 'Minix', 'Neo X6', DeviceType::TELEVISION ],
+    'NEO-X7-216A'                               => [ 'Minix', 'Neo X7', DeviceType::TELEVISION ],
+    'NEO-X7-mini'                               => [ 'Minix', 'Neo X7 mini', DeviceType::TELEVISION ],
+    'NEO-X8'                                    => [ 'Minix', 'Neo X8', DeviceType::TELEVISION ],
+    'NEO-X8-H'                                  => [ 'Minix', 'Neo X8', DeviceType::TELEVISION ],
+    'NEO-X8H-PLUS'                              => [ 'Minix', 'Neo X8+', DeviceType::TELEVISION ],
+    'RKM MK602'                                 => [ 'Rikomagic', 'MK602', DeviceType::TELEVISION ],
+    'Rikomagic MK802'                           => [ 'Rikomagic', 'MK802', DeviceType::TELEVISION ],
+    'Rikomagic MK802 ?II!'                      => [ 'Rikomagic', 'MK802 II', DeviceType::TELEVISION ],
+    'Rikomagic MK802III'                        => [ 'Rikomagic', 'MK802 III', DeviceType::TELEVISION ],
+    'Rikomagic MK802IIIS'                       => [ 'Rikomagic', 'MK802 IIIS', DeviceType::TELEVISION ],
+    'RKM MK802IIIS'                             => [ 'Rikomagic', 'MK802 IIIS', DeviceType::TELEVISION ],
+    'RKM MK802IV'                               => [ 'Rikomagic', 'MK802 IV', DeviceType::TELEVISION ],
+    'MK808'                                     => [ 'Rikomagic', 'MK808', DeviceType::TELEVISION ],
+    'MK808B'                                    => [ 'Rikomagic', 'MK808 B', DeviceType::TELEVISION ],
+    'MK809'                                     => [ 'Rikomagic', 'MK809', DeviceType::TELEVISION ],
+    'MK809B'                                    => [ 'Rikomagic', 'MK809 B', DeviceType::TELEVISION ],
+    'MK809IV'                                   => [ 'Rikomagic', 'MK809 IV', DeviceType::TELEVISION ],
+    'MK818B'                                    => [ 'Rikomagic', 'MK818 B', DeviceType::TELEVISION ],
+    'RKM MK902'                                 => [ 'Rikomagic', 'MK902', DeviceType::TELEVISION ],
+    'RKM MK902II'                               => [ 'Rikomagic', 'MK902 II', DeviceType::TELEVISION ],
+    'MK908'                                     => [ 'Rikomagic', 'MK908', DeviceType::TELEVISION ],
+    'MK908II'                                   => [ 'Rikomagic', 'MK908 II', DeviceType::TELEVISION ],
+    'GK802'                                     => [ 'Rikomagic', 'GK802', DeviceType::TELEVISION ],
+    'XW-I8'                                     => [ 'Sambao', 'XW-I8', DeviceType::TELEVISION ],
+    'TCC8920 EVM'                               => [ 'Telechips', 'TCC8920', DeviceType::TELEVISION ],
+    'TCC8925 HDMI DONGLE'                       => [ 'Telechips', 'TCC8925', DeviceType::TELEVISION ],
+    'TCC8930 STB EV'                            => [ 'Telechips', 'TCC8930', DeviceType::TELEVISION ],
+    'TCC8930 STB1'                              => [ 'Telechips', 'TCC8930', DeviceType::TELEVISION ],
+    'TCC8935 HDMI DONGLE'                       => [ 'Telechips', 'TCC8935', DeviceType::TELEVISION ],
+
+    /* Game consoles */
+    'OUYA( Console)?!'                          => [ 'OUYA', 'OUYA', [ DeviceType::GAMING, DeviceSubType::CONSOLE ] ],
+    'SHIELD'                                    => [ 'Nvidia', 'SHIELD', [ DeviceType::GAMING, DeviceSubType::CONSOLE ] ],
+    'shieldtablet'                              => [ 'Nvidia', 'SHIELD Tablet', [ DeviceType::GAMING, DeviceSubType::PORTABLE ] ],
+    'SHIELD Tablet'                             => [ 'Nvidia', 'SHIELD Tablet', [ DeviceType::GAMING, DeviceSubType::PORTABLE ] ],
+    'SHIELD Tablet K1'                          => [ 'Nvidia', 'SHIELD Tablet K1', [ DeviceType::GAMING, DeviceSubType::PORTABLE ] ],
+    'SHIELD Tablet X1'                          => [ 'Nvidia', 'SHIELD Tablet X1', [ DeviceType::GAMING, DeviceSubType::PORTABLE ] ],
+    'SHIELD Tablet II'                          => [ 'Nvidia', 'SHIELD Tablet II', [ DeviceType::GAMING, DeviceSubType::PORTABLE ] ],
+
+    'EMBT3C'                                    => [ 'EPSON', 'MOVERIO BT-300', DeviceType::HEADSET ],
+
+    /* Regular devices */
+    'EL72B'                                     => [ '3Q', 'Qoo! Q-Book EL72B', DeviceType::TABLET ],
+
+    '(AC|BC|LC|MT|RC|QS|VM|TS|OC)[0-9]{4,4}[A-Z]!!' => [
+        'AC0731B'                                   => [ '3Q', 'Qoo! Q-Pad AC0731B', DeviceType::TABLET ],
+        'AC1024C'                                   => [ '3Q', 'Qoo! Q-Pad AC1024C', DeviceType::TABLET ],
+        'AC7803C'                                   => [ '3Q', 'Qoo! Q-Pad AC7803C', DeviceType::TABLET ],
+        'BC9710A'                                   => [ '3Q', 'Qoo! Q-Pad BC9710A', DeviceType::TABLET ],
+        'BC9710AM'                                  => [ '3Q', 'Qoo! Q-Pad BC9710A', DeviceType::TABLET ],
+        'LC0720C'                                   => [ '3Q', 'Qoo! Q-Pad LC0720C', DeviceType::TABLET ],
+        'LC0723B'                                   => [ '3Q', 'Qoo! Q-Pad LC0723B', DeviceType::TABLET ],
+        'LC0725B'                                   => [ '3Q', 'Qoo! Q-Pad LC0725B', DeviceType::TABLET ],
+        'LC0804B'                                   => [ '3Q', 'Qoo! Q-Pad LC0804B', DeviceType::TABLET ],
+        'LC0808B'                                   => [ '3Q', 'Qoo! Q-Pad LC0808B', DeviceType::TABLET ],
+        'LC0809B'                                   => [ '3Q', 'Qoo! Q-Pad LC0809B', DeviceType::TABLET ],
+        'LC0810C'                                   => [ '3Q', 'Qoo! Q-Pad LC0810C', DeviceType::TABLET ],
+        'LC0816C'                                   => [ '3Q', 'Qoo! Q-Pad LC0816C', DeviceType::TABLET ],
+        'LC0901D'                                   => [ '3Q', 'Qoo! Q-Pad LC0901D', DeviceType::TABLET ],
+        'LC1016C'                                   => [ '3Q', 'Qoo! Q-Pad LC1016C', DeviceType::TABLET ],
+        'LC9721C'                                   => [ '3Q', 'Qoo! Q-Pad LC9721C', DeviceType::TABLET ],
+        'MT0724B'                                   => [ '3Q', 'Qoo! Q-Pad MT0724B', DeviceType::TABLET ],
+        'MT0729B'                                   => [ '3Q', 'Qoo! Q-Pad MT0729B', DeviceType::TABLET ],
+        'MT0729D'                                   => [ '3Q', 'Qoo! Q-Pad MT0729D', DeviceType::TABLET ],
+        'MT0811B'                                   => [ '3Q', 'Qoo! Q-Pad MT0811B', DeviceType::TABLET ],
+        'MT7801C'                                   => [ '3Q', 'Qoo! Q-Pad MT7801C', DeviceType::TABLET ],
+        'RC0709B'                                   => [ '3Q', 'Qoo! Q-Pad RC0709B', DeviceType::TABLET ],
+        'RC0710B'                                   => [ '3Q', 'Qoo! Q-Pad RC0710B', DeviceType::TABLET ],
+        'RC0718C'                                   => [ '3Q', 'Qoo! Q-Pad RC0718C', DeviceType::TABLET ],
+        'RC0719H'                                   => [ '3Q', 'Qoo! Q-Pad RC0719H', DeviceType::TABLET ],
+        'RC0721B'                                   => [ '3Q', 'Qoo! Q-Pad RC0721B', DeviceType::TABLET ],
+        'RC0722C'                                   => [ '3Q', 'Qoo! Q-Pad RC0722C', DeviceType::TABLET ],
+        'RC0726B'                                   => [ '3Q', 'Qoo! Q-Pad RC0726B', DeviceType::TABLET ],
+        'RC0734H'                                   => [ '3Q', 'Qoo! Q-Pad RC0734H', DeviceType::TABLET ],
+        'RC0738C'                                   => [ '3Q', 'Qoo! Q-Pad RC0738C', DeviceType::TABLET ],
+        'RC0743H'                                   => [ '3Q', 'Qoo! Q-Pad RC0743H', DeviceType::TABLET ],
+        'RC0813C'                                   => [ '3Q', 'Qoo! Q-Pad RC0813C', DeviceType::TABLET ],
+        'RC0813CM'                                  => [ '3Q', 'Qoo! Q-Pad RC0813CM', DeviceType::TABLET ],
+        'RC0817C'                                   => [ '3Q', 'Qoo! Q-Pad RC0817C', DeviceType::TABLET ],
+        'RC1018C'                                   => [ '3Q', 'Qoo! Q-Pad RC1018C', DeviceType::TABLET ],
+        'RC1019G'                                   => [ '3Q', 'Qoo! Q-Pad RC1019G', DeviceType::TABLET ],
+        'RC1025F'                                   => [ '3Q', 'Qoo! Q-Pad RC1025F', DeviceType::TABLET ],
+        'RC1301C'                                   => [ '3Q', 'Qoo! Q-Pad RC1301C', DeviceType::TABLET ],
+        'RC7802F'                                   => [ '3Q', 'Qoo! Q-Pad RC7802F', DeviceType::TABLET ],
+        'RC9711B'                                   => [ '3Q', 'Qoo! Q-Pad RC9711B', DeviceType::TABLET ],
+        'RC9712C'                                   => [ '3Q', 'Qoo! Q-Pad RC9712C', DeviceType::TABLET ],
+        'RC9716B'                                   => [ '3Q', 'Qoo! Q-Pad RC9716B', DeviceType::TABLET ],
+        'RC9717B'                                   => [ '3Q', 'Qoo! Q-Pad RC9717B', DeviceType::TABLET ],
+        'RC9724C'                                   => [ '3Q', 'Qoo! Q-Pad RC9724C', DeviceType::TABLET ],
+        'RC9726C'                                   => [ '3Q', 'Qoo! Q-Pad RC9726C', DeviceType::TABLET ],
+        'RC9727F'                                   => [ '3Q', 'Qoo! Q-Pad RC9727F', DeviceType::TABLET ],
+        'RC9730C'                                   => [ '3Q', 'Qoo! Q-Pad RC9730C', DeviceType::TABLET ],
+        'RC9731C'                                   => [ '3Q', 'Qoo! Q-Pad RC9731C', DeviceType::TABLET ],
+        'QS0715C'                                   => [ '3Q', 'Qoo! Q-Pad QS0715C', DeviceType::TABLET ],
+        'QS0716D'                                   => [ '3Q', 'Qoo! Q-Pad QS0716D', DeviceType::TABLET ],
+        'QS0717D'                                   => [ '3Q', 'Qoo! Q-Pad QS0717D', DeviceType::TABLET ],
+        'QS0728C'                                   => [ '3Q', 'Qoo! Q-Pad QS0728C', DeviceType::TABLET ],
+        'QS0730C'                                   => [ '3Q', 'Qoo! Q-Pad QS0730C', DeviceType::TABLET ],
+        'QS0815C'                                   => [ '3Q', 'Qoo! Q-Pad QS0815C', DeviceType::TABLET ],
+        'QS9718C'                                   => [ '3Q', 'Qoo! Q-Pad QS9718C', DeviceType::TABLET ],
+        'VM1017A'                                   => [ '3Q', 'Qoo! Q-Pad VM1017A', DeviceType::TABLET ],
+        'TS0807B'                                   => [ '3Q', 'Qoo! Q-Note TS0807B', DeviceType::TABLET ],
+        'TS1003T'                                   => [ '3Q', 'Qoo! Surf Tablet TS1003T', DeviceType::TABLET ],
+        'TS1004T'                                   => [ '3Q', 'Qoo! Surf Tablet TS1004T', DeviceType::TABLET ],
+        'TS1009B'                                   => [ '3Q', 'Qoo! Surf Tablet TS1009B', DeviceType::TABLET ],
+        'TS1013B'                                   => [ '3Q', 'Qoo! Surf Tablet TS1013B', DeviceType::TABLET ],
+        'TS9708B'                                   => [ '3Q', 'Qoo! Surf Tablet TS9708B', DeviceType::TABLET ],
+        'OC1020A'                                   => [ '3Q', 'Qoo! Surf Tablet OC1020A', DeviceType::TABLET ],
+        'QS9715F'                                   => [ '3Q', 'Qoo! Surf Tablet QS9715F', DeviceType::TABLET ],
+        'QS9719D'                                   => [ '3Q', 'Qoo! Surf Tablet QS9719D', DeviceType::TABLET ],
+        'QS1023H'                                   => [ '3Q', 'Qoo! Surf Tablet QS1023H', DeviceType::TABLET ],
+        'VM0711A'                                   => [ '3Q', 'Qoo! Surf Tablet VM0711A', DeviceType::TABLET ],
+    ],
+
+    'BioniQ!!' => [
+        'BioniQ 700'                                => [ 'a-rival', 'BioniQ 700', DeviceType::TABLET ],
+        'BioniQ700HX'                               => [ 'a-rival', 'BioniQ 700 HX', DeviceType::TABLET ],
+        'BioniQ 800'                                => [ 'a-rival', 'BioniQ 800', DeviceType::TABLET ],
+        'BioniQ 1001'                               => [ 'a-rival', 'BioniQ 1001', DeviceType::TABLET ],
+        'BioniQ 8008'                               => [ 'a-rival', 'BioniQ 8008', DeviceType::TABLET ],
+    ],
+
+    'RTC-700A'                                  => [ 'Aaeon', 'RTC-700A', DeviceType::TABLET ],
+    'aspire1000s'                               => [ 'Acer', '1000 Series', DeviceType::DESKTOP ],
+
+    'A[0-9]{3,3}!!' => [
+        'A100'                                      => [ 'Acer', 'Iconia Tab A100', DeviceType::TABLET ],
+        'A101'                                      => [ 'Acer', 'Iconia Tab A101', DeviceType::TABLET ],
+        'A110'                                      => [ 'Acer', 'Iconia Tab A110', DeviceType::TABLET ],
+        'A200'                                      => [ 'Acer', 'Iconia Tab A200', DeviceType::TABLET ],
+        'A200 3G'                                   => [ 'Acer', 'Iconia Tab A200', DeviceType::TABLET ],
+        'A210'                                      => [ 'Acer', 'Iconia Tab A210', DeviceType::TABLET ],
+        'A211'                                      => [ 'Acer', 'Iconia Tab A211', DeviceType::TABLET ],
+        'A500'                                      => [ 'Acer', 'Iconia Tab A500', DeviceType::TABLET ],
+        'A501'                                      => [ 'Acer', 'Iconia Tab A501', DeviceType::TABLET ],
+        'A510'                                      => [ 'Acer', 'Iconia Tab A510', DeviceType::TABLET ],
+        'A511'                                      => [ 'Acer', 'Iconia Tab A511', DeviceType::TABLET ],
+        'A700'                                      => [ 'Acer', 'Iconia Tab A700', DeviceType::TABLET ],
+        'A701'                                      => [ 'Acer', 'Iconia Tab A701', DeviceType::TABLET ],
+        'A800'                                      => [ 'Acer', 'Iconia Tab A800', DeviceType::TABLET ],
+    ],
+
+    'P2A700'                                    => [ 'Acer', 'Iconia Tab A700', DeviceType::TABLET ],
+
+    'A1-[0-9]{3,3}!!' => [
+        'A1-713'                                    => [ 'Acer', 'Iconia Tab 7 A1-713', DeviceType::TABLET ],
+        'A1-713HD'                                  => [ 'Acer', 'Iconia Tab 7 A1-713 HD', DeviceType::TABLET ],
+        'A1-724'                                    => [ 'Acer', 'Iconia TalkTab 7 A1-724', DeviceType::TABLET ],
+        'A1-734'                                    => [ 'Acer', 'Iconia Talk S A1-734', DeviceType::TABLET ],
+        'A1-810'                                    => [ 'Acer', 'Iconia A1-810', DeviceType::TABLET ],
+        'A1-811'                                    => [ 'Acer', 'Iconia A1-811', DeviceType::TABLET ],
+        'A1-812'                                    => [ 'Acer', 'Iconia A1-812', DeviceType::TABLET ],
+        'A1-820'                                    => [ 'Acer', 'Iconia A1-820', DeviceType::TABLET ],
+        'A1-830'                                    => [ 'Acer', 'Iconia A1-830', DeviceType::TABLET ],
+        'A1-840'                                    => [ 'Acer', 'Iconia Tab 8 A1-840', DeviceType::TABLET ],
+        'A1-840FHD'                                 => [ 'Acer', 'Iconia Tab 8 A1-840 FHD', DeviceType::TABLET ],
+        'A1-841'                                    => [ 'Acer', 'Iconia Tab 8 A1-841', DeviceType::TABLET ],
+        'A1-850'                                    => [ 'Acer', 'Iconia One 8 A1-850', DeviceType::TABLET ],
+        'A1-860'                                    => [ 'Acer', 'Iconia Tab 8 A1-860', DeviceType::TABLET ],
+    ],
+
+    'A3-A[0-9]{2,2}!!' => [
+        'A3-A10'                                    => [ 'Acer', 'Iconia A3-A10', DeviceType::TABLET ],
+        'A3-A11'                                    => [ 'Acer', 'Iconia A3-A11', DeviceType::TABLET ],
+        'A3-A20'                                    => [ 'Acer', 'Iconia Tab 10 A3-A20', DeviceType::TABLET ],
+        'A3-A20FHD'                                 => [ 'Acer', 'Iconia Tab 10 A3-A20 FHD', DeviceType::TABLET ],
+        'A3-A30'                                    => [ 'Acer', 'Iconia Tab 10 A3-A30', DeviceType::TABLET ],
+        'A3-A40'                                    => [ 'Acer', 'Iconia Tab 10 A3-A40', DeviceType::TABLET ],
+    ],
+
+    'B1-[A0-9][0-9]{2,2}!!' => [
+        'B1-A71'                                    => [ 'Acer', 'Iconia B1-A71', DeviceType::TABLET ],
+        'B1-710'                                    => [ 'Acer', 'Iconia B1-710', DeviceType::TABLET ],
+        'B1-711'                                    => [ 'Acer', 'Iconia B1-711', DeviceType::TABLET ],
+        'B1-713'                                    => [ 'Acer', 'Iconia B1-713', DeviceType::TABLET ],
+        'B1-720'                                    => [ 'Acer', 'Iconia B1-720', DeviceType::TABLET ],
+        'B1-721'                                    => [ 'Acer', 'Iconia B1-721', DeviceType::TABLET ],
+        'B1-723'                                    => [ 'Acer', 'Iconia B1-723', DeviceType::TABLET ],
+        'B1-730'                                    => [ 'Acer', 'Iconia One 7 B1-730', DeviceType::TABLET ],
+        'B1-730HD'                                  => [ 'Acer', 'Iconia One 7 B1-730 HD', DeviceType::TABLET ],
+        'B1-750'                                    => [ 'Acer', 'Iconia One 7 B1-750', DeviceType::TABLET ],
+        'B1-760'                                    => [ 'Acer', 'Iconia One 7 B1-760', DeviceType::TABLET ],
+        'B1-760HD'                                  => [ 'Acer', 'Iconia One 7 B1-760 HD', DeviceType::TABLET ],
+        'B1-770'                                    => [ 'Acer', 'Iconia One 7 B1-770', DeviceType::TABLET ],
+        'B1-780'                                    => [ 'Acer', 'Iconia One 7 B1-780', DeviceType::TABLET ],
+        'B1-810'                                    => [ 'Acer', 'Iconia One 8 B1-810', DeviceType::TABLET ],
+        'B1-820'                                    => [ 'Acer', 'Iconia One 8 B1-820', DeviceType::TABLET ],
+        'B1-830'                                    => [ 'Acer', 'Iconia One 8 B1-830', DeviceType::TABLET ],
+        'B1-850'                                    => [ 'Acer', 'Iconia One 8 B1-850', DeviceType::TABLET ],
+    ],
+
+    'B3-A20'                                    => [ 'Acer', 'Iconia One 10 B3-A20', DeviceType::TABLET ],
+    'B3-A30'                                    => [ 'Acer', 'Iconia One 10 B3-A30', DeviceType::TABLET ],
+
+    'Acer One 7 M77GHG'                         => [ 'Acer', 'Iconia One 7 M77GHG', DeviceType::TABLET ],
+    'TD070VA1'                                  => [ 'Acer', 'Iconia One 7 TD070VA1', DeviceType::TABLET ],
+
+    'ICONIA!!' => [
+        'ICONIA Tab W500'                           => [ 'Acer', 'Iconia W500', DeviceType::TABLET ],
+        'ICONIA Tab W500P'                          => [ 'Acer', 'Iconia W500P', DeviceType::TABLET ],
+        'ICONIA Tab W501'                           => [ 'Acer', 'Iconia W501', DeviceType::TABLET ],
+        'ICONIA W700'                               => [ 'Acer', 'Iconia W700', DeviceType::TABLET ],
+    ],
+
+    'GT-810'                                    => [ 'Acer', 'Predator 8', DeviceType::TABLET ],
+
+    'E[0-9]{2,2}0?!!' => [
+        'E110'                                      => [ 'Acer', 'beTouch E110' ],
+        'E120'                                      => [ 'Acer', 'beTouch E120' ],
+        'E130'                                      => [ 'Acer', 'beTouch E130' ],
+        'E140'                                      => [ 'Acer', 'beTouch E140' ],
+        'E210'                                      => [ 'Acer', 'beTouch E210' ],
+        'E310'                                      => [ 'Acer', 'Liquid mini' ],
+        'E320'                                      => [ 'Acer', 'Liquid Express' ],
+        'E330'                                      => [ 'Acer', 'Liquid Glow' ],
+        'E350'                                      => [ 'Acer', 'Liquid Gallant' ],
+        'E380'                                      => [ 'Acer', 'Liquid E3' ],
+        'E400'                                      => [ 'Acer', 'beTouch E400' ],
+        'E600'                                      => [ 'Acer', 'Liquid E600' ],
+        'E39'                                       => [ 'Acer', 'Liquid E700' ],
+    ],
+
+    'I110'                                      => [ 'Acer', 'Liquid C1' ],
+
+    'S[0-9]{2,2}0?!!' => [
+        'S100'                                      => [ 'Acer', 'Liquid' ],
+        'S110'                                      => [ 'Acer', 'Stream' ],
+        'S120'                                      => [ 'Acer', 'Liquid mt' ],
+        'S300'                                      => [ 'Acer', 'Iconia Smart' ],
+        'S500'                                      => [ 'Acer', 'CloudMobile' ],
+        'S510'                                      => [ 'Acer', 'Liquid S' ],
+        'S520'                                      => [ 'Acer', 'Liquid S2' ],
+        'S53'                                       => [ 'Acer', 'Liquid S3' ],
+        'S55'                                       => [ 'Acer', 'Liquid Jade' ],
+        'S56'                                       => [ 'Acer', 'Liquid Jade S' ],
+        'S57'                                       => [ 'Acer', 'Liquid Jade Z' ],
+        'S59'                                       => [ 'Acer', 'Liquid X2' ],
+    ],
+
+    'V[0-9]{2,2}0!!' => [
+        'V360'                                      => [ 'Acer', 'Liquid E1' ],
+        'V370'                                      => [ 'Acer', 'Liquid E2' ],
+        'V380'                                      => [ 'Acer', 'Liquid E3' ],
+    ],
+
+    'Z[0-9]{3,3}!!' => [
+        'Z110'                                      => [ 'Acer', 'Liquid Z' ],
+        'Z120'                                      => [ 'Acer', 'Liquid Z2' ],
+        'Z130'                                      => [ 'Acer', 'Liquid Z3' ],
+        'Z140'                                      => [ 'Acer', 'Liquid Z4' ],
+        'Z150'                                      => [ 'Acer', 'Liquid Z5' ],
+        'Z160'                                      => [ 'Acer', 'Liquid Z4' ],
+        'Z200'                                      => [ 'Acer', 'Liquid Z200' ],
+        'Z205'                                      => [ 'Acer', 'Liquid Z205' ],
+        'Z205P'                                     => [ 'Acer', 'Liquid Z205' ],
+        'Z220'                                      => [ 'Acer', 'Liquid Z220' ],
+        'Z410'                                      => [ 'Acer', 'Liquid Z410' ],
+        'Z500'                                      => [ 'Acer', 'Liquid Z500' ],
+        'Z520'                                      => [ 'Acer', 'Liquid Z520' ],
+        'Z530'                                      => [ 'Acer', 'Liquid Z530' ],
+    ],
+
+    'Z4'                                        => [ 'Acer', 'Liquid Z4' ],
+    'T01'                                       => [ 'Acer', 'Liquid Z330' ],
+    'T012'                                      => [ 'Acer', 'Liquid Z330' ],
+    'T02'                                       => [ 'Acer', 'Liquid Z530' ],
+    'T05'                                       => [ 'Acer', 'Liquid Z530S' ],
+    'T03'                                       => [ 'Acer', 'Liquid Z630' ],
+    'T04'                                       => [ 'Acer', 'Liquid Z630S' ],
+    'TD600'                                     => [ 'Acer', 'beTouch TD600' ],
+    'AK330'                                     => [ 'Acer', 'Liquid Gallant Duo' ],
+    'AK330s'                                    => [ 'Acer', 'Liquid Gallant Duo' ],
+    'AT390'                                     => [ 'Acer', 'Liquid C' ],
+    'E1 v360'                                   => [ 'Acer', 'Liquid E1' ],
+    'v360 E1'                                   => [ 'Acer', 'Liquid E1' ],
+
+    'Liquid!!' => [
+        'Liquid'                                    => [ 'Acer', 'Liquid' ],
+        'Liquid E'                                  => [ 'Acer', 'Liquid E' ],
+        'LIQUID E1'                                 => [ 'Acer', 'Liquid E1 ' ],
+        'LIQUID E2'                                 => [ 'Acer', 'Liquid E2 ' ],
+        'LIQUID E3'                                 => [ 'Acer', 'Liquid E3 ' ],
+        'Liquid MT'                                 => [ 'Acer', 'Liquid mt' ],
+        'Liquid Metal'                              => [ 'Acer', 'Liquid mt' ],
+        'Liquid Z205'                               => [ 'Acer', 'Liquid Z205' ],
+    ],
+
+    'Stream'                                    => [ 'Acer', 'Stream' ],
+    'M3-2200'                                   => [ 'Acer', 'M3-2200', DeviceType::TABLET ],
+    'MWND1'                                     => [ 'Acer', 'MWND1 Android Dongle', DeviceType::TELEVISION ],
+
+    'DA2[0-9]{2,2}[A-Z]+!!' => [
+        'DA220HQL'                                  => [ 'Acer', 'Touch and 3D Monitor DA220HQL', DeviceType::MONITOR ],
+        'DA221HQL'                                  => [ 'Acer', 'Touch and 3D Monitor DA221HQL', DeviceType::MONITOR ],
+        'DA222HQL'                                  => [ 'Acer', 'Touch and 3D Monitor DA222HQL', DeviceType::MONITOR ],
+        'DA222HQLA'                                 => [ 'Acer', 'Touch and 3D Monitor DA222HQL', DeviceType::MONITOR ],
+        'DA223HQL'                                  => [ 'Acer', 'All-in-One DA223HQL', DeviceType::MONITOR ],
+        'DA226HQ'                                   => [ 'Acer', 'All-in-One DA226HQ', DeviceType::MONITOR ],
+        'DA241HL'                                   => [ 'Acer', 'All-in-One DA241HL', DeviceType::MONITOR ],
+        'DA245HQL'                                  => [ 'Acer', 'Touch and 3D Monitor DA245HQL', DeviceType::MONITOR ],
+    ],
+
+    'TA272HUL'                                  => [ 'Acer', 'All-in-One TA272HUL', DeviceType::MONITOR ],
+
+    'AA3-600'                                   => [ 'Acer', 'Aspire A3', DeviceType::DESKTOP ],
+
+    'Aspire!!' => [
+        'Aspire A1'                                 => [ 'Acer', 'Aspire A1', DeviceType::DESKTOP ],
+        'Aspire ([0-9]{4,4}[A-Z]?)!'                => [ 'Acer', 'Aspire $1', DeviceType::DESKTOP ],
+        'Aspire ([A-Z][A-Z0-9]-[0-9]{3,3}[A-Z]?)!'  => [ 'Acer', 'Aspire $1', DeviceType::DESKTOP ],
+        'Aspire ([A-Z][0-9]{4,4}[A-Z]?)!'           => [ 'Acer', 'Aspire $1', DeviceType::DESKTOP ],
+        'Aspire ([A-Z]{2,2}[0-9]-[0-9]{3,3})!'      => [ 'Acer', 'Aspire $1', DeviceType::DESKTOP ],
+        'Aspire one'                                => [ 'Acer', 'Aspire One', DeviceType::DESKTOP ],
+        'Aspire one Pro'                            => [ 'Acer', 'Aspire One Pro', DeviceType::DESKTOP ],
+    ],
+
+    'C908'                                      => [ 'Acho', 'C908', DeviceType::TABLET ],
+
+    'ADVAN Q7A'                                 => [ 'Advan', 'Vandroid Q7A' ],
+    'ADVAN E1C+'                                => [ 'Advan', 'Vandroid E1-C+', DeviceType::TABLET ],
+    'ADVAN S3'                                  => [ 'Advan', 'Vandroid S3', DeviceType::TABLET ],
+    'ADVAN S3+'                                 => [ 'Advan', 'Vandroid S3+', DeviceType::TABLET ],
+    'ADVAN S3A'                                 => [ 'Advan', 'Vandroid S3-A', DeviceType::TABLET ],
+    'ADVAN S3C'                                 => [ 'Advan', 'Vandroid S3-C', DeviceType::TABLET ],
+    'ADVAN S3C 3502'                            => [ 'Advan', 'Vandroid S3-C', DeviceType::TABLET ],
+    'ADVAN S4'                                  => [ 'Advan', 'Vandroid S4', DeviceType::TABLET ],
+    'ADVAN S4+'                                 => [ 'Advan', 'Vandroid S4+', DeviceType::TABLET ],
+    'ADVAN S4A'                                 => [ 'Advan', 'Vandroid S4-A', DeviceType::TABLET ],
+    'ADVAN S4C'                                 => [ 'Advan', 'Vandroid S4-C', DeviceType::TABLET ],
+    'ADVAN S4E'                                 => [ 'Advan', 'Vandroid S4-E', DeviceType::TABLET ],
+    'Advan S4P [Official]'                      => [ 'Advan', 'Vandroid S4-P', DeviceType::TABLET ],
+    'ADVAN S5E'                                 => [ 'Advan', 'Vandroid S5-E', DeviceType::TABLET ],
+    'Vandroid S5E'                              => [ 'Advan', 'Vandroid S5-E', DeviceType::TABLET ],
+    'ADVAN S5E Pro'                             => [ 'Advan', 'Vandroid S5-E Pro', DeviceType::TABLET ],
+    'S5-F'                                      => [ 'Advan', 'Vandroid S5-F', DeviceType::TABLET ],
+    'ADVAN S5F+'                                => [ 'Advan', 'Vandroid S5-F+', DeviceType::TABLET ],
+    'ADVAN S5H'                                 => [ 'Advan', 'Vandroid S5-H', DeviceType::TABLET ],
+    'ADVAN S5I'                                 => [ 'Advan', 'Vandroid S5-I', DeviceType::TABLET ],
+    'Advan S5K'                                 => [ 'Advan', 'Vandroid S5-K', DeviceType::TABLET ],
+    'ADVAN S5M'                                 => [ 'Advan', 'Vandroid S5-M', DeviceType::TABLET ],
+    'ADVAN S5Q'                                 => [ 'Advan', 'Vandroid S5-Q', DeviceType::TABLET ],
+    'ADVAN S6A'                                 => [ 'Advan', 'Vandroid S6-A', DeviceType::TABLET ],
+    'T1-B'                                      => [ 'Advan', 'Vandroid T1-B', DeviceType::TABLET ],
+    'T1-D'                                      => [ 'Advan', 'Vandroid T1-D', DeviceType::TABLET ],
+    'T1-E'                                      => [ 'Advan', 'Vandroid T1-E', DeviceType::TABLET ],
+    'ADVAN T1G'                                 => [ 'Advan', 'Vandroid T1-G', DeviceType::TABLET ],
+    'ADVAN T1J'                                 => [ 'Advan', 'Vandroid T1-J', DeviceType::TABLET ],
+    'Vandroid T1J'                              => [ 'Advan', 'Vandroid T1-J', DeviceType::TABLET ],
+    'ADVAN T1J+'                                => [ 'Advan', 'Vandroid T1-J+', DeviceType::TABLET ],
+    'T1K Plus'                                  => [ 'Advan', 'Vandroid T1-K Plus', DeviceType::TABLET ],
+    'ADVAN T1L'                                 => [ 'Advan', 'Vandroid T1-L', DeviceType::TABLET ],
+    'ADVAN T1M'                                 => [ 'Advan', 'Vandroid T1-M', DeviceType::TABLET ],
+    'ADVAN T1X'                                 => [ 'Advan', 'Vandroid T1-X', DeviceType::TABLET ],
+    'ADVAN T2E'                                 => [ 'Advan', 'Vandroid T2-E', DeviceType::TABLET ],
+    'ADVAN T2F'                                 => [ 'Advan', 'Vandroid T2-F', DeviceType::TABLET ],
+    'Vandroid T3-A'                             => [ 'Advan', 'Vandroid T3-A', DeviceType::TABLET ],
+    'ADVAN T3E+'                                => [ 'Advan', 'Vandroid T3-E+', DeviceType::TABLET ],
+    'Vandroid T3i'                              => [ 'Advan', 'Vandroid T3i', DeviceType::TABLET ],
+    'ADVAN T5C'                                 => [ 'Advan', 'Vandroid T5-C', DeviceType::TABLET ],
+    'Vandroid T'                                => [ 'Advan', 'Vandroid T', DeviceType::TABLET ],
+    'Vega'                                      => [ 'Advent', 'Vega', DeviceType::TABLET ],
+    'VegaBean!'                                 => [ 'Advent', 'Vega', DeviceType::TABLET ],
+    'Advent Vega'                               => [ 'Advent', 'Vega', DeviceType::TABLET ],
+    'Boost'                                     => [ 'AG Mobile', 'Boost' ],
+    'Chacer'                                    => [ 'AG Mobile', 'Chacer' ],
+    'AG Chrome Selfie'                          => [ 'AG Mobile', 'Chrome Selfie' ],
+    'AG CHROME ULTRA'                           => [ 'AG Mobile', 'Chrome Ultra' ],
+    'Ghost'                                     => [ 'AG Mobile', 'Ghost' ],
+    'Neon'                                      => [ 'AG Mobile', 'Neon' ],
+    'Quest'                                     => [ 'AG Mobile', 'Quest' ],
+    'Rage'                                      => [ 'AG Mobile', 'Rage' ],
+    'Shine'                                     => [ 'AG Mobile', 'Shine' ],
+    'Status'                                    => [ 'AG Mobile', 'Status' ],
+    'Style'                                     => [ 'AG Mobile', 'Style' ],
+    'Swift'                                     => [ 'AG Mobile', 'Swift' ],
+    'Swift Plus'                                => [ 'AG Mobile', 'Swift Plus' ],
+    'Ultra'                                     => [ 'AG Mobile', 'Ultra' ],
+    'Zenith'                                    => [ 'AG Mobile', 'Zenith' ],
+    'Zoom'                                      => [ 'AG Mobile', 'Zoom' ],
+    'AG Tab 7 0'                                => [ 'AG Mobile', 'Tab 7.0', DeviceType::TABLET ],
+    'AG Go-Tab Access'                          => [ 'AG Mobile', 'Go-Tab Access', DeviceType::TABLET ],
+    'AG Chrome Go Tab 7.0'                      => [ 'AG Mobile', 'Go-Tab Chrome', DeviceType::TABLET ],
+    'aigoPad'                                   => [ 'aigo', 'aigoPad', DeviceType::TABLET ],
+    'aigoPadM60'                                => [ 'aigo', 'aigoPad M60', DeviceType::TABLET ],
+    'AigoPad M60'                               => [ 'aigo', 'aigoPad M60', DeviceType::TABLET ],
+    'aigoPad M80D'                              => [ 'aigo', 'aigoPad M80', DeviceType::TABLET ],
+    'aigoPad M80E'                              => [ 'aigo', 'aigoPad M80', DeviceType::TABLET ],
+    'M801'                                      => [ 'aigo', 'aigoPad M801', DeviceType::TABLET ],
+    'N700'                                      => [ 'aigo', 'aigoPad N700', DeviceType::TABLET ],
+    'AT102HC'                                   => [ 'Aikun', 'iTouch AT102HC', DeviceType::TABLET ],
+    'AT104GS'                                   => [ 'Aikun', 'iTouch AT104GS', DeviceType::TABLET ],
+
+    'Numy!!' => [
+        'Numy 3G AW1'                               => [ 'Ainol', 'Numy 3G AW1', DeviceType::TABLET ],
+        'Numy 3G AX1'                               => [ 'Ainol', 'Numy 3G AX1', DeviceType::TABLET ],
+        'Numy 3G AX10t'                             => [ 'Ainol', 'Numy 3G AX10t', DeviceType::TABLET ],
+        'Numy 3G AX3'                               => [ 'Ainol', 'Numy 3G AX3', DeviceType::TABLET ],
+        'Numy 3G BW1'                               => [ 'Ainol', 'Numy 3G BW1', DeviceType::TABLET ],
+        'Numy 3G Vegas'                             => [ 'Ainol', 'Numy 3G Vegas', DeviceType::TABLET ],
+        'Numy Note 9'                               => [ 'Ainol', 'Numy Note 9', DeviceType::TABLET ],
+    ],
+
+    'Novo7'                                     => [ 'Ainovo', 'Novo7', DeviceType::TABLET ],
+    'Novo7 -?Aurora!'                           => [ 'Ainovo', 'Novo7 Aurora', DeviceType::TABLET ],
+    'novo Aurora'                               => [ 'Ainovo', 'Novo7 Aurora', DeviceType::TABLET ],
+    'Novo 7 Aurora'                             => [ 'Ainovo', 'Novo7 Aurora', DeviceType::TABLET ],
+    'Ainovo Aurora-II'                          => [ 'Ainovo', 'Novo7 Aurora II', DeviceType::TABLET ],
+    'Aurora-II'                                 => [ 'Ainovo', 'Novo7 Aurora II', DeviceType::TABLET ],
+    'Novo7 Advanced'                            => [ 'Ainovo', 'Novo7 Advanced', DeviceType::TABLET ],
+    'Novo7Advanced!'                            => [ 'Ainovo', 'Novo7 Advanced', DeviceType::TABLET ],
+    'Novo7 Advanced2'                           => [ 'Ainovo', 'Novo7 Advanced 2', DeviceType::TABLET ],
+    'Novo7 Basic'                               => [ 'Ainovo', 'Novo7 Basic', DeviceType::TABLET ],
+    'NovoCrystal'                               => [ 'Ainovo', 'Novo7 Crystal', DeviceType::TABLET ],
+    'Novo 7 Crystal!'                           => [ 'Ainovo', 'Novo7 Crystal', DeviceType::TABLET ],
+    'Novo7 ELF'                                 => [ 'Ainovo', 'Novo7 Elf', DeviceType::TABLET ],
+    'ELF-II'                                    => [ 'Ainovo', 'Novo7 Elf II', DeviceType::TABLET ],
+    'Novo7 Fire'                                => [ 'Ainovo', 'Novo7 Fire', DeviceType::TABLET ],
+    'Novo7 Flame'                               => [ 'Ainovo', 'Novo7 Flame', DeviceType::TABLET ],
+    'Ainovo Flame (Nexus 7)'                    => [ 'Ainovo', 'Novo7 Flame', DeviceType::TABLET ],
+    'Novo7 Grace'                               => [ 'Ainovo', 'Novo7 Grace', DeviceType::TABLET ],
+    'Novo7 Legend'                              => [ 'Ainovo', 'Novo7 Legend', DeviceType::TABLET ],
+    'novo7Legend!'                              => [ 'Ainovo', 'Novo7 Legend', DeviceType::TABLET ],
+    'NOVO7 Mars'                                => [ 'Ainovo', 'Novo7 Mars', DeviceType::TABLET ],
+    'Novo7 PALADIN'                             => [ 'Ainovo', 'Novo7 Paladin', DeviceType::TABLET ],
+    'npm702-NOVO7PALADIN'                       => [ 'Ainovo', 'Novo7 Paladin', DeviceType::TABLET ],
+    'Novo7 Rainbow'                             => [ 'Ainovo', 'Novo7 Rainbow', DeviceType::TABLET ],
+    'Novo7 -Rainbow'                            => [ 'Ainovo', 'Novo7 Rainbow', DeviceType::TABLET ],
+    'NOVO7 Tornados'                            => [ 'Ainovo', 'Novo7 Tornados', DeviceType::TABLET ],
+    'Novo7 Venus'                               => [ 'Ainovo', 'Novo7 Venus', DeviceType::TABLET ],
+    'Novo 7 Venus'                              => [ 'Ainovo', 'Novo7 Venus', DeviceType::TABLET ],
+    'Novo7 Venus QuadCore'                      => [ 'Ainovo', 'Novo7 Venus', DeviceType::TABLET ],
+    'Novo 7 Venus QuadCore'                     => [ 'Ainovo', 'Novo7 Venus', DeviceType::TABLET ],
+    'Novo8 Advanced'                            => [ 'Ainovo', 'Novo8 Advanced', DeviceType::TABLET ],
+    'Novo8 Discover Quadcore'                   => [ 'Ainovo', 'Novo8 Discover', DeviceType::TABLET ],
+    'Novo8 Disover Quadcore'                    => [ 'Ainovo', 'Novo8 Discover', DeviceType::TABLET ],
+    'Novo8 Dream QuadCore'                      => [ 'Ainovo', 'Novo8 Dream', DeviceType::TABLET ],
+    'Novo8mini'                                 => [ 'Ainovo', 'Novo8 Mini', DeviceType::TABLET ],
+    'novo9-Spark'                               => [ 'Ainovo', 'Novo9 Spark', DeviceType::TABLET ],
+    'NOVO9 Spark II'                            => [ 'Ainovo', 'Novo9 Spark II', DeviceType::TABLET ],
+    'Novo 10 Hero'                              => [ 'Ainovo', 'Novo10 Hero', DeviceType::TABLET ],
+    'Novo10 ?Hero!'                             => [ 'Ainovo', 'Novo10 Hero', DeviceType::TABLET ],
+    'Novo 10 Hero QuadCore'                     => [ 'Ainovo', 'Novo10 Hero', DeviceType::TABLET ],
+    'Novo Captain'                              => [ 'Ainovo', 'Novo10 Captain', DeviceType::TABLET ],
+    'Novo10 captain QuadCore'                   => [ 'Ainovo', 'Novo10 Captain', DeviceType::TABLET ],
+    'AIRIS GN135'                               => [ 'Airis', 'GN135' ],
+    'AIRIS S211'                                => [ 'Airis', 'S211' ],
+    'AIRIS TM([0-9]+[A-Z]*)!'                   => [ 'Airis', 'TM$1' ],
+    'TM400'                                     => [ 'Airis', 'TM400' ],
+    'AIRIS OnePAD 725'                          => [ 'Airis', 'OnePAD 725' ],
+    'AIRIS OnePAD700'                           => [ 'Airis', 'OnePAD 700' ],
+    'AIRIS OnePAD 730'                          => [ 'Airis', 'OnePAD 730' ],
+    'OnePAD 785I'                               => [ 'Airis', 'OnePAD 785I' ],
+    'OnePAD 900HD'                              => [ 'Airis', 'OnePAD 900HD' ],
+    'OnePAD 970'                                => [ 'Airis', 'OnePAD 970' ],
+    'AirisOnePad1000'                           => [ 'Airis', 'OnePAD 1000' ],
+    'OnePAD 1100x2'                             => [ 'Airis', 'OnePAD 1100x2' ],
+    'AKAI NEO'                                  => [ 'AKAI', 'Neo' ],
+    'AKAI N8800'                                => [ 'AKAI', 'N8800' ],
+    'PHA-3850'                                  => [ 'AKAI', 'PHA-3850' ],
+    'PHA-3880'                                  => [ 'AKAI', 'PHA-3880 Glory F1' ],
+    'AKAI PHA-4800'                             => [ 'AKAI', 'PHA-4800 Glory G1' ],
+    'PHA-4850'                                  => [ 'AKAI', 'PHA-4850 Glory L1' ],
+    'AKAIPHA 5800'                              => [ 'AKAI', 'PHA-5800' ],
+    'PHA-5850'                                  => [ 'AKAI', 'PHA-5850 Glory O1' ],
+    'AKAI MIDMA-7002S'                          => [ 'AKAI', 'MIDMA 7002S', DeviceType::TABLET ],
+    'MID1040C'                                  => [ 'AKAI', 'MID1040C', DeviceType::TABLET ],
+    'A206G'                                     => [ 'Alcatel', 'A206G' ],
+    'A450TL'                                    => [ 'Alcatel', 'One Touch Pixi Charm' ],
+    'A460G'                                     => [ 'Alcatel', 'One Touch Pixi Pulsar' ],
+    'A460T'                                     => [ 'Alcatel', 'One Touch Pixi 3' ],
+    'A462C'                                     => [ 'Alcatel', 'One Touch Pixi Eclipse' ],
+    'A463BG'                                    => [ 'Alcatel', 'One Touch Pixi Glitz' ],
+    'A464BG'                                    => [ 'Alcatel', 'One Touch Pixi Glitz' ],
+    'A466BG'                                    => [ 'Alcatel', 'One Touch Pixi Unite' ],
+    'A466T'                                     => [ 'Alcatel', 'Lume' ],
+    'A480G'                                     => [ 'Alcatel', 'One Touch Pop C1' ],
+    'A520L'                                     => [ 'Alcatel', 'One Touch Pop Nova' ],
+    'A520R'                                     => [ 'Alcatel', 'One Touch Pop Nova' ],
+    'A521L'                                     => [ 'Alcatel', 'One Touch Pop Star 2' ],
+    'A554C'                                     => [ 'Alcatel', 'One Touch Juke' ],
+    'A556C'                                     => [ 'Alcatel', 'A556C' ],
+    'A560G'                                     => [ 'Alcatel', 'A560G' ],
+    'A562G'                                     => [ 'Alcatel', 'A562G' ],
+    'A564R'                                     => [ 'Alcatel', 'One Touch Pop Icon' ],
+    'A564C'                                     => [ 'Alcatel', 'One Touch Pop Icon' ],
+    'A570BL'                                    => [ 'Alcatel', 'One Touch Pixi Avion' ],
+    'A621BL'                                    => [ 'Alcatel', 'One Touch Pixi Glory' ],
+    'A621R'                                     => [ 'Alcatel', 'One Touch Pop 3 (5.5)' ],
+    'A622GL'                                    => [ 'Alcatel', 'Jitterbug Smart' ],
+    'A622VL'                                    => [ 'Alcatel', 'One Touch Pixi 3 (5.5)' ],
+    'A845L'                                     => [ 'Alcatel', 'One Touch Pop Star' ],
+    'A846L'                                     => [ 'Alcatel', 'One Touch Pop Icon 2' ],
+    'Alcatel A851L'                             => [ 'Alcatel', 'One Touch Sonic' ],
+    'A851L'                                     => [ 'Alcatel', 'One Touch Sonic' ],
+    'A995L'                                     => [ 'Alcatel', 'One Touch Pop Mega' ],
+    'ONETOUCH Flash Plus'                       => [ 'Alcatel', 'One Touch Flash Plus' ],
+    'one touch 890!'                            => [ 'Alcatel', 'One Touch 890' ],
+    'one touch 891!'                            => [ 'Alcatel', 'One Touch 891' ],
+    'one touch 900!'                            => [ 'Alcatel', 'One Touch 900' ],
+    'one touch 903!'                            => [ 'Alcatel', 'One Touch 903' ],
+    'one touch 906!'                            => [ 'Alcatel', 'One Touch 906' ],
+    'Alcatel one touch 908F'                    => [ 'Alcatel', 'One Touch 908' ],
+    'one touch 908!'                            => [ 'Alcatel', 'One Touch 908' ],
+    'one touch 909!'                            => [ 'Alcatel', 'One Touch 909' ],
+    'USCC ALCATEL one touch 909B'               => [ 'Alcatel', 'One Touch 909' ],
+    'one touch 910!'                            => [ 'Alcatel', 'One Touch 910' ],
+    'one touch 913!'                            => [ 'Alcatel', 'One Touch 913' ],
+    'one touch 916!'                            => [ 'Alcatel', 'One Touch 916' ],
+    'one touch 918!'                            => [ 'Alcatel', 'One Touch 918' ],
+    'Alcatel one touch 918'                     => [ 'Alcatel', 'One Touch 918' ],
+    'Alcatel ONETOUCH 918'                      => [ 'Alcatel', 'One Touch 918' ],
+    'OT 918'                                    => [ 'Alcatel', 'One Touch 918' ],
+    'ALCATEL OT 919'                            => [ 'Alcatel', 'One Touch 919' ],
+    'OT 919'                                    => [ 'Alcatel', 'One Touch 919' ],
+    'OT 919 HelloKitty'                         => [ 'Alcatel', 'One Touch 919 Hello Kitty' ],
+    'one touch 922!'                            => [ 'Alcatel', 'One Touch 922' ],
+    'one touch 927!'                            => [ 'Alcatel', 'One Touch 927' ],
+    'one touch 928!'                            => [ 'Alcatel', 'One Touch 928' ],
+    'one touch 930!'                            => [ 'Alcatel', 'One Touch 930' ],
+    'one touch 960!'                            => [ 'Alcatel', 'One Touch 960' ],
+    'one touch 976!'                            => [ 'Alcatel', 'One Touch 976' ],
+    'one touch 978!'                            => [ 'Alcatel', 'One Touch 978' ],
+    'one touch 979 HelloKitty'                  => [ 'Alcatel', 'One Touch 979 Hello Kitty' ],
+    'one touch 979!'                            => [ 'Alcatel', 'One Touch 979' ],
+    'one touch 980!'                            => [ 'Alcatel', 'One Touch 980' ],
+    'one touch 981!'                            => [ 'Alcatel', 'One Touch 981' ],
+    'one touch 983!'                            => [ 'Alcatel', 'One Touch 983' ],
+    'one touch 985!'                            => [ 'Alcatel', 'One Touch 985' ],
+    'one touch 986!'                            => [ 'Alcatel', 'One Touch 986' ],
+    'one touch 988!'                            => [ 'Alcatel', 'One Touch 988' ],
+    'USCC ALCATEL one touch 988'                => [ 'Alcatel', 'One Touch 988' ],
+    'one touch 990!'                            => [ 'Alcatel', 'One Touch 990' ],
+    'Alcatel one touch 990'                     => [ 'Alcatel', 'One Touch 990' ],
+    'Alcatel one touch 990S'                    => [ 'Alcatel', 'One Touch 990' ],
+    'TCL ONE TOUCH 990'                         => [ 'Alcatel', 'One Touch 990' ],
+    'OT-990C'                                   => [ 'Alcatel', 'One Touch 990' ],
+    'OT 990M'                                   => [ 'Alcatel', 'One Touch 990' ],
+    'one touch 991!'                            => [ 'Alcatel', 'One Touch 991' ],
+    'one touch 992!'                            => [ 'Alcatel', 'One Touch 992' ],
+    'ONE TOCH 992D'                             => [ 'Alcatel', 'One Touch 992' ],
+    'one touch 993!'                            => [ 'Alcatel', 'One Touch 993' ],
+    'one touch 995!'                            => [ 'Alcatel', 'One Touch 995' ],
+    'OT-995'                                    => [ 'Alcatel', 'One Touch 995' ],
+    'one touch 997!'                            => [ 'Alcatel', 'One Touch 997' ],
+    'one touch 998!'                            => [ 'Alcatel', 'One Touch 998' ],
+    'one touch D662'                            => [ 'Alcatel', 'One Touch D662' ],
+    'one touch D668'                            => [ 'Alcatel', 'One Touch D668' ],
+    'one touch D820'                            => [ 'Alcatel', 'One Touch D820' ],
+    'one touch D920'                            => [ 'Alcatel', 'One Touch D920' ],
+    'one touch J320'                            => [ 'Alcatel', 'One Touch J320' ],
+    '1216[X]!'                                  => [ 'Alcatel', 'One Touch Pixi 3 (7)' ],
+    '4002[X]!'                                  => [ 'Alcatel', 'One Touch Pop Fit' ],
+    '4003[AJ]!'                                 => [ 'Alcatel', 'One Touch Pixi 3 (4)' ],
+    'one ?touch 40(05|10|11)!'                  => [ 'Alcatel', 'One Touch T\'Pop' ],
+    'one ?touch 4007!'                          => [ 'Alcatel', 'One Touch Pixi' ],
+    '4007[D]!'                                  => [ 'Alcatel', 'One Touch Pixi' ],
+    'one ?touch 4008!'                          => [ 'Alcatel', 'One Touch Pixi 3 (3.5)' ],
+    '4008[A]!'                                  => [ 'Alcatel', 'One Touch Pixi 3 (3.5)' ],
+    'one ?touch 4009!'                          => [ 'Alcatel', 'One Touch Pixi 3 (3.5)' ],
+    '4009[ADEFIKMSX]!'                          => [ 'Alcatel', 'One Touch Pixi 3 (3.5)' ],
+    'one ?touch 4013!'                          => [ 'Alcatel', 'One Touch Pixi 3 (4)' ],
+    '4013[ADEJKMX]!'                            => [ 'Alcatel', 'One Touch Pixi 3 (4)' ],
+    'one ?touch 4014!'                          => [ 'Alcatel', 'One Touch Pixi 3 (4)' ],
+    '4014[AMX]!'                                => [ 'Alcatel', 'One Touch Pixi 3 (4)' ],
+    'one ?touch 40(15|16)!'                     => [ 'Alcatel', 'One Touch Pop C1' ],
+    '4015[ANTX]!'                               => [ 'Alcatel', 'One Touch Pop C1' ],
+    '4015[D]!'                                  => [ 'Alcatel', 'One Touch Pixi 2' ],
+    '4016[ADX]!'                                => [ 'Alcatel', 'One Touch Pop C1' ],
+    '4017[ADEFX]!'                              => [ 'Alcatel', 'One Touch Pixi 4 (3.5)' ],
+    '4018[ADEFMX]!'                             => [ 'Alcatel', 'One Touch Pop D1' ],
+    'one ?touch 4024!'                          => [ 'Alcatel', 'One Touch Pixi First' ],
+    '4024[DEX]!'                                => [ 'Alcatel', 'One Touch Pixi First' ],
+    'one ?touch 4027!'                          => [ 'Alcatel', 'One Touch Pixi 3 (4.5)' ],
+    '4027[ADNX]!'                               => [ 'Alcatel', 'One Touch Pixi 3 (4.5)' ],
+    '4028[AEJS]!'                               => [ 'Alcatel', 'One Touch Pixi 3 (4.5)' ],
+    'one ?touch 4029!'                          => [ 'Alcatel', 'One Touch S\'Pop' ],
+    'one ?touch 4030!'                          => [ 'Alcatel', 'One Touch S\'Pop' ],
+    'one ?touch 4031!'                          => [ 'Alcatel', 'One Touch Flash Mini' ],
+    'one ?touch 4032!'                          => [ 'Alcatel', 'One Touch Pop C2' ],
+    '4032[ADEX]!'                               => [ 'Alcatel', 'One Touch Pop C2' ],
+    'one ?touch 4033!'                          => [ 'Alcatel', 'One Touch Pop C3' ],
+    '4033[AL]!'                                 => [ 'Alcatel', 'One Touch Pop C3' ],
+    'ONETOUCH POPC3'                            => [ 'Alcatel', 'One Touch Pop C3' ],
+    '4034[ADEFGX]!'                             => [ 'Alcatel', 'One Touch Pixi 4 (4)' ],
+    'one ?touch 40(35|36|37)!'                  => [ 'Alcatel', 'One Touch Pop D3' ],
+    '4035[ADYX]!'                               => [ 'Alcatel', 'One Touch Pop D3' ],
+    '4036[E]!'                                  => [ 'Alcatel', 'One Touch Pop D3' ],
+    '4037[AX]!'                                 => [ 'Alcatel', 'One Touch Pop D3' ],
+    '4037[T]!'                                  => [ 'Alcatel', 'One Touch Evolve 2' ],
+    '4037[V]!'                                  => [ 'Alcatel', 'One Touch Elevate' ],
+    'one ?touch 5045!'                          => [ 'Alcatel', 'One Touch Pop 2 (4)' ],
+    '4045[ADELOX]!'                             => [ 'Alcatel', 'One Touch Pop 2 (4)' ],
+    '4055[JU]!'                                 => [ 'Alcatel', 'One Touch Pixi 5 (4)' ],
+    '4060[A]!'                                  => [ 'Alcatel', 'IDEAL' ],
+    '4060[W]!'                                  => [ 'Alcatel', 'One Touch Pixi 4 (5)' ],
+    '5010[DEGSUX]!'                             => [ 'Alcatel', 'One Touch Pixi 4 (5)' ],
+    '5012[G]!'                                  => [ 'Alcatel', 'One Touch Pixi 4 (5.5)' ],
+    '5015[ADEX]!'                               => [ 'Alcatel', 'One Touch Pixi 3 (5)' ],
+    '5016[AJ]!'                                 => [ 'Alcatel', 'One Touch Pixi 3 (5)' ],
+    '5017[B]!'                                  => [ 'Alcatel', 'One Touch Elevate' ],
+    '5017[ADEOX]!'                              => [ 'Alcatel', 'One Touch Pixi 3 (4.5)' ],
+    '5019[D]!'                                  => [ 'Alcatel', 'One Touch Pixi 3 (4.5)' ],
+    'one ?touch 5020!'                          => [ 'Alcatel', 'One Touch M\'Pop' ],
+    'Alcatel OT M\'pop 5020D'                   => [ 'Alcatel', 'One Touch M\'Pop' ],
+    'M POP 5020A'                               => [ 'Alcatel', 'One Touch M\'Pop' ],
+    'M POP'                                     => [ 'Alcatel', 'One Touch M\'Pop' ],
+    '5020[A]!'                                  => [ 'Alcatel', 'One Touch M\'Pop' ],
+    'one ?touch 5021!'                          => [ 'Alcatel', 'One Touch Soleil' ],
+    '5022[DEX]!'                                => [ 'Alcatel', 'One Touch Pop Star' ],
+    '5023[F]!'                                  => [ 'Alcatel', 'One Touch Pixi 4 Plus Power' ],
+    '5025[DEGX]!'                               => [ 'Alcatel', 'One Touch Pop 3' ],
+    '5027[B]!'                                  => [ 'Alcatel', 'One Touch Dawn' ],
+    'one ?touch 5035!'                          => [ 'Alcatel', 'One Touch X\'Pop' ],
+    '5036[D]!'                                  => [ 'Alcatel', 'One Touch Pop C5' ],
+    'one ?touch 50(36|37)!'                     => [ 'Alcatel', 'One Touch Pop C5' ],
+    'ONETOUCH POPC5'                            => [ 'Alcatel', 'One Touch Pop C5' ],
+    'one ?touch 50(38)!'                        => [ 'Alcatel', 'One Touch Pop D5' ],
+    '5038[ADEX]!'                               => [ 'Alcatel', 'One Touch Pop D5' ],
+    'one ?touch 5042!'                          => [ 'Alcatel', 'One Touch Pop 2 (4.5)' ],
+    '5042[ADEFGTWXY]!'                          => [ 'Alcatel', 'One Touch Pop 2 (4.5)' ],
+    '5044[DOY]!'                                => [ 'Alcatel', 'U5' ],
+    '5045[ADGJTX]!'                             => [ 'Alcatel', 'One Touch Pixi 4 (5.0)' ],
+    '5046[Y]!'                                  => [ 'Alcatel', 'A3' ],
+    'one ?touch 5050!'                          => [ 'Alcatel', 'One Touch Pop S3' ],
+    '5050[ASYX]!'                               => [ 'Alcatel', 'One Touch Pop S3' ],
+    '5051[ADJMX]!'                              => [ 'Alcatel', 'One Touch Pop 4 (5.0)' ],
+    '5054[ADOSTX]!'                             => [ 'Alcatel', 'One Touch Pixi 3 (5.5)' ],
+    '5054[NW]!'                                 => [ 'Alcatel', 'One Touch Fierce XL' ],
+    '5056[ADENUWX]!'                            => [ 'Alcatel', 'One Touch Pop 4+' ],
+    '5056[O]!'                                  => [ 'Alcatel', 'One Touch Allura' ],
+    '5057[M]!'                                  => [ 'Alcatel', 'One Touch Pop Mirage' ],
+    '5065[ADJNWX]!'                             => [ 'Alcatel', 'One Touch Pixi 3 (5)' ],
+    '5070[DJX]!'                                => [ 'Alcatel', 'One Touch Pop Star' ],
+    '5080[DX]!'                                 => [ 'Alcatel', 'One Touch Pixi 4 (6)' ],
+    '5085[CD]!'                                 => [ 'Alcatel', 'A5 LED' ],
+    '5095[BIKY]!'                               => [ 'Alcatel', 'One Touch Pop 4S' ],
+    '5096[A]!'                                  => [ 'Alcatel', 'One Touch Net' ],
+    '5098[OS]!'                                 => [ 'Alcatel', 'One Touch Pixi 4 (6)' ],
+    'one ?touch 6010!'                          => [ 'Alcatel', 'One Touch Star' ],
+    'one ?touch 6012!'                          => [ 'Alcatel', 'One Touch Idol Mini' ],
+    'ONE TOUCH IDOL MINI'                       => [ 'Alcatel', 'One Touch Idol Mini' ],
+    'one ?touch 6014!'                          => [ 'Alcatel', 'One Touch Idol Mini' ],
+    '6014[DX]!'                                 => [ 'Alcatel', 'One Touch Idol Mini' ],
+    'one ?touch 6016!'                          => [ 'Alcatel', 'One Touch Idol 2 Mini' ],
+    '6016[ADEX]!'                               => [ 'Alcatel', 'One Touch Idol 2 Mini' ],
+    'one ?touch 6030!'                          => [ 'Alcatel', 'One Touch Idol' ],
+    '6031[X]!'                                  => [ 'Alcatel', 'One Touch Idol Ultra' ],
+    'one ?touch 6032!'                          => [ 'Alcatel', 'One Touch Idol α' ],
+    'one ?touch 6033!'                          => [ 'Alcatel', 'One Touch Idol Ultra' ],
+    'one ?touch 60(34|35)!'                     => [ 'Alcatel', 'One Touch Idol S' ],
+    'one ?touch 6036!'                          => [ 'Alcatel', 'One Touch Idol 2 Mini S' ],
+    '6036[AYX]!'                                => [ 'Alcatel', 'One Touch Idol 2 Mini S' ],
+    'one ?touch 6037!'                          => [ 'Alcatel', 'One Touch Idol 2 Dual' ],
+    '6037[BIKY]!'                               => [ 'Alcatel', 'One Touch Idol 2 Dual' ],
+    'one ?touch 6039!'                          => [ 'Alcatel', 'One Touch Idol 3 (4.7)' ],
+    '6039[AHJKSY]!'                             => [ 'Alcatel', 'One Touch Idol 3 (4.7)' ],
+    'one ?touch 6040!'                          => [ 'Alcatel', 'One Touch Idol X' ],
+    '6042[D]!'                                  => [ 'Alcatel', 'One Touch Flash' ],
+    'one ?touch 6043!'                          => [ 'Alcatel', 'One Touch Idol X+' ],
+    '6043[AD]!'                                 => [ 'Alcatel', 'One Touch Idol X+' ],
+    '6044D'                                     => [ 'Alcatel', 'One Touch Pop Up' ],
+    'one ?touch 6045!'                          => [ 'Alcatel', 'One Touch Idol 3 (5.5)' ],
+    '6045[BFGIKOXY]!'                           => [ 'Alcatel', 'One Touch Idol 3 (5.5)' ],
+    'one ?touch 6050!'                          => [ 'Alcatel', 'One Touch Idol 2S' ],
+    '6050[AFWY]!'                               => [ 'Alcatel', 'One Touch Idol 2S' ],
+    '6055[ABDHIKPUY]!'                          => [ 'Alcatel', 'One Touch Idol 4' ],
+    '6070[KOY]!'                                => [ 'Alcatel', 'One Touch Idol 4s' ],
+    'one ?touch 7024!'                          => [ 'Alcatel', 'One Touch Fierce' ],
+    'one touch fierce!'                         => [ 'Alcatel', 'One Touch Fierce' ],
+    'one ?touch 70(25|30)!'                     => [ 'Alcatel', 'One Touch Snap' ],
+    '7030[L]!'                                  => [ 'Alcatel', 'One Touch Snap' ],
+    'one ?touch 70(40|41)!'                     => [ 'Alcatel', 'One Touch Pop C7' ],
+    '7040[NR]!'                                 => [ 'Alcatel', 'One Touch Pop C7' ],
+    '7040[T]!'                                  => [ 'Alcatel', 'One Touch Fierce 2' ],
+    'one ?touch 7042!'                          => [ 'Alcatel', 'One Touch Snap' ],
+    'one ?touch 7043!'                          => [ 'Alcatel', 'One Touch Pop 2 (5)' ],
+    '7043[AEKY]!'                               => [ 'Alcatel', 'One Touch Pop 2 (5)' ],
+    'one ?touch 7044!'                          => [ 'Alcatel', 'One Touch Pop 2 (5) Premium' ],
+    '7044[AXY]!'                                => [ 'Alcatel', 'One Touch Pop 2 (5) Premium' ],
+    'one ?touch 7045!'                          => [ 'Alcatel', 'One Touch Pop S7' ],
+    '7045[Y]!'                                  => [ 'Alcatel', 'One Touch Pop S7' ],
+    '7046[T]!'                                  => [ 'Alcatel', 'One Touch Conquest' ],
+    'one ?touch 7047!'                          => [ 'Alcatel', 'One Touch Pop C9' ],
+    '7048[ASWX]!'                               => [ 'Alcatel', 'One Touch Go Play' ],
+    'one ?touch 7050!'                          => [ 'Alcatel', 'One Touch Pop S9' ],
+    '7050[Y]!'                                  => [ 'Alcatel', 'One Touch Pop S9' ],
+    '7051[X]!'                                  => [ 'Alcatel', 'One Touch Pop 3 (5)' ],
+    '7053[D]!'                                  => [ 'Alcatel', 'X1' ],
+    '7055[AW]!'                                 => [ 'Alcatel', 'One Touch Hero 2C' ],
+    '7051[X]!'                                  => [ 'Alcatel', 'One Touch Pop 2 (5) Premium' ],
+    'one ?touch 8000!'                          => [ 'Alcatel', 'One Touch Scribe Easy' ],
+    'one ?touch 8008!'                          => [ 'Alcatel', 'One Touch Scribe HD' ],
+    'one ?touch 8020!'                          => [ 'Alcatel', 'One Touch Hero' ],
+    '8020[D]!'                                  => [ 'Alcatel', 'One Touch Hero' ],
+    'one ?touch 8030!'                          => [ 'Alcatel', 'One Touch Hero 2' ],
+    '8030[BY]!'                                 => [ 'Alcatel', 'One Touch Hero 2' ],
+    '9001[DX]!'                                 => [ 'Alcatel', 'One Touch Pixi 4 (6)' ],
+    '9002[AWX]!'                                => [ 'Alcatel', 'One Touch Pixi 3 (7)', DeviceType::TABLET ],
+    '9003[AX]!'                                 => [ 'Alcatel', 'One Touch Pixi 4 (7)', DeviceType::TABLET ],
+    '9005[X]!'                                  => [ 'Alcatel', 'One Touch Pixi 3 (8)', DeviceType::TABLET ],
+    '9006[W]!'                                  => [ 'Alcatel', 'One Touch Pixi 4 (7)', DeviceType::TABLET ],
+    '9007[ATX]!'                                => [ 'Alcatel', 'One Touch Pixi 3 (7)', DeviceType::TABLET ],
+    '9008[AIJTUX]!'                             => [ 'Alcatel', 'A3 XL', DeviceType::TABLET ],
+    '9010[X]!'                                  => [ 'Alcatel', 'One Touch Pixi 3 (10)', DeviceType::TABLET ],
+    '9015[BJW]!'                                => [ 'Alcatel', 'One Touch POP7', DeviceType::TABLET ],
+    '9022[SX]!'                                 => [ 'Alcatel', 'One Touch Pixi 3 (8)', DeviceType::TABLET ],
+    '9024[W]!'                                  => [ 'Alcatel', 'A30', DeviceType::TABLET ],
+    '9025[MQ]!'                                 => [ 'Alcatel', 'One Touch Pop 4 (7)', DeviceType::TABLET ],
+    'one ?touch T10!'                           => [ 'Alcatel', 'One Touch T10', DeviceType::TABLET ],
+    'one ?touch T20!'                           => [ 'Alcatel', 'One Touch T20', DeviceType::TABLET ],
+    'one ?touch T60!'                           => [ 'Alcatel', 'One Touch T60', DeviceType::TABLET ],
+    'ONE TOUCH TAB 7'                           => [ 'Alcatel', 'One Touch Tab 7', DeviceType::TABLET ],
+    'ONE TOUCH TAB 7HD'                         => [ 'Alcatel', 'One Touch Tab 7HD', DeviceType::TABLET ],
+    'ONE TOUCH TAB 8HD'                         => [ 'Alcatel', 'One Touch Tab 8HD', DeviceType::TABLET ],
+    'ONE TOUCH EVO7'                            => [ 'Alcatel', 'One Touch Evo 7', DeviceType::TABLET ],
+    'onetouch EVO7'                             => [ 'Alcatel', 'One Touch Evo 7', DeviceType::TABLET ],
+    'ONE TOUCH E710'                            => [ 'Alcatel', 'One Touch Evo 7 HD', DeviceType::TABLET ],
+    'ONE TOUCH EVO 7HD'                         => [ 'Alcatel', 'One Touch Evo 7 HD', DeviceType::TABLET ],
+    'ONE TOUCH EVO7HD'                          => [ 'Alcatel', 'One Touch Evo 7 HD', DeviceType::TABLET ],
+    'ONE TOUCH EVO8HD'                          => [ 'Alcatel', 'One Touch Evo 8 HD', DeviceType::TABLET ],
+    'D820X'                                     => [ 'Alcatel', 'One Touch Hero 8', DeviceType::TABLET ],
+    'ONETOUCH POP 7 LTE'                        => [ 'Alcatel', 'One Touch POP7', DeviceType::TABLET ],
+    'ONE ?TOUCH P310(A|X)!'                     => [ 'Alcatel', 'One Touch POP7', DeviceType::TABLET ],
+    'ONE ?TOUCH P320(A|X)!'                     => [ 'Alcatel', 'One Touch POP8', DeviceType::TABLET ],
+    'ONE ?TOUCH P321!'                          => [ 'Alcatel', 'One Touch POP8', DeviceType::TABLET ],
+    '9021A'                                     => [ 'Alcatel', 'One Touch POP8', DeviceType::TABLET ],
+    'P330X'                                     => [ 'Alcatel', 'One Touch POP7S', DeviceType::TABLET ],
+    'P350X'                                     => [ 'Alcatel', 'One Touch POP8S', DeviceType::TABLET ],
+    'ONE ?TOUCH POP 8S P350X!'                  => [ 'Alcatel', 'One Touch POP8S', DeviceType::TABLET ],
+    'P360X'                                     => [ 'Alcatel', 'One Touch POP10', DeviceType::TABLET ],
+    'ADR3010'                                   => [ 'Alcatel', 'Authority' ],
+    'Venture'                                   => [ 'Alcatel', 'Venture' ],
+    'Mobile Sosh'                               => [ 'Alcatel', 'Le mobile Sosh' ],
+    'Alcor Access Q913M'                        => [ 'Alcor', 'Access Q913M', DeviceType::TABLET ],
+    'Alcor Zest Q813I'                          => [ 'Alcor', 'Zest Q813I', DeviceType::TABLET ],
+    'Alcor Zest Q813IS'                         => [ 'Alcor', 'Zest Q813IS', DeviceType::TABLET ],
+    'Alcor Zest Q813IX'                         => [ 'Alcor', 'Zest Q813IX', DeviceType::TABLET ],
+    'Alcor Zest Q933R'                          => [ 'Alcor', 'Zest Q933R', DeviceType::TABLET ],
+    'ALLVIEW A4ALL'                             => [ 'Allview', 'A4 All' ],
+    'A5 Easy'                                   => [ 'Allview', 'A5 Easy' ],
+    'A5 Easy TM'                                => [ 'Allview', 'A5 Easy' ],
+    'A5 Lite'                                   => [ 'Allview', 'A5 Lite' ],
+    'A5 Quad Plus'                              => [ 'Allview', 'A5 Quad Plus' ],
+    'A5 Quad Plus TM'                           => [ 'Allview', 'A5 Quad Plus' ],
+    'A6 Duo'                                    => [ 'Allview', 'A6 Duo' ],
+    'A6 Lite'                                   => [ 'Allview', 'A6 Lite' ],
+    'ALLVIEW A6 Quad'                           => [ 'Allview', 'A6 Quad' ],
+    'A7 Lite'                                   => [ 'Allview', 'A7 Lite' ],
+    'AX3Party'                                  => [ 'Allview', 'AX3 Party' ],
+    'AX4Nano plus'                              => [ 'Allview', 'AX4 Nano Plus' ],
+    'C6 Duo'                                    => [ 'Allview', 'C6 Duo' ],
+    'C6Quad 4G'                                 => [ 'Allview', 'C6 Quad' ],
+    'E2 Jump'                                   => [ 'Allview', 'E2 Jump' ],
+    'E3 Living'                                 => [ 'Allview', 'E3 Living' ],
+    'E3 Sign'                                   => [ 'Allview', 'E3 Sign' ],
+    'E4'                                        => [ 'Allview', 'E4' ],
+    'E4 Lite'                                   => [ 'Allview', 'E4 Lite' ],
+    'ALLVIEW P1'                                => [ 'Allview', 'P1 Alldro' ],
+    'Allview P2'                                => [ 'Allview', 'P2 Alldro' ],
+    'ALLVIEW P4'                                => [ 'Allview', 'P4 Alldro' ],
+    'ALLVIEW P4i'                               => [ 'Allview', 'P4 Duo' ],
+    'P4i'                                       => [ 'Allview', 'P4 Duo' ],
+    'Allview P5'                                => [ 'Allview', 'P5' ],
+    'P5 Energy'                                 => [ 'Allview', 'P5 Energy' ],
+    'P5Life'                                    => [ 'Allview', 'P5 Life' ],
+    'P5Life TM'                                 => [ 'Allview', 'P5 Life' ],
+    'Allview P5-Mini'                           => [ 'Allview', 'P5 Mini' ],
+    'ALLVIEW P5 Quad'                           => [ 'Allview', 'P5 Quad' ],
+    'ALLVIEW P5 Qmax'                           => [ 'Allview', 'P5 Qmax' ],
+    'ALLVIEW P6'                                => [ 'Allview', 'P6' ],
+    'P6 Energy'                                 => [ 'Allview', 'P6 Energy' ],
+    'P6 Energy TM'                              => [ 'Allview', 'P6 Energy' ],
+    'P6 Pro'                                    => [ 'Allview', 'P6 Pro' ],
+    'P6 Qmax'                                   => [ 'Allview', 'P6 Qmax' ],
+    'ALLVIEW P6 Quad'                           => [ 'Allview', 'P6 Quad' ],
+    'P6 Quad'                                   => [ 'Allview', 'P6 Quad' ],
+    'P8 Energy'                                 => [ 'Allview', 'P8 Energy' ],
+    'P8 Energy mini'                            => [ 'Allview', 'P8 Energy Mini' ],
+    'P8 Energy mini TM'                         => [ 'Allview', 'P8 Energy Mini' ],
+    'ALLVIEW TX1 Quasar'                        => [ 'Allview', 'TX1 Quasar' ],
+    'V1 Viper'                                  => [ 'Allview', 'V1 Viper' ],
+    'V1 Viper E'                                => [ 'Allview', 'V1 Viper E' ],
+    'V1 Viper I'                                => [ 'Allview', 'V1 Viper I' ],
+    'V1 Viper I4G'                              => [ 'Allview', 'V1 Viper I' ],
+    'V1 Viper I4G PL'                           => [ 'Allview', 'V1 Viper I' ],
+    'V1 Viper I4G TM'                           => [ 'Allview', 'V1 Viper I' ],
+    'V1 Viper L'                                => [ 'Allview', 'V1 Viper L' ],
+    'V1 ViperS'                                 => [ 'Allview', 'V1 Viper S' ],
+    'V1 Viper S4G'                              => [ 'Allview', 'V1 Viper S' ],
+    'V1 Viper S4G TM'                           => [ 'Allview', 'V1 Viper S' ],
+    'V2 Viper'                                  => [ 'Allview', 'V2 Viper' ],
+    'V2 Viper I'                                => [ 'Allview', 'V2 Viper I' ],
+    'V2 Viper I TM'                             => [ 'Allview', 'V2 Viper I' ],
+    'V2 Viper I4G'                              => [ 'Allview', 'V2 Viper I' ],
+    'V2 Viper S'                                => [ 'Allview', 'V2 Viper S' ],
+    'V2 Viper X'                                => [ 'Allview', 'V2 Viper X' ],
+    'V2 Viper X plus'                           => [ 'Allview', 'V2 Viper X Plus' ],
+    'Viva C701'                                 => [ 'Allview', 'Viva C701' ],
+    'Viva H701'                                 => [ 'Allview', 'Viva H701' ],
+    'Viva H701 LTE CZ'                          => [ 'Allview', 'Viva H701' ],
+    'VivaH7LTE'                                 => [ 'Allview', 'Viva H7' ],
+    'VivaH8LTE'                                 => [ 'Allview', 'Viva H8' ],
+    'H8 Life'                                   => [ 'Allview', 'Viva H8 Life' ],
+    'VivaH10LTE'                                => [ 'Allview', 'Viva H10' ],
+    'Viva i7G'                                  => [ 'Allview', 'Viva i7G', DeviceType::TABLET ],
+    'VIVA i7'                                   => [ 'Allview', 'Viva i9', DeviceType::TABLET ],
+    'Viva i10HD'                                => [ 'Allview', 'Viva i10 HD', DeviceType::TABLET ],
+    'Viva i701G TM'                             => [ 'Allview', 'Viva i701G', DeviceType::TABLET ],
+    'X1 Soul'                                   => [ 'Allview', 'X1 Soul' ],
+    'X1 Soul Mini'                              => [ 'Allview', 'X1 Soul Mini' ],
+    'X1 mini Soul'                              => [ 'Allview', 'X1 Soul Mini' ],
+    'X1 Soul Xtreme'                            => [ 'Allview', 'X1 Soul Xtreme' ],
+    'X1 Xtreme Mini'                            => [ 'Allview', 'X1 Xtreme Mini' ],
+    'Xtreme X2'                                 => [ 'Allview', 'X2 Extreme' ],
+    'X2 Soul'                                   => [ 'Allview', 'X2 Soul' ],
+    'ALLVIEW X2 Soul'                           => [ 'Allview', 'X2 Soul' ],
+    'X2 Soul Lite'                              => [ 'Allview', 'X2 Soul Lite' ],
+    'X2 Soul Lite TM'                           => [ 'Allview', 'X2 Soul Lite' ],
+    'X2 Soul Mini'                              => [ 'Allview', 'X2 Soul Mini' ],
+    'X2 Soul Mini TM'                           => [ 'Allview', 'X2 Soul Mini' ],
+    'X2 Soul PRO'                               => [ 'Allview', 'X2 Soul Pro' ],
+    'X2 Soul Style'                             => [ 'Allview', 'X2 Soul Style' ],
+    'X2 Soul Style TM'                          => [ 'Allview', 'X2 Soul Style' ],
+    'X2 Soul Style Plus'                        => [ 'Allview', 'X2 Soul Style Plus' ],
+    'X2 Soul Xtreme'                            => [ 'Allview', 'X2 Soul Xtreme' ],
+    'X2 Twin'                                   => [ 'Allview', 'X2 Twin' ],
+    'X3 Soul'                                   => [ 'Allview', 'X3 Soul' ],
+    'ALLVIEW-X3 Soul'                           => [ 'Allview', 'X3 Soul' ],
+    'X3 Soul Lite'                              => [ 'Allview', 'X3 Soul Lite' ],
+    'X3 Soul Lite TM'                           => [ 'Allview', 'X3 Soul Lite' ],
+    'X3 Soul mini'                              => [ 'Allview', 'X3 Soul Mini' ],
+    'X3 Soul PLUS'                              => [ 'Allview', 'X3 Soul Plus' ],
+    'X3 Soul PRO'                               => [ 'Allview', 'X3 Soul Pro' ],
+    'X3 Soul Style'                             => [ 'Allview', 'X3 Soul Style' ],
+
+    '(Allview|Alldro)!!' => [
+        'Allview AX1 Shine'                         => [ 'Allview', 'AX1 Shine', DeviceType::TABLET ],
+        'AllviewAX2'                                => [ 'Allview', 'AX2 Frenzy', DeviceType::TABLET ],
+        'AllviewAX2Frenzy'                          => [ 'Allview', 'AX2 Frenzy', DeviceType::TABLET ],
+        'ALLVIEW SPEEDI'                            => [ 'Allview', 'Alldro Speed', DeviceType::TABLET ],
+        'AllviewSpeed'                              => [ 'Allview', 'Alldro Speed', DeviceType::TABLET ],
+        'ALLDROSPEED'                               => [ 'Allview', 'Alldro Speed', DeviceType::TABLET ],
+        'AllviewSpeedi'                             => [ 'Allview', 'Alldro Speed i', DeviceType::TABLET ],
+        'AllviewSpeedDuo'                           => [ 'Allview', 'Alldro Speed Duo', DeviceType::TABLET ],
+        'AllviewSpeedEco'                           => [ 'Allview', 'Alldro Speed Eco', DeviceType::TABLET ],
+        'AllviewSpeedSatellite'                     => [ 'Allview', 'Alldro Speed Satellite', DeviceType::TABLET ],
+        'AllviewSpeedSatelite'                      => [ 'Allview', 'Alldro Speed Satellite', DeviceType::TABLET ],
+        'ALLDRO2SPEED'                              => [ 'Allview', 'Alldro Speed 2', DeviceType::TABLET ],
+        'Allview2SpeedDuo'                          => [ 'Allview', 'Alldro Speed 2 Duo', DeviceType::TABLET ],
+        'Allview 2 Speed QUAD'                      => [ 'Allview', 'Alldro Speed 2 Quad', DeviceType::TABLET ],
+        'AllviewSpeed2'                             => [ 'Allview', 'Alldro Speed 2', DeviceType::TABLET ],
+        'AllviewSpeed2+'                            => [ 'Allview', 'Alldro Speed 2', DeviceType::TABLET ],
+        'AllviewSpeed3'                             => [ 'Allview', 'Alldro Speed 3', DeviceType::TABLET ],
+        'AllviewSpeed3G'                            => [ 'Allview', 'Alldro Speed 3G', DeviceType::TABLET ],
+        'AllviewSpeed3HD'                           => [ 'Allview', 'Alldro Speed 3HD', DeviceType::TABLET ],
+        'AllviewSpeed3T'                            => [ 'Allview', 'Alldro Speed 3T', DeviceType::TABLET ],
+        'Alldro3Speed DUO'                          => [ 'Allview', 'Alldro Speed 3 Duo', DeviceType::TABLET ],
+        'Allview3SpeedQuad'                         => [ 'Allview', 'Alldro Speed 3 Quad', DeviceType::TABLET ],
+        'Allview3SpeedQUADHD'                       => [ 'Allview', 'Alldro Speed 3 Quad HD', DeviceType::TABLET ],
+        'AllviewCity'                               => [ 'Allview', 'Alldro City', DeviceType::TABLET ],
+        'AllviewCityPlus'                           => [ 'Allview', 'Alldro City Plus', DeviceType::TABLET ],
+        'AllviewCityLife'                           => [ 'Allview', 'Alldro City Life', DeviceType::TABLET ],
+        'ALLVIEW VIPER I'                           => [ 'Allview', 'Viper I', DeviceType::TABLET ],
+        'Allview Viva H8'                           => [ 'Allview', 'Viva H8', DeviceType::TABLET ],
+        'ALLVIEW3CONECT'                            => [ 'Allview', '3 Conect', DeviceType::TABLET ],
+    ],
+
+    'A10'                                       => [ 'AllWinner', 'A10', DeviceType::TABLET ],
+    'Allwinner A10'                             => [ 'AllWinner', 'A10', DeviceType::TABLET ],
+    '97FC'                                      => [ 'AllWinner', 'A10 97FC', DeviceType::TABLET ],
+    'A13-?MID!'                                 => [ 'AllWinner', 'A13', DeviceType::TABLET ],
+    'SoftwinerEvb'                              => [ 'AllWinner', 'A13', DeviceType::TABLET ],
+    'SoftwinerEvb0308'                          => [ 'AllWinner', 'A13', DeviceType::TABLET ],
+    'SoftwinerEvd'                              => [ 'AllWinner', 'A13', DeviceType::TABLET ],
+    'Softwinerkf026'                            => [ 'AllWinner', 'A13', DeviceType::TABLET ],
+    'Softwinerf721'                             => [ 'AllWinner', 'F721', DeviceType::TABLET ],
+    'Softwinerf761'                             => [ 'AllWinner', 'F761', DeviceType::TABLET ],
+    'Softwinerf761I'                            => [ 'AllWinner', 'F761', DeviceType::TABLET ],
+    'Softwinerf900'                             => [ 'AllWinner', 'F900', DeviceType::TABLET ],
+    'SoftwinerEvbV13'                           => [ 'AllWinner', 'V13', DeviceType::TABLET ],
+    'GT-I7105'                                  => [ 'Alps', 'GT-I7105' ],
+    'GT-I9810'                                  => [ 'Alps', 'GT-I9810' ],
+    'AT107F'                                    => [ 'Aluratek', 'Cinepad AT107F', DeviceType::TABLET ],
+    'AT108F'                                    => [ 'Aluratek', 'Cinepad AT108F', DeviceType::TABLET ],
+    'AT197F'                                    => [ 'Aluratek', 'Cinepad AT197F', DeviceType::TABLET ],
+    'Amazon Kindle Fire!'                       => [ 'Amazon', 'Kindle Fire', DeviceType::TABLET ],                             // 1st generation or unknown variant using unofficial firmware
+    'Amazon Otter'                              => [ 'Amazon', 'Kindle Fire', DeviceType::TABLET ],                                 // "Otter"  1st generation 7" (1024 x 600)
+    'Amazon OtterX'                             => [ 'Amazon', 'Kindle Fire', DeviceType::TABLET ],                                 // "Otter"  1st generation 7" (1024 x 600)
+    'Amazon Otter2'                             => [ 'Amazon', 'Kindle Fire', DeviceType::TABLET ],                                 // "Otter2" 2nd generation 7" (1024 x 600)
+    'Amazon Tate'                               => [ 'Amazon', 'Kindle Fire HD', DeviceType::TABLET ],                              // "Tate"   2nd generation 7" HD (1280 x 800)
+    'Amazon Jem'                                => [ 'Amazon', 'Kindle Fire HD 8.9"', DeviceType::TABLET ],                         // "Jem"    2nd generation 8.9" HD (1920 x 1200)
+    'soho'                                      => [ 'Amazon', 'Kindle Fire HD (2013)', DeviceType::TABLET ],                       // "Soho"   3rd generation 7" HD (1280 x 800)
+    'thor'                                      => [ 'Amazon', 'Kindle Fire HDX', DeviceType::TABLET ],                             // "Thor"   3rd generation 7" HDX (1920 x 1200)
+    'apollo'                                    => [ 'Amazon', 'Kindle Fire HDX 8.9"', DeviceType::TABLET ],                        // "Apollo" 3rd generation 8.9" HDX (2560 x 1600)
+    'Kindle Fire'                               => [ 'Amazon', 'Kindle Fire', DeviceType::TABLET, Flag::FIREOS ],                   // "Otter"  1st generation 7" (1024 x 600)
+    'KFOTE?!'                                   => [ 'Amazon', 'Kindle Fire', DeviceType::TABLET, Flag::FIREOS ],                   // "Otter2" 2nd generation 7" (1024 x 600)
+    'KFTT'                                      => [ 'Amazon', 'Kindle Fire HD', DeviceType::TABLET, Flag::FIREOS ],                // "Tate"   2nd generation 7" HD (1280 x 800)
+    'KFJW(I|A)!'                                => [ 'Amazon', 'Kindle Fire HD 8.9"', DeviceType::TABLET, Flag::FIREOS ],           // "Jem"    2nd generation 8.9" HD (1920 x 1200)
+    'KFJMWI'                                    => [ 'Amazon', 'Kindle Fire', DeviceType::TABLET, Flag::FIREOS ],                   //          3rd generation (1280 x 800)
+    'KFSOWI'                                    => [ 'Amazon', 'Kindle Fire HD (2013)', DeviceType::TABLET, Flag::FIREOS ],         // "Soho"   3rd generation 7" HD (1280 x 800)
+    'KFTHW(I|A)!'                               => [ 'Amazon', 'Kindle Fire HDX', DeviceType::TABLET, Flag::FIREOS ],               // "Thor"   3rd generation 7" HDX (1920 x 1200)
+    'KFAPW(I|A)!'                               => [ 'Amazon', 'Kindle Fire HDX 8.9"', DeviceType::TABLET, Flag::FIREOS ],          // "Apollo" 3rd generation 8.9" HDX (2560 x 1600)
+    'KFARWI'                                    => [ 'Amazon', 'Fire HD 6', DeviceType::TABLET, Flag::FIREOS ],                     // 4th generation 6" HD (1280 x 800)
+    'KFASWI'                                    => [ 'Amazon', 'Fire HD 7', DeviceType::TABLET, Flag::FIREOS ],                     // 4th generation 7" HD (1280 x 800)
+    'KFSAW(I|A)!'                               => [ 'Amazon', 'Fire HDX 8.9" (2014)', DeviceType::TABLET, Flag::FIREOS ],          // 4th generation 8.9" HDX (2560 x 1600)
+    'KFFOWI'                                    => [ 'Amazon', 'Fire', DeviceType::TABLET, Flag::FIREOS ],                          // 5th generation 7" (1024 x 600)
+    'KFMEWI'                                    => [ 'Amazon', 'Fire HD 8', DeviceType::TABLET, Flag::FIREOS ],                     // 5th generation 8" HD (1280 x 800)
+    'KFTBWI'                                    => [ 'Amazon', 'Fire HD 10', DeviceType::TABLET, Flag::FIREOS ],                    // 5th generation 10" HD (1280 x 800)
+    // 'KFAUWI'
+    // 'KFDOWI'
+    // 'KFGIWI'
+    // 'KFSLWI'
+    // 'KFSUWI'
+    'SD4930UR'                                  => [ 'Amazon', 'Fire Phone', DeviceType::MOBILE, Flag::FIREOS ],
+    'AFTB'                                      => [ 'Amazon', 'Fire TV', DeviceType::TELEVISION, Flag::FIREOS ],
+    'AFTS'                                      => [ 'Amazon', 'Fire TV (2015)', DeviceType::TELEVISION, Flag::FIREOS ],
+    'AFTM'                                      => [ 'Amazon', 'Fire TV stick', DeviceType::TELEVISION, Flag::FIREOS ],
+    'AFTT'                                      => [ 'Amazon', 'Fire TV stick (2017)', DeviceType::TELEVISION, Flag::FIREOS ],
+    'AMI-TT2'                                   => [ 'Amicroe', 'TouchTab II', DeviceType::TABLET ],
+    'AMI-TT2C'                                  => [ 'Amicroe', 'TouchTab IIC', DeviceType::TABLET ],
+    'AMI-TT2E'                                  => [ 'Amicroe', 'TouchTab IIE', DeviceType::TABLET ],
+    'AMI-TT4'                                   => [ 'Amicroe', 'TouchTab IV', DeviceType::TABLET ],
+    'AMI-TTS'                                   => [ 'Amicroe', 'TouchTab S', DeviceType::TABLET ],
+    'AMI-TTLITE'                                => [ 'Amicroe', 'TouchTab Lite', DeviceType::TABLET ],
+    'AMI-TTFORCE'                               => [ 'Amicroe', 'TouchTab Force', DeviceType::TABLET ],
+    'AML-MX REF'                                => [ 'AmLogic', 'MX', DeviceType::TABLET ],
+
+    '(AMO-)?AMOI!!' => [
+        'AMOI 1570W'                                => [ 'Amoi', '1570W' ],
+        'AMOI-A702'                                 => [ 'Amoi', 'A702' ],
+        'AMOI A726T'                                => [ 'Amoi', 'A726T' ],
+        'AMOI A860w'                                => [ 'Amoi', 'A860W' ],
+        'AMOI-A862W'                                => [ 'Amoi', 'A862W' ],
+        'AMOI A900T'                                => [ 'Amoi', 'A900T' ],
+        'AMOI A900W'                                => [ 'Amoi', 'A900W' ],
+        'AMOI A918T'                                => [ 'Amoi', 'A918T' ],
+        'AMOI A920'                                 => [ 'Amoi', 'A920' ],
+        'AMOI A920T'                                => [ 'Amoi', 'A920T' ],
+        'AMOI A920W'                                => [ 'Amoi', 'A920W' ],
+        'AMOI A928W'                                => [ 'Amoi', 'A928W' ],
+        'AMOI A955T'                                => [ 'Amoi', 'A955T' ],
+        'AMO-AMOI E700C'                            => [ 'Amoi', 'E700C' ],
+        'AMOI E800C'                                => [ 'Amoi', 'E800C' ],
+        'AMOI N79+'                                 => [ 'Amoi', 'N79' ],
+        'AMOI N89'                                  => [ 'Amoi', 'N89' ],
+        'AMOI N807'                                 => [ 'Amoi', 'N807' ],
+        'AMOI N808'                                 => [ 'Amoi', 'N808' ],
+        'AMOI N816'                                 => [ 'Amoi', 'N816' ],
+        'AMOI N818'                                 => [ 'Amoi', 'N818' ],
+        'AMOI N820'                                 => [ 'Amoi', 'N820' ],
+        'AMOI N821'                                 => [ 'Amoi', 'N821' ],
+        'AMOI[ -]N828!'                             => [ 'Amoi', 'N828' ],
+        'AMOI N850'                                 => [ 'Amoi', 'N850' ],
+        'AMOI N890'                                 => [ 'Amoi', 'N890' ],
+        'AMOI M8228'                                => [ 'Amoi', 'M8228' ],
+        'AMOI M8448'                                => [ 'Amoi', 'M8448' ],
+        'AMOI M8458'                                => [ 'Amoi', 'M8458' ],
+        'AMOI-X4'                                   => [ 'Amoi', 'X4' ],
+        'Amoi Q50H'                                 => [ 'Amoi', 'Q50H', DeviceType::TABLET ],
+    ],
+
+    'A862W'                                     => [ 'Amoi', 'A862W' ],
+    'AMD120'                                    => [ 'AnyDATA', 'AnyTAB AMD120', DeviceType::TABLET ],
+    'mw07'                                      => [ 'AOC', 'Breeze MW07', DeviceType::TABLET ],
+    'MW0710'                                    => [ 'AOC', 'Breeze MW0710', DeviceType::TABLET ],
+    'MW0711'                                    => [ 'AOC', 'Breeze MW0711', DeviceType::TABLET ],
+    'MW0712'                                    => [ 'AOC', 'Breeze MW0712', DeviceType::TABLET ],
+    'MW0731'                                    => [ 'AOC', 'Breeze MW0731', DeviceType::TABLET ],
+    'MW0731PLUS'                                => [ 'AOC', 'Breeze MW0731 Plus', DeviceType::TABLET ],
+    'MW0733'                                    => [ 'AOC', 'Breeze MW0733', DeviceType::TABLET ],
+    'MW0811'                                    => [ 'AOC', 'Breeze MW0811', DeviceType::TABLET ],
+    'MW0812'                                    => [ 'AOC', 'Breeze MW0812', DeviceType::TABLET ],
+    'MW0812 V2.0'                               => [ 'AOC', 'Breeze MW0812', DeviceType::TABLET ],
+    'MW0821'                                    => [ 'AOC', 'Breeze MW0821', DeviceType::TABLET ],
+    'MW0821 V2.0'                               => [ 'AOC', 'Breeze MW0821', DeviceType::TABLET ],
+    'MW0821+'                                   => [ 'AOC', 'Breeze MW0821 Plus', DeviceType::TABLET ],
+    'MW0831'                                    => [ 'AOC', 'Breeze MW0831', DeviceType::TABLET ],
+    'MW0831Plus'                                => [ 'AOC', 'Breeze MW0831 Plus', DeviceType::TABLET ],
+    'MW0922'                                    => [ 'AOC', 'Breeze MW0922', DeviceType::TABLET ],
+    'MW0931'                                    => [ 'AOC', 'Breeze MW0931', DeviceType::TABLET ],
+    'AOLE 828'                                  => [ 'Aole', '828' ],
+    'AOSON G18'                                 => [ 'Aoson', 'G18', DeviceType::TABLET ],
+    'Aoson M11'                                 => [ 'Aoson', 'M11', DeviceType::TABLET ],
+    'M19'                                       => [ 'Aoson', 'M19', DeviceType::TABLET ],
+    'Aoson M19'                                 => [ 'Aoson', 'M19', DeviceType::TABLET ],
+    'aoson m33'                                 => [ 'Aoson', 'M33', DeviceType::TABLET ],
+    'aoson M33 3G'                              => [ 'Aoson', 'M33', DeviceType::TABLET ],
+    'AOSON M82T'                                => [ 'Aoson', 'M82T', DeviceType::TABLET ],
+    'AOSON M97F'                                => [ 'Aoson', 'M97F', DeviceType::TABLET ],
+    'AOSON M106NB'                              => [ 'Aoson', 'M106NB', DeviceType::TABLET ],
+    'AOSON M701TG-C'                            => [ 'Aoson', 'M701TG-C', DeviceType::TABLET ],
+    'AOSON M706T'                               => [ 'Aoson', 'M706T', DeviceType::TABLET ],
+    'AOSON M721S'                               => [ 'Aoson', 'M721S', DeviceType::TABLET ],
+    'aoson M787T'                               => [ 'Aoson', 'M787T', DeviceType::TABLET ],
+    'AOSON M1016'                               => [ 'Aoson', 'M1016', DeviceType::TABLET ],
+    'Apanda.A60!'                               => [ 'Apanda', 'A60' ],
+    'apanda-A80S'                               => [ 'Apanda', 'A80S' ],
+    'apanda A80S'                               => [ 'Apanda', 'A80S' ],
+    'apanda-A80T'                               => [ 'Apanda', 'A80T' ],
+    'apanda-A100'                               => [ 'Apanda', 'A100' ],
+    'apanda-A101'                               => [ 'Apanda', 'A101' ],
+    'Quicki[ -]?([0-9]+)!'                      => [ 'Apollo', 'Quicki $1', DeviceType::TABLET ],
+    'Aprix D97+'                                => [ 'Aprix', 'D97+', DeviceType::TABLET ],
+    'ARCHM901'                                  => [ 'Archos', 'Arnova M901', DeviceType::TABLET ],
+    'AN7CG2'                                    => [ 'Archos', 'Arnova 7c G2', DeviceType::TABLET ],
+    'Arnova 7G2'                                => [ 'Archos', 'Arnova 7 G2', DeviceType::TABLET ],
+    'AN7G2'                                     => [ 'Archos', 'Arnova 7 G2', DeviceType::TABLET ],
+    'AN7G2DTE'                                  => [ 'Archos', 'Arnova 7 G2', DeviceType::TABLET ],
+    'AN7G2I'                                    => [ 'Archos', 'Arnova 7 G2', DeviceType::TABLET ],
+    'AN7G3'                                     => [ 'Archos', 'Arnova 7 G3', DeviceType::TABLET ],
+    'AN7BG2'                                    => [ 'Archos', 'Arnova 7b G2', DeviceType::TABLET ],
+    'AN7BG2DT'                                  => [ 'Archos', 'Arnova 7b G2', DeviceType::TABLET ],
+    'AN7BG3'                                    => [ 'Archos', 'Arnova 7b G3', DeviceType::TABLET ],
+    'AN7CG3'                                    => [ 'Archos', 'Arnova 7c G3', DeviceType::TABLET ],
+    'AN7DG3'                                    => [ 'Archos', 'Arnova 7d G3', DeviceType::TABLET ],
+    'AN7DG3B'                                   => [ 'Archos', 'Arnova 7d G3', DeviceType::TABLET ],
+    'AN7DG3-CP'                                 => [ 'Archos', 'Arnova Childpad', DeviceType::TABLET ],
+    'AN7DG3ST-CP'                               => [ 'Archos', 'Arnova Childpad', DeviceType::TABLET ],
+    'AN7FG3'                                    => [ 'Archos', 'Arnova 7f G3', DeviceType::TABLET ],
+    'AN7HG3'                                    => [ 'Archos', 'Arnova 7h G3', DeviceType::TABLET ],
+    'AN7IG3'                                    => [ 'Archos', 'Arnova 7i G3', DeviceType::TABLET ],
+    'AN7SP'                                     => [ 'Archos', 'Arnova Soundpad', DeviceType::TABLET ],
+    'A80KSC!'                                   => [ 'Archos', 'Arnova 8', DeviceType::TABLET ],
+    'ARNOVA8G2'                                 => [ 'Archos', 'Arnova 8 G2', DeviceType::TABLET ],
+    'AN8G2'                                     => [ 'Archos', 'Arnova 8 G2', DeviceType::TABLET ],
+    'AN8G2I'                                    => [ 'Archos', 'Arnova 8 G2', DeviceType::TABLET ],
+    'AN8G3'                                     => [ 'Archos', 'Arnova 8 G3', DeviceType::TABLET ],
+    'AN8BG2'                                    => [ 'Archos', 'Arnova 8b G2', DeviceType::TABLET ],
+    'AN8BG3'                                    => [ 'Archos', 'Arnova 8b G3', DeviceType::TABLET ],
+    'AN8CG3'                                    => [ 'Archos', 'Arnova 8c G3', DeviceType::TABLET ],
+    'AN9G2'                                     => [ 'Archos', 'Arnova 9 G2', DeviceType::TABLET ],
+    'AN9G2I'                                    => [ 'Archos', 'Arnova 9i G2', DeviceType::TABLET ],
+    'AN9G3'                                     => [ 'Archos', 'Arnova 9 G3', DeviceType::TABLET ],
+    'A101B'                                     => [ 'Archos', 'Arnova 10', DeviceType::TABLET ],
+    'Arnova 10G2'                               => [ 'Archos', 'Arnova 10 G2', DeviceType::TABLET ],
+    'A101C'                                     => [ 'Archos', 'Arnova 10 G2', DeviceType::TABLET ],
+    'AN10G2'                                    => [ 'Archos', 'Arnova 10 G2', DeviceType::TABLET ],
+    'AN10G2-KN'                                 => [ 'Archos', 'Arnova 10 G2', DeviceType::TABLET ],
+    'AN10G2-LN'                                 => [ 'Archos', 'Arnova 10 G2', DeviceType::TABLET ],
+    'AN10G2I'                                   => [ 'Archos', 'Arnova 10 G2', DeviceType::TABLET ],
+    'AN10BG2'                                   => [ 'Archos', 'Arnova 10b G2', DeviceType::TABLET ],
+    'AN10BG2DT'                                 => [ 'Archos', 'Arnova 10b G2', DeviceType::TABLET ],
+    'AN10BG2I'                                  => [ 'Archos', 'Arnova 10b G2', DeviceType::TABLET ],
+    'AN10BG3'                                   => [ 'Archos', 'Arnova 10b G3', DeviceType::TABLET ],
+    'AN10BG3DT'                                 => [ 'Archos', 'Arnova 10b G3', DeviceType::TABLET ],
+    'AN10CG3'                                   => [ 'Archos', 'Arnova 10c G3', DeviceType::TABLET ],
+    'AN10DG3'                                   => [ 'Archos', 'Arnova 10d G3', DeviceType::TABLET ],
+    'AN13FP'                                    => [ 'Archos', 'Arnova Familypad', DeviceType::TABLET ],
+    'ARNOVA 90G3'                               => [ 'Archos', 'Arnova 90 G3', DeviceType::TABLET ],
+    'ARNOVA 90 G4'                              => [ 'Archos', 'Arnova 90 G4', DeviceType::TABLET ],
+    'ARNOVA 97G4'                               => [ 'Archos', 'Arnova 97 G4', DeviceType::TABLET ],
+    'ARNOVA 101 G4'                             => [ 'Archos', 'Arnova 101 G4', DeviceType::TABLET ],
+    'AN8BG3-LZ'                                 => [ 'Archos', 'Lazer 8.0', DeviceType::TABLET ],
+    'A101B2-LZ'                                 => [ 'Archos', 'Lazer 10.1', DeviceType::TABLET ],
+    'AN10G2-LZ'                                 => [ 'Archos', 'Lazer 10.1', DeviceType::TABLET ],
+    'AN10BG3-LZ'                                => [ 'Archos', 'Lazer 10.1', DeviceType::TABLET ],
+    'AN7DG3C'                                   => [ 'Archos', 'Tabeo', DeviceType::TABLET ],
+    'A32'                                       => [ 'Archos', '32', 'media' ],
+    'A35DE'                                     => [ 'Archos', '35 Smart Home Phone' ],
+    'A43'                                       => [ 'Archos', '43', 'media' ],
+    'ARCHOS 50PL'                               => [ 'Archos', '50PL', 'media' ],
+    'ARCHOS 79XE'                               => [ 'Archos', '79XE', 'media' ],
+    'Archos5'                                   => [ 'Archos', '5', 'media' ],
+    'A70HB'                                     => [ 'Archos', '7 Home Tablet', DeviceType::TABLET ],                   // G7
+    'A70BHT'                                    => [ 'Archos', '7 Home Tablet', DeviceType::TABLET ],
+    'A70BHT-LZ'                                 => [ 'Archos', '7 Home Tablet', DeviceType::TABLET ],
+    'A70BHT-PR'                                 => [ 'Archos', '7 Home Tablet', DeviceType::TABLET ],
+    'A70CHT'                                    => [ 'Archos', '7c Home Tablet', DeviceType::TABLET ],
+    'A80HF'                                     => [ 'Archos', '8 Home Tablet', DeviceType::TABLET ],
+    'A70H'                                      => [ 'Archos', '70 Internet Tablet', DeviceType::TABLET ],          // G8
+    'A70S'                                      => [ 'Archos', '70s Internet Tablet', DeviceType::TABLET ],
+    'A7EB'                                      => [ 'Archos', '70b eReader', DeviceType::TABLET ],
+    'ARCHOS 70it2'                              => [ 'Archos', '70b Internet Tablet', DeviceType::TABLET ],
+    'ARCHOS 70it2G8'                            => [ 'Archos', '70b Internet Tablet', DeviceType::TABLET ],
+    'Archos 80 Internet Tablet'                 => [ 'Archos', '80 Internet Tablet', DeviceType::TABLET ],
+    'A101IT'                                    => [ 'Archos', '101 Internet Tablet', DeviceType::TABLET ],
+    'Archos 101 Internet Tablet'                => [ 'Archos', '101 Internet Tablet', DeviceType::TABLET ],
+    'AC45BHE'                                   => [ 'Archos', '45b Helium' ],
+    'AC50BHE'                                   => [ 'Archos', '50b Helium' ],
+    'AC50DHE'                                   => [ 'Archos', '50d Helium' ],
+    'AC45NE'                                    => [ 'Archos', '45 Neon' ],
+
+    'Archos!!' => [
+        'ARCHOS 80G9'                               => [ 'Archos', '80 G9', DeviceType::TABLET ],
+        'ARCHOS 101G9'                              => [ 'Archos', '101 G9', DeviceType::TABLET ],
+        'ARCHOS 97XSLG10'                           => [ 'Archos', '97 XS', DeviceType::TABLET ],
+        'ARCHOS 80XSK'                              => [ 'Archos', '80 XS', DeviceType::TABLET ],
+        'ARCHOS 101G10'                             => [ 'Archos', '101 XS', DeviceType::TABLET ],
+        'ARCHOS 101 XS 2'                           => [ 'Archos', '101 XS 2', DeviceType::TABLET ],
+        'Archos 101 XS 2 Moi'                       => [ 'Archos', '101 XS 2', DeviceType::TABLET ],
+        'ARCHOS 101b XS2'                           => [ 'Archos', '101b XS 2', DeviceType::TABLET ],
+        'Archos 70 Carbon'                          => [ 'Archos', '70 Carbon', DeviceType::TABLET ],
+        'ARCHOS 80 Carbon'                          => [ 'Archos', '80 Carbon', DeviceType::TABLET ],
+        'ARCHOS 97 CARBON'                          => [ 'Archos', '97 Carbon', DeviceType::TABLET ],
+        'Archos 50 Cobalt'                          => [ 'Archos', '50 Cobalt' ],
+        'Archos 55 Cobalt Plus'                     => [ 'Archos', '55 Cobalt Plus' ],
+        'ARCHOS 70 Cobalt'                          => [ 'Archos', '70 Cobalt', DeviceType::TABLET ],
+        'Archos 70b Cobalt'                         => [ 'Archos', '70b Cobalt', DeviceType::TABLET ],
+        'Archos 70c Cobalt'                         => [ 'Archos', '70c Cobalt', DeviceType::TABLET ],
+        'Archos 79 Cobalt'                          => [ 'Archos', '79 Cobalt', DeviceType::TABLET ],
+        'ARCHOS 80 COBALT'                          => [ 'Archos', '80 Cobalt', DeviceType::TABLET ],
+        'Archos 97 Cobalt'                          => [ 'Archos', '97 Cobalt', DeviceType::TABLET ],
+        'Archos 101 Cobalt'                         => [ 'Archos', '101 Cobalt', DeviceType::TABLET ],
+        'Archos 70 Copper'                          => [ 'Archos', '70 Copper', DeviceType::TABLET ],
+        'Archos 70b Copper'                         => [ 'Archos', '70b Copper', DeviceType::TABLET ],
+        'Archos 90 Copper'                          => [ 'Archos', '90 Copper', DeviceType::TABLET ],
+        'Archos 90b Copper'                         => [ 'Archos', '90b Copper', DeviceType::TABLET ],
+        'Archos 101 Copper'                         => [ 'Archos', '101 Copper', DeviceType::TABLET ],
+        'Archos 101b Copper'                        => [ 'Archos', '101b Copper', DeviceType::TABLET ],
+        'Archos 101c Copper'                        => [ 'Archos', '101c Copper', DeviceType::TABLET ],
+        'Archos 50 Diamond'                         => [ 'Archos', '50 Diamond' ],
+        'Archos 55 Diamond 2 Plus'                  => [ 'Archos', '55 Diamond 2 Plus' ],
+        'Archos 55 diamond Selfie'                  => [ 'Archos', '55 Diamond Selfie' ],
+        'Archos Diamond S'                          => [ 'Archos', 'Diamond S' ],
+        'Archos Diamond Plus'                       => [ 'Archos', 'Diamond Plus' ],
+        'Archos 40 Helium'                          => [ 'Archos', '40 Helium' ],
+        'Archos 45 Helium 4G'                       => [ 'Archos', '45 Helium' ],
+        'ARCHOS 45b Helium'                         => [ 'Archos', '45b Helium' ],
+        'Archos 45c Helium'                         => [ 'Archos', '45c Helium' ],
+        'Archos 50 Helium 4G'                       => [ 'Archos', '50 Helium' ],
+        'Archos 50b Helium 4G'                      => [ 'Archos', '50b Helium' ],
+        'Archos 50c Helium'                         => [ 'Archos', '50c Helium' ],
+        'Archos 50d Helium'                         => [ 'Archos', '50d Helium' ],
+        'Archos 50e Helium'                         => [ 'Archos', '50e Helium' ],
+        'Archos 50f Helium'                         => [ 'Archos', '50f Helium' ],
+        'Archos 50 Helium Plus'                     => [ 'Archos', '50 Helium Plus' ],
+        'Archos 55 Helium'                          => [ 'Archos', '55 Helium' ],
+        'Archos 55 Helium Plus'                     => [ 'Archos', '55 Helium Plus' ],
+        'Archos 70 Helium'                          => [ 'Archos', '70 Helium', DeviceType::TABLET ],
+        'Archos 70b Helium'                         => [ 'Archos', '70b Helium', DeviceType::TABLET ],
+        'Archos 80 Helium 4G'                       => [ 'Archos', '80 Helium', DeviceType::TABLET ],
+        'Archos 80b Helium'                         => [ 'Archos', '80b Helium', DeviceType::TABLET ],
+        'Archos 80b Helium v2'                      => [ 'Archos', '80b Helium', DeviceType::TABLET ],
+        'Archos 101 Helium'                         => [ 'Archos', '101 Helium', DeviceType::TABLET ],
+        'ARCHOS 101 Magnus'                         => [ 'Archos', '101 Magnus', DeviceType::TABLET ],
+        'Archos 40 Neon'                            => [ 'Archos', '40 Neon' ],
+        'Archos 45 Neon'                            => [ 'Archos', '45 Neon' ],
+        'Archos 45b Neon'                           => [ 'Archos', '45b Neon' ],
+        'Archos 50 Neon'                            => [ 'Archos', '50 Neon' ],
+        'ARCHOS 50c Neon'                           => [ 'Archos', '50c Neon' ],
+        'Archos 50b Neon'                           => [ 'Archos', '50b Neon' ],
+        'Archos 50d Neon'                           => [ 'Archos', '50d Neon' ],
+        'Archos 50e Neon'                           => [ 'Archos', '50e Neon' ],
+        'Archos 70 Neon'                            => [ 'Archos', '70 Neon', DeviceType::TABLET ],
+        'Archos 70b Neon'                           => [ 'Archos', '70b Neon', DeviceType::TABLET ],
+        'Archos 79 Neon'                            => [ 'Archos', '79 Neon', DeviceType::TABLET ],
+        'Archos 79c Neon'                           => [ 'Archos', '79c Neon', DeviceType::TABLET ],
+        'Archos 90 Neon'                            => [ 'Archos', '90 Neon', DeviceType::TABLET ],
+        'Archos 90b Neon'                           => [ 'Archos', '90b Neon', DeviceType::TABLET ],
+        'Archos 97 Neon'                            => [ 'Archos', '97 Neon', DeviceType::TABLET ],
+        'Archos 101 Neon'                           => [ 'Archos', '101 Neon', DeviceType::TABLET ],
+        'Archos 101b Neon'                          => [ 'Archos', '101b Neon', DeviceType::TABLET ],
+        'Archos 101c Neon'                          => [ 'Archos', '101c Neon', DeviceType::TABLET ],
+        'Archos 101d Neon'                          => [ 'Archos', '101d Neon', DeviceType::TABLET ],
+        'Archos 101e Neon'                          => [ 'Archos', '101e Neon', DeviceType::TABLET ],
+        'Archos 121 Neon'                           => [ 'Archos', '121 Neon', DeviceType::TABLET ],
+        'Archos 50 Oxygen'                          => [ 'Archos', '50 Oxygen' ],
+        'Archos 50b Oxygen'                         => [ 'Archos', '50b Oxygen' ],
+        'Archos 50c Oxygen'                         => [ 'Archos', '50c Oxygen' ],
+        'Archos 50d Oxygen'                         => [ 'Archos', '50d Oxygen' ],
+        'Archos 50 Oxygen Plus'                     => [ 'Archos', '50 Oxygen Plus' ],
+        'Archos 70 Oxygen'                          => [ 'Archos', '70 Oxygen', DeviceType::TABLET ],
+        'Archos 80 Oxygen'                          => [ 'Archos', '80 Oxygen', DeviceType::TABLET ],
+        'Archos 101 Oxygen'                         => [ 'Archos', '101 Oxygen', DeviceType::TABLET ],
+        'Archos 101b Oxygen'                        => [ 'Archos', '101b Oxygen', DeviceType::TABLET ],
+        'Archos 45 Platinum'                        => [ 'Archos', '45 Platinum' ],
+        'Archos 45b Platinum'                       => [ 'Archos', '45b Platinum' ],
+        'Archos 45c Platinum'                       => [ 'Archos', '45c Platinum' ],
+        'Archos 45d Platinum'                       => [ 'Archos', '45d Platinum' ],
+        'Archos 50 Platinum'                        => [ 'Archos', '50 Platinum' ],
+        'Archos 50 Platinum 4G'                     => [ 'Archos', '50 Platinum' ],
+        'Archos 50b Platinum'                       => [ 'Archos', '50b Platinum' ],
+        'Archos 50c Platinum'                       => [ 'Archos', '50c Platinum' ],
+        'Archos 52 Platinum'                        => [ 'Archos', '52 Platinum' ],
+        'Archos 53 Platinum'                        => [ 'Archos', '53 Platinum' ],
+        'Archos 5.3s Platinum'                      => [ 'Archos', '53s Platinum' ],
+        'Archos 55 Platinum'                        => [ 'Archos', '55 Platinum' ],
+        'Archos 70 Platinum'                        => [ 'Archos', '70 Platinum', DeviceType::TABLET ],
+        'Archos 70 Platinum v3'                     => [ 'Archos', '70 Platinum', DeviceType::TABLET ],
+        'ARCHOS 79 Platinum'                        => [ 'Archos', '79 Platinum', DeviceType::TABLET ],
+        'ARCHOS 80 Platinum'                        => [ 'Archos', '80 Platinum', DeviceType::TABLET ],
+        'ARCHOS 80b PLATINUM'                       => [ 'Archos', '80b Platinum', DeviceType::TABLET ],
+        'Archos 80c Platinum'                       => [ 'Archos', '80c Platinum', DeviceType::TABLET ],
+        'ARCHOS 97 Platinum'                        => [ 'Archos', '97 Platinum', DeviceType::TABLET ],
+        'ARCHOS 97b PLATINUM'                       => [ 'Archos', '97b Platinum', DeviceType::TABLET ],
+        'Archos 97c Platinum'                       => [ 'Archos', '97c Platinum', DeviceType::TABLET ],
+        'ARCHOS 101 PLATINUM'                       => [ 'Archos', '101 Platinum', DeviceType::TABLET ],
+        'Archos 101b Platinium'                     => [ 'Archos', '101b Platinum', DeviceType::TABLET ],
+        'Archos 101c Platinum'                      => [ 'Archos', '101c Platinum', DeviceType::TABLET ],
+        'Archos 40 Power'                           => [ 'Archos', '40 Power' ],
+        'Archos 50 Power'                           => [ 'Archos', '50 Power' ],
+        'Archos 35 Titanium'                        => [ 'Archos', '35 Titanium' ],
+        'Archos 35b Titanium'                       => [ 'Archos', '35b Titanium' ],
+        'Archos 40 Titanium'                        => [ 'Archos', '40 Titanium' ],
+        'Archos 40b Titanium Surround'              => [ 'Archos', '40b Titanium' ],
+        'Archos 40c Titanium'                       => [ 'Archos', '40c Titanium' ],
+        'ARCHOS 40C TIv2'                           => [ 'Archos', '40c Titanium' ],
+        'ARCHOS 40d Titanium'                       => [ 'Archos', '40d Titanium' ],
+        'Archos 45 Titanium'                        => [ 'Archos', '45 Titanium' ],
+        'Archos 45B Titanium'                       => [ 'Archos', '45b Titanium' ],
+        'Archos 45c Titanium'                       => [ 'Archos', '45c Titanium' ],
+        'Archos 50 Titanium'                        => [ 'Archos', '50 Titanium' ],
+        'Archos 53 Titanium'                        => [ 'Archos', '53 Titanium' ],
+        'Archos 59 Titanium'                        => [ 'Archos', '59 Titanium' ],
+        'ARCHOS 70 Titanium'                        => [ 'Archos', '70 Titanium', DeviceType::TABLET ],
+        'ARCHOS 70b TITANIUM'                       => [ 'Archos', '70b Titanium', DeviceType::TABLET ],
+        'Archos 70c Titanium'                       => [ 'Archos', '70c Titanium', DeviceType::TABLET ],
+        'ARCHOS 80 TITANIUM'                        => [ 'Archos', '80 Titanium', DeviceType::TABLET ],
+        'ARCHOS 97 TITANIUMHD'                      => [ 'Archos', '97 Titanium', DeviceType::TABLET ],
+        'ARCHOS 97B TITANIUM'                       => [ 'Archos', '97b Titanium', DeviceType::TABLET ],
+        'ARCHOS 101 Titanium'                       => [ 'Archos', '101 Titanium', DeviceType::TABLET ],
+        'Archos 59 Xenon'                           => [ 'Archos', '59 Xenon' ],
+        'Archos 62 Xenon'                           => [ 'Archos', '62 Xenon' ],
+        'Archos 64 Xenon'                           => [ 'Archos', '64 Xenon' ],
+        'Archos 70 Xenon'                           => [ 'Archos', '70 Xenon', DeviceType::TABLET ],
+        'Archos 70b Xenon'                          => [ 'Archos', '70b Xenon', DeviceType::TABLET ],
+        'Archos 70c Xenon'                          => [ 'Archos', '70c Xenon', DeviceType::TABLET ],
+        'Archos 70 Xenon Color'                     => [ 'Archos', '70 Xenon Color', DeviceType::TABLET ],
+        'Archos 79 Xenon'                           => [ 'Archos', '79 Xenon', DeviceType::TABLET ],
+        'Archos 80 Xenon'                           => [ 'Archos', '80 Xenon', DeviceType::TABLET ],
+        'Archos 80b Xenon'                          => [ 'Archos', '80b Xenon', DeviceType::TABLET ],
+        'Archos 80c Xenon'                          => [ 'Archos', '80c Xenon', DeviceType::TABLET ],
+        'Archos 80d Xenon'                          => [ 'Archos', '80d Xenon', DeviceType::TABLET ],
+        'Archos 96 Xenon'                           => [ 'Archos', '96 Xenon', DeviceType::TABLET ],
+        'ARCHOS 97 XENON'                           => [ 'Archos', '97 Xenon', DeviceType::TABLET ],
+        'Archos 101 Xenon'                          => [ 'Archos', '101 Xenon', DeviceType::TABLET ],
+        'Archos 101 Xenon v2'                       => [ 'Archos', '101 Xenon', DeviceType::TABLET ],
+        'Archos 101b Xenon v2'                      => [ 'Archos', '101b Xenon', DeviceType::TABLET ],
+        'Archos 101c Xenon'                         => [ 'Archos', '101c Xenon', DeviceType::TABLET ],
+        'ARCHOS 101 Xenon Lite'                     => [ 'Archos', '101 Xenon Lite', DeviceType::TABLET ],
+        'ARCHOS 80 CHILDPAD'                        => [ 'Archos', '80 Childpad', DeviceType::TABLET ],
+        'ARCHOS 101 CHILDPAD'                       => [ 'Archos', '101 Childpad', DeviceType::TABLET ],
+        'Archos Chefpad'                            => [ 'Archos', 'ChefPad', DeviceType::TABLET ],
+        'ARCHOS GAMEPAD'                            => [ 'Archos', 'Gamepad', [ DeviceType::GAMING, DeviceSubType::PORTABLE ] ],
+        'ARCHOS GAMEPAD2'                           => [ 'Archos', 'Gamepad 2', [ DeviceType::GAMING, DeviceSubType::PORTABLE ] ],
+        'ARCHOS FAMILYPAD 2'                        => [ 'Archos', 'Familypad 2', DeviceType::TABLET ],
+        'Archos 101 DB'                             => [ 'Archos', 'ArcBook', DeviceType::TABLET ],
+        'Archos Smart Home Tablet'                  => [ 'Archos', 'Smart Home Tablet', DeviceType::TABLET ],
+        'ARCHOS LUDOG10'                            => [ 'Archos', 'TV Connect', DeviceType::TELEVISION ],
+    ],
+
+    'Artes D708'                                => [ 'Artes', 'D708', DeviceType::TABLET ],
+    'Artes D821'                                => [ 'Artes', 'D821', DeviceType::TABLET ],
+    'D9702'                                     => [ 'Artes', 'D9702', DeviceType::TABLET ],
+    'Artes i701'                                => [ 'Artes', 'i701', DeviceType::TABLET ],
+    'ARTES I709'                                => [ 'Artes', 'i709', DeviceType::TABLET ],
+    'Artes Q812'                                => [ 'Artes', 'Q812', DeviceType::TABLET ],
+    'AT10H-A10WP'                               => [ 'Artview', 'AT10H-A10WP', DeviceType::TABLET ],
+    'Arya A1+'                                  => [ 'Arya', 'A1 Plus' ],
+    'Arya Z2'                                   => [ 'Arya', 'Z2' ],
+
+    'ASK SP[0-9]{3,3}!!' => [
+        'ASK SP440 3G'                              => [ 'ASK', 'SP440' ],
+        'ASK SP460 HD'                              => [ 'ASK', 'SP460 HD' ],
+        'ASK SP461 3G'                              => [ 'ASK', 'SP461' ],
+        'ASK SP510 HD'                              => [ 'ASK', 'SP510 HD' ],
+        'ASK SP516 IPS'                             => [ 'ASK', 'SP516' ],
+        'ASK SP516+ IPS'                            => [ 'ASK', 'SP516+' ],
+        'ASK SP551 HD'                              => [ 'ASK', 'SP551 HD' ],
+        'ASK SP551+HD'                              => [ 'ASK', 'SP551+ HD' ],
+        'ASK SP553 HD'                              => [ 'ASK', 'SP553 HD' ],
+        'ASK SP554 HD'                              => [ 'ASK', 'SP554 HD' ],
+        'ASK SP554+ HD'                             => [ 'ASK', 'SP554+ HD' ],
+        'ASK SP581 HD'                              => [ 'ASK', 'SP581 HD' ],
+        'ASK SP583 HD'                              => [ 'ASK', 'SP583 HD' ],
+        'ASK SP584 FHD'                             => [ 'ASK', 'SP584 FHD' ],
+        'ASK SP591'                                 => [ 'ASK', 'SP591' ],
+        'ASK SP628 HD'                              => [ 'ASK', 'SP628 HD' ],
+    ],
+
+    'ASTRI'                                     => [ 'ASTRI', 'e-reader', DeviceType::EREADER ],
+    'eeepc'                                     => [ 'Asus', 'Eee Pc' ],
+    'asus laptop'                               => [ 'Asus', 'Eee Pc' ],
+    'eee 701'                                   => [ 'Asus', 'Eee Pc' ],
+    'OMS TTD'                                   => [ 'Asus', 'Eee Pc T10' ],
+    'ASUS T20'                                  => [ 'Asus', 'Eee Pc T20' ],
+    'ME102A'                                    => [ 'Asus', 'MeMO Pad 10 (ME102A)', DeviceType::TABLET ],
+    'ME180A'                                    => [ 'Asus', 'MeMO Pad HD 8 (ME180A)', DeviceType::TABLET ],
+    'ME171'                                     => [ 'Asus', 'Eee Pad MeMO (ME171)', DeviceType::TABLET ],
+    'ME172V'                                    => [ 'Asus', 'MeMO Pad (ME172V)', DeviceType::TABLET ],
+    'ME173X'                                    => [ 'Asus', 'MeMO Pad HD 7 (ME173X)', DeviceType::TABLET ],
+    'ME301T'                                    => [ 'Asus', 'MeMO Pad Smart 10 (ME301T)', DeviceType::TABLET ],
+    'ME302C'                                    => [ 'Asus', 'MeMO Pad 10 (ME302C)', DeviceType::TABLET ],
+    'ME302KL'                                   => [ 'Asus', 'MeMO Pad FHD 10 (ME302KL)', DeviceType::TABLET ],
+    'ASUS Pad ME370T'                           => [ 'Asus', 'Eee Pad MeMO (ME370T)', DeviceType::TABLET ],
+    'ME370T'                                    => [ 'Asus', 'Eee Pad MeMO (ME370T)', DeviceType::TABLET ],
+    'ME371MG'                                   => [ 'Asus', 'Fonepad (ME371MG)', DeviceType::TABLET ],
+    'Asus Fonepad ME371MG 8GB'                  => [ 'Asus', 'Fonepad (ME371MG)', DeviceType::TABLET ],
+    'ME372CG'                                   => [ 'Asus', 'Fonepad 7 (ME372CG)', DeviceType::TABLET ],
+    'ME372CL-FF'                                => [ 'Asus', 'Fonepad 7 (ME372CL)', DeviceType::TABLET ],
+    'ME560CG'                                   => [ 'Asus', 'Fonepad Note 6 (ME560CG)', DeviceType::TABLET ],
+    'ME581CL'                                   => [ 'Asus', 'MeMO Pad 8 (ME581CL)', DeviceType::TABLET ],
+    'Slider SL101'                              => [ 'Asus', 'Eee Pad Slider', DeviceType::TABLET ],
+    'EPAD'                                      => [ 'Asus', 'Eee Pad Transformer', DeviceType::TABLET ],
+    'TF101'                                     => [ 'Asus', 'Eee Pad Transformer', DeviceType::TABLET ],
+    'TF101-WiMAX'                               => [ 'Asus', 'Eee Pad Transformer', DeviceType::TABLET ],
+    'Transformer'                               => [ 'Asus', 'Eee Pad Transformer', DeviceType::TABLET ],
+    'Transformer TF101(G)?!'                    => [ 'Asus', 'Eee Pad Transformer', DeviceType::TABLET ],
+    'TF201'                                     => [ 'Asus', 'Eee Pad Transformer Prime', DeviceType::TABLET ],
+    'tf201t'                                    => [ 'Asus', 'Eee Pad Transformer Prime', DeviceType::TABLET ],
+    '(Eee Pad )?Transformer Prime TF201!'       => [ 'Asus', 'Eee Pad Transformer Prime', DeviceType::TABLET ],
+    'Transformer TF201'                         => [ 'Asus', 'Eee Pad Transformer Prime', DeviceType::TABLET ],
+    'Transformer TF201G'                        => [ 'Asus', 'Eee Pad Transformer Prime', DeviceType::TABLET ],
+    'Transformer Prime'                         => [ 'Asus', 'Eee Pad Transformer Prime', DeviceType::TABLET ],
+    'Transformer Prime TF300T'                  => [ 'Asus', 'Eee Pad Transformer Prime', DeviceType::TABLET ],
+    'Transformer 300'                           => [ 'Asus', 'Transformer Pad 300', DeviceType::TABLET ],
+    'Transformer Pad'                           => [ 'Asus', 'Transformer Pad 300', DeviceType::TABLET ],
+    '(Transformer )?(Pad )?TF300(T|TG|TL)!'     => [ 'Asus', 'Transformer Pad 300', DeviceType::TABLET ],
+    '(Transformer )?(Pad )?TF502(T)!'           => [ 'Asus', 'Transformer Pad 502', DeviceType::TABLET ],
+    'Transformer Pad TF600T'                    => [ 'Asus', 'Transformer Pad 600', DeviceType::TABLET ],
+    '(Transformer )?(Pad )?TF700(T|K)!'         => [ 'Asus', 'Transformer Pad Infinity 700', DeviceType::TABLET ],
+    'Transformer (Pad )?Infinity!'              => [ 'Asus', 'Transformer Pad Infinity 700', DeviceType::TABLET ],
+    'Tablet P1801-T'                            => [ 'Asus', 'Transformer AiO P1801', DeviceType::TABLET ],
+    'Tablet P1802-T'                            => [ 'Asus', 'Transformer AiO P1802', DeviceType::TABLET ],
+    'PadFone'                                   => [ 'Asus', 'PadFone', DeviceType::TABLET ],
+    'PadFone 2'                                 => [ 'Asus', 'PadFone 2', DeviceType::TABLET ],
+    'PadFone Infinity'                          => [ 'Asus', 'PadFone Infinity', DeviceType::TABLET ],
+    'PadFone Infinity A86'                      => [ 'Asus', 'PadFone Infinity', DeviceType::TABLET ],
+    'PadFone T004'                              => [ 'Asus', 'PadFone Infinity', DeviceType::TABLET ],
+    'PadFone-T004'                              => [ 'Asus', 'PadFone Infinity', DeviceType::TABLET ],
+    'PadFone T008'                              => [ 'Asus', 'PadFone E', DeviceType::TABLET ],
+    'PadFone T00C'                              => [ 'Asus', 'PadFone mini', DeviceType::TABLET ],
+    'PadFone X'                                 => [ 'Asus', 'PadFone X', DeviceType::TABLET ],
+    'PadFone X mini'                            => [ 'Asus', 'PadFone X mini (PF450CL)', DeviceType::TABLET ],
+    'ETBW11AA'                                  => [ 'Asus', 'Tough' ],
+    'K00C'                                      => [ 'Asus', 'Transformer Pad Infinity', DeviceType::TABLET ],
+    'K010'                                      => [ 'Asus', 'Transformer Pad TF103', DeviceType::TABLET ],
+    'K010E'                                     => [ 'Asus', 'Transformer Pad TF103', DeviceType::TABLET ],
+    'K018'                                      => [ 'Asus', 'Transformer Pad TF103', DeviceType::TABLET ],
+    'K014'                                      => [ 'Asus', 'Transformer Pad TF303', DeviceType::TABLET ],
+    'K01B'                                      => [ 'Asus', 'Transformer Pad TF303', DeviceType::TABLET ],
+    'K00G'                                      => [ 'Asus', 'Fonepad Note 6 (ME560CG)', DeviceType::TABLET ],
+    'K00E'                                      => [ 'Asus', 'Fonepad 7 (ME372CG)', DeviceType::TABLET ],
+    'K00Y'                                      => [ 'Asus', 'Fonepad 7 (ME372CL)', DeviceType::TABLET ],
+    'K00Z'                                      => [ 'Asus', 'Fonepad 7 (ME175CG)', DeviceType::TABLET ],
+    'K012'                                      => [ 'Asus', 'Fonepad 7 (FE170CG)', DeviceType::TABLET ],
+    'K019'                                      => [ 'Asus', 'Fonepad 7 (FE375CG)', DeviceType::TABLET ],
+    'K01F'                                      => [ 'Asus', 'Fonepad 7 (FE171MG)', DeviceType::TABLET ],
+    'K01N'                                      => [ 'Asus', 'Fonepad 7 (FE171CG)', DeviceType::TABLET ],
+    'K01Q'                                      => [ 'Asus', 'Fonepad 7 (FE375CL)', DeviceType::TABLET ],
+    'K016'                                      => [ 'Asus', 'Fonepad 8 (FE380CG)', DeviceType::TABLET ],
+    'K01E'                                      => [ 'Asus', 'MeMO Pad (ME103K)', DeviceType::TABLET ],
+    'K00X'                                      => [ 'Asus', 'MeMO Pad 7 (ME7530CL)', DeviceType::TABLET ],
+    'K00R'                                      => [ 'Asus', 'MeMO Pad 7 (ME572CL)', DeviceType::TABLET ],
+    'K007'                                      => [ 'Asus', 'MeMO Pad 7 (ME572C)', DeviceType::TABLET ],
+    'K013'                                      => [ 'Asus', 'MeMO Pad 7 (ME176C)', DeviceType::TABLET ],
+    'K013C'                                     => [ 'Asus', 'MeMO Pad 7 (ME176C)', DeviceType::TABLET ],
+    'K017'                                      => [ 'Asus', 'MeMO Pad 7 (ME170C)', DeviceType::TABLET ],
+    'K01A'                                      => [ 'Asus', 'MeMO Pad 7 (ME70C)', DeviceType::TABLET ],
+    'MeMO Pad 7'                                => [ 'Asus', 'MeMo Pad 7 (ME375CL)', DeviceType::TABLET ],
+    'K012 2'                                    => [ 'Asus', 'MeMO Pad 7 (FE7010CG)', DeviceType::TABLET ],
+    'K01U'                                      => [ 'Asus', 'MeMO Pad 7 (ME171C)', DeviceType::TABLET ],
+    'K00S'                                      => [ 'Asus', 'MeMO Pad HD 7 (ME175KG)', DeviceType::TABLET ],
+    'K00U'                                      => [ 'Asus', 'MeMO Pad HD 7 (ME173XX)', DeviceType::TABLET ],
+    'K011'                                      => [ 'Asus', 'MeMO Pad 8 (ME181C)', DeviceType::TABLET ],
+    'AST21'                                     => [ 'Asus', 'MeMO Pad 8 AST21', DeviceType::TABLET, 'carrier' => 'au' ],
+    'K015'                                      => [ 'Asus', 'MeMO Pad 8 AST21', DeviceType::TABLET, 'carrier' => 'au' ],
+    'K01H'                                      => [ 'Asus', 'MeMO Pad 8 (ME581C)', DeviceType::TABLET ],
+    'K00L'                                      => [ 'Asus', 'MeMO Pad HD 8 (ME180A)', DeviceType::TABLET ],
+    'K00F'                                      => [ 'Asus', 'MeMO Pad 10 (ME102A)', DeviceType::TABLET ],
+    'T00C'                                      => [ 'Asus', 'PadFone mini', DeviceType::TABLET ],
+    'T00E'                                      => [ 'Asus', 'PadFone mini (PF400CG)', DeviceType::TABLET ],
+    'T00N'                                      => [ 'Asus', 'PadFone S (PF500KL)', DeviceType::TABLET ],
+    'T00D'                                      => [ 'Asus', 'PadFone X mini (PF450CL)', DeviceType::TABLET ],
+    'T00S'                                      => [ 'Asus', 'PadFone X mini (PF450CL)', DeviceType::TABLET ],
+    'T00T'                                      => [ 'Asus', 'PadFone X mini (PF450CL)', DeviceType::TABLET ],
+    'T001'                                      => [ 'Asus', 'ZenFone 4 (A400CG)' ],
+    'T00I'                                      => [ 'Asus', 'ZenFone 4 (A400CG)' ],
+    'T00I-D'                                    => [ 'Asus', 'ZenFone 4 (A400CG)' ],
+    'A400CG'                                    => [ 'Asus', 'ZenFone 4 (A400CG)' ],
+    'T00F'                                      => [ 'Asus', 'ZenFone 5 (A500CG)' ],
+    'A500CG'                                    => [ 'Asus', 'ZenFone 5 (A500CG)' ],
+    'T00J'                                      => [ 'Asus', 'ZenFone 5 (A501CG)' ],
+    'T00J-D'                                    => [ 'Asus', 'ZenFone 5 (A501CG)' ],
+    'T00K'                                      => [ 'Asus', 'ZenFone 5 (A502CG)' ],
+    'T00P'                                      => [ 'Asus', 'ZenFone 5 LTE (A500KL)' ],
+    'Zenfone 5 LTE'                             => [ 'Asus', 'ZenFone 5 LTE (A500KL)' ],
+    'T00G'                                      => [ 'Asus', 'ZenFone 6 (A600CG)' ],
+    'T00Q'                                      => [ 'Asus', 'ZenFone 4 (A450CG)' ],
+    'P001'                                      => [ 'Asus', 'ZenPad C 7.0 (Z170MG)', DeviceType::TABLET ],
+    'P001 2'                                    => [ 'Asus', 'ZenPad C 7.0 (Z170MG)', DeviceType::TABLET ],
+    'P002'                                      => [ 'Asus', 'ZenPad 7.0 (Z370KL)', DeviceType::TABLET ],
+    'P00C'                                      => [ 'Asus', 'ZenPad 10 (Z300M)', DeviceType::TABLET ],
+    'P00I'                                      => [ 'Asus', 'ZenPad Z10 (Z500KL)', DeviceType::TABLET ],
+    'P01M'                                      => [ 'Asus', 'ZenPad S 8.0 (Z580C)', DeviceType::TABLET ],
+    'P01MA'                                     => [ 'Asus', 'ZenPad S 8.0 (Z580CA)', DeviceType::TABLET ],
+    'P01T'                                      => [ 'Asus', 'ZenPad 10 (Z300CL)', DeviceType::TABLET ],
+    'P01T 1'                                    => [ 'Asus', 'ZenPad 10 (Z300CL)', DeviceType::TABLET ],
+    'P01V'                                      => [ 'Asus', 'ZenPad 7.0 (Z370CG)', DeviceType::TABLET ],
+    'P01W'                                      => [ 'Asus', 'ZenPad 7.0 (Z370C)', DeviceType::TABLET ],
+    'P01Y'                                      => [ 'Asus', 'ZenPad C 7.0 (Z170CG)', DeviceType::TABLET ],
+    'P01Z'                                      => [ 'Asus', 'ZenPad C 7.0 (Z170C)', DeviceType::TABLET ],
+    'P021'                                      => [ 'Asus', 'ZenPad 10 (Z300CG)', DeviceType::TABLET ],
+    'P022'                                      => [ 'Asus', 'ZenPad 8.0 (Z380C)', DeviceType::TABLET ],
+    'P023'                                      => [ 'Asus', 'ZenPad 10 (Z300C)', DeviceType::TABLET ],
+    'P024'                                      => [ 'Asus', 'ZenPad 8.0 (Z380KL)', DeviceType::TABLET ],
+    // ''                                    => [ 'Asus', 'ZenPad 10 (Z300CNL)', DeviceType::TABLET ],
+    'A001'                                      => [ 'Asus', 'ZenFone 3 Ultra (ZU680KL)' ],
+    'X007D'                                     => [ 'Asus', 'ZenFone Go (ZB552KL)' ],
+    'X008D'                                     => [ 'Asus', 'ZenFone 3 Max (ZC520TL)' ],
+    'X008DA'                                    => [ 'Asus', 'ZenFone 3 Max (ZC520TL)' ],
+    'X008DB'                                    => [ 'Asus', 'ZenFone 3 Max (ZC520TL)' ],
+    'X008DC'                                    => [ 'Asus', 'ZenFone 3 Max (ZC520TL)' ],
+    'X009D'                                     => [ 'Asus', 'ZenFone Go (ZB450KL)' ],
+    'X009DA'                                    => [ 'Asus', 'ZenFone Go (ZB450KL)' ],
+    'X009DB'                                    => [ 'Asus', 'ZenFone Go (ZB450KL)' ],
+    'X009DD'                                    => [ 'Asus', 'ZenFone Go (ZB450KL)' ],
+    'X00AD'                                     => [ 'Asus', 'ZenFone Go (ZB500KL)' ],
+    'X00ADC'                                    => [ 'Asus', 'ZenFone Go (ZB500KL)' ],
+    'X00BD'                                     => [ 'Asus', 'ZenFone Go (ZB500KG)' ],
+    'X00DD'                                     => [ 'Asus', 'ZenFone 3 Max (ZC553KL)' ],
+    'X00DDA'                                    => [ 'Asus', 'ZenFone 3 Max (ZC553KL)' ],
+    'X00DDB'                                    => [ 'Asus', 'ZenFone 3 Max (ZC553KL)' ],
+    'X013D'                                     => [ 'Asus', 'ZenFone Go (ZB551KL)' ],
+    'X013DA'                                    => [ 'Asus', 'ZenFone Go (ZB551KL)' ],
+    'X013DB'                                    => [ 'Asus', 'ZenFone Go (ZB551KL)' ],
+    'X013DC'                                    => [ 'Asus', 'ZenFone Go (ZB551KL)' ],
+    'X015D'                                     => [ 'Asus', 'ZenFone 3 Max (ZC550TL)' ],
+    'X013DB'                                    => [ 'Asus', 'ZenFone Go TV (ZB551KL)' ],
+    'X013DC'                                    => [ 'Asus', 'ZenFone Go (ZB551KL)' ],
+    'ZB551KL'                                   => [ 'Asus', 'ZenFone Go (ZB551KL)' ],
+    'X014D'                                     => [ 'Asus', 'ZenFone Go (ZB452KG)' ],
+    'Z002'                                      => [ 'Asus', 'ZenFone 6 (A601CG)' ],
+    'Z007'                                      => [ 'Asus', 'ZenFone C (ZC451CG)' ],
+    'ZenFone 2'                                 => [ 'Asus', 'ZenFone 2 (ZE550ML)' ],
+    'Z008'                                      => [ 'Asus', 'ZenFone 2 (ZE550ML)' ],
+    'Z008D'                                     => [ 'Asus', 'ZenFone 2 (ZE550ML)' ],
+    'Z00A'                                      => [ 'Asus', 'ZenFone 2 (ZE551ML)' ],
+    'Z00AD'                                     => [ 'Asus', 'ZenFone 2 (ZE551ML)' ],
+    'Z00ADA'                                    => [ 'Asus', 'ZenFone 2 (ZE551ML)' ],
+    'Z00ADB'                                    => [ 'Asus', 'ZenFone 2 (ZE551ML)' ],
+    'Z00AS'                                     => [ 'Asus', 'ZenFone 2 (ZE551ML)' ],
+    'Z00D'                                      => [ 'Asus', 'ZenFone 2 (ZE500CL)' ],
+    'ZenFone 2E'                                => [ 'Asus', 'ZenFone 2E' ],
+    'Z00ED'                                     => [ 'Asus', 'ZenFone 2 Laser (ZE500KL)' ],
+    'Z00EDB'                                    => [ 'Asus', 'ZenFone 2 Laser (ZE500KL)' ],
+    'Z00LD'                                     => [ 'Asus', 'ZenFone 2 Laser (ZE550KL)' ],
+    'Z00LDC'                                    => [ 'Asus', 'ZenFone 2 Laser (ZE550KL)' ],
+    'Z00LDD'                                    => [ 'Asus', 'ZenFone 2 Laser (ZE550KL)' ],
+    'Z00MD'                                     => [ 'Asus', 'ZenFone 2 Laser (ZE600KL)' ],
+    'Z00RD'                                     => [ 'Asus', 'ZenFone 2 Laser (ZE500KG)' ],
+    'Z00TD'                                     => [ 'Asus', 'ZenFone 2 Laser (ZE551KL)' ],
+    'Z00TDA'                                    => [ 'Asus', 'ZenFone 2 Laser (ZE551KL)' ],
+    'Z00WD'                                     => [ 'Asus', 'ZenFone 2 Laser (ZE550KG)' ],
+    'Z011D'                                     => [ 'Asus', 'ZenFone 2 Laser (ZE601KL)' ],
+    'Z011DD'                                    => [ 'Asus', 'ZenFone 2 Laser (ZE601KL)' ],
+    'Z00UD'                                     => [ 'Asus', 'ZenFone Selfie (ZD551KL)' ],
+    'Z00UDA'                                    => [ 'Asus', 'ZenFone Selfie (ZD551KL)' ],
+    'Z00UDB'                                    => [ 'Asus', 'ZenFone Selfie (ZD551KL)' ],
+    'Z00UDC'                                    => [ 'Asus', 'ZenFone Selfie (ZD551KL)' ],
+    'Z00UDH'                                    => [ 'Asus', 'ZenFone Selfie (ZD551KL)' ],
+    'Z00SD'                                     => [ 'Asus', 'ZenFone Go (ZC451TG)' ],
+    'Z00VD'                                     => [ 'Asus', 'ZenFone Go (ZC500TG)' ],
+    'Z00XS'                                     => [ 'Asus', 'ZenFone Zoom (ZX551ML)' ],
+    'Z00XSA'                                    => [ 'Asus', 'ZenFone Zoom (ZX551ML)' ],
+    'Z00XSB'                                    => [ 'Asus', 'ZenFone Zoom (ZX551ML)' ],
+    'Z010D'                                     => [ 'Asus', 'ZenFone Max (ZC550KL)' ],
+    'Z010DA'                                    => [ 'Asus', 'ZenFone Max (ZC550KL)' ],
+    'Z010DB'                                    => [ 'Asus', 'ZenFone Max (ZC550KL)' ],
+    'Z010DD'                                    => [ 'Asus', 'ZenFone Max (ZC550KL)' ],
+    'Z012D'                                     => [ 'Asus', 'ZenFone 3 (ZE552KL)' ],
+    'Z012DA'                                    => [ 'Asus', 'ZenFone 3 (ZE552KL)' ],
+    'Z012DB'                                    => [ 'Asus', 'ZenFone 3 (ZE552KL)' ],
+    'Z012DC'                                    => [ 'Asus', 'ZenFone 3 (ZE552KL)' ],
+    'Z012DE'                                    => [ 'Asus', 'ZenFone 3 (ZE552KL)' ],
+    'Z012S'                                     => [ 'Asus', 'ZenFone 3 (ZE552KL)' ],
+    'Z016D'                                     => [ 'Asus', 'ZenFone 3 Deluxe (ZS570KL)' ],
+    'Z016S'                                     => [ 'Asus', 'ZenFone 3 Deluxe (ZS570KL)' ],
+    'Z017D'                                     => [ 'Asus', 'ZenFone 3 Deluxe (ZS570KL)' ],
+    'Z017DA'                                    => [ 'Asus', 'ZenFone 3 Deluxe (ZS570KL)' ],
+    'Z017DB'                                    => [ 'Asus', 'ZenFone 3 Deluxe (ZS570KL)' ],
+    'Z017DC'                                    => [ 'Asus', 'ZenFone 3 Deluxe (ZS570KL)' ],
+    'Z01BD'                                     => [ 'Asus', 'ZenFone 3 Laser (ZC551KL)' ],
+    'Z01BDA'                                    => [ 'Asus', 'ZenFone 3 Laser (ZC551KL)' ],
+    'Z01BDB'                                    => [ 'Asus', 'ZenFone 3 Laser (ZC551KL)' ],
+    'Z01BDC'                                    => [ 'Asus', 'ZenFone 3 Laser (ZC551KL)' ],
+    'Z01BS'                                     => [ 'Asus', 'ZenFone 3 Laser (ZC551KL)' ],
+    'Z01FD'                                     => [ 'Asus', 'ZenFone 3 Deluxe (ZS550KL)' ],
+    'Z01HD'                                     => [ 'Asus', 'ZenFone 3 Zoom (ZE553KL)' ],
+    'Z01HDA'                                    => [ 'Asus', 'ZenFone 3 Zoom (ZE553KL)' ],
+    'Z00YD'                                     => [ 'Asus', 'Live' ],
+    'X002'                                      => [ 'Asus', 'Pegasus' ],
+    'X003'                                      => [ 'Asus', 'Pegasus' ],
+    'X005'                                      => [ 'Asus', 'Pegasus 2 Plus' ],
+    'X008'                                      => [ 'Asus', 'Pegasus 3' ],
+    'X550'                                      => [ 'Asus', 'Pegasus 2 Plus' ],
+    'TX201LA'                                   => [ 'Asus', 'Transformer Book Trio', DeviceType::TABLET ],
+    'TX201LAF'                                  => [ 'Asus', 'Transformer Book Trio', DeviceType::TABLET ],
+    'asus google cube'                          => [ 'Asus', 'Cube with Google TV', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'google cube'                               => [ 'Asus', 'Cube with Google TV', DeviceType::TELEVISION, Flag::GOOGLETV ],
+
+    'RTC-700A'                                  => [ 'Asus', 'AAEON RTC-700A', DeviceType::TABLET ],
+
+    'Qilive!!' => [
+        'Qilive 40'                                 => [ 'Auchan', 'QiLive 4” Smartphone' ],
+        'Qilive 45'                                 => [ 'Auchan', 'QiLive 4.5” Smartphone' ],
+        'Qilive 50'                                 => [ 'Auchan', 'QiLive 5” Smartphone' ],
+        'Qilive 50 QC'                              => [ 'Auchan', 'QiLive 5” Smartphone' ],
+        'Qilive 53'                                 => [ 'Auchan', 'QiLive 5.3” Smartphone' ],
+        'Qilive 7'                                  => [ 'Auchan', 'QiLive 7” Dual core tablet', DeviceType::TABLET ],
+        'Qilive 70v2'                               => [ 'Auchan', 'QiLive 7” Dual core tablet', DeviceType::TABLET ],
+        'Qilive 79'                                 => [ 'Auchan', 'QiLive 7.9” Dual core tablet', DeviceType::TABLET ],
+        'Qilive 97R-2'                              => [ 'Auchan', 'QiLive 7.9” Quad core tablet', DeviceType::TABLET ],
+        'QiLive 8'                                  => [ 'Auchan', 'QiLive 8” Dual core tablet', DeviceType::TABLET ],
+        'QiLive 8QC'                                => [ 'Auchan', 'QiLive 8” Quad core tablet', DeviceType::TABLET ],
+        'QiLive 97'                                 => [ 'Auchan', 'QiLive 9.7” Dual core tablet', DeviceType::TABLET ],
+        'QiLive 97R'                                => [ 'Auchan', 'QiLive 9.7R Quad core tablet', DeviceType::TABLET ],
+        'QILIVE 101'                                => [ 'Auchan', 'QiLive 10.1” Dual core tablet', DeviceType::TABLET ],
+    ],
+
+    'T-07B'                                     => [ 'AudioSonic', 'T07B', DeviceType::TABLET ],
+    'T-800'                                     => [ 'AudioSonic', 'T800', DeviceType::TABLET ],
+
+    'AUX!!' => [
+        'AUX 909+P'                                 => [ 'AUX', '909+P' ],
+        'AUX 910+'                                  => [ 'AUX', '910+' ],
+        'AUX 939+'                                  => [ 'AUX', '939+' ],
+        'AUX M959P'                                 => [ 'AUX', 'M959P' ],
+        'AUX T5100L'                                => [ 'AUX', 'T5100L' ],
+        'AUX V900'                                  => [ 'AUX', 'V900' ],
+        'AUX V900P'                                 => [ 'AUX', 'V900P' ],
+        'AUX V920'                                  => [ 'AUX', 'V920' ],
+        'AUX V920P'                                 => [ 'AUX', 'V920P' ],
+        'AUX V926T'                                 => [ 'AUX', 'V926T' ],
+        'AUX V950'                                  => [ 'AUX', 'V950' ],
+        'AUX V950P'                                 => [ 'AUX', 'V950P' ],
+        'AUX V965T'                                 => [ 'AUX', 'V965T' ],
+        'AUX W6'                                    => [ 'AUX', 'W6' ],
+    ],
+
+    'Numy!!' => [
+        'Avea inTouch 2'                            => [ 'Avea', 'inTouch 2', DeviceType::TABLET ],
+        'Avea inTouch 3'                            => [ 'Avea', 'inTouch 3', DeviceType::TABLET ],
+        'Avea inTouch 3 Large'                      => [ 'Avea', 'inTouch 3', DeviceType::TABLET ],
+        'Avea inTouch 4'                            => [ 'Avea', 'inTouch 4', DeviceType::TABLET ],
+    ],
+
+    '(Ilium )?Avvio!!' => [
+        'Avvio 489'                                 => [ 'Avvio', '489' ],
+        'Avvio 710'                                 => [ 'Avvio', '710' ],
+        'Avvio 735s'                                => [ 'Avvio', '735' ],
+        'Avvio 750'                                 => [ 'Avvio', '750' ],
+        'Ilium AVVIO 760'                           => [ 'Avvio', '760' ],
+        'AVVIO 765!'                                => [ 'Avvio', '765' ],
+        'Avvio 768'                                 => [ 'Avvio', '768' ],
+        'Avvio 775'                                 => [ 'Avvio', '775' ],
+        'Avvio-775s'                                => [ 'Avvio', '775s' ],
+        'Avvio 778'                                 => [ 'Avvio', '778' ],
+        'Avvio 780'                                 => [ 'Avvio', '780' ],
+        'Avvio 785'                                 => [ 'Avvio', '785' ],
+        'Avvio786'                                  => [ 'Avvio', '786' ],
+        'Avvio 790'                                 => [ 'Avvio', '790' ],
+        'Avvio 790s'                                => [ 'Avvio', '790s' ],
+        'Avvio 792'                                 => [ 'Avvio', '792' ],
+        'Avvio 792s'                                => [ 'Avvio', '792s' ],
+        'Avvio 793'                                 => [ 'Avvio', '793' ],
+        'Avvio 794Q'                                => [ 'Avvio', '794Q' ],
+        'Avvio L500 Claro'                          => [ 'Avvio', 'L500' ],
+        'Avvio PAD'                                 => [ 'Avvio', 'Pad', DeviceType::TABLET ],
+        'Avvio PAD10.1'                             => [ 'Avvio', 'Pad', DeviceType::TABLET ],
+    ],
+
+    '(Axioo[\- ])?PICO!!' => [
+        'PICOphone 2'                               => [ 'Axioo', 'PICOphone 2' ],
+        'PICOphone 4'                               => [ 'Axioo', 'PICOphone 4' ],
+        'Picophone4'                                => [ 'Axioo', 'PICOphone 4' ],
+        'PICOphone4 GDF'                            => [ 'Axioo', 'PICOphone 4' ],
+        'PICOphone4 GDX'                            => [ 'Axioo', 'PICOphone 4' ],
+        'PICOphone M1'                              => [ 'Axioo', 'PICOphone M1' ],
+        'PICOphone M2 (M)'                          => [ 'Axioo', 'PICOphone M2' ],
+        'PICOphone M4N M3'                          => [ 'Axioo', 'PICOphone M4N' ],
+        'PICOphone M4P M3'                          => [ 'Axioo', 'PICOphone M4P' ],
+        'PICOphone M4S(M2/M)'                       => [ 'Axioo', 'PICOphone M4S' ],
+        'PICOphone M4U M2 M'                        => [ 'Axioo', 'PICOphone M4U' ],
+        'PICOpad S1(7 3G)'                          => [ 'Axioo', 'PICOpad S1', DeviceType::TABLET ],
+        'PICOpad 7H(7 3G)'                          => [ 'Axioo', 'PICOpad 7H', DeviceType::TABLET ],
+        'PICOpad 7H2 7H(7 3G)'                      => [ 'Axioo', 'PICOpad 7H2', DeviceType::TABLET ],
+        'PICOpadGCE'                                => [ 'Axioo', 'PICOpad GCE', DeviceType::TABLET ],
+        'Axioo PICOpad GDK'                         => [ 'Axioo', 'PICOpad GDK', DeviceType::TABLET ],
+        'PICOpad GDK'                               => [ 'Axioo', 'PICOpad GDK', DeviceType::TABLET ],
+        'PICOpad GDS'                               => [ 'Axioo', 'PICOpad GDS', DeviceType::TABLET ],
+        'PICOpad GEA'                               => [ 'Axioo', 'PICOpad GEA', DeviceType::TABLET ],
+        'PICOpad GEW'                               => [ 'Axioo', 'PICOpad GEW', DeviceType::TABLET ],
+        'PICOpad GFI'                               => [ 'Axioo', 'PICOpad GFI', DeviceType::TABLET ],
+        'PICOpad GGA'                               => [ 'Axioo', 'PICOpad GGA', DeviceType::TABLET ],
+        'PICOpad GGD'                               => [ 'Axioo', 'PICOpad GGD', DeviceType::TABLET ],
+        'PICOpad GGG'                               => [ 'Axioo', 'PICOpad GGG', DeviceType::TABLET ],
+        'PICOpad GHM'                               => [ 'Axioo', 'PICOpad GHM', DeviceType::TABLET ],
+        'Axioo PICOpad GIM'                         => [ 'Axioo', 'PICOpad GIM', DeviceType::TABLET ],
+        'PICOpad GJE'                               => [ 'Axioo', 'PICOpad GJE', DeviceType::TABLET ],
+        'PICOpad GJT'                               => [ 'Axioo', 'PICOpad GJT', DeviceType::TABLET ],
+        'PICOpad-QGN'                               => [ 'Axioo', 'PICOpad QGN', DeviceType::TABLET ],
+        'Axioo-VIGO350'                             => [ 'Axioo', 'Vigo 350' ],
+        'Axioo-VIGO410'                             => [ 'Axioo', 'Vigo 410' ],
+    ],
+
+    '(AXPAD|Axxion)!!' => [
+        'AXPAD 7E01'                                => [ 'Axtrom', 'Axpad 7" Series-7E01', DeviceType::TABLET ],
+        'AXPAD 7E02'                                => [ 'Axtrom', 'Axpad 7" Series-7E02', DeviceType::TABLET ],
+        'AXPAD 7I04'                                => [ 'Axtrom', 'Axpad 7" Series-7I04', DeviceType::TABLET ],
+        'AXPAD 9P01'                                => [ 'Axtrom', 'Axpad 9" Series-9P01', DeviceType::TABLET ],
+        'Axxion ATAB-701'                           => [ 'Axxion', 'ATAB-701', DeviceType::TABLET ],
+        'Axxion ATAB-902'                           => [ 'Axxion', 'ATAB-902', DeviceType::TABLET ],
+    ],
+
+    'A10 MID'                                   => [ 'Azhuo', 'A10 MID', DeviceType::TABLET ],
+    'A10MID'                                    => [ 'Azhuo', 'A10 MID', DeviceType::TABLET ],
+
+    'Azumi!!' => [
+        'Azumi A35C Lite'                           => [ 'Azumi', 'A35c Lite' ],
+        'Azumi A35S'                                => [ 'Azumi', 'A35s' ],
+        'Azumi A40C'                                => [ 'Azumi', 'A40c' ],
+        'Azumi A45T'                                => [ 'Azumi', 'A45t' ],
+        'AZUMI A50'                                 => [ 'Azumi', 'A50' ],
+        'Azumi A50c'                                => [ 'Azumi', 'A50c' ],
+        'AZUMI A50c+'                               => [ 'Azumi', 'A50c+' ],
+        'Azumi LT50'                                => [ 'Azumi', 'LT50' ],
+        'Azumi KL32'                                => [ 'Azumi', 'KL32' ],
+        'Azumi AT7'                                 => [ 'Azumi', 'AT7', DeviceType::TABLET ],
+    ],
+
+    '(BDS|BHX|BKO)\-!!' => [
+        'BDS-S100'                                  => [ 'B box', 'B tv BDS-S100', DeviceType::TELEVISION ],
+        'BDS-S200'                                  => [ 'B box', 'B tv BDS-S200', DeviceType::TELEVISION ],
+        'BHX-S100'                                  => [ 'B box', 'B tv BHX-S100', DeviceType::TELEVISION ],
+        'BHX-S100 TV'                               => [ 'B box', 'B tv BHX-S100', DeviceType::TELEVISION ],
+        'BHX-UH200'                                 => [ 'B box', 'B tv UHD BHX-UH200', DeviceType::TELEVISION ],
+        'BKO-S200'                                  => [ 'B box', 'B tv BKO-S200', DeviceType::TELEVISION ],
+        'BKO-S200 TV'                               => [ 'B box', 'B tv BKO-S200', DeviceType::TELEVISION ],
+    ],
+
+    'Aero A2-110'                               => [ 'Banghó', 'Aero A2 110', DeviceType::TABLET ],
+    'NOOK'                                      => [ 'Barnes & Noble', 'NOOK', DeviceType::EREADER ],
+    'Nook ?Color!'                              => [ 'Barnes & Noble', 'NOOK Color', DeviceType::EREADER ],
+    '(NOOK )?BNRV(200|300)!'                    => [ 'Barnes & Noble', 'NOOK Color', DeviceType::EREADER ],
+    'Nook ?Tablet!'                             => [ 'Barnes & Noble', 'NOOK Tablet', DeviceType::EREADER ],
+    'NOOK Slate'                                => [ 'Barnes & Noble', 'NOOK Tablet', DeviceType::EREADER ],
+    'Barnes & Noble Nook Tablet'                => [ 'Barnes & Noble', 'NOOK Tablet', DeviceType::EREADER ],
+    '(NOOK )?BNTV250!'                          => [ 'Barnes & Noble', 'NOOK Tablet', DeviceType::EREADER ],
+    '(NOOK )?BNRV350!'                          => [ 'Barnes & Noble', 'NOOK Simple Touch', DeviceType::EREADER ],
+    '(NOOK )?BNTV(400)!'                        => [ 'Barnes & Noble', 'NOOK HD Tablet', DeviceType::EREADER ],
+    '(NOOK )?BNTV(600)!'                        => [ 'Barnes & Noble', 'NOOK HD+ Tablet', DeviceType::EREADER ],
+    '(NOOK )?BNTV(800)!'                        => [ 'Barnes & Noble', 'NOOK BNTV800 Tablet', DeviceType::EREADER ],
+    'Barnes & Noble Nook HD'                    => [ 'Barnes & Noble', 'NOOK HD Tablet', DeviceType::EREADER ],
+    'Barnes & Noble Nook HD+'                   => [ 'Barnes & Noble', 'NOOK HD+ Tablet', DeviceType::EREADER ],
+    'Nook HD'                                   => [ 'Barnes & Noble', 'NOOK HD Tablet', DeviceType::EREADER ],
+    'BN Nook HD'                                => [ 'Barnes & Noble', 'NOOK HD Tablet', DeviceType::EREADER ],
+    'BN NookHD+'                                => [ 'Barnes & Noble', 'NOOK HD+ Tablet', DeviceType::EREADER ],
+    'Nook HD+'                                  => [ 'Barnes & Noble', 'NOOK HD+ Tablet', DeviceType::EREADER ],
+    'HY5001'                                    => [ 'Bedove', 'HY5001' ],
+    'BenWee 5100'                               => [ 'BenWee', '5100' ],
+    'ASP-4300W'                                 => [ 'Bauhn', 'ASP-4300W' ],
+    'ASP-4500Z'                                 => [ 'Bauhn', 'ASP-4500Z' ],
+    'ASP-5000H'                                 => [ 'Bauhn', 'ASP-5000H' ],
+    'AT101-014'                                 => [ 'Bauhn', 'AT101-014', DeviceType::TABLET ],
+    'AT101T-114'                                => [ 'Bauhn', 'AT101T-114', DeviceType::TABLET ],
+    'WL-101GQC'                                 => [ 'Bauhn', 'WL-101GQC', DeviceType::TABLET ],
+    'BEE 9500'                                  => [ 'Bee Mobile', 'Bee 9500' ],
+
+    'BF[ \-]!!' => [
+        'BF A8'                                     => [ 'Bellefonte', 'A8' ],
+        'BF-A10'                                    => [ 'Bellefonte', 'A10' ],
+        'BF A11'                                    => [ 'Bellefonte', 'A11' ],
+        'BF A12P'                                   => [ 'Bellefonte', 'A12P' ],
+        'BF A16'                                    => [ 'Bellefonte', 'A16' ],
+        'BF C7'                                     => [ 'Bellefonte', 'C7' ],
+        'BF G11'                                    => [ 'Bellefonte', 'G11' ],
+        'BF V5T!'                                   => [ 'Bellefonte', 'V5T' ],
+    ],
+
+    'BenQ!!' => [
+        'BenQ F5'                                   => [ 'BenQ', 'F5' ],
+        'BenQ T3'                                   => [ 'BenQ', 'T3' ],
+        'BenQ R71'                                  => [ 'BenQ', 'R71', DeviceType::TABLET ],
+    ],
+
+    'BenWee!!' => [
+        'BenWee 550S'                               => [ 'BenWee', '550S' ],
+        'BenWee 5100S'                              => [ 'BenWee', '5100S' ],
+        'BenWee N7'                                 => [ 'BenWee', 'N7' ],
+        'BenWee N9'                                 => [ 'BenWee', 'N9' ],
+    ],
+
+    'BePhone UN030'                             => [ 'BePhone', 'UN030' ],
+
+    'Best ?sonny!!' => [
+        'Best sonny L82'                            => [ 'Best Sonny', 'L82' ],
+        'Best sonny LT986'                          => [ 'Best Sonny', 'LT986' ],
+        'Best sonny T898'                           => [ 'Best Sonny', 'T898' ],
+        'BestsonnyT961'                             => [ 'Best Sonny', 'T961' ],
+        'BestsonnyT962'                             => [ 'Best Sonny', 'T962' ],
+    ],
+
+    'CA907AAC0G'                                => [ 'Besta', 'CA907AAC0G' ],
+
+    'BFB!!' => [
+        'BFB S7'                                    => [ 'BFB', 'S7' ],
+        'BFB W9000'                                 => [ 'BFB', 'W9000' ],
+        'BFB W9900'                                 => [ 'BFB', 'W9900' ],
+    ],
+
+    'BF[0-9]{2,2}00!!' => [
+        'BF5200'                                    => [ 'Bifer', 'BF5200' ],
+        'BF9100'                                    => [ 'Bifer', 'BF9100' ],
+        'BF9200'                                    => [ 'Bifer', 'BF9200' ],
+    ],
+
+    'Bird!!' => [
+        'BIRD A11C'                                 => [ 'Bird', 'A11C' ],
+        'BIRD E700'                                 => [ 'Bird', 'E700' ],
+        'Bird-Doeasy E700'                          => [ 'Bird', 'Doeasy E700' ],
+        'Bird i7'                                   => [ 'Bird', 'I7' ],
+        'Bird i8'                                   => [ 'Bird', 'I8' ],
+        'Bird i9'                                   => [ 'Bird', 'I9' ],
+        'Bird i500'                                 => [ 'Bird', 'I500' ],
+        'Bird i580'                                 => [ 'Bird', 'I580' ],
+        'Bird i600'                                 => [ 'Bird', 'I600' ],
+        'BIRD I720 WIFI 3000'                       => [ 'Bird', 'I720' ],
+        'Bird i900'                                 => [ 'Bird', 'I900' ],
+        'Bird L9'                                   => [ 'Bird', 'L9' ],
+        'BIRD L108'                                 => [ 'Bird', 'L108' ],
+        'Bird LT01'                                 => [ 'Bird', 'LT01' ],
+        'Bird LT02'                                 => [ 'Bird', 'LT02' ],
+        'BIRD S6'                                   => [ 'Bird', 'S6' ],
+        'BIRD T40'                                  => [ 'Bird', 'T40' ],
+        'BIRD T900'                                 => [ 'Bird', 'T900' ],
+        'Bird T9500'                                => [ 'Bird', 'T9500' ],
+        'Bird T9508'                                => [ 'Bird', 'T9508' ],
+        'BIRD T9600'                                => [ 'Bird', 'T9600' ],
+        'Bird T9608'                                => [ 'Bird', 'T9608' ],
+        'BIRD-V8'                                   => [ 'Bird', 'V8' ],
+        'BIRD-W3'                                   => [ 'Bird', 'W3' ],
+        'BIRD W5'                                   => [ 'Bird', 'W5' ],
+        'Bird W188'                                 => [ 'Bird', 'W188' ],
+        'Bird XL100'                                => [ 'Bird', 'XL100' ],
+    ],
+
+    'T9108'                                     => [ 'Bird', 'T9108' ],
+    'BB EH7'                                    => [ 'BestBuy', 'EH7', DeviceType::TABLET ],
+    'BB EH7LE'                                  => [ 'BestBuy', 'EH7LE', DeviceType::TABLET ],
+    '(BB )?Q5$!'                                => [ 'BlackBerry', 'Q5' ],
+    '(BB )?Q10$!'                               => [ 'BlackBerry', 'Q10' ],
+    '(BB )?Z10$!'                               => [ 'BlackBerry', 'Z10' ],
+    '(BB )?Z30$!'                               => [ 'BlackBerry', 'Z30' ],
+    'BLACKBERRY P\'9982'                        => [ 'BlackBerry', 'Porsche Design P\'9982' ],
+    'STV100-[0-9]!'                             => [ 'BlackBerry', 'PRIV' ],
+    'STH100-[0-9]!'                             => [ 'BlackBerry', 'DTEK50' ],
+    'BBA100-[0-9]!'                             => [ 'BlackBerry', 'DTEK60' ],
+    'BBB100-[0-9]!'                             => [ 'BlackBerry', 'KEYone' ],
+
+    'Endeavour!!' => [
+        'Endeavour101'                              => [ 'Blaupunkt', 'Endeavour 101', DeviceType::TABLET ],
+        'Endeavour 101G'                            => [ 'Blaupunkt', 'Endeavour 101 G', DeviceType::TABLET ],
+        'Endeavour 101M'                            => [ 'Blaupunkt', 'Endeavour 101 M', DeviceType::TABLET ],
+        'Endeavour 700BN'                           => [ 'Blaupunkt', 'Endeavour 700 BN', DeviceType::TABLET ],
+        'Endeavour 785'                             => [ 'Blaupunkt', 'Endeavour 785', DeviceType::TABLET ],
+        'Endeavour 800NG'                           => [ 'Blaupunkt', 'Endeavour 800 NG', DeviceType::TABLET ],
+        'Endeavour 1000WS'                          => [ 'Blaupunkt', 'Endeavour 1000 WS', DeviceType::TABLET ],
+        'Endeavour 1000QC'                          => [ 'Blaupunkt', 'Endeavour 1000 QC', DeviceType::TABLET ],
+        'Endeavour 1001'                            => [ 'Blaupunkt', 'Endeavour 1001', DeviceType::TABLET ],
+        'Endeavour 1001 DVB-T'                      => [ 'Blaupunkt', 'Endeavour 1001 DVB-T', DeviceType::TABLET ],
+        'Endeavour 1010'                            => [ 'Blaupunkt', 'Endeavour 1010', DeviceType::TABLET ],
+        'Endeavour 1013'                            => [ 'Blaupunkt', 'Endeavour 1013', DeviceType::TABLET ],
+        'Endeavour 1100'                            => [ 'Blaupunkt', 'Endeavour 1100', DeviceType::TABLET ],
+    ],
+
+    '(BLU|DASH|LIFE|NEO|STUDIO|VIVO)!!' => [
+        'BLU ADVANCE 3.5'                           => [ 'BLU', 'Advance 3.5' ],
+        'BLU ADVANCE 4.0'                           => [ 'BLU', 'Advance 4.0' ],
+        'BLU ADVANCE 4.0 L'                         => [ 'BLU', 'Advance 4.0 L' ],
+        'BLU ADVANCE 4.0 L2'                        => [ 'BLU', 'Advance 4.0 L2' ],
+        'BLU Advance 5.0'                           => [ 'BLU', 'Advance 5.0' ],
+        'BLU AMOUR'                                 => [ 'BLU', 'Amour' ],
+        'BLU DASH'                                  => [ 'BLU', 'Dash' ],
+        'DASH JR'                                   => [ 'BLU', 'Dash Jr' ],
+        'BLU DASH JR'                               => [ 'BLU', 'Dash Jr' ],
+        'DASH JR 3G'                                => [ 'BLU', 'Dash Jr' ],
+        'BLU DASH JR SOCIAL'                        => [ 'BLU', 'Dash Jr Social' ],
+        'DASH JR K'                                 => [ 'BLU', 'Dash Jr K' ],
+        'DASHJRTV'                                  => [ 'BLU', 'Dash Jr TV' ],
+        'DASH JR. 4.0'                              => [ 'BLU', 'Dash Jr 4.0' ],
+        'BLU DASH JR 4.0 K'                         => [ 'BLU', 'Dash Jr 4.0 K' ],
+        '(BLU )?DASH 3.2!'                          => [ 'BLU', 'Dash 3.2' ],
+        'Blu Dash3.5'                               => [ 'BLU', 'Dash 3.5' ],
+        'BLU DASH 3.5!'                             => [ 'BLU', 'Dash 3.5' ],
+        'DASH 3.5'                                  => [ 'BLU', 'Dash 3.5' ],
+        'DASH 3.5 II'                               => [ 'BLU', 'Dash 3.5 II' ],
+        'BLU DASH 4.0'                              => [ 'BLU', 'Dash 4.0' ],
+        'BLU Dash 4.0 Ce'                           => [ 'BLU', 'Dash 4.0 CE' ],
+        'BLU DASH 4.5'                              => [ 'BLU', 'Dash 4.5' ],
+        'BLU DASH 5.0'                              => [ 'BLU', 'Dash 5.0' ],
+        'DASH 5.0+'                                 => [ 'BLU', 'Dash 5.0+' ],
+        'Dash 5.5'                                  => [ 'BLU', 'Dash 5.5' ],
+        'BLU DASH5.5'                               => [ 'BLU', 'Dash 5.5' ],
+        'BLU DASH MUSIC 4.0'                        => [ 'BLU', 'Dash Music 4.0' ],
+        'BLU DASH MUSIC 4.5'                        => [ 'BLU', 'Dash Music 4.5' ],
+        'BLU DASH MUSIC II'                         => [ 'BLU', 'Dash Music II' ],
+        'DASH MUSIC JR'                             => [ 'BLU', 'Dash Music Jr' ],
+        'DASHMUSICJR'                               => [ 'BLU', 'Dash Music Jr' ],
+        'DASH C MUSIC'                              => [ 'BLU', 'Dash C Music' ],
+        'BLU DASH J'                                => [ 'BLU', 'Dash J' ],
+        'BLU DASH L'                                => [ 'BLU', 'Dash L' ],
+        'BLU DASH M'                                => [ 'BLU', 'Dash M' ],
+        'BLU DASH M2'                               => [ 'BLU', 'Dash M2' ],
+        'BLU DASH X'                                => [ 'BLU', 'Dash X' ],
+        'BLU DASH X LTE'                            => [ 'BLU', 'Dash X' ],
+        'DASH X PLUS'                               => [ 'BLU', 'Dash X Plus' ],
+        'DASH X PLUS LTE'                           => [ 'BLU', 'Dash X Plus' ],
+        'BLU DASH X2'                               => [ 'BLU', 'Dash X2' ],
+        'BLU Elite 3.8'                             => [ 'BLU', 'Elite 3.8' ],
+        'BLU ENERGY DIAMOND'                        => [ 'BLU', 'Energy Diamond' ],
+        'BLU ENERGY X PLUS'                         => [ 'BLU', 'Energy X Plus' ],
+        'BLU LIFE 8'                                => [ 'BLU', 'Life 8' ],
+        'BLU LIFE 8 XL'                             => [ 'BLU', 'Life 8 XL' ],
+        'BLU LIFE MARK'                             => [ 'BLU', 'Life Mark' ],
+        'BLU Life One'                              => [ 'BLU', 'Life One' ],
+        'BLU LIFE ONE M'                            => [ 'BLU', 'Life One M' ],
+        'BLU LIFE ONE X'                            => [ 'BLU', 'Life One X' ],
+        'BLU LIFE ONE XL'                           => [ 'BLU', 'Life One XL' ],
+        'LIFE PLAY'                                 => [ 'BLU', 'Life Play' ],
+        'LIFE PLAY 2'                               => [ 'BLU', 'Life Play 2' ],
+        'BLU LIFE PLAY S'                           => [ 'BLU', 'Life Play S' ],
+        'LIFE PLAY X'                               => [ 'BLU', 'Life Play X' ],
+        'BLU LIFE PLAY MINI'                        => [ 'BLU', 'Life Play Mini' ],
+        'LIFE PRO'                                  => [ 'BLU', 'Life Pro' ],
+        'LIFE PURE'                                 => [ 'BLU', 'Life Pure' ],
+        'LIFE PURE MINI'                            => [ 'BLU', 'Life Pure Mini' ],
+        'LIFE PURE XL'                              => [ 'BLU', 'Life Pure XL' ],
+        'BLU Life View'                             => [ 'BLU', 'Life View' ],
+        'BLU LIFE XL'                               => [ 'BLU', 'Life XL' ],
+        'BLU Magic'                                 => [ 'BLU', 'Magic' ],
+        'BLU Neo 3.5'                               => [ 'BLU', 'Neo 3.5' ],
+        'Neo 3.5'                                   => [ 'BLU', 'Neo 3.5' ],
+        'BLU NEO 5.0'                               => [ 'BLU', 'Neo 5.0' ],
+        'BLU Neo JR'                                => [ 'BLU', 'Neo Jr' ],
+        'BLU PURE XL'                               => [ 'BLU', 'Pure XL' ],
+        'BLU Quattro 4.5'                           => [ 'BLU', 'Quattro 4.5' ],
+        'BLU Quattro 4.5 HD'                        => [ 'BLU', 'Quattro 4.5 HD' ],
+        'BLU Quattro 5.7HD'                         => [ 'BLU', 'Quattro 5.7 HD' ],
+        'BLU SPORT 4.5'                             => [ 'BLU', 'Sport 4.5' ],
+        'BLU STAR4.0'                               => [ 'BLU', 'Star 4.0' ],
+        'BLU STUDIO 5.0'                            => [ 'BLU', 'Studio 5.0' ],
+        'BLU STUDIO 5.0 C'                          => [ 'BLU', 'Studio 5.0c' ],
+        'BLU STUDIO 5.0 Ce'                         => [ 'BLU', 'Studio 5.0ce' ],
+        'BLU STUDIO 5.0 C HD'                       => [ 'BLU', 'Studio 5.0c HD' ],
+        'STUDIO 5.0e'                               => [ 'BLU', 'Studio 5.0e' ],
+        'STUDIO 5.0K'                               => [ 'BLU', 'Studio 5.0k' ],
+        'Studio 5.0s'                               => [ 'BLU', 'Studio 5.0s' ],
+        'BLU Studio 5.0 S II'                       => [ 'BLU', 'Studio 5.0s II' ],
+        'Studio 5.0 S II'                           => [ 'BLU', 'Studio 5.0s II' ],
+        'Studio-5.0sII'                             => [ 'BLU', 'Studio 5.0s II' ],
+        'Studio-5.0-s-II'                           => [ 'BLU', 'Studio 5.0s II' ],
+        'BLU STUDIO 5.0 II'                         => [ 'BLU', 'Studio 5.0 II' ],
+        'Studio 5.0LTE'                             => [ 'BLU', 'Studio 5.0 LTE' ],
+        'Studio 5.0 HD LTE'                         => [ 'BLU', 'Studio 5.0 HD LTE' ],
+        'BLU Studio 5.3'                            => [ 'BLU', 'Studio 5.3' ],
+        'Studio 5.3s'                               => [ 'BLU', 'Studio 5.3s' ],
+        'BLU STUDIO 5.3 II'                         => [ 'BLU', 'Studio 5.3 II' ],
+        'STUDIO 5.5'                                => [ 'BLU', 'Studio 5.5' ],
+        'BLU STUDIO 5.5 C'                          => [ 'BLU', 'Studio 5.5c' ],
+        'BLU STUDIO 5.5 S'                          => [ 'BLU', 'Studio 5.5s' ],
+        'STUDIO6 0HD'                               => [ 'BLU', 'Studio 6.0 HD' ],
+        'STUDIO6.0HD'                               => [ 'BLU', 'Studio 6.0 HD' ],
+        'BLU STUDIO 6.0 HD'                         => [ 'BLU', 'Studio 6.0 HD' ],
+        'Studio 6.0 LTE'                            => [ 'BLU', 'Studio 6.0 LTE' ],
+        'BLU STUDIO 7.0'                            => [ 'BLU', 'Studio 7.0' ],
+        'STUDIO 7.0 LTE'                            => [ 'BLU', 'Studio 7.0 LTE' ],
+        'BLU STUDIO 7.0 LTE'                        => [ 'BLU', 'Studio 7.0 LTE' ],
+        'BLU STUDIO 7.0 II'                         => [ 'BLU', 'Studio 7.0 II' ],
+        'STUDIO C'                                  => [ 'BLU', 'Studio C' ],
+        'BLU STUDIO C'                              => [ 'BLU', 'Studio C' ],
+        'BLU STUDIO C MINI'                         => [ 'BLU', 'Studio C Mini' ],
+        'BLU STUDIO C HD'                           => [ 'BLU', 'Studio C HD' ],
+        'Studio C HD'                               => [ 'BLU', 'Studio C HD' ],
+        'BLU STUDIO C 5+5'                          => [ 'BLU', 'Studio C 5+5' ],
+        'BLU STUDIO C 5+5 LTE'                      => [ 'BLU', 'Studio C 5+5' ],
+        'BLU STUDIO C SUPER CAMERA'                 => [ 'BLU', 'Studio C Super Camera' ],
+        'STUDIO C8'                                 => [ 'BLU', 'Studio C8' ],
+        'BLU STUDIO G'                              => [ 'BLU', 'Studio G' ],
+        'Studio G HD LTE'                           => [ 'BLU', 'Studio G HD' ],
+        'BLU STUDIO G PLUS'                         => [ 'BLU', 'Studio G Plus' ],
+        'STUDIO G PLUS'                             => [ 'BLU', 'Studio G Plus' ],
+        'STUDIO M LTE'                              => [ 'BLU', 'Studio M' ],
+        'STUDIO M HD'                               => [ 'BLU', 'Studio M HD' ],
+        'BLU STUDIO X'                              => [ 'BLU', 'Studio X' ],
+        'STUDIO-X'                                  => [ 'BLU', 'Studio X' ],
+        'STUDIO X PLUS'                             => [ 'BLU', 'Studio X Plus' ],
+        'STUDIO X5'                                 => [ 'BLU', 'Studio X5' ],
+        'BLU STUDIO X8 HD'                          => [ 'BLU', 'Studio X8 HD' ],
+        'STUDIO XL'                                 => [ 'BLU', 'Studio XL' ],
+        'BLU STUDIO XL'                             => [ 'BLU', 'Studio XL' ],
+        'Studio XL 2'                               => [ 'BLU', 'Studio XL 2' ],
+        'STUDIO ENERGY'                             => [ 'BLU', 'Studio Energy' ],
+        'STUDIO ENERGY 2'                           => [ 'BLU', 'Studio Energy 2' ],
+        'Studio Mini LTE'                           => [ 'BLU', 'Studio Mini LTE' ],
+        'BLU STUDIO ONE PLUS'                       => [ 'BLU', 'Studio One Plus' ],
+        'STUDIO SELFIE'                             => [ 'BLU', 'Studio Selfie' ],
+        'BLU STUDIO SELFIE LTE'                     => [ 'BLU', 'Studio Selfie LTE' ],
+        'BLU Tank4.5'                               => [ 'BLU', 'Tank 4.5' ],
+        'BLU Tigo'                                  => [ 'BLU', 'Tigo' ],
+        'BLU TOUCH BOOK 7.0'                        => [ 'BLU', 'Touch Book 7.0', DeviceType::TABLET ],
+        'BLU Touch Book 7.0 LITE'                   => [ 'BLU', 'Touch Book 7.0 Lite', DeviceType::TABLET ],
+        'BLU P100i'                                 => [ 'BLU', 'Touch Book 7.0 Plus', DeviceType::TABLET ],
+        '(BLU )?VIVO 4.3!'                          => [ 'BLU', 'Vivo 4.3' ],
+        '(BLU )?VIVO 4.65!'                         => [ 'BLU', 'Vivo 4.65' ],
+        'VIVO 4.8 HD'                               => [ 'BLU', 'Vivo 4.8 HD' ],
+        'VIVO 5'                                    => [ 'BLU', 'Vivo 5' ],
+        'Vivo 5R'                                   => [ 'BLU', 'Vivo 5R' ],
+        'Vivo 6'                                    => [ 'BLU', 'Vivo 6' ],
+        'VIVO IV'                                   => [ 'BLU', 'Vivo IV' ],
+        'VIVO AIR'                                  => [ 'BLU', 'Vivo Air' ],
+        'BLU VIVO AIR LTE'                          => [ 'BLU', 'Vivo Air' ],
+        'BLU VIVO SELFIE'                           => [ 'BLU', 'Vivo Selfie' ],
+        'VIVO XL'                                   => [ 'BLU', 'Vivo XL' ],
+    ],
+
+    'PURE XL'                                   => [ 'BLU', 'Pure XL' ],
+    'TOUCHBOOK7.0 3G'                           => [ 'BLU', 'Touch Book 7.0', DeviceType::TABLET ],
+    'BMOBILE DASH 3.5'                          => [ 'BLU', 'Dash 3.5' ],
+    'B3000'                                     => [ 'BlueBo', 'B3000' ],
+
+    '(Bmobile )?AX[0-9]{3,4}!!' => [
+        'AX410'                                     => [ 'Bmobile', 'AX410' ],
+        'Bmobile AX512'                             => [ 'Bmobile', 'AX512' ],
+        'AX512'                                     => [ 'Bmobile', 'AX512' ],
+        'AX515'                                     => [ 'Bmobile', 'AX515' ],
+        'AX520'                                     => [ 'Bmobile', 'AX520' ],
+        'AX525'                                     => [ 'Bmobile', 'AX525' ],
+        'AX530'                                     => [ 'Bmobile', 'AX530' ],
+        'AX535'                                     => [ 'Bmobile', 'AX535' ],
+        'Bmobile AX524'                             => [ 'Bmobile', 'AX524' ],
+        'Bmobile AX530'                             => [ 'Bmobile', 'AX530' ],
+        'Bmobile AX535'                             => [ 'Bmobile', 'AX535' ],
+        'AX540'                                     => [ 'Bmobile', 'AX540' ],
+        'Bmobile AX540'                             => [ 'Bmobile', 'AX540' ],
+        'AX570'                                     => [ 'Bmobile', 'AX570' ],
+        'Bmobile AX570'                             => [ 'Bmobile', 'AX570' ],
+        'Bmobile AX600'                             => [ 'Bmobile', 'AX600' ],
+        'AX600'                                     => [ 'Bmobile', 'AX600' ],
+        'Bmobile AX605'                             => [ 'Bmobile', 'AX605' ],
+        'AX610'                                     => [ 'Bmobile', 'AX610' ],
+        'Bmobile AX610'                             => [ 'Bmobile', 'AX610' ],
+        'AX620'                                     => [ 'Bmobile', 'AX620' ],
+        'Bmobile AX620'                             => [ 'Bmobile', 'AX620' ],
+        'Bmobile AX650'                             => [ 'Bmobile', 'AX650' ],
+        'AX650'                                     => [ 'Bmobile', 'AX650' ],
+        'Bmobile AX660'                             => [ 'Bmobile', 'AX660' ],
+        'AX660'                                     => [ 'Bmobile', 'AX660' ],
+        'Bmobile AX670'                             => [ 'Bmobile', 'AX670' ],
+        'Bmobile AX675'                             => [ 'Bmobile', 'AX675' ],
+        'Bmobile AX680'                             => [ 'Bmobile', 'AX680' ],
+        'Bmobile AX685'                             => [ 'Bmobile', 'AX685' ],
+        'Bmobile AX710'                             => [ 'Bmobile', 'AX710' ],
+        'AX745'                                     => [ 'Bmobile', 'AX745' ],
+        'Bmobile AX745'                             => [ 'Bmobile', 'AX745' ],
+        'Bmobile AX800'                             => [ 'Bmobile', 'AX800' ],
+        'Bmobile AX810'                             => [ 'Bmobile', 'AX810' ],
+        'Bmobile  AX960'                            => [ 'Bmobile', 'AX960' ],
+        'AX1020'                                    => [ 'Bmobile', 'AX1020' ],
+        'BMOBILE AX1020'                            => [ 'Bmobile', 'AX1020' ],
+        'Bmobile AX1030'                            => [ 'Bmobile', 'AX1030' ],
+        'Bmobile AX1035'                            => [ 'Bmobile', 'AX1035' ],
+        'Bmobile AX1050'                            => [ 'Bmobile', 'AX1050' ],
+        'Bmobile AX1055'                            => [ 'Bmobile', 'AX1055' ],
+        'AX1055'                                    => [ 'Bmobile', 'AX1055' ],
+        'BMOBILE AX1060'                            => [ 'Bmobile', 'AX1060' ],
+        'AX1060'                                    => [ 'Bmobile', 'AX1060' ],
+        'Bmobile AX1065'                            => [ 'Bmobile', 'AX1065' ],
+    ],
+
+    'AX7OO'                                     => [ 'Bmobile', 'AX700' ],
+    'Bmobile T35AC'                             => [ 'Bmobile', 'T35AC' ],
+    'JC-S9220'                                  => [ 'Bmorn', 'Phone One' ],
+    'BM999'                                     => [ 'Bmorn', 'BM999', DeviceType::TABLET ],
+    'V11'                                       => [ 'Bmorn', 'V11', DeviceType::TABLET ],
+    'V99'                                       => [ 'Bmorn', 'V99', DeviceType::TABLET ],
+    'BO-FRSP4'                                  => [ 'Bogo', 'Friendly 4DC' ],
+    'BO-LFSPBS5'                                => [ 'Bogo', 'Lifestyle 5BS' ],
+    'BOVO S-F16'                                => [ 'Bovo', 'Walker S-F16' ],
+    'S-F16'                                     => [ 'Bovo', 'Walker S-F16' ],
+
+    'BOWAY!!' => [
+        'BOWAY F3'                                  => [ 'Boway', 'F3' ],
+        'BOWAY I3'                                  => [ 'Boway', 'I3' ],
+        'BOWAY I5'                                  => [ 'Boway', 'I5' ],
+        'BOWAY I9'                                  => [ 'Boway', 'I9' ],
+        'BOWAY L3'                                  => [ 'Boway', 'L3' ],
+        'BOWAY P1'                                  => [ 'Boway', 'P1' ],
+        'BOWAY TL100'                               => [ 'Boway', 'TL100' ],
+        'BOWAY TL600'                               => [ 'Boway', 'TL600' ],
+        'BOWAY U1'                                  => [ 'Boway', 'U1' ],
+        'BOWAY-BOWAY-U1'                            => [ 'Boway', 'U1' ],
+        'BOWAY U2'                                  => [ 'Boway', 'U2' ],
+        'BOWAY-BOWAY-U2'                            => [ 'Boway', 'U2' ],
+        'BOWAY U3'                                  => [ 'Boway', 'U3' ],
+        'BOWAY U6'                                  => [ 'Boway', 'U6' ],
+        'BOWAY U7'                                  => [ 'Boway', 'U7' ],
+        'BOWAY U11'                                 => [ 'Boway', 'U11' ],
+        'BOWAY U12'                                 => [ 'Boway', 'U12' ],
+        'BOWAY V2C'                                 => [ 'Boway', 'V2C' ],
+        'BOWAY V7'                                  => [ 'Boway', 'V7' ],
+        'BOWAY V7A'                                 => [ 'Boway', 'V7A' ],
+        'BOWAY V9'                                  => [ 'Boway', 'V9' ],
+        'BOWAY V70'                                 => [ 'Boway', 'V70' ],
+        'BOWAY V80'                                 => [ 'Boway', 'V80' ],
+        'BOWAY V95Pro'                              => [ 'Boway', 'V95 Pro' ],
+        'BOWAY X6'                                  => [ 'Boway', 'X6' ],
+    ],
+
+    'BroadSign Xpress!'                         => [ 'BroadSign', 'Xpress', DeviceType::SIGNAGE ],
+    'Broncho M7'                                => [ 'Broncho', 'M7', DeviceType::TABLET ],
+    'CENTURION'                                 => [ 'Brondi', 'CENTURION' ],
+    'CENTURION 3'                               => [ 'Brondi', 'CENTURION 3' ],
+    'GLADIATOR'                                 => [ 'Brondi', 'GLADIATOR' ],
+    'GLADIATOR-2'                               => [ 'Brondi', 'GLADIATOR 2' ],
+    'GLADIATOR 3'                               => [ 'Brondi', 'GLADIATOR 3' ],
+    'GLADIATOR 4'                               => [ 'Brondi', 'GLADIATOR 4' ],
+    'Glory'                                     => [ 'Brondi', 'GLORY' ],
+    'Glory 2'                                   => [ 'Brondi', 'GLORY 2' ],
+    'Glory3'                                    => [ 'Brondi', 'GLORY 3' ],
+    'GLORY 4'                                   => [ 'Brondi', 'GLORY 4' ],
+    'LUXURY'                                    => [ 'Brondi', 'LUXURY' ],
+    'LUXURY 3'                                  => [ 'Brondi', 'LUXURY 3' ],
+    'LUXURY 4'                                  => [ 'Brondi', 'LUXURY 4' ],
+    'LUXURY 5'                                  => [ 'Brondi', 'LUXURY 5' ],
+    'SENSUELLE'                                 => [ 'Brondi', 'SENSUELLE' ],
+    'VICTORY'                                   => [ 'Brondi', 'VICTORY' ],
+    'Victory 2'                                 => [ 'Brondi', 'VICTORY 2' ],
+    'Victory 3'                                 => [ 'Brondi', 'VICTORY 3' ],
+    'VICTORY 4'                                 => [ 'Brondi', 'VICTORY 4' ],
+    'Victory 5'                                 => [ 'Brondi', 'VICTORY 5' ],
+    'Surfing TAB B 9.7 3G'                      => [ 'Brondi', 'SURFING TAB B', DeviceType::TABLET ],
+    'Surfing Tab C 3G'                          => [ 'Brondi', 'SURFING TAB C', DeviceType::TABLET ],
+
+    '(BRS-)?BROR!!' => [
+        'BROR F2'                                   => [ 'BROR', 'F2' ],
+        'BROR G2'                                   => [ 'BROR', 'G2' ],
+        'BRS-BROR S3'                               => [ 'BROR', 'S3' ],
+        'BROR S9'                                   => [ 'BROR', 'S9' ],
+        'BRS-BROR S9'                               => [ 'BROR', 'S9' ],
+        'BROR T5'                                   => [ 'BROR', 'T5' ],
+        'BROR T70'                                  => [ 'BROR', 'T70' ],
+        'BRS-BROR W58'                              => [ 'BROR', 'W58' ],
+        'BROR W58'                                  => [ 'BROR', 'W58' ],
+        'BROR W60'                                  => [ 'BROR', 'W60' ],
+        'BROR W60+'                                 => [ 'BROR', 'W60+' ],
+        'BROR W61'                                  => [ 'BROR', 'W61' ],
+        'BROR W65'                                  => [ 'BROR', 'W65' ],
+        'BROR W68'                                  => [ 'BROR', 'W68' ],
+        'BRS-BROR W70'                              => [ 'BROR', 'W70' ],
+        'BROR W80'                                  => [ 'BROR', 'W80' ],
+        'BRS-BROR W80'                              => [ 'BROR', 'W80' ],
+    ],
+
+    '(bq|Aquaris|Edison|Maxwell)!!' => [
+        'bq Aquaris'                                => [ 'bq', 'Aquaris' ],
+        'bq Aquaris 3.5'                            => [ 'bq', 'Aquaris 3.5' ],
+        'bq Aquaris 4'                              => [ 'bq', 'Aquaris 4' ],
+        'bq Aquaris 5'                              => [ 'bq', 'Aquaris 5' ],
+        'bq Aquaris5'                               => [ 'bq', 'Aquaris 5' ],
+        'BqAquaris5'                                => [ 'bq', 'Aquaris 5' ],
+        'bq Aquaris 5 HD'                           => [ 'bq', 'Aquaris 5 HD' ],
+        'bq Aquaris 5.7'                            => [ 'bq', 'Aquaris 5.7' ],
+        'Aquaris A4.5'                              => [ 'bq', 'Aquaris A4.5' ],
+        'Aquaris E4'                                => [ 'bq', 'Aquaris E4' ],
+        'Aquaris E4.5'                              => [ 'bq', 'Aquaris E4.5' ],
+        'Aquaris E5'                                => [ 'bq', 'Aquaris E5' ],
+        'Aquaris E5 HD'                             => [ 'bq', 'Aquaris E5 HD' ],
+        'Aquaris E5 FHD'                            => [ 'bq', 'Aquaris E5 FHD' ],
+        'Aquaris E6'                                => [ 'bq', 'Aquaris E6' ],
+        'Aquaris E10'                               => [ 'bq', 'Aquaris E10', DeviceType::TABLET ],
+        'Aquaris E10 3G'                            => [ 'bq', 'Aquaris E10', DeviceType::TABLET ],
+        'Aquaris M4.5'                              => [ 'bq', 'Aquaris M4.5' ],
+        'Aquaris M5'                                => [ 'bq', 'Aquaris M5' ],
+        'Aquaris M5.5'                              => [ 'bq', 'Aquaris M5.5' ],
+        'Aquaris M8'                                => [ 'bq', 'Aquaris M8', DeviceType::TABLET ],
+        'Aquaris M10'                               => [ 'bq', 'Aquaris M10', DeviceType::TABLET ],
+        'Aquaris M10 FHD'                           => [ 'bq', 'Aquaris M10 FHD', DeviceType::TABLET ],
+        'Aquaris U'                                 => [ 'bq', 'Aquaris U' ],
+        'Aquaris U Lite'                            => [ 'bq', 'Aquaris U Lite' ],
+        'Aquaris U Plus'                            => [ 'bq', 'Aquaris U Plus' ],
+        'Aquaris X'                                 => [ 'bq', 'Aquaris X' ],
+        'Aquaris X5'                                => [ 'bq', 'Aquaris X5' ],
+        'Aquaris X5 Plus'                           => [ 'bq', 'Aquaris X5 Plus' ],
+        'bq Curie'                                  => [ 'bq', 'Curie', DeviceType::TABLET ],
+        'bq Curie 2'                                => [ 'bq', 'Curie 2', DeviceType::TABLET ],
+        'bq Curie 2 3G'                             => [ 'bq', 'Curie 2', DeviceType::TABLET ],
+        'bq Curie 2 Quad Core'                      => [ 'bq', 'Curie 2', DeviceType::TABLET ],
+        'bq Curie 2 Quad Core 3G'                   => [ 'bq', 'Curie 2', DeviceType::TABLET ],
+        'Bq Darwin'                                 => [ 'bq', 'Darwin', DeviceType::TABLET ],
+        'bq DaVinci'                                => [ 'bq', 'DaVinci', DeviceType::TABLET ],
+        'bq Elcano'                                 => [ 'bq', 'Elcano', DeviceType::TABLET ],
+        'bq Elcano 2 Quad Core'                     => [ 'bq', 'Elcano 2', DeviceType::TABLET ],
+        'bq Edison'                                 => [ 'bq', 'Edison', DeviceType::TABLET ],
+        'bq Edison 3G'                              => [ 'bq', 'Edison', DeviceType::TABLET ],
+        'bq Edison 2'                               => [ 'bq', 'Edison 2', DeviceType::TABLET ],
+        'bq Edison 2 3G'                            => [ 'bq', 'Edison 2', DeviceType::TABLET ],
+        'bq Edison 2 Quad Core'                     => [ 'bq', 'Edison 2', DeviceType::TABLET ],
+        'bq Edison 2 Quad Core 3G'                  => [ 'bq', 'Edison 2', DeviceType::TABLET ],
+        'Edison 3'                                  => [ 'bq', 'Edison 3', DeviceType::TABLET ],
+        'Edison 3 3G'                               => [ 'bq', 'Edison 3', DeviceType::TABLET ],
+        'Edison 3 mini'                             => [ 'bq', 'Edison 3 mini', DeviceType::TABLET ],
+        'bq Livingstone 2'                          => [ 'bq', 'Livingstone 2', DeviceType::TABLET ],
+        'bq Livingstone 3n!'                        => [ 'bq', 'Livingstone 3n', DeviceType::TABLET ],
+        'Maxwell'                                   => [ 'bq', 'Maxwell', DeviceType::TABLET ],
+        'Maxwell Lite'                              => [ 'bq', 'Maxwell Lite', DeviceType::TABLET ],
+        'bq Maxwell Plus'                           => [ 'bq', 'Maxwell Plus', DeviceType::TABLET ],
+        'bq Maxwell 2'                              => [ 'bq', 'Maxwell 2', DeviceType::TABLET ],
+        'bq Maxwell 2 Lite'                         => [ 'bq', 'Maxwell 2 Lite', DeviceType::TABLET ],
+        'bq Maxwell 2 Plus'                         => [ 'bq', 'Maxwell 2 Plus', DeviceType::TABLET ],
+        'bq Maxwell 2 Quad Core'                    => [ 'bq', 'Maxwell 2', DeviceType::TABLET ],
+        'bq Pascal 2!'                              => [ 'bq', 'Pascal 2', DeviceType::TABLET ],
+        'bq Verne Plus'                             => [ 'bq', 'Verne Plus', DeviceType::TABLET ],
+        'bq Verne Plus 3G'                          => [ 'bq', 'Verne Plus', DeviceType::TABLET ],
+        'bq Voltaire'                               => [ 'bq', 'Voltaire', DeviceType::TABLET ],
+    ],
+
+    'BUSH!!' => [
+        'Bush 4 Android'                            => [ 'Bush', '4' ],
+        'BUSH 5 Android'                            => [ 'Bush', '5' ],
+        'Bush 5" Android'                           => [ 'Bush', '5' ],
+        'Bush 5" 4G'                                => [ 'Bush', '5 4G' ],
+        'Bush Spira C2 5" Smartphone'               => [ 'Bush', '5 4G' ],
+        'Bush 5.5" 4G'                              => [ 'Bush', '5.5 4G' ],
+        'Bush Spira D2 5.5" Smartphone'             => [ 'Bush', '5.5 4G' ],
+        'BUSH 7.0 TABLET'                           => [ 'Bush', '7.0 Tablet', DeviceType::TABLET ],
+        'BUSH 7.85 TABLET'                          => [ 'Bush', '7.85 Tablet', DeviceType::TABLET ],
+        'Bush 8.0 MyTablet'                         => [ 'Bush', '8.0 MyTablet', DeviceType::TABLET ],
+        'BUSH 10.1 TABLET'                          => [ 'Bush', '10.1 Tablet', DeviceType::TABLET ],
+        'Bush 7.0 MyTablet'                         => [ 'Bush', '7.0 MyTablet', DeviceType::TABLET ],
+        'Bush 10.0 MyTablet'                        => [ 'Bush', '10.0 MyTablet', DeviceType::TABLET ],
+        'Bush Mytablet 2'                           => [ 'Bush', 'MyTablet 2', DeviceType::TABLET ],
+    ],
+
+    'CT[0-9]{3,4}!!' => [
+        'CT700'                                     => [ 'Carrefour', 'Touch Tablet CT700', DeviceType::TABLET ],
+        'CT701'                                     => [ 'Carrefour', 'Touch Tablet CT701', DeviceType::TABLET ],
+        'CT704'                                     => [ 'Carrefour', 'Touch Tablet CT704', DeviceType::TABLET ],
+        'CT705'                                     => [ 'Carrefour', 'Touch Tablet CT705', DeviceType::TABLET ],
+        'CT705FR'                                   => [ 'Carrefour', 'Touch Tablet CT705', DeviceType::TABLET ],
+        'CT710'                                     => [ 'Carrefour', 'Touch Tablet CT710', DeviceType::TABLET ],
+        'CT715'                                     => [ 'Carrefour', 'Touch Tablet CT715', DeviceType::TABLET ],
+        'CT720'                                     => [ 'Carrefour', 'Touch Tablet CT720', DeviceType::TABLET ],
+        'CT726'                                     => [ 'Carrefour', 'Touch Tablet CT726', DeviceType::TABLET ],
+        'CT820'                                     => [ 'Carrefour', 'Touch Tablet CT820', DeviceType::TABLET ],
+        'CT826'                                     => [ 'Carrefour', 'Touch Tablet CT826', DeviceType::TABLET ],
+        'CT1000'                                    => [ 'Carrefour', 'Touch Tablet CT1000', DeviceType::TABLET ],
+        'CT1002'                                    => [ 'Carrefour', 'Touch Tablet CT1002', DeviceType::TABLET ],
+        'CT1002PLUS'                                => [ 'Carrefour', 'Touch Tablet CT1002 plus', DeviceType::TABLET ],
+        'CT1010'                                    => [ 'Carrefour', 'Touch Tablet CT1010', DeviceType::TABLET ],
+        'CT1020W'                                   => [ 'Carrefour', 'Touch Tablet CT1020W', DeviceType::TABLET ],
+    ],
+
+    'EM63'                                      => [ 'Carrefour', 'Touch Tablet CT720', DeviceType::TABLET ],
+    'A101B-CF'                                  => [ 'Carrefour', 'Touch Tablet CT1001', DeviceType::TABLET ],
+    'TVE9603I'                                  => [ 'Carrefour', 'Touch Tablet CT1050', DeviceType::TABLET ],
+    'Camangi-Mangrove7'                         => [ 'Camangi', 'Mangrove 7', DeviceType::TABLET ],
+    'WS171'                                     => [ 'Camangi', 'WebStation', DeviceType::TABLET ],
+
+    'CAPTIVA!!' => [
+        'CAPTIVA PAD 7'                             => [ 'Captiva', 'Pad 7', DeviceType::TABLET ],
+        'CAPTIVA PAD 8'                             => [ 'Captiva', 'Pad 8', DeviceType::TABLET ],
+        'CAPTIVA PAD 8 Pro'                         => [ 'Captiva', 'Pad 8 Pro', DeviceType::TABLET ],
+        'CAPTIVA PAD 8 GPS'                         => [ 'Captiva', 'Pad 8 GPS', DeviceType::TABLET ],
+        'CAPTIVA 9.7 Super FHD'                     => [ 'Captiva', 'Pad 9.7 Super FHD', DeviceType::TABLET ],
+        'CAPTIVA PAD 10'                            => [ 'Captiva', 'Pad 10.1', DeviceType::TABLET ],
+        'CAPTIVA PAD 10.1'                          => [ 'Captiva', 'Pad 10.1', DeviceType::TABLET ],
+        'CAPTIVA 10.1 HD'                           => [ 'Captiva', 'Pad 10.1 HD', DeviceType::TABLET ],
+        'CAPTIVA PAD 10.1 Quad FHD'                 => [ 'Captiva', 'Pad 10.1 Quad FHD', DeviceType::TABLET ],
+        'CAPTIVA PAD 10.1 Quad FHD 3G'              => [ 'Captiva', 'Pad 10.1 Quad FHD', DeviceType::TABLET ],
+    ],
+
+    'Carpad T5'                                 => [ 'Carpad', 'T5' ],
+    'Carpad T61 2g'                             => [ 'Carpad', 'T61' ],
+    'CAL21'                                     => [ 'Casio', 'GzOne Type-L CAL21', 'carrier' => 'au' ],
+    'CA201SP'                                   => [ 'Casio', 'GzOne CA-201SP' ],
+    'CA-201L'                                   => [ 'Casio', 'GzOne CA-201L' ],
+    'IS11CA'                                    => [ 'Casio', 'GzOne Commando IS11CA', 'carrier' => 'au' ],
+    'C771'                                      => [ 'Casio', 'GzOne Commando' ],
+    'C811 4G'                                   => [ 'Casio', 'GzOne Commando 811' ],
+    'VX-100'                                    => [ 'Casio', 'VX-100 EPOS Terminal', DeviceType::POS ],
+
+    'Casper VIA!!' => [
+        'Casper VIA A3216'                          => [ 'Casper', 'VIA A3216' ],
+        'Casper VIA A6108'                          => [ 'Casper', 'VIA A6108' ],
+        'Casper VIA V4'                             => [ 'Casper', 'VIA V4' ],
+        'Casper VIA V5'                             => [ 'Casper', 'VIA V5' ],
+        'Casper VIA V8'                             => [ 'Casper', 'VIA V8' ],
+    ],
+
+    'B15'                                       => [ 'CAT', 'B15' ],
+    'B15Q'                                      => [ 'CAT', 'B15Q' ],
+    'S30'                                       => [ 'CAT', 'S30' ],
+    'S40'                                       => [ 'CAT', 'S40' ],
+    'S50'                                       => [ 'CAT', 'S50' ],
+    'S50c'                                      => [ 'CAT', 'S50c' ],
+
+    'CAT!!' => [
+        'Cat Comet'                                 => [ 'CAT', 'COMET', DeviceType::TABLET ],
+        'CAT NOVA'                                  => [ 'CAT', 'NOVA', DeviceType::TABLET ],
+        'Cat Tablet Android 4.0.4'                  => [ 'CAT', 'NOVA', DeviceType::TABLET ],
+        'CatNova8'                                  => [ 'CAT', 'NOVA8', DeviceType::TABLET ],
+        'Cat Tablet PHOENIX 8J0'                    => [ 'CAT', 'PHOENIX', DeviceType::TABLET ],
+        'Cat Tablet PHOENIX 8.1J0'                  => [ 'CAT', 'PHOENIX', DeviceType::TABLET ],
+        'Cat Tablet Galactica 9[.,]7CA!'            => [ 'CAT', 'GALACTICA', DeviceType::TABLET ],
+        'Cat Tablet Galactica X 9[.,]7CA!'          => [ 'CAT', 'GALACTICA X', DeviceType::TABLET ],
+        'Cat Tablet GalacticaX 9.7JA'               => [ 'CAT', 'GALACTICA X', DeviceType::TABLET ],
+        'Cat Tablet PEGASUS T 8J0'                  => [ 'CAT', 'PEGASUS', DeviceType::TABLET ],
+        'Cat StarGate'                              => [ 'CAT', 'STARGATE', DeviceType::TABLET ],
+        'Cat Tablet CSG 7J0'                        => [ 'CAT', 'STARGATE', DeviceType::TABLET ],
+        'Cat Tablet StarGate 2'                     => [ 'CAT', 'STARGATE 2', DeviceType::TABLET ],
+        'Cat Tablet CSG2 7.1J0'                     => [ 'CAT', 'STARGATE 2', DeviceType::TABLET ],
+    ],
+
+    'SK351'                                     => [ 'CCE', 'Motion.Plus SK351' ],
+    'CCE SK352'                                 => [ 'CCE', 'Motion.Plus SK352' ],
+
+    'Celkon!!' => [
+        'Celkon A8+'                                => [ 'Celkon', 'A8+' ],
+        'CELKON A9 Dual'                            => [ 'Celkon', 'A9' ],
+        'CELKON A9+'                                => [ 'Celkon', 'A9+' ],
+        'Celkon A10'                                => [ 'Celkon', 'Campus A10' ],
+        'Celkon A15'                                => [ 'Celkon', 'Campus A15' ],
+        'Celkon A15K'                               => [ 'Celkon', 'Campus A15K' ],
+        'Celkon A20'                                => [ 'Celkon', 'Campus A20' ],
+        'Celkon A21'                                => [ 'Celkon', 'A21' ],
+        'Celkon A 22'                               => [ 'Celkon', 'A22' ],
+        'Celkon A27'                                => [ 'Celkon', 'A27' ],
+        'Celkon A35K'                               => [ 'Celkon', 'A35K' ],
+        'Celkon A43'                                => [ 'Celkon', 'A43' ],
+        'Celkon A58'                                => [ 'Celkon', 'A58' ],
+        'Celkon A 59'                               => [ 'Celkon', 'A59' ],
+        'Celkon A62'                                => [ 'Celkon', 'A62' ],
+        'Celkon A 63'                               => [ 'Celkon', 'A63' ],
+        'CELKON A64'                                => [ 'Celkon', 'A64' ],
+        'Celkon A66'                                => [ 'Celkon', 'A66' ],
+        'Celkon A67'                                => [ 'Celkon', 'A67' ],
+        'Celkon A75'                                => [ 'Celkon', 'A75' ],
+        'Celkon A 77'                               => [ 'Celkon', 'A77' ],
+        'Celkon A79'                                => [ 'Celkon', 'A79' ],
+        'CELKON A83'                                => [ 'Celkon', 'A83' ],
+        'Celkon A 85'                               => [ 'Celkon', 'A85' ],
+        'Celkon*A86'                                => [ 'Celkon', 'A86' ],
+        'Celkon A88'                                => [ 'Celkon', 'A88' ],
+        'CELKON A 90'                               => [ 'Celkon', 'A90' ],
+        'Celkon*A95*Pro'                            => [ 'Celkon', 'A95 Pro' ],
+        'Celkon A97'                                => [ 'Celkon', 'A97' ],
+        'Celkon A98'                                => [ 'Celkon', 'A98' ],
+        'Celkon A101'                               => [ 'Celkon', 'A101' ],
+        'Celkon A105+'                              => [ 'Celkon', 'Signature Vista A105+' ],
+        'Celkon A107'                               => [ 'Celkon', 'Signature One A107' ],
+        'Celkon A107+'                              => [ 'Celkon', 'Signature One A107+' ],
+        'Celkon A112'                               => [ 'Celkon', 'Signature Swift A112' ],
+        'Celkon A118'                               => [ 'Celkon', 'Signature HD A118' ],
+        'Celkon A119'                               => [ 'Celkon', 'Signature HD A119' ],
+        'Celkon A119Q'                              => [ 'Celkon', 'Signature HD A119Q' ],
+        'Celkon A125'                               => [ 'Celkon', 'Campus A125' ],
+        'Celkon A 200'                              => [ 'Celkon', 'A200' ],
+        'Celkon A200'                               => [ 'Celkon', 'A200' ],
+        'Celkon A 220'                              => [ 'Celkon', 'A220' ],
+        'Celkon A 225'                              => [ 'Celkon', 'A225' ],
+        'Celkon A404'                               => [ 'Celkon', 'Campus Buddy A404' ],
+        'Celkon A500'                               => [ 'Celkon', 'Signature Two A500' ],
+        'Celkon A900'                               => [ 'Celkon', 'A900' ],
+        'Celkon A.R 40'                             => [ 'Celkon', 'AR40' ],
+        'Celkon A.R 45'                             => [ 'Celkon', 'AR45' ],
+        'Celkon A.R 50'                             => [ 'Celkon', 'AR50' ],
+        'Celkon C720'                               => [ 'Celkon', 'C720', DeviceType::TABLET ],
+        'CELKON CT2'                                => [ 'Celkon', 'CT2', DeviceType::TABLET ],
+        'Celkon CT3'                                => [ 'Celkon', 'CT3', DeviceType::TABLET ],
+        'Celkon CT7'                                => [ 'Celkon', 'CT7', DeviceType::TABLET ],
+        'Celkon CT 9'                               => [ 'Celkon', 'CT9', DeviceType::TABLET ],
+        'CELKON CT 888'                             => [ 'Celkon', 'CT888', DeviceType::TABLET ],
+        'Celkon CT 910'                             => [ 'Celkon', 'CT910', DeviceType::TABLET ],
+        'Celkon CT 910+'                            => [ 'Celkon', 'CT910+', DeviceType::TABLET ],
+        'Celkon IQ180'                              => [ 'Celkon', 'IQ180' ],
+        'Celkon S1'                                 => [ 'Celkon', 'S1' ],
+        'Celkon Q4GPlus'                            => [ 'Celkon', 'Diamond 4G Plus' ],
+        'Celkon Q405'                               => [ 'Celkon', 'Campus Q405' ],
+        'CELKON Q450'                               => [ 'Celkon', 'Millennia Q450' ],
+        'Celkon Q455'                               => [ 'Celkon', 'Millennium Vogue Q455' ],
+        'Celkon Q470'                               => [ 'Celkon', 'Millennium Elite Q470' ],
+        'Celkon Q500'                               => [ 'Celkon', 'Millennium Ultra Q500' ],
+        'Celkon Q550'                               => [ 'Celkon', 'Millennia Epic Q550' ],
+        'Celkon Q567'                               => [ 'Celkon', 'Millennia Q567' ],
+        'Celkon Q3000'                              => [ 'Celkon', 'Millennia Power Q3000' ],
+        'Celkon 4G TAB-8'                           => [ 'Celkon', '4G Tab-8', DeviceType::TABLET ],
+    ],
+
+    'A89'                                       => [ 'Celkon', 'A89' ],
+    'A95'                                       => [ 'Celkon', 'A95' ],
+    'A97i'                                      => [ 'Celkon', 'A97i' ],
+    'CT-1'                                      => [ 'Celkon', 'CT1', DeviceType::TABLET ],
+    'CT910'                                     => [ 'Celkon', 'CT910', DeviceType::TABLET ],
+    'W820'                                      => [ 'Cellon', 'HW-W820' ],
+
+    'ChangHong!!' => [
+        'ChangHong-Z-ME'                            => [ 'ChangHong', 'Z-me' ],
+        'ChanghongA898T'                            => [ 'ChangHong', 'A898T' ],
+        'ChanghongC100'                             => [ 'ChangHong', 'C100' ],
+        'ChanghongC600'                             => [ 'ChangHong', 'C600' ],
+        'ChanghongC770'                             => [ 'ChangHong', 'C770' ],
+        'ChanghongC800'                             => [ 'ChangHong', 'C800' ],
+        'Changhong H5018'                           => [ 'ChangHong', 'H5018' ],
+        'ChangHongV5t'                              => [ 'ChangHong', 'V5t' ],
+        'ChangHong ?V7!'                            => [ 'ChangHong', 'V7' ],
+        'ChonghongV8'                               => [ 'ChangHong', 'V8' ],
+        'ChangHongV11t'                             => [ 'ChangHong', 'V11t' ],
+        'ChangHongW3'                               => [ 'ChangHong', 'W3' ],
+        'ChangHong W3'                              => [ 'ChangHong', 'W3' ],
+        'ChanghongW6'                               => [ 'ChangHong', 'W6' ],
+        'ChanghongW7'                               => [ 'ChangHong', 'W7' ],
+        'ChangHong W8'                              => [ 'ChangHong', 'W8' ],
+        'ChangHong W22'                             => [ 'ChangHong', 'W22' ],
+        'ChangHong ?Z1!'                            => [ 'ChangHong', 'Z1' ],
+        'ChanghongZ3t'                              => [ 'ChangHong', 'Z3t' ],
+        'ChangHongZ9'                               => [ 'ChangHong', 'Z9' ],
+        'changhong TV'                              => [ 'ChangHong', null ],
+    ],
+
+    'CHER!!' => [
+        'CHER A50'                                  => [ 'Cher', 'A50' ],
+        'CHER A55w'                                 => [ 'Cher', 'A55w' ],
+        'CHER A90'                                  => [ 'Cher', 'A90' ],
+        'CHER A91'                                  => [ 'Cher', 'A91' ],
+    ],
+
+    'PC1038'                                    => [ 'Cherry', 'Pro-Line 2', DeviceType::TABLET ],
+    'Candy TV'                                  => [ 'Cherry Mobile', 'Candy TV' ],
+    'Titan TV S320'                             => [ 'Cherry Mobile', 'Titan TV' ],
+    'Flame2'                                    => [ 'Cherry Mobile', 'Flame 2.0' ],
+    'Flare S100'                                => [ 'Cherry Mobile', 'Flare' ],
+    'Flare 2.0'                                 => [ 'Cherry Mobile', 'Flare 2.0' ],
+    'Flare 2.1'                                 => [ 'Cherry Mobile', 'Flare 2.1' ],
+    'Flare2X'                                   => [ 'Cherry Mobile', 'Flare 2X' ],
+    'Flare J1'                                  => [ 'Cherry Mobile', 'Flare J1' ],
+    'FLARE J1 PLUS'                             => [ 'Cherry Mobile', 'Flare J1 Plus' ],
+    'Flare J3 Plus'                             => [ 'Cherry Mobile', 'Flare J3 Plus' ],
+    'Flare S4 Max'                              => [ 'Cherry Mobile', 'Flare S4 Max' ],
+    'Blaze S180'                                => [ 'Cherry Mobile', 'Blaze S180' ],
+    'Burst S280'                                => [ 'Cherry Mobile', 'Burst W280' ],
+    'Cherry Mobile Burst'                       => [ 'Cherry Mobile', 'Burst W280' ],
+    'Cherry Life'                               => [ 'Cherry Mobile', 'Life' ],
+    'Cherry Razor'                              => [ 'Cherry Mobile', 'Razor' ],
+    'Cherry Mobile Razor'                       => [ 'Cherry Mobile', 'Razor' ],
+    'CHERRY SNAP'                               => [ 'Cherry Mobile', 'Snap' ],
+    'Cherry Sonic'                              => [ 'Cherry Mobile', 'Sonic' ],
+    'Cherry thunder2.0'                         => [ 'Cherry Mobile', 'Thunder 2.0' ],
+    'Thunder S220'                              => [ 'Cherry Mobile', 'Thunder S220' ],
+    'Ultra Flare v2'                            => [ 'Cherry Mobile', 'Ultra Flare' ],
+    'H120'                                      => [ 'Cherry Mobile', 'H120' ],
+    'W200'                                      => [ 'Cherry Mobile', 'W200' ],
+    'Cherry Mobile Amber W380'                  => [ 'Cherry Mobile', 'Amber W380' ],
+    'Cherry w500'                               => [ 'Cherry Mobile', 'W500' ],
+    'W900'                                      => [ 'Cherry Mobile', 'W900' ],
+    'Fusion Bolt'                               => [ 'Cherry Mobile', 'Fusion Bolt', DeviceType::TABLET ],
+
+    'LA-!!' => [
+        'LA-E'                                      => [ 'Chili', 'E' ],
+        'LA-I'                                      => [ 'Chili', 'I' ],
+        'LA-I2'                                     => [ 'Chili', 'I2' ],
+        'LA-M1'                                     => [ 'Chili', 'M1' ],
+        'LA-M1Y'                                    => [ 'Chili', 'M1Y' ],
+        'LA-M2'                                     => [ 'Chili', 'M2' ],
+        'LA-Q1'                                     => [ 'Chili', 'Q1' ],
+    ],
+
+    'M701C'                                     => [ 'China Tablet', 'M701C', DeviceType::TABLET ],
+    'TR720F'                                    => [ 'China Tablet', 'TR720F', DeviceType::TABLET ],
+    'ARMM2V'                                    => [ 'chinaleap', 'ARMM2V', DeviceType::TABLET ],
+    'ARMM3V'                                    => [ 'chinaleap', 'ARMM3V', DeviceType::TABLET ],
+    'V936'                                      => [ 'Chiva', 'V936' ],
+
+    'CHUWI!!' => [
+        'CHUWI V3'                                  => [ 'Chuwi', 'V3', DeviceType::TABLET ],
+        'CHUWI-V8-HD'                               => [ 'Chuwi', 'V8 HD', DeviceType::TABLET ],
+        'CHUWI V9'                                  => [ 'Chuwi', 'V9', DeviceType::TABLET ],
+    ],
+
+    'cius'                                      => [ 'Cisco', 'Cius', DeviceType::TABLET ],
+    'CIUS-7!'                                   => [ 'Cisco', 'Cius', DeviceType::TABLET ],
+
+    'CP-DX!!' => [
+        'CP-DX70'                                   => [ 'Cisco', 'DX70', DeviceType::TABLET ],
+        'CP-DX80'                                   => [ 'Cisco', 'DX80', DeviceType::TABLET ],
+        'CP-DX650'                                  => [ 'Cisco', 'DX650', DeviceType::TABLET ],
+    ],
+
+    'Citycall!!' => [
+        'Citycall A1'                               => [ 'Citycall', 'A1' ],
+        'Citycall i310+'                            => [ 'Citycall', 'i310+' ],
+        'Citycall i930+'                            => [ 'Citycall', 'i930+' ],
+    ],
+
+    'Clarion Mirage 2'                          => [ 'Clarion', 'Mirage 2', DeviceType::CAR ],
+
+    '(Cloudfone|CloudPad|Excite|Thrill)!!' => [
+        'Cloudfone Excite320e'                      => [ 'Cloudfone', 'Excite 320e' ],
+        'Cloudfone Excite320g'                      => [ 'Cloudfone', 'Excite 320g' ],
+        'Cloudfone Excite350e'                      => [ 'Cloudfone', 'Excite 350e' ],
+        'Cloudfone Excite350g'                      => [ 'Cloudfone', 'Excite 350g' ],
+        'Cloudfone Excite 350g'                     => [ 'Cloudfone', 'Excite 350g' ],
+        'Cloudfone Excite 350i'                     => [ 'Cloudfone', 'Excite 350i' ],
+        'Cloudfone Excite 354g'                     => [ 'Cloudfone', 'Excite 354g' ],
+        'Cloudfone Excite 400d'                     => [ 'Cloudfone', 'Excite 400d' ],
+        'Cloudfone Excite 402d'                     => [ 'Cloudfone', 'Excite 402d' ],
+        'Excite 402d'                               => [ 'Cloudfone', 'Excite 402d' ],
+        'Cloudfone Excite 452q'                     => [ 'Cloudfone', 'Excite 452q' ],
+        'Cloudfone Excite 500d'                     => [ 'Cloudfone', 'Excite 500d' ],
+        'Excite 501o'                               => [ 'Cloudfone', 'Excite 501o' ],
+        'Cloudfone Excite 502q'                     => [ 'Cloudfone', 'Excite 502q' ],
+        'Cloudfone Excite 504d'                     => [ 'Cloudfone', 'Excite 504d' ],
+        'Cloudfone GEO 400q+'                       => [ 'Cloudfone', 'Geo 400q' ],
+        'Cloudfone GEO 402q'                        => [ 'Cloudfone', 'Geo 402q' ],
+        'Cloudfone ICE 2Gs'                         => [ 'Cloudfone', 'Ice 2Gs' ],
+        'cloudfone ice 350e!'                       => [ 'Cloudfone', 'Ice 350e' ],
+        'Cloudfone ICE 500e'                        => [ 'Cloudfone', 'Ice 500e' ],
+        'Cloudfone Thrill 400g'                     => [ 'Cloudfone', 'Thrill 400g' ],
+        'Cloudfone Thrill 430d'                     => [ 'Cloudfone', 'Thrill 430d' ],
+        'Cloudfone Thrill 430g'                     => [ 'Cloudfone', 'Thrill 430g' ],
+        'Thrill 430x'                               => [ 'Cloudfone', 'Thrill 430x' ],
+        'Cloudfone Thrill 500g'                     => [ 'Cloudfone', 'Thrill 500g' ],
+        'Thrill 530qx'                              => [ 'Cloudfone', 'Thrill 530qx' ],
+        'Thrill HD'                                 => [ 'Cloudfone', 'Thrill HD' ],
+        'Thrill Access'                             => [ 'Cloudfone', 'Thrill Access' ],
+        'Thrill Boost'                              => [ 'Cloudfone', 'Thrill Boost' ],
+        'Thrill Lite'                               => [ 'Cloudfone', 'Thrill Lite' ],
+        'Thrill Plus 16GB'                          => [ 'Cloudfone', 'Thrill Plus' ],
+        'CloudPad 700d'                             => [ 'Cloudfone', 'CloudPad 700d' ],
+        'CloudPad 700w'                             => [ 'Cloudfone', 'CloudPad 700w' ],
+        'CloudPad 700TV'                            => [ 'Cloudfone', 'CloudPad 700tv' ],
+        'CloudPad 701tv'                            => [ 'Cloudfone', 'CloudPad 701tv' ],
+        'Cloudpad 705w'                             => [ 'Cloudfone', 'CloudPad 705w' ],
+        'CloudPad 707qw'                            => [ 'Cloudfone', 'CloudPad 707qw' ],
+        'Cloudpad 800d'                             => [ 'Cloudfone', 'CloudPad 800d' ],
+    ],
+
+    'CW[- ]!!' => [
+        'CW  V7 SIM'                                => [ 'Chuwi', 'V7' ],
+        'CW V8 Dual'                                => [ 'Chuwi', 'V8' ],
+        'CW-V9 DUAL'                                => [ 'Chuwi', 'V9' ],
+        'CW-V17HD'                                  => [ 'Chuwi', 'V17HD' ],
+        'CW-V18'                                    => [ 'Chuwi', 'V18' ],
+        'CW V70'                                    => [ 'Chuwi', 'V70' ],
+        'CW V80'                                    => [ 'Chuwi', 'V80' ],
+        'CW-V88-QUAD'                               => [ 'Chuwi', 'V88' ],
+        'CW-V88S'                                   => [ 'Chuwi', 'V88s' ],
+        'CW-V88S-QUAD'                              => [ 'Chuwi', 'V88s' ],
+        'CW-V99'                                    => [ 'Chuwi', 'V99' ],
+        'CW-V99-QUAD'                               => [ 'Chuwi', 'V99' ],
+        'CW-VX8-3G'                                 => [ 'Chuwi', 'VX8 3G' ],
+        'CW-Hi8Pro'                                 => [ 'Chuwi', 'Hi8 Pro', DeviceType::TABLET ],
+    ],
+
+    'V17HD'                                     => [ 'Chuwi', 'V17HD' ],
+    'Aquila 070-0508'                           => [ 'CMX', 'Aquila 070-0508', DeviceType::TABLET ],
+    'Aquila 070-0508 3G'                        => [ 'CMX', 'Aquila 070-0508', DeviceType::TABLET ],
+    'Aquila 080-0508'                           => [ 'CMX', 'Aquila 080-0508', DeviceType::TABLET ],
+    'AQUILA 080-1008'                           => [ 'CMX', 'Aquila 080-1008', DeviceType::TABLET ],
+    'Aquila 097-0508'                           => [ 'CMX', 'Aquila 097-0508', DeviceType::TABLET ],
+    'AQUILA 097-1006'                           => [ 'CMX', 'Aquila 097-1006', DeviceType::TABLET ],
+    'AQUILA 097-1016'                           => [ 'CMX', 'Aquila 097-1016', DeviceType::TABLET ],
+    'AQUILA 097-1016 BT + 3G'                   => [ 'CMX', 'Aquila 097-1016', DeviceType::TABLET ],
+    'AQUILA 097-1016 BT 3G'                     => [ 'CMX', 'Aquila 097-1016', DeviceType::TABLET ],
+    'Aquila 101'                                => [ 'CMX', 'Aquila 101', DeviceType::TABLET ],
+    'Aquila 101-1008 3G'                        => [ 'CMX', 'Aquila 101-1008', DeviceType::TABLET ],
+    'Aquila LE 080-0508'                        => [ 'CMX', 'Aquila LE 080-0508', DeviceType::TABLET ],
+    'Aquila SE 090-0508'                        => [ 'CMX', 'Aquila SE 090-0508', DeviceType::TABLET ],
+    'Clanga 079-1016'                           => [ 'CMX', 'Clanga 079-1016', DeviceType::TABLET ],
+    'Clanga 097-2016'                           => [ 'CMX', 'Clanga 097-2016', DeviceType::TABLET ],
+    'Clanga SE 097-1008'                        => [ 'CMX', 'Clanga SE 097-1008', DeviceType::TABLET ],
+    'RAPAXSE080-0508'                           => [ 'CMX', 'Rapax SE 080-0508', DeviceType::TABLET ],
+
+    'CnM!!' => [
+        'CnM TouchPad 7'                            => [ 'CnM', 'TouchPad 7', DeviceType::TABLET ],
+        'CnM-TOUCHPAD 7'                            => [ 'CnM', 'TouchPad 7', DeviceType::TABLET ],
+        'CnM-TOUCHPAD7'                             => [ 'CnM', 'TouchPad 7', DeviceType::TABLET ],
+        'CnM TouchPad 7DC'                          => [ 'CnM', 'TouchPad 7 DC', DeviceType::TABLET ],
+        'CnM-TP-8DC-16-B'                           => [ 'CnM', 'TouchPad 7 DC', DeviceType::TABLET ],
+        'CnM TouchPad 9DC'                          => [ 'CnM', 'TouchPad 8 DC', DeviceType::TABLET ],
+        'CnM TOUCHPAD 9'                            => [ 'CnM', 'TouchPad 9', DeviceType::TABLET ],
+        'CnM-TOUCHPAD9'                             => [ 'CnM', 'TouchPad 9', DeviceType::TABLET ],
+        'Cnm TOUCHPAD 9.7'                          => [ 'CnM', 'TouchPad 9.7', DeviceType::TABLET ],
+        'CnM-TP-10DC-16-B'                          => [ 'CnM', 'TouchPad 10 DC', DeviceType::TABLET ],
+        'CnM TouchPad 10.1DC'                       => [ 'CnM', 'TouchPad 10.1 DC', DeviceType::TABLET ],
+    ],
+
+    'MID[0-9]{4,4}!!' => [
+        'MID1024'                                   => [ 'Coby', 'Kyros MID1024', DeviceType::TABLET ],
+        'MID1042'                                   => [ 'Coby', 'Kyros MID1042', DeviceType::TABLET ],
+        'MID1045'                                   => [ 'Coby', 'Kyros MID1045', DeviceType::TABLET ],
+        'MID1048'                                   => [ 'Coby', 'Kyros MID1048', DeviceType::TABLET ],
+        'MID1060'                                   => [ 'Coby', 'Kyros MID1060', DeviceType::TABLET ],
+        'MID1065'                                   => [ 'Coby', 'Kyros MID1065', DeviceType::TABLET ],
+        'MID1125'                                   => [ 'Coby', 'Kyros MID1125', DeviceType::TABLET ],
+        'MID1126'                                   => [ 'Coby', 'Kyros MID1126', DeviceType::TABLET ],
+        'MID4331'                                   => [ 'Coby', 'Kyros MID4331', DeviceType::MEDIA ],
+        'MID7002'                                   => [ 'Coby', 'Kyros MID7002', DeviceType::TABLET ],
+        'MID7005'                                   => [ 'Coby', 'Kyros MID7005', DeviceType::TABLET ],
+        'MID7010'                                   => [ 'Coby', 'Kyros MID7010', DeviceType::TABLET ],
+        'MID7011'                                   => [ 'Coby', 'Kyros MID7011', DeviceType::TABLET ],
+        'MID7012'                                   => [ 'Coby', 'Kyros MID7012', DeviceType::TABLET ],
+        'MID7014'                                   => [ 'Coby', 'Kyros MID7014', DeviceType::TABLET ],
+        'MID7015!'                                  => [ 'Coby', 'Kyros MID7015', DeviceType::TABLET ],
+        'MID7016'                                   => [ 'Coby', 'Kyros MID7016', DeviceType::TABLET ],
+        'MID7020'                                   => [ 'Coby', 'Kyros MID7020', DeviceType::TABLET ],
+        'MID7022'                                   => [ 'Coby', 'Kyros MID7022', DeviceType::TABLET ],
+        'MID7024'                                   => [ 'Coby', 'Kyros MID7024', DeviceType::TABLET ],
+        'MID7025'                                   => [ 'Coby', 'Kyros MID7025', DeviceType::TABLET ],
+        'MID7032'                                   => [ 'Coby', 'Kyros MID7032', DeviceType::TABLET ],
+        'MID7033'                                   => [ 'Coby', 'Kyros MID7033', DeviceType::TABLET ],
+        'MID7034'                                   => [ 'Coby', 'Kyros MID7034', DeviceType::TABLET ],
+        'MID7035'                                   => [ 'Coby', 'Kyros MID7035', DeviceType::TABLET ],
+        'MID7036'                                   => [ 'Coby', 'Kyros MID7036', DeviceType::TABLET ],
+        'MID7038'                                   => [ 'Coby', 'Kyros MID7038', DeviceType::TABLET ],
+        'MID7042'                                   => [ 'Coby', 'Kyros MID7042', DeviceType::TABLET ],
+        'MID7046'                                   => [ 'Coby', 'Kyros MID7046', DeviceType::TABLET ],
+        'MID7047'                                   => [ 'Coby', 'Kyros MID7047', DeviceType::TABLET ],
+        'MID7048'                                   => [ 'Coby', 'Kyros MID7048', DeviceType::TABLET ],
+        'MID7051'                                   => [ 'Coby', 'Kyros MID7051', DeviceType::TABLET ],
+        'MID7052'                                   => [ 'Coby', 'Kyros MID7052', DeviceType::TABLET ],
+        'MID7055'                                   => [ 'Coby', 'Kyros MID7052', DeviceType::TABLET ],
+        'MID7065'                                   => [ 'Coby', 'Kyros MID7065', DeviceType::TABLET ],
+        'MID7120'                                   => [ 'Coby', 'Kyros MID7120', DeviceType::TABLET ],
+        'MID7125'                                   => [ 'Coby', 'Kyros MID7125', DeviceType::TABLET ],
+        'MID7127'                                   => [ 'Coby', 'Kyros MID7127', DeviceType::TABLET ],
+        'MID8024'                                   => [ 'Coby', 'Kyros MID8024', DeviceType::TABLET ],
+        'MID8042'                                   => [ 'Coby', 'Kyros MID8042', DeviceType::TABLET ],
+        'MID8048'                                   => [ 'Coby', 'Kyros MID8048', DeviceType::TABLET ],
+        'MID8065'                                   => [ 'Coby', 'Kyros MID8065', DeviceType::TABLET ],
+        'MID8120'                                   => [ 'Coby', 'Kyros MID8120', DeviceType::TABLET ],
+        'MID8125'                                   => [ 'Coby', 'Kyros MID8125', DeviceType::TABLET ],
+        'MID8127'                                   => [ 'Coby', 'Kyros MID8127', DeviceType::TABLET ],
+        'MID8128'                                   => [ 'Coby', 'Kyros MID8128', DeviceType::TABLET ],
+        'MID9042'                                   => [ 'Coby', 'Kyros MID9042', DeviceType::TABLET ],
+        'MID9724'                                   => [ 'Coby', 'Kyros MID9724', DeviceType::TABLET ],
+        'MID9740'                                   => [ 'Coby', 'Kyros MID9740', DeviceType::TABLET ],
+        'MID9742'                                   => [ 'Coby', 'Kyros MID9742', DeviceType::TABLET ],
+        'MID9760'                                   => [ 'Coby', 'Kyros MID9760', DeviceType::TABLET ],
+    ],
+
+    'Ultimix!!' => [
+        'Ultimix77'                                 => [ 'Codegen', 'Ultimix 77', DeviceType::TABLET ],
+        'Ultimix 88'                                => [ 'Codegen', 'Ultimix 88', DeviceType::TABLET ],
+        'Ultimix94'                                 => [ 'Codegen', 'Ultimix 94', DeviceType::TABLET ],
+        'Ultimix95'                                 => [ 'Codegen', 'Ultimix 95', DeviceType::TABLET ],
+        'Ultimix99'                                 => [ 'Codegen', 'Ultimix 99', DeviceType::TABLET ],
+    ],
+
+    'BLADE LE 70'                               => [ 'COMMAX', 'BLADE LE 70', DeviceType::TABLET ],
+
+    'Commodore!!' => [
+        'Commodore  IS-7107C'                       => [ 'Commodore', 'IS-7107C', DeviceType::TABLET ],
+        'Commodore IS-7107C'                        => [ 'Commodore', 'IS-7107C', DeviceType::TABLET ],
+    ],
+
+    'Z71'                                       => [ 'Commtiva', 'Z71' ],
+    'V-T100'                                    => [ 'Commtiva', 'V-T100' ],
+    'FIH-FB0'                                   => [ 'Commtiva', 'HD700'],
+    'Commtiva-HD710'                            => [ 'Commtiva', 'HD710'],
+    'Commtiva-N700'                             => [ 'Commtiva', 'N700'],
+    'Connspeed IP71'                            => [ 'Connspeed', 'IP71' ],
+
+    '(Colorfly|CT[0-9]{3,3})!!' => [
+        'Colorfly CT102 Qise 3'                     => [ 'Colorfly', 'CT102 Qise 3', DeviceType::TABLET ],
+        'CT704 D·Bok'                               => [ 'Colorfly', 'CT704 D·Bok', DeviceType::TABLET ],
+        'CT801 Eyas'                                => [ 'Colorfly', 'CT801 Eyas', DeviceType::TABLET ],
+        'CT801 Q.Ait'                               => [ 'Colorfly', 'CT801 Q·Ait', DeviceType::TABLET ],
+        'Colorfly CT972Q·Vanilla'                   => [ 'Colorfly', 'CT972 Q·Vanilla', DeviceType::TABLET ],
+        'Colorfly CT972Q·Vanilla'                  => [ 'Colorfly', 'CT972 Q·Vanilla', DeviceType::TABLET ],
+        'Colorfly CT972Q·Vanilla'                => [ 'Colorfly', 'CT972 Q·Vanilla', DeviceType::TABLET ],
+        'CT972 Q.Vanilla 2'                         => [ 'Colorfly', 'CT972 Q·Vanilla 2', DeviceType::TABLET ],
+        'CT974 Ivory 3'                             => [ 'Colorfly', 'CT974 Ivory 3', DeviceType::TABLET ],
+        'Colorfly E708'                             => [ 'Colorfly', 'E708', DeviceType::TABLET ],
+        'Colorfly E708 Q1'                          => [ 'Colorfly', 'E708 Q1', DeviceType::TABLET ],
+        'Colorfly E708 Q1s'                         => [ 'Colorfly', 'E708 Q1s', DeviceType::TABLET ],
+        'Colorfly E708 Q2'                          => [ 'Colorfly', 'E708 Q2', DeviceType::TABLET ],
+        'Colorfly G708'                             => [ 'Colorfly', 'G708', DeviceType::TABLET ],
+        'Colorfly S782 Q1'                          => [ 'Colorfly', 'S782 Q1', DeviceType::TABLET ],
+        'Colorfly U781 Q1'                          => [ 'Colorfly', 'U781 Q1', DeviceType::TABLET ],
+    ],
+
+    'K11'                                       => [ 'Colors', 'K11' ],
+    'XT751'                                     => [ 'Colors', 'XT751' ],
+
+    'Colors!!' => [
+        'Colors K22'                                => [ 'Colors', 'K22' ],
+        'Colors X27'                                => [ 'Colors', 'Xfactor Wave X27' ],
+        'Colors X45'                                => [ 'Colors', 'X45' ],
+        'Colors X115'                               => [ 'Colors', 'Xfactor Quad II X115' ],
+    ],
+
+    'ConCorde!!' => [
+        'ConCorde SmartPhone 4300'                  => [ 'ConCorde', 'SmartPhone 4300' ],
+        'ConCorde SmartPhone5000'                   => [ 'ConCorde', 'SmartPhone 5000' ],
+        'ConCorde Smartphone 5005 NFC'              => [ 'ConCorde', 'SmartPhone 5005 NFC' ],
+        'ConCorde SmartPhone5700'                   => [ 'ConCorde', 'SmartPhone 5700' ],
+        'ConCorde SmartPhone6500'                   => [ 'ConCorde', 'SmartPhone 6500' ],
+        'ConCorde tab 9.7IPS PLUS'                  => [ 'ConCorde', 'tab 9.7IPS Plus', DeviceType::TABLET ],
+        'ConCorde tab NOVUM'                        => [ 'ConCorde', 'tab NOVUM', DeviceType::TABLET ],
+        'Concorde Tab Omega 3G'                     => [ 'ConCorde', 'tab OMEGA', DeviceType::TABLET ],
+        'ConCorde tab PLAY'                         => [ 'ConCorde', 'tab PLAY', DeviceType::TABLET ],
+        'ConCorde tab Speed'                        => [ 'ConCorde', 'tab SPEED', DeviceType::TABLET ],
+        'ConCorde Tab T10'                          => [ 'ConCorde', 'tab T10', DeviceType::TABLET ],
+    ],
+
+    'Coolgen!!' => [
+        'Coolgen E68+'                              => [ 'Coolgen', 'E68+' ],
+        'Coolgen E69+'                              => [ 'Coolgen', 'E69+' ],
+        'Coolgen E70'                               => [ 'Coolgen', 'E70' ],
+        'Coolgen E70 G'                             => [ 'Coolgen', 'E70 G' ],
+        'Coolgen E71'                               => [ 'Coolgen', 'E71' ],
+        'Coolgen E72 Note 3G'                       => [ 'Coolgen', 'E72' ],
+        'Coolgen E72 Note8'                         => [ 'Coolgen', 'E72' ],
+    ],
+
+    'Coolpad!!' => [
+        'Coolpad A8-531'                            => [ 'Coolpad', 'A8-531' ],
+        'Coolpad D510'                              => [ 'Coolpad', 'D510' ],
+        'Coolpad D530'                              => [ 'Coolpad', 'D530' ],
+        'Coolpad D530TW'                            => [ 'Coolpad', 'D530' ],
+        'Coolpad D539'                              => [ 'Coolpad', 'D539' ],
+        'Coolpad E239'                              => [ 'Coolpad', 'E239' ],
+        'Coolpad E501!'                             => [ 'Coolpad', 'E501' ],
+        'Coolpad E560'                              => [ 'Coolpad', 'E560' ],
+        'Coolpad F101'                              => [ 'Coolpad', 'F101' ],
+        'Coolpad F103'                              => [ 'Coolpad', 'F103' ],
+        'Coolpad N930'                              => [ 'Coolpad', 'N930' ],
+        'Coolpad N950'                              => [ 'Coolpad', 'N950' ],
+        'Coolpad R106'                              => [ 'Coolpad', 'R106' ],
+        'Coolpad S6-NT'                             => [ 'Coolpad', 'S6-NT' ],
+        'Coolpad T1'                                => [ 'Coolpad', 'T1' ],
+        'Coolpad T2-C01'                            => [ 'Coolpad', 'T2' ],
+        'Coolpad V1-C'                              => [ 'Coolpad', 'Bodun' ],
+        'Coolpad W706!'                             => [ 'Coolpad', 'W706' ],
+        'Coolpad W708'                              => [ 'Coolpad', 'W708' ],
+        'Coolpad Y1'                                => [ 'Coolpad', 'Y1' ],
+        'Coolpad Y60!'                              => [ 'Coolpad', 'Y60' ],
+        'Coolpad Y70!'                              => [ 'Coolpad', 'Y70' ],
+        'Coolpad Y71!'                              => [ 'Coolpad', 'Y71' ],
+        'Coolpad Y75!'                              => [ 'Coolpad', 'Y75' ],
+        'Coolpad Y76!'                              => [ 'Coolpad', 'Y76' ],
+        'Coolpad Y80!'                              => [ 'Coolpad', 'Y80' ],
+        'Coolpad Y82!'                              => [ 'Coolpad', 'Y82' ],
+        'Coolpad 3300A'                             => [ 'Coolpad', '3300A' ],
+        'Coolpad 3320A'                             => [ 'Coolpad', '3320A' ],
+        'Coolpad 5010'                              => [ 'Coolpad', '5010' ],
+        'Coolpad 5108'                              => [ 'Coolpad', '5108' ],
+        'Coolpad 5109'                              => [ 'Coolpad', '5109' ],
+        'Coolpad 5110'                              => [ 'Coolpad', '5110' ],
+        'Coolpad 5200'                              => [ 'Coolpad', '5200' ],
+        'Coolpad 5200S'                             => [ 'Coolpad', '5200S' ],
+        'Coolpad 5210!'                             => [ 'Coolpad', '5210' ],
+        'Coolpad 5211'                              => [ 'Coolpad', '5211' ],
+        'Coolpad 5213'                              => [ 'Coolpad', '5213' ],
+        'Coolpad 5216!'                             => [ 'Coolpad', '5216' ],
+        'Coolpad 5217'                              => [ 'Coolpad', '5217' ],
+        'Coolpad 5218!'                             => [ 'Coolpad', '5218' ],
+        'Coolpad 5219'                              => [ 'Coolpad', '5219' ],
+        'Coolpad 5230!'                             => [ 'Coolpad', '5230' ],
+        'Coolpad 5261!'                             => [ 'Coolpad', '5261' ],
+        'Coolpad 5263!'                             => [ 'Coolpad', '5263' ],
+        'Coolpad 5310'                              => [ 'Coolpad', '5310' ],
+        'Coolpad 5311'                              => [ 'Coolpad', '5311' ],
+        'Coolpad 5313'                              => [ 'Coolpad', '5313' ],
+        'Coolpad 5313S'                             => [ 'Coolpad', '5313S' ],
+        'Coolpad 5316'                              => [ 'Coolpad', '5316' ],
+        'Coolpad 5360'                              => [ 'Coolpad', '5360' ],
+        'Coolpad 5820'                              => [ 'Coolpad', '5820' ],
+        'Coolpad 5832'                              => [ 'Coolpad', '5832' ],
+        'Coolpad 5860!'                             => [ 'Coolpad', '5860' ],
+        'Coolpad 5870'                              => [ 'Coolpad', '5870' ],
+        'Coolpad 5872'                              => [ 'Coolpad', '5872' ],
+        'Coolpad 5876'                              => [ 'Coolpad', '5876' ],
+        'Coolpad 5879'                              => [ 'Coolpad', '5879' ],
+        'Coolpad 5879T'                             => [ 'Coolpad', '5879T' ],
+        'Coolpad 5880'                              => [ 'Coolpad', '5880' ],
+        'Coolpad 5890'                              => [ 'Coolpad', '5890' ],
+        'Coolpad 5891!'                             => [ 'Coolpad', '5891' ],
+        'Coolpad 5892!'                             => [ 'Coolpad', '5892' ],
+        'Coolpad 5910'                              => [ 'Coolpad', '5910' ],
+        'Coolpad 5930'                              => [ 'Coolpad', '5930' ],
+        'Coolpad 5950'                              => [ 'Coolpad', '5950' ],
+        'Coolpad 5950T'                             => [ 'Coolpad', '5950T' ],
+        'Coolpad 5951'                              => [ 'Coolpad', '5951' ],
+        'Coolpad 5952'                              => [ 'Coolpad', '5952' ],
+        'Coolpad 5956'                              => [ 'Coolpad', '5956' ],
+        'Coolpad 7005'                              => [ 'Coolpad', '7005' ],
+        'Coolpad 7011'                              => [ 'Coolpad', '7011' ],
+        'Coolpad 7019!'                             => [ 'Coolpad', '7019' ],
+        'Coolpad 7020'                              => [ 'Coolpad', '7020' ],
+        'Coolpad 7060!'                             => [ 'Coolpad', '7060' ],
+        'Coolpad 7061'                              => [ 'Coolpad', '7061' ],
+        'Coolpad 7105'                              => [ 'Coolpad', '7105' ],
+        'Coolpad 7230!'                             => [ 'Coolpad', '7230' ],
+        'Coolpad 7231'                              => [ 'Coolpad', '7231' ],
+        'Coolpad 7232'                              => [ 'Coolpad', '7232' ],
+        'Coolpad 7235'                              => [ 'Coolpad', '7235' ],
+        'Coolpad 7236'                              => [ 'Coolpad', '7236' ],
+        'Coolpad 7251'                              => [ 'Coolpad', '7251' ],
+        'Coolpad 7260!'                             => [ 'Coolpad', '7260' ],
+        'Coolpad 7266'                              => [ 'Coolpad', '7266' ],
+        'Coolpad 7268'                              => [ 'Coolpad', '7268' ],
+        'Coolpad 7269'                              => [ 'Coolpad', '7269' ],
+        'Coolpad 7270'                              => [ 'Coolpad', '7270' ],
+        'Coolpad 7270 W00'                          => [ 'Coolpad', '7270' ],
+        'Coolpad 7275'                              => [ 'Coolpad', '7275' ],
+        'Coolpad 7290'                              => [ 'Coolpad', '7290' ],
+        'Coolpad 7295!'                             => [ 'Coolpad', '7295' ],
+        'Coolpad 7296'                              => [ 'Coolpad', '7296' ],
+        'Coolpad 7296S'                             => [ 'Coolpad', '7296S' ],
+        'Coolpad 7298A'                             => [ 'Coolpad', '7298A' ],
+        'Coolpad 7298D'                             => [ 'Coolpad', '7298D' ],
+        'Coolpad 7320'                              => [ 'Coolpad', '7320' ],
+        'Coolpad 7560U'                             => [ 'Coolpad', '7560U' ],
+        'Coolpad 7620L!'                            => [ 'Coolpad', '7620L' ],
+        'Coolpad 7728'                              => [ 'Coolpad', '7728' ],
+        'Coolpad 8010'                              => [ 'Coolpad', '8010' ],
+        'Coolpad 8012'                              => [ 'Coolpad', '8012' ],
+        'Coolpad 8013'                              => [ 'Coolpad', '8013' ],
+        'Coolpad 8017!'                             => [ 'Coolpad', '8017' ],
+        'Coolpad 8020!'                             => [ 'Coolpad', '8020' ],
+        'Coolpad 8021'                              => [ 'Coolpad', '8021' ],
+        'Coolpad 8022'                              => [ 'Coolpad', '8022' ],
+        'Coolpad 8026'                              => [ 'Coolpad', '8026' ],
+        'Coolpad 8028'                              => [ 'Coolpad', '8028' ],
+        'Coolpad 8029'                              => [ 'Coolpad', '8029' ],
+        'Coolpad 8050'                              => [ 'Coolpad', '8050' ],
+        'Coolpad 8056'                              => [ 'Coolpad', '8056' ],
+        'Coolpad -8056'                             => [ 'Coolpad', '8056' ],
+        'Coolpad 8060'                              => [ 'Coolpad', '8060' ],
+        'Coolpad 8070'                              => [ 'Coolpad', '8070' ],
+        'Coolpad 8070D'                             => [ 'Coolpad', '8070D' ],
+        'Coolpad 8071'                              => [ 'Coolpad', '8071' ],
+        'Coolpad 8076'                              => [ 'Coolpad', '8076' ],
+        'Coolpad -8076!'                            => [ 'Coolpad', '8076' ],
+        'Coolpad 8076D'                             => [ 'Coolpad', '8076' ],
+        'Coolpad 8079'                              => [ 'Coolpad', '8079' ],
+        'Coolpad 8085'                              => [ 'Coolpad', '8085' ],
+        'Coolpad 8085Q'                             => [ 'Coolpad', '8085' ],
+        'Coolpad 8089'                              => [ 'Coolpad', '8089' ],
+        'Coolpad 8105'                              => [ 'Coolpad', '8105' ],
+        'Coolpad 8122'                              => [ 'Coolpad', '8122' ],
+        'Coolpad 8150S'                             => [ 'Coolpad', '8150' ],
+        'Coolpad -?8190!'                           => [ 'Coolpad', '8190' ],
+        'Coolpad 8198T'                             => [ 'Coolpad', '8198T' ],
+        'Coolpad 8295M'                             => [ 'Coolpad', '8295M' ],
+        'Coolpad 8295!'                             => [ 'Coolpad', '8295' ],
+        'Coolpad 8297!'                             => [ 'Coolpad', 'Dashen F1' ],
+        'Coolpad F1 8297W'                          => [ 'Coolpad', 'Dashen F1' ],
+        'Coolpad 8670'                              => [ 'Coolpad', 'Note 8670' ],
+        'Coolpad 8675!'                             => [ 'Coolpad', 'Dashen F2' ],
+        'Coolpad 8676!'                             => [ 'Coolpad', 'Note 3 8676' ],
+        'Coolpad 8690!'                             => [ 'Coolpad', 'Dashen X7' ],
+        'Coolpad 8702'                              => [ 'Coolpad', '8702' ],
+        'Coolpad 8702D'                             => [ 'Coolpad', '8702D' ],
+        'Coolpad 8705'                              => [ 'Coolpad', '8705' ],
+        'Coolpad 8707'                              => [ 'Coolpad', '8707' ],
+        'Coolpad 8713'                              => [ 'Coolpad', '8713' ],
+        'Coolpad 8720L'                             => [ 'Coolpad', '8720L' ],
+        'Coolpad 8720Q'                             => [ 'Coolpad', '8720Q' ],
+        'Coolpad 8729'                              => [ 'Coolpad', '8729' ],
+        'Coolpad 8730L'                             => [ 'Coolpad', '8730L' ],
+        'Coolpad 8732'                              => [ 'Coolpad', '8732' ],
+        'Coolpad 8735'                              => [ 'Coolpad', '8735' ],
+        'Coolpad 8736'                              => [ 'Coolpad', '8736' ],
+        'Coolpad 8750'                              => [ 'Coolpad', 'Xuan Ying SII 8750' ],
+        'Coolpad 8809'                              => [ 'Coolpad', '8809' ],
+        'Coolpad 8810'                              => [ 'Coolpad', '8810' ],
+        'Coolpad 8811'                              => [ 'Coolpad', '8811' ],
+        'Coolpad 8860!'                             => [ 'Coolpad', '8860' ],
+        'Coolpad 8870!'                             => [ 'Coolpad', '8870' ],
+        'Coolpad 8908'                              => [ 'Coolpad', '8908' ],
+        'Coolpad 8920'                              => [ 'Coolpad', 'Quattro II 8920' ],
+        'Coolpad 8970L'                             => [ 'Coolpad', 'Grand 4 8970' ],
+        'Coolpad 8971'                              => [ 'Coolpad', '8971' ],
+        'Coolpad 9070'                              => [ 'Coolpad', '9070+XO' ],
+        'Coolpad 9080W'                             => [ 'Coolpad', '9080' ],
+        'Coolpad 9100'                              => [ 'Coolpad', '9100' ],
+        'Coolpad 9120'                              => [ 'Coolpad', '9120' ],
+        'Coolpad 9150'                              => [ 'Coolpad', 'Air 9150' ],
+        'Coolpad 9150W'                             => [ 'Coolpad', 'Air 9150' ],
+        'Coolpad 9190L!'                            => [ 'Coolpad', 'S6 9190' ],
+        'Coolpad 9190 T00'                          => [ 'Coolpad', 'S6 9190' ],
+        'Coolpad 9900'                              => [ 'Coolpad', '9900' ],
+        'Coolpad 9960'                              => [ 'Coolpad', 'Grand HD 9960' ],
+        'Coolpad 9970'                              => [ 'Coolpad', 'Grand 4 9970' ],
+        'Coolpad 9976!'                             => [ 'Coolpad', '9976' ],
+        'Coolpad Flo'                               => [ 'Coolpad', 'Flo' ],
+    ],
+
+    'D530'                                      => [ 'Coolpad', 'D530' ],
+    'D539'                                      => [ 'Coolpad', 'D539' ],
+    'E239'                                      => [ 'Coolpad', 'E239' ],
+    'N930'                                      => [ 'Coolpad', 'N930' ],
+    'W711'                                      => [ 'Coolpad', 'W711' ],
+    'CP3700A'                                   => [ 'Coolpad', '3700A' ],
+    '5560S'                                     => [ 'Coolpad', '5560S' ],
+    '5832'                                      => [ 'Coolpad', '5832' ],
+    '5855'                                      => [ 'Coolpad', '5855' ],
+    '5860'                                      => [ 'Coolpad', '5860' ],
+    '5860A'                                     => [ 'Coolpad', '5860A' ],
+    '5860E'                                     => [ 'Coolpad', 'Quattro 4G 5860E' ],
+    '5860S'                                     => [ 'Coolpad', '5860S' ],
+    '5870'                                      => [ 'Coolpad', '5870' ],
+    '7260'                                      => [ 'Coolpad', '7260' ],
+    '7266'                                      => [ 'Coolpad', '7266' ],
+    '8022'                                      => [ 'Coolpad', '8022' ],
+    '8190Q'                                     => [ 'Coolpad', '8190' ],
+    '8720'                                      => [ 'Coolpad', '8720' ],
+    '8720L'                                     => [ 'Coolpad', '8720' ],
+    '8810'                                      => [ 'Coolpad', '8810' ],
+    '801ES'                                     => [ 'Coolpad', 'Quattro II 4G' ],
+    'CP8298 I00'                                => [ 'Coolpad', 'Note 3 Lite' ],
+
+    'COSHIP F2'                                 => [ 'Coship', 'F2' ],
+
+    'COWON!!' => [
+        'COWON D3'                                  => [ 'Cowon', 'D3 Plenue', DeviceType::MEDIA ],
+        'COWON Z2'                                  => [ 'Cowon', 'Z2 Plenue', DeviceType::MEDIA ],
+    ],
+
+    'COZCO C1 Plus'                             => [ 'Cozco', 'C1 Plus' ],
+    'CLP281X'                                   => [ 'Craig', 'CLP281x', DeviceType::TABLET ],
+
+    'CMP!!' => [
+        'CMP741d'                                   => [ 'Craig', 'CMP741d', DeviceType::TABLET ],
+        'CMP741E'                                   => [ 'Craig', 'CMP741e', DeviceType::TABLET ],
+        'CMP745E'                                   => [ 'Craig', 'CMP745e', DeviceType::TABLET ],
+        'CMP748'                                    => [ 'Craig', 'CMP748', DeviceType::TABLET ],
+        'CMP749'                                    => [ 'Craig', 'CMP749', DeviceType::TABLET ],
+        'CMP756'                                    => [ 'Craig', 'CMP756', DeviceType::TABLET ],
+        'CMP 765'                                   => [ 'Craig', 'CMP765', DeviceType::TABLET ],
+    ],
+
+    'ZEN Touch 2'                               => [ 'Creative', 'ZEN Touch 2', DeviceType::MEDIA ],
+
+    'Zii!!' => [
+        'ZiiO7'                                     => [ 'Creative', 'ZiiO 7', DeviceType::TABLET ],
+        'ZiiLABS ZiiO7'                             => [ 'Creative', 'ZiiO 7', DeviceType::TABLET ],
+        'ZiiLABS ZiiO10'                            => [ 'Creative', 'ZiiO 10', DeviceType::TABLET ],
+        'ZiiLABS ZiiO10 '                           => [ 'Creative', 'ZiiO 10', DeviceType::TABLET ],
+        'ZiiLABS ZiiO10+'                           => [ 'Creative', 'ZiiO 10', DeviceType::TABLET ],
+        'ZiiLABS ZiiO Shenbi'                       => [ 'Creative', 'ZiiO ShenBi', DeviceType::TABLET ],
+        'Zii EGG'                                   => [ 'Creative', 'Zii Egg', DeviceType::MEDIA ],
+    ],
+
+    'CTP828BT'                                  => [ 'Cresta', 'CTP828BT', DeviceType::TABLET ],
+    'CRESTA.CTP888'                             => [ 'Cresta', 'CTP888', DeviceType::TABLET ],
+
+    'Cross!!' => [
+        'CROSS-A1'                                  => [ 'Cross', 'A1' ],
+        'Cross A2'                                  => [ 'Cross', 'A2' ],
+        'CROSS A5'                                  => [ 'Cross', 'A5' ],
+        'CROSS A5B'                                 => [ 'Cross', 'A5B' ],
+        'Cross A7*'                                 => [ 'Cross', 'A7' ],
+        'CROSS A7#'                                 => [ 'Cross', 'A7' ],
+        'Cross Andromeda A7*'                       => [ 'Cross', 'A7' ],
+        'CROSS A7S'                                 => [ 'Cross', 'A7S' ],
+        'CROSSA7S'                                  => [ 'Cross', 'A7S' ],
+        'CROSS A10'                                 => [ 'Cross', 'A10' ],
+        'CROSS A11'                                 => [ 'Cross', 'A11' ],
+        'CrossA18'                                  => [ 'Cross', 'A18' ],
+        'CROSS-A20G'                                => [ 'Cross', 'A20G' ],
+        'Cross A22'                                 => [ 'Cross', 'A22' ],
+        'Cross A25'                                 => [ 'Cross', 'A25' ],
+        'CROSS A26'                                 => [ 'Cross', 'A26' ],
+        'CROSS A27'                                 => [ 'Cross', 'A27' ],
+        'CROSS A28'                                 => [ 'Cross', 'A28' ],
+        'CROSS A66'                                 => [ 'Cross', 'A66' ],
+        'CROSS A88'                                 => [ 'Cross', 'A88' ],
+        'CROSS AT1'                                 => [ 'Cross', 'AT1', DeviceType::TABLET ],
+        'CROSS AT1G'                                => [ 'Cross', 'AT1G', DeviceType::TABLET ],
+        'CROSS AT1G*'                               => [ 'Cross', 'AT1G', DeviceType::TABLET ],
+    ],
+
+    'Crosscall!!' => [
+        'Crosscall ELEMENT'                         => [ 'Crosscall', 'ELEMENT' ],
+        'CROSSCALL WILD'                            => [ 'Crosscall', 'WILD' ],
+    ],
+
+    'Novapad!!' => [
+        'Novapad 70 D124 FC'                        => [ 'Crypto', 'NovaPad 70 D124', DeviceType::TABLET ],
+        'Novapad 70 S124 FC'                        => [ 'Crypto', 'NovaPad 70 S124', DeviceType::TABLET ],
+        'NovaPad80C104'                             => [ 'Crypto', 'NovaPad 80 C104', DeviceType::TABLET ],
+        'NovaPad 80 C124'                           => [ 'Crypto', 'NovaPad 80 C124', DeviceType::TABLET ],
+        'Novapad D7000'                             => [ 'Crypto', 'NovaPad D7000', DeviceType::TABLET ],
+        'Novapad D7001'                             => [ 'Crypto', 'NovaPad D7001', DeviceType::TABLET ],
+        'Novapad D7002'                             => [ 'Crypto', 'NovaPad D7002', DeviceType::TABLET ],
+    ],
+
+    'CUBOT!!' => [
+        'CUBOT C7'                                  => [ 'Cubot', 'C7' ],
+        'CUBOT C7+'                                 => [ 'Cubot', 'C7+' ],
+        'CUBOT C9+'                                 => [ 'Cubot', 'C9+' ],
+        'CUBOT C9W'                                 => [ 'Cubot', 'C9W' ],
+        'CUBOT C11'                                 => [ 'Cubot', 'C11' ],
+        'CUBOT GT72E'                               => [ 'Cubot', 'GT72E' ],
+        'CUBOT GT99'                                => [ 'Cubot', 'GT99' ],
+        'CUBOT ONE'                                 => [ 'Cubot', 'One' ],
+        'CUBOT ONE-S'                               => [ 'Cubot', 'One S' ],
+        'CUBOT P7'                                  => [ 'Cubot', 'P7' ],
+        'CUBOT P9'                                  => [ 'Cubot', 'P9' ],
+        'CUBOT S108'                                => [ 'Cubot', 'S108' ],
+        'CUBOT S222'                                => [ 'Cubot', 'S222' ],
+        'CUBOT X6'                                  => [ 'Cubot', 'X6' ],
+    ],
+
+    'S222'                                      => [ 'Cubot', 'S222' ],
+    'S308'                                      => [ 'Cubot', 'S308' ],
+
+    '(CUBE ?)?(K8|U1|U2|U3|U5|U6|U8|U9)[0-9]?GT!!' => [
+        'CUBE K8GT'                                 => [ 'Cube', 'K8GT', DeviceType::TABLET ],
+        'CUBE K8GT A'                               => [ 'Cube', 'K8GT A', DeviceType::TABLET ],
+        'CUBE K8GT B'                               => [ 'Cube', 'K8GT B', DeviceType::TABLET ],
+        'K8GT C'                                    => [ 'Cube', 'K8GT C', DeviceType::TABLET ],
+        'K8GT H'                                    => [ 'Cube', 'K8GT H', DeviceType::TABLET ],
+        'CUBE K8GT H'                               => [ 'Cube', 'K8GT H', DeviceType::TABLET ],
+        'K8GT W'                                    => [ 'Cube', 'K8GT W', DeviceType::TABLET ],
+        'CUBE U8GT'                                 => [ 'Cube', 'U8GT', DeviceType::TABLET ],
+        'CUBE U9GT'                                 => [ 'Cube', 'U9GT', DeviceType::TABLET ],
+        'CUBE U9 GT'                                => [ 'Cube', 'U9GT', DeviceType::TABLET ],
+        'U9GT'                                      => [ 'Cube', 'U9GT', DeviceType::TABLET ],
+        'U9GT S'                                    => [ 'Cube', 'U9GT S', DeviceType::TABLET ],
+        'U9GT-S'                                    => [ 'Cube', 'U9GT S', DeviceType::TABLET ],
+        'U9GT S A'                                  => [ 'Cube', 'U9GT SA', DeviceType::TABLET ],
+        'U9GTS A'                                   => [ 'Cube', 'U9GT SA', DeviceType::TABLET ],
+        'U9GT-SA'                                   => [ 'Cube', 'U9GT SA', DeviceType::TABLET ],
+        'U9GT V'                                    => [ 'Cube', 'U9GT V', DeviceType::TABLET ],
+        'U9GT V Core 4'                             => [ 'Cube', 'U9GT V', DeviceType::TABLET ],
+        'CUBE U9GT ?2!'                             => [ 'Cube', 'U9GT2', DeviceType::TABLET ],
+        'Cube U9GT-2'                               => [ 'Cube', 'U9GT2', DeviceType::TABLET ],
+        'U9GT2!'                                    => [ 'Cube', 'U9GT2', DeviceType::TABLET ],
+        'N90 From moage.com'                        => [ 'Cube', 'U9GT2', DeviceType::TABLET ],
+        'U9GT3'                                     => [ 'Cube', 'U9GT3', DeviceType::TABLET ],
+        'U9GT3-S'                                   => [ 'Cube', 'U9GT3 S', DeviceType::TABLET ],
+        'U9GT4'                                     => [ 'Cube', 'U9GT4', DeviceType::TABLET ],
+        'U10GT A'                                   => [ 'Cube', 'U10GT A', DeviceType::TABLET ],
+        'U10GT-A'                                   => [ 'Cube', 'U10GT A', DeviceType::TABLET ],
+        'U10GT S'                                   => [ 'Cube', 'U10GT S', DeviceType::TABLET ],
+        'U10GT 2'                                   => [ 'Cube', 'U10GT2', DeviceType::TABLET ],
+        'CUBE U15GT'                                => [ 'Cube', 'U15GT', DeviceType::TABLET ],
+        'U18GT'                                     => [ 'Cube', 'U18GT', DeviceType::TABLET ],
+        'U18GT-H'                                   => [ 'Cube', 'U18GT H', DeviceType::TABLET ],
+        'U18GT-S'                                   => [ 'Cube', 'U18GT S', DeviceType::TABLET ],
+        'U18GT-W'                                   => [ 'Cube', 'U18GT W', DeviceType::TABLET ],
+        'U18GTW'                                    => [ 'Cube', 'U18GT W', DeviceType::TABLET ],
+        'U18GT2'                                    => [ 'Cube', 'U18GT2', DeviceType::TABLET ],
+        'U19GT-W'                                   => [ 'Cube', 'U19GT W', DeviceType::TABLET ],
+        'U21GT'                                     => [ 'Cube', 'U21GT', DeviceType::TABLET ],
+        'U20GT'                                     => [ 'Cube', 'U20GT', DeviceType::TABLET ],
+        'U20GT WS'                                  => [ 'Cube', 'U20GT WS', DeviceType::TABLET ],
+        'U23GT'                                     => [ 'Cube', 'U23GT', DeviceType::TABLET ],
+        'U23GT-S'                                   => [ 'Cube', 'U23GT S', DeviceType::TABLET ],
+        'U23GTC4'                                   => [ 'Cube', 'U23GT C4', DeviceType::TABLET ],
+        'U25GT'                                     => [ 'Cube', 'U25GT', DeviceType::TABLET ],
+        'CUBE U25GT'                                => [ 'Cube', 'U25GT', DeviceType::TABLET ],
+        'U25GT PRO'                                 => [ 'Cube', 'U25GT Pro', DeviceType::TABLET ],
+        'U25GT-W'                                   => [ 'Cube', 'U25GT W', DeviceType::TABLET ],
+        'U25GT-W4'                                  => [ 'Cube', 'U25GT W4', DeviceType::TABLET ],
+        'U25GT-BN'                                  => [ 'Cube', 'U25GT BN', DeviceType::TABLET ],
+        'U25GT-C4'                                  => [ 'Cube', 'U25GT C4', DeviceType::TABLET ],
+        'U25GT-C4W'                                 => [ 'Cube', 'U25GT C4W', DeviceType::TABLET ],
+        'U25GT-C4WB'                                => [ 'Cube', 'U25GT C4WB', DeviceType::TABLET ],
+        'U25GT-C4Y'                                 => [ 'Cube', 'U25GT C4Y', DeviceType::TABLET ],
+        'U25GT-YR'                                  => [ 'Cube', 'U25GT YR', DeviceType::TABLET ],
+        'U25GT2-H'                                  => [ 'Cube', 'U25GT2 H', DeviceType::TABLET ],
+        'U25GT2-T'                                  => [ 'Cube', 'U25GT2 T', DeviceType::TABLET ],
+        'U27GT'                                     => [ 'Cube', 'U27GT', DeviceType::TABLET ],
+        'U27GT-C8'                                  => [ 'Cube', 'U27GT C8', DeviceType::TABLET ],
+        'U27GT-C8P'                                 => [ 'Cube', 'U27GT C8P', DeviceType::TABLET ],
+        'U27GT-SD'                                  => [ 'Cube', 'U27GT SD', DeviceType::TABLET ],
+        'U27GT-3G'                                  => [ 'Cube', 'U27GT 3G', DeviceType::TABLET ],
+        'U27GT-3GH'                                 => [ 'Cube', 'U27GT 3GH', DeviceType::TABLET ],
+        'U27GT-3GHY'                                => [ 'Cube', 'U27GT 3GHY', DeviceType::TABLET ],
+        'U28GT'                                     => [ 'Cube', 'U28GT', DeviceType::TABLET ],
+        'U30GT'                                     => [ 'Cube', 'U30GT', DeviceType::TABLET ],
+        'U30GT C4'                                  => [ 'Cube', 'U30GT C4', DeviceType::TABLET ],
+        'U30GT-H'                                   => [ 'Cube', 'U30GT H', DeviceType::TABLET ],
+        'U30GT-H By BiscuitTeam'                    => [ 'Cube', 'U30GT H', DeviceType::TABLET ],
+        'U30GT-HS'                                  => [ 'Cube', 'U30GT HS', DeviceType::TABLET ],
+        'U30GT-M'                                   => [ 'Cube', 'U30GT M', DeviceType::TABLET ],
+        'U30GT-MS'                                  => [ 'Cube', 'U30GT MS', DeviceType::TABLET ],
+        'U30GTm2'                                   => [ 'Cube', 'U30GT M2', DeviceType::TABLET ],
+        'U30GT MINI'                                => [ 'Cube', 'U30GT Mini', DeviceType::TABLET ],
+        'U30GT-mini'                                => [ 'Cube', 'U30GT Mini', DeviceType::TABLET ],
+        'U30GT-W'                                   => [ 'Cube', 'U30GT W', DeviceType::TABLET ],
+        'u30gt2'                                    => [ 'Cube', 'U30GT2', DeviceType::TABLET ],
+        'U30GT 2'                                   => [ 'Cube', 'U30GT2', DeviceType::TABLET ],
+        'U30GT-2'                                   => [ 'Cube', 'U30GT2', DeviceType::TABLET ],
+        'U30GT 2MH'                                 => [ 'Cube', 'U30GT2 MH', DeviceType::TABLET ],
+        'U31GT'                                     => [ 'Cube', 'U31GT', DeviceType::TABLET ],
+        'U33GT'                                     => [ 'Cube', 'U33GT', DeviceType::TABLET ],
+        'U35GT'                                     => [ 'Cube', 'U35GT', DeviceType::TABLET ],
+        'U35GT-W'                                   => [ 'Cube', 'U35GT W', DeviceType::TABLET ],
+        'U35GT2'                                    => [ 'Cube', 'U35GT2', DeviceType::TABLET ],
+        'U39GT'                                     => [ 'Cube', 'U39GT', DeviceType::TABLET ],
+        'U39GT-W'                                   => [ 'Cube', 'U39GT W', DeviceType::TABLET ],
+        'U39GT-3G'                                  => [ 'Cube', 'U39GT 3G', DeviceType::TABLET ],
+        'U51GT'                                     => [ 'Cube', 'U51GT', DeviceType::TABLET ],
+        'U51GT-S'                                   => [ 'Cube', 'U51GT S', DeviceType::TABLET ],
+        'U51GT-W'                                   => [ 'Cube', 'U51GT W', DeviceType::TABLET ],
+        'U51GT C4'                                  => [ 'Cube', 'U51GT C4', DeviceType::TABLET ],
+        'U51GT-C4'                                  => [ 'Cube', 'U51GT C4', DeviceType::TABLET ],
+        'U51GT-C4B'                                 => [ 'Cube', 'U51GT C4B', DeviceType::TABLET ],
+        'U51GT-C4BD'                                => [ 'Cube', 'U51GT C4BD', DeviceType::TABLET ],
+        'U51GT-C8'                                  => [ 'Cube', 'U51GT C8', DeviceType::TABLET ],
+        'U51GT-C8P'                                 => [ 'Cube', 'U51GT C8S', DeviceType::TABLET ],
+        'U51GT-C8S'                                 => [ 'Cube', 'U51GT C8S', DeviceType::TABLET ],
+        'U51GT-4G'                                  => [ 'Cube', 'U51GT 4G', DeviceType::TABLET ],
+        'U55GT'                                     => [ 'Cube', 'U55GT', DeviceType::TABLET ],
+        'U55GT C8'                                  => [ 'Cube', 'U55GT C8', DeviceType::TABLET ],
+        'U55GT S'                                   => [ 'Cube', 'U55GT S', DeviceType::TABLET ],
+        'U59GT-C4'                                  => [ 'Cube', 'U59GT C4', DeviceType::TABLET ],
+        'U65GT'                                     => [ 'Cube', 'U65GT', DeviceType::TABLET ],
+    ],
+
+    'CUBE!!' => [
+        'CUBE Q7PRO'                                => [ 'Cube', 'Q7 Pro', DeviceType::TABLET ],
+        'CUBE Q7PRO J'                              => [ 'Cube', 'Q7 Pro', DeviceType::TABLET ],
+        'CUBE TALK7X'                               => [ 'Cube', 'Talk 7X', DeviceType::TABLET ],
+        'CUBE TALK7X C4'                            => [ 'Cube', 'Talk 7X C4', DeviceType::TABLET ],
+    ],
+
+    'LT[0-9]{4,4}!!' => [
+        'LT7033'                                    => [ 'Curtis', 'Klu LT7033', DeviceType::TABLET ],
+        'LT7035-F'                                  => [ 'Curtis', 'Klu LT7035-F', DeviceType::TABLET ],
+        'LT7035-J'                                  => [ 'Curtis', 'Klu LT7035-J', DeviceType::TABLET ],
+        'LT7035-L'                                  => [ 'Curtis', 'Klu LT7035-L', DeviceType::TABLET ],
+        'LT7052'                                    => [ 'Curtis', 'Klu LT7052', DeviceType::TABLET ],
+        'LT8088'                                    => [ 'Curtis', 'Klu LT8088', DeviceType::TABLET ],
+    ],
+
+    'Cydle M7!'                                 => [ 'Cydle', 'M7 MultiPAD', DeviceType::TABLET ],
+    'EVDO1000'                                  => [ 'Cyrus', 'EVDO 1000' ],
+    'GloryG1000'                                => [ 'Cyrus', 'Glory G1000' ],
+    'TVPAD Slim K3409'                          => [ 'Cyrus', 'TVPad Slim K3409', DeviceType::TABLET ],
+
+    'D2-[0-9]{3,3}!!' => [
+        'D2-711'                                    => [ 'D2pad', 'D2-711', DeviceType::TABLET ],
+        'D2-712'                                    => [ 'D2pad', 'D2-712', DeviceType::TABLET ],
+        'D2-721'                                    => [ 'D2pad', 'D2-721', DeviceType::TABLET ],
+        'D2-721G'                                   => [ 'D2pad', 'D2-721G', DeviceType::TABLET ],
+        'D2-727'                                    => [ 'D2pad', 'D2-727', DeviceType::TABLET ],
+        'D2-751G'                                   => [ 'D2pad', 'D2-751G', DeviceType::TABLET ],
+        'D2-911'                                    => [ 'D2pad', 'D2-911', DeviceType::TABLET ],
+        'D2-912'                                    => [ 'D2pad', 'D2-912', DeviceType::TABLET ],
+        'D2-927G'                                   => [ 'D2pad', 'D2-927G', DeviceType::TABLET ],
+        'D2-961G'                                   => [ 'D2pad', 'D2-961G', DeviceType::TABLET ],
+    ],
+
+    'Dakele A380'                               => [ 'Dakele', 'A380' ],
+    'DAKELE MC001'                              => [ 'Dakele', 'MC001' ],
+    'MC002'                                     => [ 'Dakele', 'MC002' ],
+
+    'Dslide!!' => [
+        'Dslide 700'                                => [ 'Danew', 'DSlide 700', DeviceType::TABLET ],
+        'Dslide 702'                                => [ 'Danew', 'DSlide 702', DeviceType::TABLET ],
+        'Dslide 703R'                               => [ 'Danew', 'DSlide 703R', DeviceType::TABLET ],
+        'Dslide 704'                                => [ 'Danew', 'DSlide 704', DeviceType::TABLET ],
+        'Dslide 706'                                => [ 'Danew', 'DSlide 706', DeviceType::TABLET ],
+        'Dslide 707'                                => [ 'Danew', 'DSlide 707', DeviceType::TABLET ],
+        'Dslide800'                                 => [ 'Danew', 'DSlide 800', DeviceType::TABLET ],
+        'Dslide801'                                 => [ 'Danew', 'DSlide 801', DeviceType::TABLET ],
+        'Dslide900'                                 => [ 'Danew', 'DSlide 900', DeviceType::TABLET ],
+        'Dslide 971'                                => [ 'Danew', 'DSlide 971', DeviceType::TABLET ],
+        'Dslide971DC'                               => [ 'Danew', 'DSlide 971', DeviceType::TABLET ],
+        'DSlide972'                                 => [ 'Danew', 'DSlide 972', DeviceType::TABLET ],
+        'DSlide973'                                 => [ 'Danew', 'DSlide 973', DeviceType::TABLET ],
+        'Dslide973QC'                               => [ 'Danew', 'DSlide 973', DeviceType::TABLET ],
+        'DSlide 1013'                               => [ 'Danew', 'DSlide 1013', DeviceType::TABLET ],
+    ],
+
+    'Genius!!' => [
+        'Genius TAB GIII'                           => [ 'Dany', 'Genius Tab G3', DeviceType::TABLET ],
+        'GENIUS-G4'                                 => [ 'Dany', 'Genius Tab G4', DeviceType::TABLET ],
+        'Genius TAB G4'                             => [ 'Dany', 'Genius Tab G4', DeviceType::TABLET ],
+        'Genius Tab Q4'                             => [ 'Dany', 'Genius Tab Q4', DeviceType::TABLET ],
+    ],
+
+    'EvoPAD!!' => [
+        'EvoPAD A7000'                              => [ 'Dark', 'EvoPad A7000', DeviceType::TABLET ],
+        'EvoPad-R1020'                              => [ 'Dark', 'EvoPad R1020', DeviceType::TABLET ],
+        'EVOPad R8000'                              => [ 'Dark', 'EvoPad R8000', DeviceType::TABLET ],
+        'EVOPad R8020'                              => [ 'Dark', 'EvoPad R8020', DeviceType::TABLET ],
+        'EVOPad R9720'                              => [ 'Dark', 'EvoPad R9720', DeviceType::TABLET ],
+        'EvoPAD R9740'                              => [ 'Dark', 'EvoPad R9740', DeviceType::TABLET ],
+        'EvoPAD-R9722'                              => [ 'Dark', 'EvoPad R9722', DeviceType::TABLET ],
+        'Evopad R9730'                              => [ 'Dark', 'EvoPad R9730', DeviceType::TABLET ],
+    ],
+
+    'HB-100 DASAN'                              => [ 'Dasan', 'HB-100', DeviceType::TELEVISION ],
+    'HB-100 DASAN Networks, Inc.'               => [ 'Dasan', 'HB-100', DeviceType::TELEVISION ],
+
+    'Mini 3iG'                                  => [ 'Dell', 'Aero' ],
+    'BizSmartPhone'                             => [ 'Dell', 'Biz SmartPhone' ],
+    '001DL'                                     => [ 'Dell', 'STREAK 001DL', DeviceType::TABLET, 'carrier' => 'Softbank' ],
+    '101DL'                                     => [ 'Dell', 'STREAK PRO 101DL', DeviceType::TABLET, 'carrier' => 'Softbank' ],
+    'GS01'                                      => [ 'Dell', 'STREAK PRO GS01', DeviceType::TABLET, 'carrier' => 'EMOBILE' ],
+    'streak7'                                   => [ 'Dell', 'Streak 7', DeviceType::TABLET ],
+    'CS-1A13'                                   => [ 'Dell', 'Wyse Cloud Connect', DeviceType::TELEVISION ],
+
+    'Dell!!' => [
+        'Dell Aero'                                 => [ 'Dell', 'Aero' ],
+        'Dell Grappa'                               => [ 'Dell', 'Aero' ],
+        'Dell M01M'                                 => [ 'Dell', 'Streak', DeviceType::TABLET ],
+        'Dell Mini 5'                               => [ 'Dell', 'Streak', DeviceType::TABLET ],
+        'Dell Streak mini5'                         => [ 'Dell', 'Streak', DeviceType::TABLET ],
+        'Dell Streak'                               => [ 'Dell', 'Streak', DeviceType::TABLET ],
+        'Dell V04B'                                 => [ 'Dell', 'Streak Pro', DeviceType::TABLET ],
+        'Dell Streak Pro'                           => [ 'Dell', 'Streak Pro', DeviceType::TABLET ],
+        'Dell Streak Pro (D43)'                     => [ 'Dell', 'Streak Pro', DeviceType::TABLET ],
+        'Dell Streak Pro (GS01)'                    => [ 'Dell', 'Streak Pro', DeviceType::TABLET ],
+        'Dell Streak Pro D43'                       => [ 'Dell', 'Streak Pro', DeviceType::TABLET ],
+        'Dell Streak 7'                             => [ 'Dell', 'Streak 7', DeviceType::TABLET ],
+        'Dell Streak 10 Pro'                        => [ 'Dell', 'Streak 10 Pro', DeviceType::TABLET ],
+        'Dell streak 10 Pro 940'                    => [ 'Dell', 'Streak 10 Pro', DeviceType::TABLET ],
+        'Dell Venue'                                => [ 'Dell', 'Venue' ],
+    ],
+
+    'Venue!!' => [
+        'venue 7'                                   => [ 'Dell', 'Venue 7', DeviceType::TABLET ],
+        'Venue 7 3730'                              => [ 'Dell', 'Venue 7', DeviceType::TABLET ],
+        'Venue 7 3736'                              => [ 'Dell', 'Venue 7', DeviceType::TABLET ],
+        'Venue 7 3740'                              => [ 'Dell', 'Venue 7', DeviceType::TABLET ],
+        'Venue7 3740'                               => [ 'Dell', 'Venue 7', DeviceType::TABLET ],
+        'Venue7 3740 LTE'                           => [ 'Dell', 'Venue 7', DeviceType::TABLET ],
+        'Venue7 3740 HSPA+'                         => [ 'Dell', 'Venue 7', DeviceType::TABLET ],
+        'Venue 3740 LTE'                            => [ 'Dell', 'Venue 7', DeviceType::TABLET ],
+        'Venue 7 3741'                              => [ 'Dell', 'Venue 7', DeviceType::TABLET ],
+        'Venue 7 HSPA+'                             => [ 'Dell', 'Venue 7', DeviceType::TABLET ],
+        'Venue 7 WWAN'                              => [ 'Dell', 'Venue 7', DeviceType::TABLET ],
+        'Venue 8 HSPA+'                             => [ 'Dell', 'Venue 8', DeviceType::TABLET ],
+        'Venue 8 WiFi'                              => [ 'Dell', 'Venue 8', DeviceType::TABLET ],
+        'Venue 8 3830'                              => [ 'Dell', 'Venue 8', DeviceType::TABLET ],
+        'Venue 8 3840'                              => [ 'Dell', 'Venue 8', DeviceType::TABLET ],
+        'Venue8 3840'                               => [ 'Dell', 'Venue 8', DeviceType::TABLET ],
+        'Venue8 3840 LTE'                           => [ 'Dell', 'Venue 8', DeviceType::TABLET ],
+        'Venue 8 7040'                              => [ 'Dell', 'Venue 8', DeviceType::TABLET ],
+        'Venue 8 7840'                              => [ 'Dell', 'Venue 8', DeviceType::TABLET ],
+        'Venue 8 7840 LTE'                          => [ 'Dell', 'Venue 8', DeviceType::TABLET ],
+        'Venue 10 5050'                             => [ 'Dell', 'Venue 10', DeviceType::TABLET ],
+        'Venue 10 7040'                             => [ 'Dell', 'Venue 10', DeviceType::TABLET ],
+        'Venue 11 Pro 7130 MS'                      => [ 'Dell', 'Venue 11', DeviceType::TABLET ],
+    ],
+
+    'XCD 28'                                    => [ 'Dell', 'XCD28' ],
+    'Dell XCD35'                                => [ 'Dell', 'XCD35' ],
+    'XCD35'                                     => [ 'Dell', 'XCD35' ],
+    'DEM752HCF'                                 => [ 'Denver', 'TAC-7018', DeviceType::TABLET ],
+
+    '(DENVER-)?TA[CD]-[0-9]{4,5}!!' => [
+        'TAC-7028'                                  => [ 'Denver', 'TAC-7028', DeviceType::TABLET ],
+        'TAC-10011'                                 => [ 'Denver', 'TAC-10011', DeviceType::TABLET ],
+        'TAC-10031'                                 => [ 'Denver', 'TAC-10031', DeviceType::TABLET ],
+        'TAC-10031 MK2'                             => [ 'Denver', 'TAC-10031', DeviceType::TABLET ],
+        'TAC-70031'                                 => [ 'Denver', 'TAC-70031', DeviceType::TABLET ],
+        'TAC-70041'                                 => [ 'Denver', 'TAC-70041', DeviceType::TABLET ],
+        'TAC-70051'                                 => [ 'Denver', 'TAC-70051', DeviceType::TABLET ],
+        'TAC-70061'                                 => [ 'Denver', 'TAC-70061', DeviceType::TABLET ],
+        'TAC-70072'                                 => [ 'Denver', 'TAC-70072', DeviceType::TABLET ],
+        'TAC-70072kc'                               => [ 'Denver', 'TAC-70072', DeviceType::TABLET ],
+        'TAD-70092 PINK MK2 PO8318'                 => [ 'Denver', 'TAC-70092', DeviceType::TABLET ],
+        'TAD-70102G'                                => [ 'Denver', 'TAC-70102G', DeviceType::TABLET ],
+        'TAC-70111'                                 => [ 'Denver', 'TAC-70111', DeviceType::TABLET ],
+        'TAC-70111 PO8195'                          => [ 'Denver', 'TAC-70111', DeviceType::TABLET ],
+        'TAC-70111 PO8241'                          => [ 'Denver', 'TAC-70111', DeviceType::TABLET ],
+        'TAC-70111 PO8242'                          => [ 'Denver', 'TAC-70111', DeviceType::TABLET ],
+        'TAD-70111 PO8306'                          => [ 'Denver', 'TAC-70111', DeviceType::TABLET ],
+        'TAD-70111MK2'                              => [ 'Denver', 'TAC-70111', DeviceType::TABLET ],
+        'TAD-70112 PO8278'                          => [ 'Denver', 'TAC-70112', DeviceType::TABLET ],
+        'TAD-70112KC PO8347'                        => [ 'Denver', 'TAC-70112', DeviceType::TABLET ],
+        'TAD-70132 PO8575'                          => [ 'Denver', 'TAC-70132', DeviceType::TABLET ],
+        'TAC-80011'                                 => [ 'Denver', 'TAC-80011', DeviceType::TABLET ],
+        'TAC-90011'                                 => [ 'Denver', 'TAC-90011', DeviceType::TABLET ],
+        'TAC-90012'                                 => [ 'Denver', 'TAC-90012', DeviceType::TABLET ],
+        'TAC-97032'                                 => [ 'Denver', 'TAC-97032', DeviceType::TABLET ],
+        'TAC-97052'                                 => [ 'Denver', 'TAC-97052', DeviceType::TABLET ],
+        'TAD-10021'                                 => [ 'Denver', 'TAD-10021', DeviceType::TABLET ],
+        'TAD-10023'                                 => [ 'Denver', 'TAD-10023', DeviceType::TABLET ],
+        'TAD-10062'                                 => [ 'Denver', 'TAD-10062', DeviceType::TABLET ],
+        'TAD-10063 MK2 PO8311'                      => [ 'Denver', 'TAD-10063', DeviceType::TABLET ],
+        'DENVER-TAD-10082'                          => [ 'Denver', 'TAD-10082', DeviceType::TABLET ],
+        'TAD-70091'                                 => [ 'Denver', 'TAD-70091', DeviceType::TABLET ],
+        'TAD-70092'                                 => [ 'Denver', 'TAD-70092', DeviceType::TABLET ],
+        'TAD-70092 BLACK MK2 PO8341'                => [ 'Denver', 'TAD-70092', DeviceType::TABLET ],
+        'TAD-70111PO8275'                           => [ 'Denver', 'TAD-70111', DeviceType::TABLET ],
+        'TAD-70111 PO8307'                          => [ 'Denver', 'TAD-70111', DeviceType::TABLET ],
+        'TAD-70112PO8197'                           => [ 'Denver', 'TAD-70112', DeviceType::TABLET ],
+        'TAD-70112 PO8292'                          => [ 'Denver', 'TAD-70112', DeviceType::TABLET ],
+        'TAD-70112KC PO8360'                        => [ 'Denver', 'TAD-70112', DeviceType::TABLET ],
+        'TAD-90021'                                 => [ 'Denver', 'TAD-90021', DeviceType::TABLET ],
+        'TAD-90022'                                 => [ 'Denver', 'TAD-90022', DeviceType::TABLET ],
+        'TAD-97052'                                 => [ 'Denver', 'TAD-97052', DeviceType::TABLET ],
+        'TAD-97052mk2'                              => [ 'Denver', 'TAD-97052', DeviceType::TABLET ],
+        'TAD-97072G'                                => [ 'Denver', 'TAD-97072', DeviceType::TABLET ],
+        'TAD-97082!'                                => [ 'Denver', 'TAD-97082', DeviceType::TABLET ],
+    ],
+
+    'deovo V5'                                  => [ 'deovo', 'V5' ],
+
+    'DESAY!!' => [
+        'DESAY TS808'                               => [ 'Desay', 'TS808' ],
+        'DESAY TS908'                               => [ 'Desay', 'TS908' ],
+        'DESAY TS928'                               => [ 'Desay', 'TS928' ],
+        'DESAY TS1008'                              => [ 'Desay', 'TS1008' ],
+        'DESAY TS1018'                              => [ 'Desay', 'TS1018' ],
+        'DESAY TS1218'                              => [ 'Desay', 'TS1218' ],
+    ],
+
+    'iP977'                                     => [ 'Dex', 'iP977', DeviceType::TABLET ],
+
+    'Dialog!!' => [
+        'Dialog i35'                                => [ 'Dialog', 'i35' ],
+        'Dialog i43'                                => [ 'Dialog', 'i43' ],
+        'Dialog i43(ICS)'                           => [ 'Dialog', 'i43' ],
+        'Dialog K35'                                => [ 'Dialog', 'K35' ],
+        'Dialog K45'                                => [ 'Dialog', 'K45' ],
+        'Dialog K235'                               => [ 'Dialog', 'K235' ],
+        'Dialog Q143L'                              => [ 'Dialog', 'Q143L' ],
+        'Dialog Q178'                               => [ 'Dialog', 'Q178' ],
+        'Dialog Q243'                               => [ 'Dialog', 'Q243' ],
+    ],
+
+    'DIT[0-9]{4,6}!!' => [
+        'DIT1010'                                   => [ 'Difrnce', 'DIT1010', DeviceType::TABLET ],
+        'DIT7000'                                   => [ 'Difrnce', 'DIT7000', DeviceType::TABLET ],
+        'DIT7070'                                   => [ 'Difrnce', 'DIT7070', DeviceType::TABLET ],
+        'DIT8070'                                   => [ 'Difrnce', 'DIT8070', DeviceType::TABLET ],
+        'DIT9720'                                   => [ 'Difrnce', 'DIT9720', DeviceType::TABLET ],
+        'DIT101201'                                 => [ 'Difrnce', 'DIT101201', DeviceType::TABLET ],
+        'DIT102201'                                 => [ 'Difrnce', 'DIT102201', DeviceType::TABLET ],
+        'DIT102202'                                 => [ 'Difrnce', 'DIT102202', DeviceType::TABLET ],
+        'DIT701101'                                 => [ 'Difrnce', 'DIT701101', DeviceType::TABLET ],
+        'DIT702101'                                 => [ 'Difrnce', 'DIT702101', DeviceType::TABLET ],
+        'DIT902101'                                 => [ 'Difrnce', 'DIT902101', DeviceType::TABLET ],
+        'DIT902102'                                 => [ 'Difrnce', 'DIT902102', DeviceType::TABLET ],
+        'DIT902103'                                 => [ 'Difrnce', 'DIT902103', DeviceType::TABLET ],
+    ],
+
+    'NID 7010'                                  => [ 'Difrnce', 'DIT702201', DeviceType::TABLET ],
+    'DIGICELDL1plus'                            => [ 'Digicel', 'DL1 Plus' ],
+    'DIGICEL DL800'                             => [ 'Digicel', 'DL800' ],
+    'DIGICEL DL1000'                            => [ 'Digicel', 'DL1000' ],
+
+    '(Digma )?iD[jmnsx][DQ]?[0-9]*!!' => [
+        'Digma iDj7!'                               => [ 'Digma', 'iDj7', DeviceType::TABLET ],
+        'iDj7n'                                     => [ 'Digma', 'iDj7n', DeviceType::TABLET ],
+        'Digma iDm7'                                => [ 'Digma', 'iDm7', DeviceType::TABLET ],
+        'Digma iDn7'                                => [ 'Digma', 'iDn7', DeviceType::TABLET ],
+        'ids7'                                      => [ 'Digma', 'iDs7', DeviceType::TABLET ],
+        'ids10'                                     => [ 'Digma', 'iDs10', DeviceType::TABLET ],
+        'DIGMA iDs10!'                              => [ 'Digma', 'iDs10', DeviceType::TABLET ],
+        'iDx5'                                      => [ 'Digma', 'iDx5' ],
+        'iDx7'                                      => [ 'Digma', 'iDx7', DeviceType::TABLET ],
+        'iDx7 Type2 4'                              => [ 'Digma', 'iDx7', DeviceType::TABLET ],
+        'iDx10!'                                    => [ 'Digma', 'iDx10', DeviceType::TABLET ],
+        'iDnD7'                                     => [ 'Digma', 'iDnD7', DeviceType::TABLET ],
+        'DIGMA IDSD'                                => [ 'Digma', 'iDsD', DeviceType::TABLET ],
+        'DIGMA iDsD7!'                              => [ 'Digma', 'iDsD7', DeviceType::TABLET ],
+        'DIGMA iDsD8!'                              => [ 'Digma', 'iDsD8', DeviceType::TABLET ],
+        'DIGMA iDsD10!'                             => [ 'Digma', 'iDsD10', DeviceType::TABLET ],
+        'iDxD4'                                     => [ 'Digma', 'iDxD4' ],
+        'IDXD8'                                     => [ 'Digma', 'iDxD8', DeviceType::TABLET ],
+        'iDxD8 3G'                                  => [ 'Digma', 'iDxD8', DeviceType::TABLET ],
+        'iDxD7 3G'                                  => [ 'Digma', 'iDxD7', DeviceType::TABLET ],
+        'IDXD10'                                    => [ 'Digma', 'iDxD10', DeviceType::TABLET ],
+        'iDxD10 3G'                                 => [ 'Digma', 'iDxD10', DeviceType::TABLET ],
+        'iDxQ5'                                     => [ 'Digma', 'iDxQ5' ],
+    ],
+
+    'DISTAB9000R'                               => [ 'Disgo', 'Distab 9000R', DeviceType::TABLET ],
+    'DishTV Smartvu A2020'                      => [ 'DishTV', 'SmartVU-mini', DeviceType::TELEVISION ],
+
+    'DM0[0-9]{2,2}(K|SH)!!' => [
+        'DM009SH'                                   => [ 'Sharp', 'DM009SH', 'carrier' => 'Disney Mobile' ],
+        'DM010SH'                                   => [ 'Sharp', 'DM010SH', 'carrier' => 'Disney Mobile' ],
+        'DM011SH'                                   => [ 'Sharp', 'DM011SH', 'carrier' => 'Disney Mobile' ],
+        'DM012SH'                                   => [ 'Sharp', 'DM012SH', 'carrier' => 'Disney Mobile' ],
+        'DM013SH'                                   => [ 'Sharp', 'DM013SH', 'carrier' => 'Disney Mobile' ],
+        'DM014SH'                                   => [ 'Sharp', 'DM014SH', 'carrier' => 'Disney Mobile' ],
+        'DM015K'                                    => [ 'Kyocera', 'DM015K', 'carrier' => 'Disney Mobile' ],
+        'DM016SH'                                   => [ 'Sharp', 'DM016SH', 'carrier' => 'Disney Mobile' ],
+    ],
+
+    'DJC Touchtab3'                             => [ 'DJC', 'Touchtab3', DeviceType::TABLET ],
+    'DJC Touchtab4'                             => [ 'DJC', 'Touchtab4', DeviceType::TABLET ],
+    'AirBook TTJ702'                            => [ 'DNS', 'Airbook TTJ702', DeviceType::TABLET ],
+    'DNS Airbook TYT701'                        => [ 'DNS', 'Airbook TYT701', DeviceType::TABLET ],
+
+    '(DNS )?(Airtab )?(E|ES|M|MA|MC|MF|MW|P|PC|PF)[0-9]{2,4}!!' => [
+        'DNS Airtab E73'                            => [ 'DNS', 'AirTab E73', DeviceType::TABLET ],
+        'AirTab ES70'                               => [ 'DNS', 'AirTab ES70', DeviceType::TABLET ],
+        'AirTab M81g'                               => [ 'DNS', 'AirTab M81g', DeviceType::TABLET ],
+        'AirTab M81w'                               => [ 'DNS', 'AirTab M81w', DeviceType::TABLET ],
+        'M83w'                                      => [ 'DNS', 'AirTab M83w', DeviceType::TABLET ],
+        'M84g'                                      => [ 'DNS', 'AirTab M84g', DeviceType::TABLET ],
+        'M100qw'                                    => [ 'DNS', 'AirTab M100qw', DeviceType::TABLET ],
+        'M101g'                                     => [ 'DNS', 'AirTab M101g', DeviceType::TABLET ],
+        'AirTab M104G'                              => [ 'DNS', 'AirTab M104g', DeviceType::TABLET ],
+        'AirTab m971g'                              => [ 'DNS', 'AirTab M971g', DeviceType::TABLET ],
+        'M971w'                                     => [ 'DNS', 'AirTab M971w', DeviceType::TABLET ],
+        'M972g'                                     => [ 'DNS', 'AirTab M972g', DeviceType::TABLET ],
+        'M972w'                                     => [ 'DNS', 'AirTab M972w', DeviceType::TABLET ],
+        'DNS AirTab M974w'                          => [ 'DNS', 'AirTab M974w', DeviceType::TABLET ],
+        'AirTab M975w'                              => [ 'DNS', 'AirTab M975w', DeviceType::TABLET ],
+        'DNS M975W'                                 => [ 'DNS', 'AirTab M975W', DeviceType::TABLET ],
+        'AirTab MA7001'                             => [ 'DNS', 'AirTab MA7001', DeviceType::TABLET ],
+        'AirTab MC1011'                             => [ 'DNS', 'AirTab MC1011', DeviceType::TABLET ],
+        'DNS AirTab MF1011'                         => [ 'DNS', 'AirTab MF1011', DeviceType::TABLET ],
+        'AirTab MW1011'                             => [ 'DNS', 'AirTab MW1011', DeviceType::TABLET ],
+        'AirTab MW7851'                             => [ 'DNS', 'AirTab MW7851', DeviceType::TABLET ],
+        'AirTab P70qw'                              => [ 'DNS', 'AirTab P70qw', DeviceType::TABLET ],
+        'AirTab P71g'                               => [ 'DNS', 'AirTab P71g', DeviceType::TABLET ],
+        'DNS AirTab P71g'                           => [ 'DNS', 'AirTab P71g', DeviceType::TABLET ],
+        'AirTab P83'                                => [ 'DNS', 'AirTab P83', DeviceType::TABLET ],
+        'DNS AirTab P101w'                          => [ 'DNS', 'AirTab P101w', DeviceType::TABLET ],
+        'AirTab P970g'                              => [ 'DNS', 'AirTab P970g', DeviceType::TABLET ],
+        'AirTab P970w'                              => [ 'DNS', 'AirTab P970w', DeviceType::TABLET ],
+        'AirTab PC9701'                             => [ 'DNS', 'AirTab PC9701', DeviceType::TABLET ],
+        'DNS AirTab PF7001'                         => [ 'DNS', 'AirTab PF7001', DeviceType::TABLET ],
+    ],
+
+    'DNS S!!' => [
+        'DNS S3501'                                 => [ 'DNS', 'S3501' ],
+        'DNS s4003'                                 => [ 'DNS', 'S4003' ],
+        'DNS S4006'                                 => [ 'DNS', 'S4006' ],
+        'DNS S4008'                                 => [ 'DNS', 'S4008' ],
+        'DNS S4502'                                 => [ 'DNS', 'S4502' ],
+        'DNS S4502M'                                => [ 'DNS', 'S4502M' ],
+        'DNS S4507'                                 => [ 'DNS', 'S4507' ],
+        'DNS S4508'                                 => [ 'DNS', 'S4508' ],
+        'DNS S4705'                                 => [ 'DNS', 'S4705' ],
+        'DNS S5005'                                 => [ 'DNS', 'S5005' ],
+        'DNS S5008'                                 => [ 'DNS', 'S5008' ],
+        'DNS S5701'                                 => [ 'DNS', 'S5701' ],
+    ],
+
+    'DNS4502M'                                  => [ 'DNS', 'S4502M' ],
+    'S4503Q'                                    => [ 'DNS', 'S4503Q' ],
+    'S4505M'                                    => [ 'DNS', 'S4505M' ],
+
+    'DPS Dream 7'                               => [ 'DPS', 'Dream 7', DeviceType::TABLET ],
+    'DPS Dream 9'                               => [ 'DPS', 'Dream 9', DeviceType::TABLET ],
+    'domod G20'                                 => [ 'Domod', 'G20' ],
+    'Collo DG100'                               => [ 'Doogee', 'Collo DG100' ],
+    'Collo 2 DG120'                             => [ 'Doogee', 'Collo 2 DG120' ],
+    'DOOGEE-TITANS-DG150'                       => [ 'Doogee', 'Titans DG150' ],
+    'VOYAGER DG300'                             => [ 'Doogee', 'Voyager DG300' ],
+    'VOYAGER2 DG310'                            => [ 'Doogee', 'Voyager 2 DG310' ],
+    'MINT-DG330'                                => [ 'Doogee', 'Mint DG330' ],
+    'Discovery DG500'                           => [ 'Doogee', 'Discovery DG500' ],
+    'Discovery2-DG500C'                         => [ 'Doogee', 'Discovery 2 DG500C' ],
+    'TURBO DG2014'                              => [ 'Doogee', 'Turbo DG2014' ],
+
+    'DOOV!!' => [
+        'DOOV C1'                                   => [ 'DOOV', 'C1' ],
+        'DOOV C7'                                   => [ 'DOOV', 'C7' ],
+        'DOOV D2'                                   => [ 'DOOV', 'D2' ],
+        'DOOV D3'                                   => [ 'DOOV', 'D3' ],
+        'DOOV D5'                                   => [ 'DOOV', 'D5' ],
+        'DOOV D7'                                   => [ 'DOOV', 'D7' ],
+        'DOOV D8'                                   => [ 'DOOV', 'D8' ],
+        'DOOV D9'                                   => [ 'DOOV', 'D9' ],
+        'DOOV D10'                                  => [ 'DOOV', 'D10' ],
+        'DOOV D30'                                  => [ 'DOOV', 'D30' ],
+        'DOOV-DOOV D300'                            => [ 'DOOV', 'D300' ],
+        'DOOV D300'                                 => [ 'DOOV', 'D300' ],
+        'DOOV D350'                                 => [ 'DOOV', 'D350' ],
+        'DOOV D360'                                 => [ 'DOOV', 'D360' ],
+        'DOOV D500'                                 => [ 'DOOV', 'D500' ],
+        'DOOV D700'                                 => [ 'DOOV', 'D700' ],
+        'DOOV D708'                                 => [ 'DOOV', 'D708' ],
+        'DOOV D710'                                 => [ 'DOOV', 'D710' ],
+        'DOOV D720'                                 => [ 'DOOV', 'D720' ],
+        'DOOV D770'                                 => [ 'DOOV', 'D770' ],
+        'DOOV D800'                                 => [ 'DOOV', 'D800' ],
+        'DOOV D910T'                                => [ 'DOOV', 'D910T' ],
+        'DOOV D920'                                 => [ 'DOOV', 'D920' ],
+        'DOOV L1'                                   => [ 'DOOV', 'L1' ],
+        'DOOV L1M'                                  => [ 'DOOV', 'L1M' ],
+        'DOOV L3'                                   => [ 'DOOV', 'L3' ],
+        'DOOV L5'                                   => [ 'DOOV', 'L5' ],
+        'DOOV L5Pro'                                => [ 'DOOV', 'L5 Pro' ],
+        'DOOV S1'                                   => [ 'DOOV', 'S1' ],
+        'DOOV S2'                                   => [ 'DOOV', 'S2' ],
+        'DOOV S2y'                                  => [ 'DOOV', 'S2y' ],
+        'DOOV S3'                                   => [ 'DOOV', 'S3' ],
+        'DOOV S5'                                   => [ 'DOOV', 'S5' ],
+        'DOOV T20L'                                 => [ 'DOOV', 'T20L' ],
+        'DOOV T35'                                  => [ 'DOOV', 'T35' ],
+        'DOOV T60'                                  => [ 'DOOV', 'T60' ],
+        'DOOV T90'                                  => [ 'DOOV', 'T90' ],
+    ],
+
+    'Doro Liberto!!' => [
+        'Doro Liberto 810'                          => [ 'Doro', 'Liberto 810' ],
+        'Doro Liberto 820'                          => [ 'Doro', 'Liberto 820' ],
+        'Doro Liberto 820 Mini'                     => [ 'Doro', 'Liberto 820 Mini' ],
+        'Doro Liberto 822'                          => [ 'Doro', 'Liberto 822' ],
+        'Doro Liberto 825'                          => [ 'Doro', 'Liberto 825' ],
+    ],
+
+    'Doro 8030'                                 => [ 'Doro', 'Liberto 822' ],
+    'Doro 824'                                  => [ 'Doro', 'Liberto 824' ],
+    '825 T-Mobile'                              => [ 'Doro', 'Liberto 825' ],
+    'M975'                                      => [ 'Double Power', 'M975', DeviceType::TABLET ],
+    'TD-1010'                                   => [ 'Double Power', 'TD-1010', DeviceType::TABLET ],
+    'Tablet-P27'                                => [ 'DracoTek', 'P27 Tablet', DeviceType::TABLET ],
+    'dyno 7.80'                                 => [ 'Dyno', '7.80', DeviceType::TABLET ],
+    'dyno 7.85'                                 => [ 'Dyno', '7.85', DeviceType::TABLET ],
+    'ACM3066-8'                                 => [ 'MY|eebo', 'Color Tablet', DeviceType::TABLET ],
+
+    '(E-Boda|Eruption|Essential|Supreme|Storm|Revo)!!' => [
+        'Eruption V200'                             => [ 'E-Boda', 'Eruption V200', DeviceType::TABLET ],
+        'E-Boda Essential A150'                     => [ 'E-Boda', 'Essential A150', DeviceType::TABLET ],
+        'Essential A330'                            => [ 'E-Boda', 'Essential A330', DeviceType::TABLET ],
+        'E-Boda IMPRESSPE3D E1'                     => [ 'E-Boda', 'Impresspeed E1', DeviceType::TABLET ],
+        'E-Boda IMPRESSPEED E 250DC'                => [ 'E-Boda', 'Impresspeed E250', DeviceType::TABLET ],
+        'E-Boda Impresspeed E300'                   => [ 'E-Boda', 'Impresspeed E300', DeviceType::TABLET ],
+        'E-Boda Supreme X80 Dual Core'              => [ 'E-Boda', 'Supreme X80', DeviceType::TABLET ],
+        'E-Boda Supreme Dual Core X190'             => [ 'E-Boda', 'Supreme X190', DeviceType::TABLET ],
+        'SUPREME IPS Dual Core X200'                => [ 'E-Boda', 'Supreme X200', DeviceType::TABLET ],
+        'E-Boda Supreme X400 Quad Core'             => [ 'E-Boda', 'Supreme X400', DeviceType::TABLET ],
+        'E-Boda Supreme XL200IPS'                   => [ 'E-Boda', 'Supreme XL200', DeviceType::TABLET ],
+        'E-Boda Supreme XL400QC'                    => [ 'E-Boda', 'Supreme XL400', DeviceType::TABLET ],
+        'E-Boda Rainbow V47'                        => [ 'E-Boda', 'Rainbow V47' ],
+        'Revo R80'                                  => [ 'E-Boda', 'Revo R80' ],
+        'E-Boda Storm V50'                          => [ 'E-Boda', 'Storm V50' ],
+        'Storm V100'                                => [ 'E-Boda', 'Storm V100' ],
+        'Storm X450'                                => [ 'E-Boda', 'Storm X450' ],
+    ],
+
+    'Etel!!' => [
+        'Etel i3'                                   => [ 'E-tel', 'Curiosity i3' ],
+        'Etel i4'                                   => [ 'E-tel', 'Curiosity i4' ],
+        'Etel i6'                                   => [ 'E-tel', 'Curiosity i6' ],
+        'Etel i8'                                   => [ 'E-tel', 'Curiosity i8' ],
+    ],
+
+    'EasyPhone EP5'                             => [ 'Easypix', 'EasyPhone EP5' ],
+    'EasyPad 971'                               => [ 'Easypix', 'EasyPad 971', DeviceType::TABLET ],
+
+    'EBEN!!' => [
+        'EBEN A3'                                   => [ 'EBEN', 'A3', DeviceType::TABLET ],
+        'EBEN S1'                                   => [ 'EBEN', 'S1', DeviceType::TABLET ],
+        'EBEN T6'                                   => [ 'EBEN', 'T6', DeviceType::TABLET ],
+        'EBEN T7'                                   => [ 'EBEN', 'T7', DeviceType::TABLET ],
+        'EBEN T8'                                   => [ 'EBEN', 'T8', DeviceType::TABLET ],
+    ],
+
+    'EBEST!!' => [
+        'EBEST A35'                                 => [ 'EBEST', 'A35' ],
+        'EBEST F5'                                  => [ 'EBEST', 'F5' ],
+        'EBEST N4'                                  => [ 'EBEST', 'N4' ],
+        'EBEST T5'                                  => [ 'EBEST', 'T5' ],
+        'EBEST T7'                                  => [ 'EBEST', 'T7' ],
+        'EBEST U1'                                  => [ 'EBEST', 'U1' ],
+        'EBEST V5'                                  => [ 'EBEST', 'V5' ],
+        'EBEST V6'                                  => [ 'EBEST', 'V6' ],
+        'EBEST V7'                                  => [ 'EBEST', 'V7' ],
+        'EBEST V8'                                  => [ 'EBEST', 'V8' ],
+        'EBEST W16A'                                => [ 'EBEST', 'W16A' ],
+        'EBEST W18'                                 => [ 'EBEST', 'W18' ],
+        'EBEST W66'                                 => [ 'EBEST', 'W66' ],
+        'EBEST W66A'                                => [ 'EBEST', 'W66A' ],
+        'EBEST W70'                                 => [ 'EBEST', 'W70' ],
+        'EBEST Z5'                                  => [ 'EBEST', 'Z5' ],
+        'EBEST Z7'                                  => [ 'EBEST', 'Z7' ],
+    ],
+
+    'TA10CA3'                                   => [ 'ECS', 'TA10CA3', DeviceType::TABLET ],
+    'TM105'                                     => [ 'ECS', 'TM105', DeviceType::TABLET ],
+    'TM105A'                                    => [ 'ECS', 'TM105A', DeviceType::TABLET ],
+    'TR10CS1'                                   => [ 'ECS', 'TR10CS1', DeviceType::TABLET ],
+
+    'Elephone!!' => [
+        'Elephone G1'                               => [ 'Elephone', 'G1' ],
+        'Elephone G2'                               => [ 'Elephone', 'G2' ],
+        'Elephone G3'                               => [ 'Elephone', 'G3' ],
+        'Elephone G4'                               => [ 'Elephone', 'G4' ],
+        'Elephone G5'                               => [ 'Elephone', 'G5' ],
+        'Elephone G6'                               => [ 'Elephone', 'G6' ],
+        'Elephone G7'                               => [ 'Elephone', 'G7' ],
+        'Elephone G9'                               => [ 'Elephone', 'G9' ],
+        'Elephone P6'                               => [ 'Elephone', 'P6' ],
+        'Elephone P8'                               => [ 'Elephone', 'P8' ],
+        'Elephone P8 Pro'                           => [ 'Elephone', 'P8 Pro' ],
+        'Elephone P10'                              => [ 'Elephone', 'P10' ],
+        'Elephone-P10C'                             => [ 'Elephone', 'P10C' ],
+        'Elephone-P2000'                            => [ 'Elephone', 'P2000' ],
+        'Elephone P2000'                            => [ 'Elephone', 'P2000' ],
+        'Elephone-P2000C'                           => [ 'Elephone', 'P2000C' ],
+        'Elephone P3000!'                           => [ 'Elephone', 'P3000' ],
+        'Elephone P4000!'                           => [ 'Elephone', 'P4000' ],
+        'Elephone P5000!'                           => [ 'Elephone', 'P5000' ],
+        'Elephone P6000!'                           => [ 'Elephone', 'P6000' ],
+        'Elephone P7000'                            => [ 'Elephone', 'P7000' ],
+        'Elephone P8000!'                           => [ 'Elephone', 'P8000' ],
+        'Elephone S2'                               => [ 'Elephone', 'S2' ],
+        'Elephone S2 Plus'                          => [ 'Elephone', 'S2 Plus' ],
+    ],
+
+    'D709'                                      => [ 'Empire Electronix', 'Tablet D709', DeviceType::TABLET ],
+    'C8660'                                     => [ 'Enspire', 'C8660' ],
+    'edgejr'                                    => [ 'EnTourage', 'Pocket eDGe', DeviceType::TABLET ],
+    'l97D'                                      => [ 'EPad', 'l97D', DeviceType::TABLET ],
+    'A1001T'                                    => [ 'Elijah', 'A1001T', DeviceType::TABLET ],
+    'ELIYA S1'                                  => [ 'Eliya', 'S1' ],
+
+    'epade!!' => [
+        'epade A3'                                  => [ 'epade', 'A3' ],
+        'epade A7'                                  => [ 'epade', 'A7' ],
+        'epade A45'                                 => [ 'epade', 'A45' ],
+        'epade A300'                                => [ 'epade', 'A300' ],
+        'epade A360S'                               => [ 'epade', 'A360S' ],
+        'epade A718'                                => [ 'epade', 'A718' ],
+        'epade N01'                                 => [ 'epade', 'N01' ],
+        'epade Q3'                                  => [ 'epade', 'Q3' ],
+        'epade S300'                                => [ 'epade', 'S300' ],
+        'EPADE S3'                                  => [ 'epade', 'S3' ],
+        'epade S5'                                  => [ 'epade', 'S5' ],
+        'epade S7'                                  => [ 'epade', 'S7' ],
+        'epade V05'                                 => [ 'epade', 'V05' ],
+    ],
+
+    'equiso.smart.tv.pro'                       => [ 'Equiso', 'SmartTV', DeviceType::TELEVISION ],
+
+    'ST7001'                                    => [ 'Essentiel B', 'Black Diamond' ],
+    'ST8000'                                    => [ 'Essentiel B', 'Smart\'Tab 8000', DeviceType::TABLET ],
+    'ST9001'                                    => [ 'Essentiel B', 'Smart\'Tab 9001', DeviceType::TABLET ],
+
+    'eSTAR!!' => [
+        'eSTAR BEAUTY HD Quad core'                 => [ 'eSTAR', 'Beauty HD', DeviceType::TABLET ],
+        'eSTAR CRYSTAL'                             => [ 'eSTAR', 'Crystal', DeviceType::TABLET ],
+        'eSTAR Easy'                                => [ 'eSTAR', 'Easy', DeviceType::TABLET ],
+        'eSTAR GO!'                                 => [ 'eSTAR', 'Go!', DeviceType::TABLET ],
+        'eSTAR GRAND'                               => [ 'eSTAR', 'Grand', DeviceType::TABLET ],
+        'eSTAR GRAND HD'                            => [ 'eSTAR', 'Grand HD', DeviceType::TABLET ],
+        'eSTAR GRAND HD Quad 3G'                    => [ 'eSTAR', 'Grand HD 3G', DeviceType::TABLET ],
+        'eSTAR GRAND HD Intel Quad core 3G'         => [ 'eSTAR', 'Grand HD 3G', DeviceType::TABLET ],
+        'eSTAR Gemini'                              => [ 'eSTAR', 'Gemini', DeviceType::TABLET ],
+        'eSTAR MINI'                                => [ 'eSTAR', 'Mini', DeviceType::TABLET ],
+        'eSTAR MINI 3G'                             => [ 'eSTAR', 'Mini 3G', DeviceType::TABLET ],
+        'eSTAR Zoom Quad'                           => [ 'eSTAR', 'Zoom', DeviceType::TABLET ],
+        'eSTAR ZOOM HD Duo'                         => [ 'eSTAR', 'Zoom HD', DeviceType::TABLET ],
+        'eSTAR Zoom HD Quad'                        => [ 'eSTAR', 'Zoom HD', DeviceType::TABLET ],
+    ],
+
+    'MID1018'                                   => [ 'eSTAR', 'MID1018', DeviceType::TABLET ],
+    'MID1028'                                   => [ 'eSTAR', 'MID1028', DeviceType::TABLET ],
+    'M4301'                                     => [ 'Eston', 'MID M4301', 'media' ],
+
+    '(EVAS )?EVERCOSS[- ]A!!' => [
+        'EVERCOSS A5'                               => [ 'EVERCOSS', 'A5' ],
+        'EVERCOSS A5A*'                             => [ 'EVERCOSS', 'A5A' ],
+        'EVERCOSS A5C'                              => [ 'EVERCOSS', 'A5C' ],
+        'EVERCOSS A5K'                              => [ 'EVERCOSS', 'A5K' ],
+        'EVERCOSS A5P'                              => [ 'EVERCOSS', 'A5P' ],
+        'EVERCOSS A5P*'                             => [ 'EVERCOSS', 'A5P' ],
+        'EVERCOSS A5V'                              => [ 'EVERCOSS', 'A5V' ],
+        'EVERCOSS A5Z'                              => [ 'EVERCOSS', 'A5Z' ],
+        'EVERCOSS A7A'                              => [ 'EVERCOSS', 'A7A' ],
+        'EVERCOSS A7A*'                             => [ 'EVERCOSS', 'A7A' ],
+        'EVERCOSS A7B'                              => [ 'EVERCOSS', 'A7B' ],
+        'EVERCOSS A7F'                              => [ 'EVERCOSS', 'A7F' ],
+        'EVERCOSS A7K'                              => [ 'EVERCOSS', 'A7K' ],
+        'EVERCOSS A7L'                              => [ 'EVERCOSS', 'A7L' ],
+        'EVERCOSS A7N'                              => [ 'EVERCOSS', 'A7N' ],
+        'EVERCOSS A7R'                              => [ 'EVERCOSS', 'A7R' ],
+        'EVERCOSS A7S'                              => [ 'EVERCOSS', 'A7S' ],
+        'EVAS evercoss-a7s'                         => [ 'EVERCOSS', 'A7S' ],
+        'EVERCOSS A7T'                              => [ 'EVERCOSS', 'A7T' ],
+        'EVERCOSS A7T*'                             => [ 'EVERCOSS', 'A7T' ],
+        'EVERCOSS A7V'                              => [ 'EVERCOSS', 'A7V' ],
+        'EVERCOSS A7V+'                             => [ 'EVERCOSS', 'A7V' ],
+        'EVERCOSS A7Z'                              => [ 'EVERCOSS', 'A7Z' ],
+        'EVERCOSS A28A'                             => [ 'EVERCOSS', 'A28A' ],
+        'EVERCOSS A28M'                             => [ 'EVERCOSS', 'A28M' ],
+        'EVERCOSS A53B'                             => [ 'EVERCOSS', 'A53B' ],
+        'EVERCOSS A54'                              => [ 'EVERCOSS', 'A54' ],
+        'EVERCOSS A65'                              => [ 'EVERCOSS', 'A65' ],
+        'Evercoss A66A'                             => [ 'EVERCOSS', 'A66A' ],
+        'EVERCOSS A66S'                             => [ 'EVERCOSS', 'A66S' ],
+        'EVERCOSS A66V'                             => [ 'EVERCOSS', 'A66V' ],
+        'EVERCOSS A74A'                             => [ 'EVERCOSS', 'A74A' ],
+        'EVERCOSS A74C'                             => [ 'EVERCOSS', 'A74C' ],
+        'EVERCOSS A74D'                             => [ 'EVERCOSS', 'A74D' ],
+        'EVERCOSS-A75L'                             => [ 'EVERCOSS', 'A75L' ],
+        'EVERCOSS A75W'                             => [ 'EVERCOSS', 'A75W' ],
+        'EVERCOSS A80A'                             => [ 'EVERCOSS', 'A80A' ],
+        'EVERCOSS A200'                             => [ 'EVERCOSS', 'A200' ],
+        'EVERCOSS AT1A'                             => [ 'EVERCOSS', 'AT1A', DeviceType::TABLET ],
+        'EVERCOSS AT1A*'                            => [ 'EVERCOSS', 'AT1A', DeviceType::TABLET ],
+        'EVERCOSS AT1G'                             => [ 'EVERCOSS', 'AT1G', DeviceType::TABLET ],
+        'EVERCOSS AT8D'                             => [ 'EVERCOSS', 'AT8D', DeviceType::TABLET ],
+    ],
+
+    'AT1A*'                                     => [ 'EVERCOSS', 'AT1A', DeviceType::TABLET ],
+    'AT1C'                                      => [ 'EVERCOSS', 'AT1C', DeviceType::TABLET ],
+    'AT1C*'                                     => [ 'EVERCOSS', 'AT1C', DeviceType::TABLET ],
+    'AT1D'                                      => [ 'EVERCOSS', 'AT1D', DeviceType::TABLET ],
+    'AT1G*'                                     => [ 'EVERCOSS', 'AT1G', DeviceType::TABLET ],
+    'AT7E'                                      => [ 'EVERCOSS', 'AT7E', DeviceType::TABLET ],
+
+    'EVERPAD SC-710'                            => [ 'Everest', 'Everpad SC-710', DeviceType::TABLET ],
+
+    'Ever!!' => [
+        'EverClassic'                               => [ 'Evertek', 'EverClassic' ],
+        'EverFancy D40'                             => [ 'Evertek', 'EverFancy D40' ],
+        'EverGlory'                                 => [ 'Evertek', 'EverGlory' ],
+        'EverMagic'                                 => [ 'Evertek', 'EverMagic' ],
+        'EverMellow D45'                            => [ 'Evertek', 'EverMellow D45' ],
+        'EverMellow D50'                            => [ 'Evertek', 'EverMellow D50' ],
+        'EverMiracle'                               => [ 'Evertek', 'EverMiracle' ],
+        'EverMiracle mini'                          => [ 'Evertek', 'EverMiracle Mini' ],
+        'EverMiracle Nano'                          => [ 'Evertek', 'EverMiracle Nano' ],
+        'EverShine'                                 => [ 'Evertek', 'EverShine' ],
+        'EverTrendy'                                => [ 'Evertek', 'EverTrendy' ],
+    ],
+
+    'E70[0-9]{2,2}H[DG]!!' => [
+        'E7020HD'                                   => [ 'Evertek', 'Everpad E7020HD', DeviceType::TABLET ],
+        'E7050HD'                                   => [ 'Evertek', 'Everpad E7050HD', DeviceType::TABLET ],
+    ],
+
+    'E80[0-9]{2,2}H[DG]!!' => [
+        'E8050HG'                                   => [ 'Evertek', 'Everpad E8050HG', DeviceType::TABLET ],
+        'E8051HD'                                   => [ 'Evertek', 'Everpad E8051HD', DeviceType::TABLET ],
+    ],
+
+    'P10AN'                                     => [ 'Exper', 'Easypad P10AN', DeviceType::TABLET ],
+
+    '(Explay|X-tremer|ActiveD|Informer|Surfer)!!' => [
+        'Explay A320'                               => [ 'Explay', 'A320' ],
+        'Explay Advance'                            => [ 'Explay', 'Advance' ],
+        'Explay Dream'                              => [ 'Explay', 'Dream' ],
+        'Explay Fresh'                              => [ 'Explay', 'Fresh' ],
+        'Explay Indigo'                             => [ 'Explay', 'Indigo' ],
+        'Explay Infinity'                           => [ 'Explay', 'Infinity' ],
+        'Explay A350'                               => [ 'Explay', 'Star' ],
+        'Explay Star'                               => [ 'Explay', 'Star' ],
+        'Explay Vega'                               => [ 'Explay', 'Vega' ],
+        'X-tremer'                                  => [ 'Explay', 'X-tremer' ],
+        'Explay X-tremer'                           => [ 'Explay', 'X-tremer' ],
+        'ActiveD 7.4 3G'                            => [ 'Explay', 'ActiveD 7.4 3G', DeviceType::TABLET ],
+        'Explay Informer 701'                       => [ 'Explay', 'Informer 701', DeviceType::TABLET ],
+        'Informer 701'                              => [ 'Explay', 'Informer 701', DeviceType::TABLET ],
+        'Explay Informer 702'                       => [ 'Explay', 'Informer 702', DeviceType::TABLET ],
+        'Informer-702'                              => [ 'Explay', 'Informer 702', DeviceType::TABLET ],
+        'Explay Informer 703'                       => [ 'Explay', 'Informer 703', DeviceType::TABLET ],
+        'Informer 703'                              => [ 'Explay', 'Informer 703', DeviceType::TABLET ],
+        'Informer 704'                              => [ 'Explay', 'Informer 704', DeviceType::TABLET ],
+        'Informer 705'                              => [ 'Explay', 'Informer 705', DeviceType::TABLET ],
+        'Explay Informer 705'                       => [ 'Explay', 'Informer 705', DeviceType::TABLET ],
+        'Informer-801'                              => [ 'Explay', 'Informer 801', DeviceType::TABLET ],
+        'Explay Informer 801'                       => [ 'Explay', 'Informer 801', DeviceType::TABLET ],
+        'Explay Informer 804'                       => [ 'Explay', 'Informer 804', DeviceType::TABLET ],
+        'informer 901'                              => [ 'Explay', 'Informer 901', DeviceType::TABLET ],
+        'informer 920'                              => [ 'Explay', 'Informer 920', DeviceType::TABLET ],
+        'informer 921'                              => [ 'Explay', 'Informer 921', DeviceType::TABLET ],
+        'Explay Surfer 7.02'                        => [ 'Explay', 'Surfer 7.02', DeviceType::TABLET ],
+        'Surfer7.03'                                => [ 'Explay', 'Surfer 7.03', DeviceType::TABLET ],
+        'Surfer 7.04'                               => [ 'Explay', 'Surfer 7.04', DeviceType::TABLET ],
+        'Surfer 7.31 3G'                            => [ 'Explay', 'Surfer 7.31 3G', DeviceType::TABLET ],
+        'Surfer 7.32 3G'                            => [ 'Explay', 'Surfer 7.32 3G', DeviceType::TABLET ],
+        'Surfer 7.34'                               => [ 'Explay', 'Surfer 7.34', DeviceType::TABLET ],
+        'Explay surfer 8.01'                        => [ 'Explay', 'Surfer 8.01', DeviceType::TABLET ],
+        'Surfer 8 02'                               => [ 'Explay', 'Surfer 8.02', DeviceType::TABLET ],
+        'Surfer 8.02'                               => [ 'Explay', 'Surfer 8.02', DeviceType::TABLET ],
+        'Surfer 8.31 3G'                            => [ 'Explay', 'Surfer 8.31 3G', DeviceType::TABLET ],
+        'Surfer 10.11'                              => [ 'Explay', 'Surfer 10.11', DeviceType::TABLET ],
+    ],
+
+    'Smart!!' => [
+        'Smart402'                                  => [ 'Fareastone', 'Smart 402' ],
+        'Smart 403'                                 => [ 'Fareastone', 'Smart 403' ],
+        'Smart501'                                  => [ 'Fareastone', 'Smart 501' ],
+        'Smart 502'                                 => [ 'Fareastone', 'Smart 502' ],
+        'Smart503'                                  => [ 'Fareastone', 'Smart 503' ],
+        'Smart 505'                                 => [ 'Fareastone', 'Smart 505' ],
+        'Smart 701'                                 => [ 'Fareastone', 'Smart 701', DeviceType::TABLET ],
+    ],
+
+    'FP1'                                       => [ 'Fairphone', '1' ],
+    'FP1U'                                      => [ 'Fairphone', '1' ],
+    'FP2'                                       => [ 'Fairphone', '2' ],
+
+    'FDT!!' => [
+        'FDT C838'                                  => [ 'FDT', 'C838' ],
+        'FDT E5'                                    => [ 'FDT', 'E5' ],
+        'FDT E6'                                    => [ 'FDT', 'E6' ],
+        'FDT E829'                                  => [ 'FDT', 'E829' ],
+        'FDT E969'                                  => [ 'FDT', 'E969' ],
+        'FDT G18'                                   => [ 'FDT', 'G18' ],
+        'FDT G505'                                  => [ 'FDT', 'G505' ],
+    ],
+
+    'GT-[HN][0-9]{4,4}!!' => [
+        'GT-H9001'                                  => [ 'Feiteng', 'GT-H9001' ],
+        'GT-H9500'                                  => [ 'Feiteng', 'GT-H9500' ],
+        'GT-N9300'                                  => [ 'Feiteng', 'GT-N9300' ],
+    ],
+
+    'GT-9000'                                   => [ 'Feiteng', 'H5W' ],
+    '9300'                                      => [ 'Feiteng', 'GT-N9300' ],
+
+    'iOCEAN!!' => [
+        'iOCEAN X7'                                 => [ 'FHD', 'iOCEAN X7' ],
+        'iOCEAN X7 HD'                              => [ 'FHD', 'iOCEAN X7 HD' ],
+        'iOCEAN X7S'                                => [ 'FHD', 'iOCEAN X7S' ],
+        'iOCEAN X7T'                                => [ 'FHD', 'iOCEAN X7T' ],
+        'iOCEAN X8'                                 => [ 'FHD', 'iOCEAN X8' ],
+    ],
+
+    'FIH-!!' => [
+        'FIH-F0X'                                   => [ 'FIH', 'F0X' ],
+        'FIH-FBO'                                   => [ 'FIH', 'FBO' ],
+        'FIH-FD1'                                   => [ 'FIH', 'FD1' ],
+        'FIH-VKY'                                   => [ 'FIH', 'VKY' ],
+    ],
+
+    'Vibo-A688'                                 => [ 'FIH', 'Vibo A688' ],
+
+    'XT[0-9]{3,3}!!' => [
+        'XT712'                                     => [ 'Flipkart', 'Digiflip Pro XT712', DeviceType::TABLET ],
+        'XT801'                                     => [ 'Flipkart', 'Digiflip Pro XT801', DeviceType::TABLET ],
+        'XT811'                                     => [ 'Flipkart', 'Digiflip Pro XT811', DeviceType::TABLET ],
+    ],
+
+    'Fly F[0-9]{2,3}!!' => [
+        'Fly F40'                                   => [ 'Fly', 'F40' ],
+        'FLY F45s'                                  => [ 'Fly', 'F45s' ],
+        'FLY F50s'                                  => [ 'Fly', 'F50s' ],
+        'Fly F350'                                  => [ 'Fly', 'F350' ],
+    ],
+
+    'F50Q'                                      => [ 'Fly', 'F50Q' ],
+    'FS403'                                     => [ 'Fly', 'FS403 Cumulus 1' ],
+    'FS407'                                     => [ 'Fly', 'FS407 Stratus 6' ],
+    'Fly Phoenix 2'                             => [ 'Fly', 'IQ4410i Phoenix 2' ],
+    'Fly Ego Art 2'                             => [ 'Fly', 'IQ455 Ego Art 2' ],
+
+    '(Fly )?IQ ?[0-9]{3,4}!!' => [
+        '(Fly )?IQ4413!'                            => [ 'Fly', 'IQ4413 Evo Chic 3' ],
+        '(Fly )?IQ4417!'                            => [ 'Fly', 'IQ4417 Quad Era Energy 3' ],
+        '(Fly )?IQ4516!'                            => [ 'Fly', 'IQ4516 Tornado Slim' ],
+        '(Fly )?IQ230!'                             => [ 'Fly', 'IQ230 Compact' ],
+        '(Fly )?IQ235!'                             => [ 'Fly', 'IQ235 Uno' ],
+        '(Fly )?IQ236!'                             => [ 'Fly', 'IQ236 Victory' ],
+        '(Fly )?IQ237!'                             => [ 'Fly', 'IQ237 Dynamic' ],
+        '(Fly )?IQ238!'                             => [ 'Fly', 'IQ238 Jazz' ],
+        '(Fly )?IQ239!'                             => [ 'Fly', 'IQ239 Era Nano 2' ],
+        '(Fly )?IQ240!'                             => [ 'Fly', 'IQ240 Whizz' ],
+        '(Fly )?IQ245!'                             => [ 'Fly', 'IQ245 Wizard' ],
+        '(Fly )?IQ245 Plus!'                        => [ 'Fly', 'IQ245 Wizard Plus' ],
+        '(Fly )?IQ246!'                             => [ 'Fly', 'IQ246 Power' ],
+        '(Fly )?IQ250!'                             => [ 'Fly', 'IQ250 Swift' ],
+        '(Fly )?IQ255!'                             => [ 'Fly', 'IQ255 Pride' ],
+        '(Fly )?IQ256!'                             => [ 'Fly', 'IQ256 Vogue' ],
+        '(Fly )?IQ260!'                             => [ 'Fly', 'IQ260 BlackBird' ],
+        '(Fly )?IQ270!'                             => [ 'Fly', 'IQ270 Firebird' ],
+        '(Fly )?IQ275!'                             => [ 'Fly', 'IQ275 Marathon' ],
+        '(Fly )?IQ280!'                             => [ 'Fly', 'IQ280 Tech' ],
+        '(Fly )?IQ285!'                             => [ 'Fly', 'IQ285 Turbo' ],
+        '(Fly )?IQ310!'                             => [ 'Fly', 'IQ310 Panorama', DeviceType::TABLET ],
+        '(Fly )?IQ320!'                             => [ 'Fly', 'IQ320', DeviceType::TABLET ],
+        '(Fly )?IQ430!'                             => [ 'Fly', 'IQ430 Evoke' ],
+        'IQ 430'                                    => [ 'Fly', 'IQ430 Evoke' ],
+        '(Fly )?IQ431!'                             => [ 'Fly', 'IQ431 Glory' ],
+        '(Fly )?IQ432!'                             => [ 'Fly', 'IQ432 Era Nano 1' ],
+        '(Fly )?IQ434!'                             => [ 'Fly', 'IQ434 Era Nano 5' ],
+        '(Fly )?IQ436!'                             => [ 'Fly', 'IQ434 Era Nano 9' ],
+        '(Fly )?IQ440!'                             => [ 'Fly', 'IQ440 Energie' ],
+        '(Fly )?IQ441!'                             => [ 'Fly', 'IQ441 Radiance' ],
+        '(Fly )?IQ442!'                             => [ 'Fly', 'IQ442 Miracle' ],
+        '(Fly )?IQ443!'                             => [ 'Fly', 'IQ443 Trend' ],
+        '(Fly )?IQ444!'                             => [ 'Fly', 'IQ444 Diamond' ],
+        '(Fly )?IQ445!'                             => [ 'Fly', 'IQ445 Genius' ],
+        '(Fly )?IQ446!'                             => [ 'Fly', 'IQ446 Magic' ],
+        'IQ 446'                                    => [ 'Fly', 'IQ446 Magic' ],
+        '(Fly )?IQ447!'                             => [ 'Fly', 'IQ447 Era Life 1' ],
+        '(Fly )?IQ448!'                             => [ 'Fly', 'IQ448 Chic' ],
+        '(Fly )?IQ449!'                             => [ 'Fly', 'IQ449 Pronto' ],
+        '(Fly )?IQ450!'                             => [ 'Fly', 'IQ450 Horizon' ],
+        '(Fly )?IQ451!'                             => [ 'Fly', 'IQ451 Vista' ],
+        'IQ 451'                                    => [ 'Fly', 'IQ451 Vista' ],
+        '(Fly )?IQ452!'                             => [ 'Fly', 'IQ452 Ego Vision 1' ],
+        '(Fly )?IQ453!'                             => [ 'Fly', 'IQ453 Luminor' ],
+        '(Fly )?IQ454!'                             => [ 'Fly', 'IQ454 Evo Tech 1' ],
+        '(Fly )?IQ455!'                             => [ 'Fly', 'IQ455 Ego Art 2' ],
+        'IQ456'                                     => [ 'Fly', 'IQ456 Era Life 2' ],
+        '(Fly )?IQ458!'                             => [ 'Fly', 'IQ458 Evo Tech 2' ],
+        '(Fly )?IQ459!'                             => [ 'Fly', 'IQ459 Evo Chic 2' ],
+        'IQ588'                                     => [ 'Fly', 'IQ588 Nimbuzz' ],
+        'IQ4601'                                    => [ 'Fly', 'IQ4601 Era Style 2' ],
+        'IQ4602 Quad'                               => [ 'Fly', 'IQ4602 Thunder' ],
+    ],
+
+    'Flylife!!' => [
+        'Flylife Connect 7 3G'                      => [ 'Fly', 'Flylife Connect 7 3G', DeviceType::TABLET ],
+        'Flylife Connect 7 3G 2'                    => [ 'Fly', 'Flylife Connect 7 3G 2', DeviceType::TABLET ],
+        'Flylife Connect 7.85 3G 2'                 => [ 'Fly', 'Flylife Connect 7.85 3G 2', DeviceType::TABLET ],
+        'Flylife Connect 7.85 3G Slim'              => [ 'Fly', 'Flylife Connect 7.85 3G Slim', DeviceType::TABLET ],
+        'Flylife Connect 10.1 3G'                   => [ 'Fly', 'Flylife Connect 10.1 3G', DeviceType::TABLET ],
+        'Flylife Web 7'                             => [ 'Fly', 'Flylife Web 7', DeviceType::TABLET ],
+        'Flylife Web 7.85 Slim'                     => [ 'Fly', 'Flylife Web 7.85 Slim', DeviceType::TABLET ],
+    ],
+
+    'Fly Flylife Web 7.85 Slim'                 => [ 'Fly', 'Flylife Web 7.85 Slim', DeviceType::TABLET ],
+    'F600'                                      => [ 'Flying', 'F600' ],
+    'BC1003'                                    => [ 'Flytouch', 'BC1003', DeviceType::TABLET ],
+
+    '(tablet )?fnac!!' => [
+        'fnac 3.5'                                  => [ 'Fnac', 'Smartphone 3.5' ],
+        'fnac 4'                                    => [ 'Fnac', 'Smartphone 4' ],
+        'fnac 4.5'                                  => [ 'Fnac', 'Smartphone 4.5' ],
+        'fnac 5'                                    => [ 'Fnac', 'Smartphone 5' ],
+        'fnac 5 HD'                                 => [ 'Fnac', 'Smartphone 5 HD' ],
+        'fnac 5.7'                                  => [ 'Fnac', 'Smartphone 5.7' ],
+        'tablet Fnac 7'                             => [ 'Fnac', 'Tablet 7', DeviceType::TABLET ],
+        'tablet Fnac 8'                             => [ 'Fnac', 'Tablet 8', DeviceType::TABLET ],
+        'fnac 8 3G v2'                              => [ 'Fnac', 'Tablet 8 3G v2', DeviceType::TABLET ],
+        'tablet Fnac 10'                            => [ 'Fnac', 'Tablet 10', DeviceType::TABLET ],
+        'tablet Fnac 10 3G'                         => [ 'Fnac', 'Tablet 10 3G', DeviceType::TABLET ],
+        'fnac 10 v2'                                => [ 'Fnac', 'Tablet 10 v2', DeviceType::TABLET ],
+        'fnac 3.0 8'                                => [ 'Fnac', 'Tablet 3.0 8', DeviceType::TABLET ],
+        'fnac 3.0 10 Plus'                          => [ 'Fnac', 'Tablet 3.0 10', DeviceType::TABLET ],
+    ],
+
+    'ifive!!' => [
+        'ifive 2'                                   => [ 'FNF', 'iFive 2', DeviceType::TABLET ],
+        'ifive2S'                                   => [ 'FNF', 'iFive 2S', DeviceType::TABLET ],
+        'ifive3'                                    => [ 'FNF', 'iFive 3', DeviceType::TABLET ],
+        'ifive MX'                                  => [ 'FNF', 'iFive MX', DeviceType::TABLET ],
+        'ifive MX100'                               => [ 'FNF', 'iFive MX100', DeviceType::TABLET ],
+        'ifive X'                                   => [ 'FNF', 'iFive X', DeviceType::TABLET ],
+        'ifiveX2'                                   => [ 'FNF', 'iFive X2', DeviceType::TABLET ],
+        'ifive X2'                                  => [ 'FNF', 'iFive X2', DeviceType::TABLET ],
+        'ifiveX3'                                   => [ 'FNF', 'iFive X3', DeviceType::TABLET ],
+        'ifive MINI 2'                              => [ 'FNF', 'iFive Mini 2', DeviceType::TABLET ],
+        'IfiveMini3'                                => [ 'FNF', 'iFive Mini 3', DeviceType::TABLET ],
+        'ifive mini 3GS'                            => [ 'FNF', 'iFive Mini 3GS', DeviceType::TABLET ],
+        'IfiveMini4'                                => [ 'FNF', 'iFive Mini 4', DeviceType::TABLET ],
+    ],
+
+    'Freelander I20'                            => [ 'Freelander', 'i20' ],
+    'PD10-DYD'                                  => [ 'Freelander', 'PD10', DeviceType::TABLET ],
+
+    'SXZ-PD!!' => [
+        'SXZ-PD10'                                  => [ 'Freelander', 'PD10', DeviceType::TABLET ],
+        'SXZ-PDX0-01'                               => [ 'Freelander', 'PD20', DeviceType::TABLET ],
+        'SXZ-PDX0-03'                               => [ 'Freelander', 'PD90', DeviceType::TABLET ],
+        'SXZ-PDX-03'                                => [ 'Freelander', 'PD90', DeviceType::TABLET ],
+    ],
+
+    'NABI!!' => [
+        'NABI-A'                                    => [ 'Fuhu', 'nabi Kids tablet', DeviceType::TABLET ],
+        'NABIJR-NV5A'                               => [ 'Fuhu', 'nabi Jr.', DeviceType::TABLET ],
+        'NABIJR-NV5B'                               => [ 'Fuhu', 'nabi Jr.', DeviceType::TABLET ],
+        'NABI2-NV3D'                                => [ 'Fuhu', 'nabi 2', DeviceType::TABLET ],
+        'NABI2-NV7A'                                => [ 'Fuhu', 'nabi 2', DeviceType::TABLET ],
+        'NABI2-NV7A-D'                              => [ 'Fuhu', 'nabi 2', DeviceType::TABLET ],
+        'NABI2-NV7A-IE'                             => [ 'Fuhu', 'nabi 2', DeviceType::TABLET ],
+        'NABI2-NV7A-UK'                             => [ 'Fuhu', 'nabi 2', DeviceType::TABLET ],
+        'NABI2-NV7A-3D'                             => [ 'Fuhu', 'nabi 2', DeviceType::TABLET ],
+        'NABIXD-NV10A'                              => [ 'Fuhu', 'nabi XD', DeviceType::TABLET ],
+        'NABIXD-NV10B'                              => [ 'Fuhu', 'nabi XD', DeviceType::TABLET ],
+        'NABIXD-NV10C'                              => [ 'Fuhu', 'nabi XD', DeviceType::TABLET ],
+    ],
+
+    '[0-9]0[0-9]F!!' => [
+        '101F'                                      => [ 'Fujitsu', 'ARROWS A 101F', 'carrier' => 'Softbank' ],
+        '201F'                                      => [ 'Fujitsu', 'ARROWS A 201F', 'carrier' => 'Softbank' ],
+        '202F'                                      => [ 'Fujitsu', 'ARROWS A 202F', 'carrier' => 'Softbank' ],
+        '301F'                                      => [ 'Fujitsu', 'ARROWS A 301F', 'carrier' => 'Softbank' ],
+    ],
+
+    'ISW?[0-9]{2,2}F!!' => [
+        'ISW11F'                                    => [ 'Fujitsu', 'ARROWS Z ISW11F', 'carrier' => 'au' ],
+        'ISW13F'                                    => [ 'Fujitsu', 'ARROWS Z ISW13F', 'carrier' => 'au' ],
+        'IS12F'                                     => [ 'Fujitsu', 'ARROWS ES IS12F', 'carrier' => 'au' ],
+    ],
+
+    'F-[0-9]{2,2}[A-Z]!!' => [
+        'F-01D'                                     => [ 'Fujitsu', 'ARROWS Tab LTE F-01D', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+        'F-01F'                                     => [ 'Fujitsu', 'ARROWS NX F-01F', 'carrier' => 'DoCoMo' ],
+        'F-01H'                                     => [ 'Fujitsu', 'arrows Fit F-01H', 'carrier' => 'DoCoMo' ],
+        'F-01J'                                     => [ 'Fujitsu', 'arrows NX F-01J', 'carrier' => 'DoCoMo' ],
+        'F-02E'                                     => [ 'Fujitsu', 'ARROWS X F-02E', 'carrier' => 'DoCoMo' ],
+        'F-02F'                                     => [ 'Fujitsu', 'ARROWS Tab F-02F', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+        'F-02G'                                     => [ 'Fujitsu', 'ARROWS NX F-02G', 'carrier' => 'DoCoMo' ],
+        'F-02H'                                     => [ 'Fujitsu', 'arrows NX F-02H', 'carrier' => 'DoCoMo' ],
+        'F-03D'                                     => [ 'Fujitsu', 'ARROWS Kiss F-03D', 'carrier' => 'DoCoMo' ],
+        'F-03E'                                     => [ 'Fujitsu', 'ARROWS Kiss with JILL STUART F-03E', 'carrier' => 'DoCoMo' ],
+        'F-03F'                                     => [ 'Fujitsu', 'F-03F', 'carrier' => 'Disney Mobile' ],
+        'F-03G'                                     => [ 'Fujitsu', 'ARROWS Tab F-03G', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+        'F-03H'                                     => [ 'Fujitsu', 'arrows SV F-03H', 'carrier' => 'DoCoMo' ],
+        'F-04E'                                     => [ 'Fujitsu', 'ARROWS V F-04E', 'carrier' => 'DoCoMo' ],
+        'F-04F'                                     => [ 'Fujitsu', 'Business Smartphone F-04F', 'carrier' => 'DoCoMo' ],
+        'F-04G'                                     => [ 'Fujitsu', 'ARROWS NX F-04G', 'carrier' => 'DoCoMo' ],
+        'F-04H'                                     => [ 'Fujitsu', 'ARROWS Tab F-04H', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+        'F-05D'                                     => [ 'Fujitsu', 'ARROWS X LTE F-05D', 'carrier' => 'DoCoMo' ],
+        'F-05E'                                     => [ 'Fujitsu', 'ARROWS Tab F-05E', 'carrier' => 'DoCoMo' ],
+        'F-05F'                                     => [ 'Fujitsu', 'ARROWS NX F-05F', 'carrier' => 'DoCoMo' ],
+        'F-05G'                                     => [ 'Fujitsu', 'ARROWS F-05G', 'carrier' => 'DoCoMo' ],
+        'F-06E'                                     => [ 'Fujitsu', 'ARROWS NX F-06E', 'carrier' => 'DoCoMo' ],
+        'F-06F'                                     => [ 'Fujitsu', 'Easy Smartphone 3 F-06F', 'carrier' => 'DoCoMo' ],
+        'F-07D'                                     => [ 'Fujitsu', 'ARROWS μ F-07D', 'carrier' => 'DoCoMo' ],
+        'F-07E'                                     => [ 'Fujitsu', 'F-07E', 'carrier' => 'Disney Mobile' ],
+        'F-08D'                                     => [ 'Fujitsu', 'F-08D', 'carrier' => 'Disney Mobile' ],
+        'F-08E'                                     => [ 'Fujitsu', 'Easy Smartphone 2 F-08E', 'carrier' => 'DoCoMo' ],
+        'F-09D'                                     => [ 'Fujitsu', 'ANTEPRIMA F-09D', 'carrier' => 'DoCoMo' ],
+        'F-09E'                                     => [ 'Fujitsu', 'Easy Smartphone Premium F-09E', 'carrier' => 'DoCoMo' ],
+        'F-10D'                                     => [ 'Fujitsu', 'ARROWS X F-10D', 'carrier' => 'DoCoMo' ],
+        'F-11D'                                     => [ 'Fujitsu', 'ARROWS Me F-11D', 'carrier' => 'DoCoMo' ],
+        'F-12C'                                     => [ 'Fujitsu', 'GLOBE-TROTTER F-12C', 'carrier' => 'DoCoMo' ],
+        'F-12D'                                     => [ 'Fujitsu', 'Easy Smartphone F-12D', 'carrier' => 'DoCoMo' ],
+    ],
+
+    'f12[a-z]{3,3}!!' => [
+        'f12arc'                                    => [ 'Fujitsu', 'F12arc' ],
+        'f12bob'                                    => [ 'Fujitsu', 'F12bob' ],
+    ],
+
+    'FJ[LT][0-9]{2,2}!!' => [
+        'FJL21'                                     => [ 'Fujitsu', 'ARROWS ef FJL21', 'carrier' => 'au' ],
+        'FJL22'                                     => [ 'Fujitsu', 'ARROWS Z FJL22', 'carrier' => 'au' ],
+        'FJT21'                                     => [ 'Fujitsu', 'ARROWS Tab FJT21', DeviceType::TABLET, 'carrier' => 'au' ],
+    ],
+
+    'SZJ-JS101'                                 => [ 'Fujitsu', 'SZJ-JS101' ],
+
+    'FHMD001'                                   => [ 'Fujitsu', 'FHMD001', DeviceType::HEADSET ],
+
+    'F-074'                                     => [ 'Fujitsu', 'ARROWS μ F-07D', 'carrier' => 'DoCoMo' ],
+    'FJJB091'                                   => [ 'Fujitsu', 'ARROWS μ F-07D', 'carrier' => 'DoCoMo' ],
+    'EM01F'                                     => [ 'Fujitsu', 'ARROWS S EM01F', 'carrier' => 'EMOBILE' ],
+    'M01'                                       => [ 'Fujitsu', 'ARROWS M01' ],
+    'M02'                                       => [ 'Fujitsu', 'ARROWS M02' ],
+    'RM02'                                      => [ 'Fujitsu', 'ARROWS M02' ],
+    'M305'                                      => [ 'Fujitsu', 'ARROWS M305' ],
+    'M01T'                                      => [ 'Fujitsu', 'ARROWS Tab M01T', DeviceType::TABLET ],
+    'M555'                                      => [ 'Fujitsu', 'ARROWS Tab M555', DeviceType::TABLET ],
+    'FAR7'                                      => [ 'Fujitsu', 'ARROWS Tab FAR70A', DeviceType::TABLET ],
+    'FAR70B'                                    => [ 'Fujitsu', 'ARROWS Tab FAR70B', DeviceType::TABLET ],
+    'FARTM933KZ'                                => [ 'Fujitsu', 'ARROWS Tab M504', DeviceType::TABLET ],
+
+    'M350'                                      => [ 'Fujitsu', 'Stylistic M350', DeviceType::TABLET ],
+    'M532'                                      => [ 'Fujitsu', 'Stylistic M532', DeviceType::TABLET ],
+    'M363'                                      => [ 'Fujitsu', 'Stylistic M363', DeviceType::TABLET ],
+    'M702'                                      => [ 'Fujitsu', 'Stylistic M702', DeviceType::TABLET ],
+    'MH350'                                     => [ 'Fujitsu', 'Stylistic MH350', DeviceType::TABLET ],
+    'S01'                                       => [ 'Fujitsu', 'Stylistic S01', DeviceType::TABLET ],
+
+    'Patio100'                                  => [ 'Fujitsu', 'Patio100', DeviceType::POS ],
+    'Patio100 3G'                               => [ 'Fujitsu', 'Patio100', DeviceType::POS ],
+
+    'F&U ETB!!' => [
+        'F&U ETB7506'                               => [ 'F&U', 'ETB7506', DeviceType::TABLET ],
+        'F&U ETB7818'                               => [ 'F&U', 'ETB7818', DeviceType::TABLET ],
+        'F&U ETB9543'                               => [ 'F&U', 'ETB9543', DeviceType::TABLET ],
+        'F&U ETB9544'                               => [ 'F&U', 'ETB9544', DeviceType::TABLET ],
+        'F&U ETB1063'                               => [ 'F&U', 'ETB1063', DeviceType::TABLET ],
+        'F&U ETB1065'                               => [ 'F&U', 'ETB1065', DeviceType::TABLET ],
+    ],
+
+    'Asus A10'                                  => [ 'Garmin-Asus', 'Nuvifone A10' ],
+    'Monterra'                                  => [ 'Garmin', 'Monterra', DeviceType::GPS ],
+
+    'Garmin!!' => [
+        'Garminfone'                                => [ 'Garmin-Asus', 'Garminfone' ],
+        'Garmin-Asus A10'                           => [ 'Garmin-Asus', 'Nuvifone A10' ],
+        'Garmin-Asus A50'                           => [ 'Garmin-Asus', 'Nuvifone A50' ],
+    ],
+
+    'nuvi!!' => [
+        'nuvi 3590'                                 => [ 'Garmin', 'Nuvi 3590', DeviceType::GPS ],
+        'nuvi 3592'                                 => [ 'Garmin', 'Nuvi 3592', DeviceType::GPS ],
+        'nuvi 3595'                                 => [ 'Garmin', 'Nuvi 3595', DeviceType::GPS ],
+        'nuvifone A50'                              => [ 'Garmin-Asus', 'Nuvifone A50' ],
+    ],
+
+    'G1-715'                                    => [ 'Gateway', 'G1-715', DeviceType::TABLET ],
+    'G1-725'                                    => [ 'Gateway', 'G1-725', DeviceType::TABLET ],
+    'N3-2200'                                   => [ 'Gateway', 'N3-2200', DeviceType::TABLET ],
+    'TPA60W'                                    => [ 'Gateway', 'TPA60W', DeviceType::TABLET ],
+
+    '(GP-|Geeksphone)!!' => [
+        'GP-KEON'                                   => [ 'Geeksphone', 'Keon'],
+        'GP-PEAK'                                   => [ 'Geeksphone', 'Peak'],
+        'Geeksphone ZERO'                           => [ 'Geeksphone', 'ZERO'],
+        'Geeksphone ONE'                            => [ 'Geeksphone', 'ONE'],
+    ],
+
+    'Gemei!!' => [
+        'Gemei G2'                                  => [ 'Gemei', 'G2', DeviceType::TABLET ],
+        'Gemei G3'                                  => [ 'Gemei', 'G3', DeviceType::TABLET ],
+        'gemei G6'                                  => [ 'Gemei', 'G6', DeviceType::TABLET ],
+        'Gemei G9'                                  => [ 'Gemei', 'G9', DeviceType::TABLET ],
+        'gemei G9T'                                 => [ 'Gemei', 'G9T', DeviceType::TABLET ],
+    ],
+
+    'GEM[0-9]{4,4}!!' => [
+        'GEM7008'                                   => [ 'Gemini', 'JoyTab GEM7008', DeviceType::TABLET ],
+        'GEM7020'                                   => [ 'Gemini', 'JoyTab GEM7020', DeviceType::TABLET ],
+        'GEM7032G-rev2'                             => [ 'Gemini', 'JoyTab GEM7032', DeviceType::TABLET ],
+        'GEM10313BK'                                => [ 'Gemini', 'JoyTab GEM10313', DeviceType::TABLET ],
+        'GEM10313S'                                 => [ 'Gemini', 'JoyTab GEM10313', DeviceType::TABLET ],
+    ],
+
+    'GP-431'                                    => [ 'Genesis', 'GP-431' ],
+
+    'GT-[0-9]{4,4}!!' => [
+        'GT-7200'                                   => [ 'Genesis', 'Tab GT-7200', DeviceType::TABLET ],
+        'GT-7204'                                   => [ 'Genesis', 'Tab GT-7204', DeviceType::TABLET ],
+        'GT-7204R'                                  => [ 'Genesis', 'Tab GT-7204R', DeviceType::TABLET ],
+        'GT-7240'                                   => [ 'Genesis', 'Tab GT-7240', DeviceType::TABLET ],
+        'GT-7240R'                                  => [ 'Genesis', 'Tab GT-7240R', DeviceType::TABLET ],
+        'GT-7245'                                   => [ 'Genesis', 'Tab GT-7245', DeviceType::TABLET ],
+        'GT-7326'                                   => [ 'Genesis', 'Tab GT-7326', DeviceType::TABLET ],
+    ],
+
+    'GP-720'                                    => [ 'Genius', 'GP-720', DeviceType::TABLET ],
+
+    'G9'                                        => [ 'GFive', 'G9' ],
+
+    'GFIVE!!' => [
+        'GFIVE A5'                                  => [ 'GFive', 'A5' ],
+        'GFIVE A800'                                => [ 'GFive', 'A800' ],
+        'GFIVE Aurora(A79)'                         => [ 'GFive', 'Aurora' ],
+        'GFIVE A68'                                 => [ 'GFive', 'Beam' ],
+        'GFIVE Blade (F500)'                        => [ 'GFive', 'Blade' ],
+        'GFIVE Bravo'                               => [ 'GFive', 'Bravo' ],
+        'GFIVE Bravo(G95)'                          => [ 'GFive', 'Bravo' ],
+        'GFIVE A77'                                 => [ 'GFive', 'Bravo' ],
+        'GFIVE A57'                                 => [ 'GFive', 'Fanse' ],
+        'GFIVE Glory'                               => [ 'GFive', 'Glory' ],
+        'GFIVE Glory(A86)'                          => [ 'GFive', 'Glory' ],
+        'GFIVE A86'                                 => [ 'GFive', 'Glory' ],
+        'GFIVE Glory Bee(E670)'                     => [ 'GFive', 'Glory Bee' ],
+        'GFIVE Prado'                               => [ 'GFive', 'Prado' ],
+        'GFIVE President A97'                       => [ 'GFive', 'President' ],
+        'GFIVE president(G6)'                       => [ 'GFive', 'President' ],
+        'GFIVE President(G7)'                       => [ 'GFive', 'President' ],
+        'GFIVE President(G9)'                       => [ 'GFive', 'President' ],
+        'GFIVE G9'                                  => [ 'GFive', 'President' ],
+        'GFIVE.G9'                                  => [ 'GFive', 'President' ],
+        'GFIVE President G10 Fashion'               => [ 'GFive', 'President' ],
+        'GFIVE Spark(A1)'                           => [ 'GFive', 'Spark' ],
+        'GFIVE GPad701'                             => [ 'GFive', 'GPad 701', DeviceType::TABLET ],
+    ],
+
+    'GHIA!!' => [
+        'GHIA 20218P'                               => [ 'Ghia', 'Any 20218P', DeviceType::TABLET ],
+        'GHIA 27154P'                               => [ 'Ghia', 'Any 27154P', DeviceType::TABLET ],
+        'GHIA V2.0 27158N'                          => [ 'Ghia', 'Any 27158N', DeviceType::TABLET ],
+        'GHIA 27214P'                               => [ 'Ghia', 'Any 27214P', DeviceType::TABLET ],
+        'GHIA 27258B'                               => [ 'Ghia', 'Any 27258B', DeviceType::TABLET ],
+        'GHIA 27258N'                               => [ 'Ghia', 'Any 27258N', DeviceType::TABLET ],
+        'GHIA V2.0 27258N'                          => [ 'Ghia', 'Any 27258N', DeviceType::TABLET ],
+        'GHIA 29214P'                               => [ 'Ghia', 'Any 29214P', DeviceType::TABLET ],
+    ],
+
+    '(Gsmart|Gigabyte|Rio)!!' => [
+        'GSmart Aku A1'                             => [ 'Gigabyte', 'GSmart Aku A1' ],
+        'GSmart Alto A2'                            => [ 'Gigabyte', 'GSmart Alto A2' ],
+        'GSmart Arty A3'                            => [ 'Gigabyte', 'GSmart Arty A3' ],
+        'GSmart Akta A4'                            => [ 'Gigabyte', 'GSmart Akta A4' ],
+        'GSmart Essence 4'                          => [ 'Gigabyte', 'GSmart Essence 4' ],
+        'GSmart-G1305'                              => [ 'Gigabyte', 'GSmart G1305' ],
+        'GSmart G1310'                              => [ 'Gigabyte', 'GSmart G1310' ],
+        'GSmart G1315!'                             => [ 'Gigabyte', 'GSmart G1315' ],
+        'GSmart G1317!'                             => [ 'Gigabyte', 'GSmart G1317' ],
+        'GSmart G1342'                              => [ 'Gigabyte', 'GSmart G1342' ],
+        'GSmart G1345'                              => [ 'Gigabyte', 'GSmart G1345' ],
+        'GSmart G1355'                              => [ 'Gigabyte', 'GSmart G1355' ],
+        'GSmart G1362'                              => [ 'Gigabyte', 'GSmart G1362' ],
+        'GSmart GS202!'                             => [ 'Gigabyte', 'GSmart GS202' ],
+        'GSmart Guru G1'                            => [ 'Gigabyte', 'GSmart Guru G1' ],
+        'GSmart Maya M1'                            => [ 'Gigabyte', 'GSmart Maya M1' ],
+        'GSmart Maya M1v2'                          => [ 'Gigabyte', 'GSmart Maya M1 v2' ],
+        'GSmart Maya M1 v2'                         => [ 'Gigabyte', 'GSmart Maya M1 v2' ],
+        'GSmart Mika M2'                            => [ 'Gigabyte', 'GSmart Mika M2' ],
+        'GSmart Mika M3'                            => [ 'Gigabyte', 'GSmart Mika M3' ],
+        'GSmart Rio R1'                             => [ 'Gigabyte', 'GSmart Rio R1' ],
+        'GIGABYTE GSmart Rio R1'                    => [ 'Gigabyte', 'GSmart Rio R1' ],
+        'Gigabyte RIO R1'                           => [ 'Gigabyte', 'GSmart Rio R1' ],
+        'Rio R1'                                    => [ 'Gigabyte', 'GSmart Rio R1' ],
+        'GSmart Roma R2'                            => [ 'Gigabyte', 'GSmart Roma R2' ],
+        'GSmart Rey R3'                             => [ 'Gigabyte', 'GSmart Rey R3' ],
+        'GSmart Saga S3'                            => [ 'Gigabyte', 'GSmart Saga S3' ],
+        'GSmart Sierra S1'                          => [ 'Gigabyte', 'GSmart Sierra S1' ],
+        'GSmart Tuku T2'                            => [ 'Gigabyte', 'GSmart Tuku T2' ],
+        'GSmart T4'                                 => [ 'Gigabyte', 'GSmart T4' ],
+        'Gigabyte TB100'                            => [ 'Gigabyte', 'TB100', DeviceType::TABLET ],
+    ],
+
+    'Gigaset!!' => [
+        'Gigaset QV830'                             => [ 'Gigaset', 'QV830', DeviceType::TABLET ],
+        'Gigaset QV831'                             => [ 'Gigaset', 'QV831', DeviceType::TABLET ],
+        'Gigaset QV1030'                            => [ 'Gigaset', 'QV1030', DeviceType::TABLET ],
+    ],
+
+    '80-1'                                      => [ 'Gigaset', 'Maxwell 10', DeviceType::DECT ],
+    'SL930'                                     => [ 'Gigaset', 'SL930', DeviceType::DECT ],
+
+    '(GIO-)?(GiONEE[- ])?A9$!'                  => [ 'Gionee', 'A9' ],
+    '(GIO-)?(GiONEE[- ])?C500!'                 => [ 'Gionee', 'C500' ],
+    '(GIO-)?(GiONEE[- ])?C600!'                 => [ 'Gionee', 'C600' ],
+    '(GIO-)?(GiONEE[- ])?C610!'                 => [ 'Gionee', 'C610' ],
+    '(GIO-)?(GiONEE[- ])?C620!'                 => [ 'Gionee', 'C620' ],
+    '(GIO-)?(GiONEE[- ])?C700!'                 => [ 'Gionee', 'C700' ],
+    '(GIO-)?(GiONEE[- ])?C800!'                 => [ 'Gionee', 'C800' ],
+    '(GIO-)?(GiONEE[- ])?Dream D1!'             => [ 'Gionee', 'Dream D1' ],
+    '(GIO-)?(GiONEE[- ])?E3T!'                  => [ 'Gionee', 'E3T' ],
+    '(GIO-)?(GiONEE[- ])?E3$!'                  => [ 'Gionee', 'E3' ],
+    '(GIO-)?(GiONEE[- ])?E5$!'                  => [ 'Gionee', 'E5' ],
+    '(GIO-)?(GiONEE[- ])?E6mini!'               => [ 'Gionee', 'E6 mini' ],
+    '(GIO-)?(GiONEE[- ])?E6$!'                  => [ 'Gionee', 'E6' ],
+    '(GIO-)?(GiONEE[- ])?E6T$!'                 => [ 'Gionee', 'E6T' ],
+    '(GIO-)?(GiONEE[- ])?E7$!'                  => [ 'Gionee', 'E7' ],
+    '(GIO-)?(GiONEE[- ])?F103!'                 => [ 'Gionee', 'F103' ],
+    '(GIO-)?(GiONEE[- ])?F301!'                 => [ 'Gionee', 'F301' ],
+    '(GIO-)?(GiONEE[- ])?GN5001!'               => [ 'Gionee', 'GN5001' ],
+    '(GIO-)?(GiONEE[- ])?GN5002!'               => [ 'Gionee', 'GN5002' ],
+    '(GIO-)?(GiONEE[- ])?GN8001!'               => [ 'Gionee', 'GN8001' ],
+    '(GIO-)?(GiONEE[- ])?GN9000!'               => [ 'Gionee', 'GN9000' ],
+    '(GIO-)?(GiONEE[- ])?GN9001!'               => [ 'Gionee', 'GN9001' ],
+    '(GIO-)?(GiONEE[- ])?GN9002!'               => [ 'Gionee', 'GN9002' ],
+    '(GIO-)?(GiONEE[- ])?GN9004!'               => [ 'Gionee', 'GN9004' ],
+    '(GIO-)?(GiONEE[- ])?GN9005!'               => [ 'Gionee', 'GN9005' ],
+    '(GIO-)?(GiONEE[- ])?GN9006!'               => [ 'Gionee', 'GN9006' ],
+    '(GIO-)?(GiONEE[- ])?GN9007!'               => [ 'Gionee', 'GN9007' ],
+    '(GIO-)?(GiONEE[- ])?GN9008!'               => [ 'Gionee', 'GN9008' ],
+    '(GIO-)?(GiONEE[- ])?GN9010!'               => [ 'Gionee', 'GN9010' ],
+    '(GIO-)?(GiONEE[- ])?GN100T!'               => [ 'Gionee', 'GN100T' ],
+    '(GIO-)?(GiONEE[- ])?GN100!'                => [ 'Gionee', 'GN100' ],
+    '(GIO-)?(GiONEE[- ])?GN105!'                => [ 'Gionee', 'GN105' ],
+    '(GIO-)?(GiONEE[- ])?GN106!'                => [ 'Gionee', 'GN106' ],
+    '(GIO-)?(GiONEE[- ])?GN107!'                => [ 'Gionee', 'GN107' ],
+    '(GIO-)?(GiONEE[- ])?GN108!'                => [ 'Gionee', 'GN108' ],
+    '(GIO-)?(GiONEE[- ])?GN109!'                => [ 'Gionee', 'GN109' ],
+    '(GIO-)?(GiONEE[- ])?GN135!'                => [ 'Gionee', 'GN135' ],
+    '(GIO-)?(GiONEE[- ])?GN136!'                => [ 'Gionee', 'GN136' ],
+    '(GIO-)?(GiONEE[- ])?GN137!'                => [ 'Gionee', 'GN137' ],
+    '(GIO-)?(GiONEE[- ])?GN139!'                => [ 'Gionee', 'GN139' ],
+    '(GIO-)?(GiONEE[- ])?GN150!'                => [ 'Gionee', 'GN150' ],
+    '(GIO-)?(GiONEE[- ])?GN151!'                => [ 'Gionee', 'GN151' ],
+    '(GIO-)?(GiONEE[- ])?GN152!'                => [ 'Gionee', 'GN152' ],
+    '(GIO-)?(GiONEE[- ])?GN160T!'               => [ 'Gionee', 'GN160T' ],
+    '(GIO-)?(GiONEE[- ])?GN160!'                => [ 'Gionee', 'GN160' ],
+    '(GIO-)?(GiONEE[- ])?GN168T!'               => [ 'Gionee', 'GN168T' ],
+    '(GIO-)?(GiONEE[- ])?GN170!'                => [ 'Gionee', 'GN170' ],
+    '(GIO-)?(GiONEE[- ])?GN180!'                => [ 'Gionee', 'GN180' ],
+    '(GIO-)?(GiONEE[- ])?GN181!'                => [ 'Gionee', 'GN181' ],
+    '(GIO-)?(GiONEE[- ])?GN200!'                => [ 'Gionee', 'GN200' ],
+    '(GIO-)?(GiONEE[- ])?GN205!'                => [ 'Gionee', 'GN205' ],
+    '(GIO-)?(GiONEE[- ])?GN210!'                => [ 'Gionee', 'GN210' ],
+    '(GIO-)?(GiONEE[- ])?GN305!'                => [ 'Gionee', 'GN305' ],
+    '(GIO-)?(GiONEE[- ])?GN320!'                => [ 'Gionee', 'GN320' ],
+    '(GIO-)?(GiONEE[- ])?GN360!'                => [ 'Gionee', 'GN360' ],
+    '(GIO-)?(GiONEE[- ])?GN380!'                => [ 'Gionee', 'GN380' ],
+    '(GIO-)?(GiONEE[- ])?GN600!'                => [ 'Gionee', 'GN600' ],
+    '(GIO-)?(GiONEE[- ])?GN700T!'               => [ 'Gionee', 'GN700T' ],
+    '(GIO-)?(GiONEE[- ])?GN700W!'               => [ 'Gionee', 'GN700W' ],
+    '(GIO-)?(GiONEE[- ])?GN705T!'               => [ 'Gionee', 'GN705T' ],
+    '(GIO-)?(GiONEE[- ])?GN705W!'               => [ 'Gionee', 'GN705W' ],
+    '(GIO-)?(GiONEE[- ])?GN706L!'               => [ 'Gionee', 'GN706L' ],
+    '(GIO-)?(GiONEE[- ])?GN708T!'               => [ 'Gionee', 'GN708T' ],
+    'GN 708T'                                   => [ 'Gionee', 'GN708T' ],
+    '(GIO-)?(GiONEE[- ])?GN708W!'               => [ 'Gionee', 'GN708W' ],
+    'GPLUS GN708W'                              => [ 'Gionee', 'GN708W' ],
+    '(GIO-)?(GiONEE[- ])?GN787!'                => [ 'Gionee', 'GN787' ],
+    '(GIO-)?(GiONEE[- ])?GN800!'                => [ 'Gionee', 'GN800' ],
+    '(GIO-)?(GiONEE[- ])?GN810!'                => [ 'Gionee', 'GN810' ],
+    '(GIO-)?(GiONEE[- ])?GN818T!'               => [ 'Gionee', 'GN818T' ],
+    '(GIO-)?(GiONEE[- ])?GN858!'                => [ 'Gionee', 'GN858' ],
+    '(GIO-)?(GiONEE[- ])?GN868!'                => [ 'Gionee', 'GN868' ],
+    '(GIO-)?(GiONEE[- ])?GN878!'                => [ 'Gionee', 'GN878' ],
+    'Gionee M1'                                 => [ 'Gionee', 'M1' ],
+    'Gionee M2'                                 => [ 'Gionee', 'M2' ],
+    'Gionee-M2'                                 => [ 'Gionee', 'M2' ],
+    'Gionee M3S'                                => [ 'Gionee', 'M3S' ],
+    'Gionee M5'                                 => [ 'Gionee', 'M5' ],
+    'GPLUS N809'                                => [ 'Gionee', 'N809' ],
+    '(GIO-)?(GiONEE[- ])?S101!'                 => [ 'Gionee', 'S101' ],
+    'GiONEE TD500'                              => [ 'Gionee', 'TD500' ],
+    '(GIO-)?(GiONEE[- ])?V182!'                 => [ 'Gionee', 'V182' ],
+    '(GIO-)?(GiONEE[- ])?V185!'                 => [ 'Gionee', 'V185' ],
+    '(GIO-)?(GiONEE[- ])?V188!'                 => [ 'Gionee', 'V188' ],
+    '(GIO-)?(GiONEE[- ])?W800!'                 => [ 'Gionee', 'W800' ],
+    '(GIO-)?(GiONEE[- ])?X817!'                 => [ 'Gionee', 'X817' ],
+    '(GIO-)?(GiONEE[- ])?Ctrl V1!'              => [ 'Gionee', 'CTRL V1' ],
+    '(GIO-)?(GiONEE[- ])?Ctrl V2!'              => [ 'Gionee', 'CTRL V2' ],
+    '(GIO-)?(GiONEE[- ])?Ctrl V3!'              => [ 'Gionee', 'CTRL V3' ],
+    '(GIO-)?(GiONEE[- ])?Ctrl V4!'              => [ 'Gionee', 'CTRL V4' ],
+    '(GIO-)?(GiONEE[- ])?Ctrl V5!'              => [ 'Gionee', 'CTRL V5' ],
+    '(GIO-)?(GiONEE[- ])?Pioneer P1!'           => [ 'Gionee', 'Pioneer P1' ],
+    '(GIO-)?(GiONEE[- ])?Pioneer P2!'           => [ 'Gionee', 'Pioneer P2' ],
+    '(GIO-)?(GiONEE[- ])?Pioneer P3!'           => [ 'Gionee', 'Pioneer P3' ],
+    '(GIO-)?(GiONEE[- ])?Pioneer P4!'           => [ 'Gionee', 'Pioneer P4' ],
+    'Gionee P3'                                 => [ 'Gionee', 'Pioneer P3' ],
+    'Gionee P4'                                 => [ 'Gionee', 'Pioneer P4' ],
+    'GiONEE S7'                                 => [ 'Gionee', 'Elife S7' ],
+    '(GIO-)?(GiONEE[- ])?Gpad G1!'              => [ 'Gionee', 'GPAD G1', DeviceType::TABLET ],
+    '(GIO-)?(GiONEE[- ])?Gpad G2!'              => [ 'Gionee', 'GPAD G2', DeviceType::TABLET ],
+    '(GIO-)?(GiONEE[- ])?Gpad G3!'              => [ 'Gionee', 'GPAD G3', DeviceType::TABLET ],
+    'GL-900'                                    => [ 'GlobusGPS', 'GL-900', DeviceType::GPS ],
+
+    'GLX!!' => [
+        'GLX Jet'                                   => [ 'GLX', 'Jet', DeviceType::TABLET ],
+        'GLX Luster a'                              => [ 'GLX', 'Luster', DeviceType::TABLET ],
+        'GLX SpiderI'                               => [ 'GLX', 'Spider', DeviceType::TABLET ],
+    ],
+
+    'GOCL!!' => [
+        'GOCLEVER ANDROID BOX 500'                  => [ 'Goclever', 'Android Box 500', ],
+        'GOCLEVER'                                  => [ 'Goclever', 'TAB', DeviceType::TABLET ],
+        'GOCLEVER TAB A73'                          => [ 'Goclever', 'TAB A73', DeviceType::TABLET ],
+        'GOCLEVER TAB A93'                          => [ 'Goclever', 'TAB A93', DeviceType::TABLET ],
+        'GOCLEVER TAB A93.2'                        => [ 'Goclever', 'TAB A93', DeviceType::TABLET ],
+        'GOCLEVER TAB A101'                         => [ 'Goclever', 'TAB A101', DeviceType::TABLET ],
+        'GOCLEVER TAB A103'                         => [ 'Goclever', 'TAB A103', DeviceType::TABLET ],
+        'GOCLEVER A103'                             => [ 'Goclever', 'TAB A103', DeviceType::TABLET ],
+        'GOCLEVER TAB A104!'                        => [ 'Goclever', 'TAB A104', DeviceType::TABLET ],
+        'GOCLEVER TAB A971'                         => [ 'Goclever', 'TAB A971', DeviceType::TABLET ],
+        'GOCLEVER TAB A972BK'                       => [ 'Goclever', 'TAB A972', DeviceType::TABLET ],
+        'GOCLEVER TAB I71'                          => [ 'Goclever', 'TAB I71', DeviceType::TABLET ],
+        'GOCLEVER TAB M703G'                        => [ 'Goclever', 'TAB M703G', DeviceType::TABLET ],
+        'GOCLEVER TAB M713G'                        => [ 'Goclever', 'TAB M713G', DeviceType::TABLET ],
+        'GOCLEVER TAB M723G'                        => [ 'Goclever', 'TAB M723G', DeviceType::TABLET ],
+        'GOCLEVER TAB M813G'                        => [ 'Goclever', 'TAB M813G', DeviceType::TABLET ],
+        'GOCLEVER TAB R70'                          => [ 'Goclever', 'TAB R70', DeviceType::TABLET ],
+        'GOCLEVER TAB R76.1'                        => [ 'Goclever', 'TAB R76', DeviceType::TABLET ],
+        'GOCLEVER TAB R104'                         => [ 'Goclever', 'TAB R104', DeviceType::TABLET ],
+        'GOCLEVER TAB R106'                         => [ 'Goclever', 'TAB R106', DeviceType::TABLET ],
+        'GOCLEVER TAB T75'                          => [ 'Goclever', 'TAB T75', DeviceType::TABLET ],
+        'GOCLEVER TAB T76'                          => [ 'Goclever', 'TAB T76', DeviceType::TABLET ],
+        'GOCLEVER TAB 9300'                         => [ 'Goclever', 'TAB 9300', DeviceType::TABLET ],
+        'GOCLM7000KD'                               => [ 'Goclever', 'Terra 70', DeviceType::TABLET ],
+        'GOCLEVER HYBRID'                           => [ 'Goclever', 'Hybrid', DeviceType::TABLET ],
+        'GOCLEVER NETBOOK I102'                     => [ 'Goclever', 'Netbook I102' ],
+        'GOCLEVER NETBOOK R103'                     => [ 'Goclever', 'Netbook R103' ],
+    ],
+
+    'ARIES 101'                                 => [ 'Goclever', 'ARIES 101', DeviceType::TABLET ],
+    'ARIES 785'                                 => [ 'Goclever', 'ARIES 785', DeviceType::TABLET ],
+    'INSIGNIA 5'                                => [ 'Goclever', 'INSIGNIA 5' ],
+    'INSIGNIA 5X'                               => [ 'Goclever', 'INSIGNIA 5X' ],
+    'QUANTUM 4'                                 => [ 'Goclever', 'QUANTUM 4' ],
+    'QUANTUM 700m'                              => [ 'Goclever', 'QUANTUM 700M' ],
+    'QUANTUM 1010N'                             => [ 'Goclever', 'QUANTUM 1010N' ],
+
+    'GO Live!!' => [
+        'GO Live S1'                                => [ 'GoLive', 'S1' ],
+        'GO Live Dual Core'                         => [ 'GoLive', 'Dual Core' ],
+    ],
+
+    'GOOPHONE!!' => [
+        'GOOPHONE i5C'                              => [ 'Goophone', 'i5C' ],
+        'GOOPHONE i5S'                              => [ 'Goophone', 'i5S' ],
+        'Goophone i9'                               => [ 'Goophone', 'i9' ],
+        'GOOPHONE M3+'                              => [ 'Goophone', 'M3+' ],
+        'GooPhone S5 Pro'                           => [ 'Goophone', 'S5 Pro' ],
+        'GOOPHONE X1'                               => [ 'Goophone', 'X1' ],
+        'GOOPHONE X7'                               => [ 'Goophone', 'X7' ],
+    ],
+
+    'CHONG!!' => [
+        'GHONG T618'                                => [ 'Guohong', 'T618' ],
+        'GHONGV10'                                  => [ 'Guohong', 'V10' ],
+        'GHONGV12'                                  => [ 'Guohong', 'V12' ],
+        'GHONG W100'                                => [ 'Guohong', 'W100' ],
+    ],
+
+    'M758A'                                     => [ 'Gpad', 'M758A', DeviceType::TABLET ],
+
+    'GO !!' => [
+        'GO M1'                                     => [ 'GreenOrange', 'M1' ],
+        'GO M2'                                     => [ 'GreenOrange', 'M2' ],
+        'GO M2S'                                    => [ 'GreenOrange', 'M2S' ],
+        'GO M3'                                     => [ 'GreenOrange', 'M3' ],
+        'GO N1'                                     => [ 'GreenOrange', 'N1' ],
+        'GO N1-Y'                                   => [ 'GreenOrange', 'N1-Y' ],
+        'GO N1S'                                    => [ 'GreenOrange', 'N1S' ],
+        'GO N2'                                     => [ 'GreenOrange', 'N2' ],
+        'GO NX'                                     => [ 'GreenOrange', 'NX' ],
+        'GO S2'                                     => [ 'GreenOrange', 'S2' ],
+    ],
+
+    'GR-TB!!' => [
+        'GR-TB7'                                    => [ 'Grundig', 'Style Tab GR-TB7', DeviceType::TABLET ],
+        'GR-TB10S'                                  => [ 'Grundig', 'Style Tab GR-TB10S', DeviceType::TABLET ],
+    ],
+
+    'GVON 898'                                  => [ 'Gvon', 'Aero 898' ],
+
+    '(Haier[- ])?H[ETW]- ?[A-Z][0-9]!!' => [
+        '(Haier[- ])?HE-E80!'                       => [ 'Haier', 'E80' ],
+        '(Haier[- ])?HE-E617!'                      => [ 'Haier', 'E617' ],
+        '(Haier[- ])?HE-E700!'                      => [ 'Haier', 'E700' ],
+        '(Haier[- ])?HE-E760!'                      => [ 'Haier', 'E760' ],
+        '(Haier[- ])?HT-I600!'                      => [ 'Haier', 'I600' ],
+        '(Haier[- ])?HT-I617!'                      => [ 'Haier', 'I617' ],
+        '(Haier[- ])?HT-I619!'                      => [ 'Haier', 'I619' ],
+        '(Haier[- ])?HT-I710!'                      => [ 'Haier', 'I710' ],
+        '(Haier[- ])?HT-I736!'                      => [ 'Haier', 'I736' ],
+        '(Haier[- ])?HT-I756!'                      => [ 'Haier', 'I756' ],
+        '(Haier[- ])?HT-I816!'                      => [ 'Haier', 'I816' ],
+        '(Haier[- ])?HT-I860!'                      => [ 'Haier', 'I860' ],
+        '(Haier[- ])?HT-I928!'                      => [ 'Haier', 'I928' ],
+        '(Haier[- ])?HW-N66W!'                      => [ 'Haier', 'N66W' ],
+        '(Haier[- ])?HW-N86W!'                      => [ 'Haier', 'N86W' ],
+        '(Haier[- ])?(HW-)?N88W!'                   => [ 'Haier', 'N88W' ],
+        '(Haier[- ])?HW-N620E!'                     => [ 'Haier', 'N620E' ],
+        '(Haier[- ])?HW-N800!'                      => [ 'Haier', 'N800' ],
+        '(Haier[- ])?(HW-)?W716!'                   => [ 'Haier', 'W716' ],
+        '(Haier[- ])?(HW-)?W718!'                   => [ 'Haier', 'W718' ],
+        '(Haier[- ])?HW-W820!'                      => [ 'Haier', 'W820' ],
+        '(Haier[- ])?HW-W850!'                      => [ 'Haier', 'W850' ],
+        '(Haier[- ])?HW-W860!'                      => [ 'Haier', 'W860' ],
+        '(Haier[- ])?HW-W910!'                      => [ 'Haier', 'W910' ],
+    ],
+
+    'Haier-W700'                                => [ 'Haier', 'W700' ],
+    'W757'                                      => [ 'Haier', 'W757' ],
+    'Haier-SY0880'                              => [ 'Haier', 'SY0880' ],
+    '(LE[0-9]{2,2}[BMU][0-9]{4,4}[A-Z]+)!'      => [ 'Haier', '$1', DeviceType::TELEVISION ],
+
+    'Zio P2'                                    => [ 'Haier', 'Zio P2' ],
+
+    'PAD[0-9]{3,3}!!' => [
+        'PAD511'                                    => [ 'Haier', 'Pad 511', DeviceType::TABLET ],
+        'PAD711'                                    => [ 'Haier', 'Pad 711', DeviceType::TABLET ],
+        'PAD722'                                    => [ 'Haier', 'Pad 722', DeviceType::TABLET ],
+        'PAD821'                                    => [ 'Haier', 'Pad 821', DeviceType::TABLET ],
+        'PAD822'                                    => [ 'Haier', 'Pad 822', DeviceType::TABLET ],
+    ],
+
+    'I9220'                                     => [ 'Haipai', 'I9220' ],
+    'GT-i9377'                                  => [ 'Haipai', 'I9377' ],
+    'X710d'                                     => [ 'Haipai', 'X710D' ],
+    'X720D'                                     => [ 'Haipai', 'X720D' ],
+
+    'SN[0-9]!!' => [
+        'SN10T1'                                    => [ 'HANNspree', 'HANNSpad SN10T1', DeviceType::TABLET ],
+        'SN10T2'                                    => [ 'HANNspree', 'HANNSpad SN10T2', DeviceType::TABLET ],
+        'SN14T71'                                   => [ 'HANNspree', 'HANNSpad SN14T71', DeviceType::TABLET ],
+        'SN97T41W'                                  => [ 'HANNspree', 'HANNSpad SN97T41W', DeviceType::TABLET ],
+        'SN1AT71W(B)'                               => [ 'HANNspree', 'HANNSpad SN1AT71WB', DeviceType::TABLET ],
+    ],
+
+    'HannsComb'                                 => [ 'HANNspree', 'HANNSpad', DeviceType::TABLET ],
+    'Hannspadd'                                 => [ 'HANNspree', 'HANNSpad', DeviceType::TABLET ],
+
+    'U1'                                        => [ 'HCL', 'ME U1', DeviceType::TABLET ],
+    'X1'                                        => [ 'HCL', 'ME X1', DeviceType::TABLET ],
+    'Y2'                                        => [ 'HCL', 'ME Y2', DeviceType::TABLET ],
+    'Connect-2G-2.0'                            => [ 'HCL', 'ME Connect 2G 2.0', DeviceType::TABLET ],
+    'H701'                                      => [ 'Hedy', 'H701' ],
+
+    'HEDY!!' => [
+        'HEDY H701'                                 => [ 'Hedy', 'H701' ],
+        'HEDY H712'                                 => [ 'Hedy', 'H712' ],
+        'HEDY H770'                                 => [ 'Hedy', 'H770' ],
+        'HEDY S801'                                 => [ 'Hedy', 'S801' ],
+        'HEDY S803'                                 => [ 'Hedy', 'S803' ],
+        'HEDY T700'                                 => [ 'Hedy', 'T700' ],
+    ],
+
+    '9300+'                                     => [ 'Hero', '9300+' ],
+    'H2000+'                                    => [ 'Hero', 'H2000+' ],
+    'H7100'                                     => [ 'Hero', 'H7100' ],
+    'H7500+'                                    => [ 'Hero', 'H7500+' ],
+    'HERO H7500+'                               => [ 'Hero', 'H7500+' ],
+    'H9500'                                     => [ 'Hero', 'H9500' ],
+    'MID Ser(ai|ia)ls!'                         => [ 'Herotab', 'C8', DeviceType::TABLET ],
+
+    '(Highscreen|Alpha|Bay|Boost|Cosmo|Explosion|Power|Prime|Zera)!!' => [
+        'Alpha Ice'                                 => [ 'Highscreen', 'Alpha Ice' ],
+        'Alpha GT'                                  => [ 'Highscreen', 'Alpha GT' ],
+        'Alpha GTR'                                 => [ 'Highscreen', 'Alpha GTR' ],
+        'HIGHSCREEN GTR'                            => [ 'Highscreen', 'Alpha GTR' ],
+        'Alpha GTX'                                 => [ 'Highscreen', 'Alpha GTX' ],
+        'Alpha R'                                   => [ 'Highscreen', 'Alpha R' ],
+        'Alpha Rage'                                => [ 'Highscreen', 'Alpha Rage' ],
+        'Bay'                                       => [ 'Highscreen', 'Bay' ],
+        'HighScreen Boost'                          => [ 'Highscreen', 'Boost' ],
+        'Boost II'                                  => [ 'Highscreen', 'Boost 2' ],
+        'Boost IIse'                                => [ 'Highscreen', 'Boost 2 SE' ],
+        'Highscreen Boost 2 SE'                     => [ 'Highscreen', 'Boost 2 SE' ],
+        'Boost3'                                    => [ 'Highscreen', 'Boost 3' ],
+        'Boost 3 SE'                                => [ 'Highscreen', 'Boost 3 SE' ],
+        'Cosmo'                                     => [ 'Highscreen', 'Cosmo', DeviceType::TABLET ],
+        'COSMO DUO'                                 => [ 'Highscreen', 'Cosmo Duo', DeviceType::TABLET ],
+        'Explosion'                                 => [ 'Highscreen', 'Explosion' ],
+        'HIGHSCREEN Jet Duo'                        => [ 'Highscreen', 'Jet Duo', DeviceType::TABLET ],
+        'PowerFive'                                 => [ 'Highscreen', 'Power Five' ],
+        'PowerFour'                                 => [ 'Highscreen', 'Power Four' ],
+        'Power Ice'                                 => [ 'Highscreen', 'Power Ice' ],
+        'Power Rage'                                => [ 'Highscreen', 'Power Rage' ],
+        'Prime L'                                   => [ 'Highscreen', 'Prime L' ],
+        'Highscreen Spark'                          => [ 'Highscreen', 'Spark' ],
+        'ZeraF'                                     => [ 'Highscreen', 'Zera F' ],
+        'Zera F'                                    => [ 'Highscreen', 'Zera F' ],
+        'Zera f rev.S'                              => [ 'Highscreen', 'Zera F' ],
+        'Zera S'                                    => [ 'Highscreen', 'Zera S' ],
+        'Zera S Rev.S'                              => [ 'Highscreen', 'Zera S' ],
+        'Zera-S-Power'                              => [ 'Highscreen', 'Zera S Power' ],
+        'Zera U'                                    => [ 'Highscreen', 'Zera U' ],
+    ],
+
+    'HLV-T!!' => [
+        'HLV-T701'                                  => [ 'Hi-Level', 'HLV-T701', DeviceType::TABLET ],
+        'HLV-T702'                                  => [ 'Hi-Level', 'HLV-T702', DeviceType::TABLET ],
+        'HLV-T704'                                  => [ 'Hi-Level', 'HLV-T704', DeviceType::TABLET ],
+        'HLV-T707'                                  => [ 'Hi-Level', 'HLV-T707', DeviceType::TABLET ],
+        'HLV-T1001W'                                => [ 'Hi-Level', 'HLV-T1001W', DeviceType::TABLET ],
+        'HLV-T1002W'                                => [ 'Hi-Level', 'HLV-T1002W', DeviceType::TABLET ],
+        'HLV-T9701'                                 => [ 'Hi-Level', 'HLV-T9701', DeviceType::TABLET ],
+        'HLV-TN75'                                  => [ 'Hi-Level', 'HLV-TN75', DeviceType::TABLET ],
+    ],
+
+    'HIKe!!' => [
+        'HIKe 716'                                  => [ 'HIKe', 'Q1' ],
+        'HIKe 818'                                  => [ 'HIKe', 'Pandora 2' ],
+        'HIKe 828'                                  => [ 'HIKe', 'X1' ],
+        'HIKe 828A'                                 => [ 'HIKe', 'X1' ],
+        'HIKe 848'                                  => [ 'HIKe', 'X2' ],
+        'HIKe 868'                                  => [ 'HIKe', 'Z1' ],
+    ],
+
+    'HILIVE H7'                                 => [ 'Hilive', 'H7' ],
+
+    'HS-[0-9]{1,2}DTB!!' => [
+        'HS-7DTB4!'                                 => [ 'Hipstreet', 'Titan 7"', DeviceType::TABLET ],
+        'HS-7DTB25!'                                => [ 'Hipstreet', 'Titan 2 7"', DeviceType::TABLET ],
+        'HS-7DTB26!'                                => [ 'Hipstreet', 'Titan+ 7"', DeviceType::TABLET ],
+        'HS-7DTB27!'                                => [ 'Hipstreet', 'Titan+ 7"', DeviceType::TABLET ],
+        'HS-7DTB29!'                                => [ 'Hipstreet', 'Astro 7"', DeviceType::TABLET ],
+        'HS-7DTB39!'                                => [ 'Hipstreet', 'Titan 2 7"', DeviceType::TABLET ],
+        'HS-7DTB5!'                                 => [ 'Hipstreet', 'Nova 7"', DeviceType::TABLET ],
+        'HS-7DTB6!'                                 => [ 'Hipstreet', 'Aurora 7"', DeviceType::TABLET ],
+        'HS-785TB2!'                                => [ 'Hipstreet', 'Hyperion 7"', DeviceType::TABLET ],
+        'HS-785TB3!'                                => [ 'Hipstreet', 'i8', DeviceType::TABLET ],
+        'HS-8DTB!'                                  => [ 'Hipstreet', 'Flash 8"', DeviceType::TABLET ],
+        'HS-9DTB4!'                                 => [ 'Hipstreet', 'Flare 9"', DeviceType::TABLET ],
+        'HS-9DTB7!'                                 => [ 'Hipstreet', 'Flare 2 9"', DeviceType::TABLET ],
+        'HS-9DTB37!'                                => [ 'Hipstreet', 'Flare 3 9"', DeviceType::TABLET ],
+        'HS-10DTB2!'                                => [ 'Hipstreet', 'Equinox 10"', DeviceType::TABLET ],
+        'HS-10DTB4!'                                => [ 'Hipstreet', 'Equinox 4 10"', DeviceType::TABLET ],
+        'HS-10DTB5!'                                => [ 'Hipstreet', 'Spectrum 10"', DeviceType::TABLET ],
+        'HS-10DTB8!'                                => [ 'Hipstreet', 'Equinox 3 10"', DeviceType::TABLET ],
+        'HS-10DTB12!'                               => [ 'Hipstreet', 'Phoenix 10"', DeviceType::TABLET ],
+    ],
+
+    'HS-[EFHITUX][0-9]!!' => [
+        'HS-X1'                                     => [ 'Hisense', 'X1' ],
+        'HS-X5T'                                    => [ 'Hisense', 'X5T' ],
+        'HS-X6C'                                    => [ 'Hisense', 'X6C' ],
+        'HS-X8C'                                    => [ 'Hisense', 'X8C' ],
+        'HS-X8T'                                    => [ 'Hisense', 'X8T' ],
+        'HS-U8'                                     => [ 'Hisense', 'U8' ],
+        'HS-U9'                                     => [ 'Hisense', 'U9' ],
+        'HS-U98'                                    => [ 'Hisense', 'U98' ],
+        'HS-U609'                                   => [ 'Hisense', 'U609' ],
+        'HS-U800'                                   => [ 'Hisense', 'U800' ],
+        'HS-U820'                                   => [ 'Hisense', 'U820' ],
+        'HS-U850'                                   => [ 'Hisense', 'U850' ],
+        'HS-U860'                                   => [ 'Hisense', 'U860' ],
+        'HS-U909'                                   => [ 'Hisense', 'U909' ],
+        'HS-U909B'                                  => [ 'Hisense', 'U909B' ],
+        'HS-U912'                                   => [ 'Hisense', 'U912' ],
+        'HS-U912C'                                  => [ 'Hisense', 'U912C' ],
+        'HS-U930'                                   => [ 'Hisense', 'U930' ],
+        'HS-U936'                                   => [ 'Hisense', 'U936' ],
+        'HS-U939'                                   => [ 'Hisense', 'U939' ],
+        'HS-U950'                                   => [ 'Hisense', 'U950' ],
+        'HS-U958'                                   => [ 'Hisense', 'U958' ],
+        'HS-U960Q'                                  => [ 'Hisense', 'U960' ],
+        'HS-U966'                                   => [ 'Hisense', 'U966' ],
+        'HS-U970'                                   => [ 'Hisense', 'U970' ],
+        'HS-U971'                                   => [ 'Hisense', 'U971' ],
+        'HS-U978'                                   => [ 'Hisense', 'U978' ],
+        'HS-U980'                                   => [ 'Hisense', 'U980' ],
+        'HS-U988'                                   => [ 'Hisense', 'U988' ],
+        'HS-T9'                                     => [ 'Hisense', 'T9' ],
+        'HS-T92'                                    => [ 'Hisense', 'T92' ],
+        'HS-T96'                                    => [ 'Hisense', 'T96' ],
+        'HS-T818'                                   => [ 'Hisense', 'T818' ],
+        'HS-T820'                                   => [ 'Hisense', 'T820' ],
+        'HS-T830'                                   => [ 'Hisense', 'T830' ],
+        'HS-T909'                                   => [ 'Hisense', 'T909' ],
+        'HS-T912'                                   => [ 'Hisense', 'T912' ],
+        'HS-T928'                                   => [ 'Hisense', 'T928' ],
+        'HS-T930'                                   => [ 'Hisense', 'T930' ],
+        'HS-T950'                                   => [ 'Hisense', 'T950' ],
+        'HS-T958'                                   => [ 'Hisense', 'T958' ],
+        'HS-T959'                                   => [ 'Hisense', 'T959' ],
+        'HS-T959S1'                                 => [ 'Hisense', 'T959' ],
+        'HS-T967'                                   => [ 'Hisense', 'T967' ],
+        'HS-T968'                                   => [ 'Hisense', 'T968' ],
+        'HS-T970'                                   => [ 'Hisense', 'T970' ],
+        'HS-T978'                                   => [ 'Hisense', 'T978' ],
+        'HS-I630T'                                  => [ 'Hisense', 'I630T' ],
+        'HS-H800T'                                  => [ 'Hisense', 'H800T' ],
+        'HS-F1'                                     => [ 'Hisense', 'F1' ],
+        'HS-F5180'                                  => [ 'Hisense', 'F5180' ],
+        'HS-E86'                                    => [ 'Hisense', 'E86' ],
+        'HS-E200T'                                  => [ 'Hisense', 'E200T' ],
+        'HS-E260T'                                  => [ 'Hisense', 'E260T' ],
+        'HS-E600M'                                  => [ 'Hisense', 'E600M' ],
+        'HS-E620M'                                  => [ 'Hisense', 'E620M' ],
+        'HS-E820'                                   => [ 'Hisense', 'E820' ],
+        'HS-E830'                                   => [ 'Hisense', 'E830' ],
+        'HS-E860'                                   => [ 'Hisense', 'E860' ],
+        'HS-E909'                                   => [ 'Hisense', 'E909' ],
+        'HS-E910'                                   => [ 'Hisense', 'E910' ],
+        'HS-E912!'                                  => [ 'Hisense', 'E912' ],
+        'HS-E913'                                   => [ 'Hisense', 'E913' ],
+        'HS-E917'                                   => [ 'Hisense', 'E917' ],
+        'HS-E920'                                   => [ 'Hisense', 'E920' ],
+        'HS-E926'                                   => [ 'Hisense', 'E926' ],
+        'HS-E930'                                   => [ 'Hisense', 'E930' ],
+        'HS-E936'                                   => [ 'Hisense', 'E936' ],
+        'HS-E956'                                   => [ 'Hisense', 'E956' ],
+        'HS-E956Q'                                  => [ 'Hisense', 'E956' ],
+        'HS-E968'                                   => [ 'Hisense', 'E968' ],
+    ],
+
+    'HS-E[GT][0-9]{3,3}!!' => [
+        'HS-EG870'                                  => [ 'Hisense', 'EG870' ],
+        'HS-EG900'                                  => [ 'Hisense', 'EG900' ],
+        'HS-EG901'                                  => [ 'Hisense', 'EG901' ],
+        'HS-EG902'                                  => [ 'Hisense', 'EG902' ],
+        'HS-EG906'                                  => [ 'Hisense', 'EG906' ],
+        'HS-EG909'                                  => [ 'Hisense', 'EG909' ],
+        'HS-EG916'                                  => [ 'Hisense', 'EG916' ],
+        'HS-EG929'                                  => [ 'Hisense', 'EG929' ],
+        'HS-EG936D'                                 => [ 'Hisense', 'EG936' ],
+        'HS-EG939'                                  => [ 'Hisense', 'EG939' ],
+        'HS-EG950'                                  => [ 'Hisense', 'EG950' ],
+        'HS-EG958'                                  => [ 'Hisense', 'EG958' ],
+        'HS-EG966'                                  => [ 'Hisense', 'EG966' ],
+        'HS-EG970'                                  => [ 'Hisense', 'EG970' ],
+        'HS-EG971'                                  => [ 'Hisense', 'EG971' ],
+        'HS-EG978'                                  => [ 'Hisense', 'EG978' ],
+        'HS-EG980'                                  => [ 'Hisense', 'EG980' ],
+        'HS-EG981'                                  => [ 'Hisense', 'EG981' ],
+        'HS-ET919'                                  => [ 'Hisense', 'ET919' ],
+    ],
+
+    '(HS-)?Hisense!!' => [
+        'Hisense C1'                                => [ 'Hisense', 'C1' ],
+        'Hisense-U8'                                => [ 'Hisense', 'U8' ],
+        'Hisense U980'                              => [ 'Hisense', 'U980' ],
+        'Hisense T92'                               => [ 'Hisense', 'T92' ],
+        'Hisense I639T'                             => [ 'Hisense', 'I639T' ],
+        'Hisense I639M'                             => [ 'Hisense', 'I639M' ],
+        'Hisense-E360M'                             => [ 'Hisense', 'E360M' ],
+        'Hisense E602M'                             => [ 'Hisense', 'E602M' ],
+        'Hisense HS-E910'                           => [ 'Hisense', 'E910' ],
+        'Hisense EG909'                             => [ 'Hisense', 'EG909' ],
+        'HS-Hisense F20T'                           => [ 'Hisense', 'F20T' ],
+        'Hisense F31'                               => [ 'Hisense', 'F31' ],
+        'HS-Hisense I632T'                          => [ 'Hisense', 'I632T' ],
+        'HS-Hisense I635T'                          => [ 'Hisense', 'I635T' ],
+        'HS-Hisense I639T'                          => [ 'Hisense', 'I639T' ],
+        'HS-Hisense E602T'                          => [ 'Hisense', 'E602T' ],
+        'HS-Hisense E621T'                          => [ 'Hisense', 'E621T' ],
+        'HS-Hisense E625T'                          => [ 'Hisense', 'E625T' ],
+    ],
+
+    'T92'                                       => [ 'Hisense', 'T92' ],
+    'E860'                                      => [ 'Hisense', 'E860' ],
+    'EG98'                                      => [ 'Hisense', 'EG98' ],
+    'EG680'                                     => [ 'Hisense', 'EG680' ],
+
+    'AD683G'                                    => [ 'Hisense', 'EG909' ],
+    'EG968B'                                    => [ 'Hisense', 'EG968B' ],
+    'E170BS'                                    => [ 'Hisense', 'E170BS', DeviceType::TABLET ],
+    'Hisense AD686G'                            => [ 'Hisense', 'AD686G' ],
+    'E270BSA'                                   => [ 'Hisense', 'Sero 7 Lite', DeviceType::TABLET ],
+    'M470BSA'                                   => [ 'Hisense', 'Sero 7 Pro', DeviceType::TABLET ],
+    'M470BSE'                                   => [ 'Hisense', 'Sero 7 Pro', DeviceType::TABLET ],
+    'E2281'                                     => [ 'Hisense', 'Sero 8', DeviceType::TABLET ],
+    'xt880b'                                    => [ 'Hisense', 'XT880', DeviceType::TELEVISION ],
+    'GX1210V TV'                                => [ 'Hisense', 'GX1210', DeviceType::TELEVISION ],
+
+    '(Hisense )?(LED[0-9]{2,2}(G|K|L|EC|XT)[0-9]{2,3})!'
+                                                => [ 'Hisense', '$2', DeviceType::TELEVISION ],
+
+    'Hisense Google TV TV'                      => [ 'Hisense', 'Pulse', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'hisense gx1200v'                           => [ 'Hisense', 'Pulse', DeviceType::TELEVISION, Flag::GOOGLETV ],
+
+    '(Amaze|Hitech)!!' => [
+        'Amaze HT-808'                              => [ 'Hi-Tech', 'Amaze HT-808' ],
+        'Amaze S2'                                  => [ 'Hi-Tech', 'Amaze S2' ],
+        'AMAZE S3'                                  => [ 'Hi-Tech', 'Amaze S3' ],
+        'Amaze S5'                                  => [ 'Hi-Tech', 'Amaze S5' ],
+        'Amaze S5 Plus'                             => [ 'Hi-Tech', 'Amaze S5 Plus' ],
+        'Amaze S9'                                  => [ 'Hi-Tech', 'Amaze S9' ],
+        'AMAZE S200'                                => [ 'Hi-Tech', 'Amaze S200' ],
+        'Hitech Amaze S200 3G'                      => [ 'Hi-Tech', 'Amaze S200' ],
+        'Amaze S230'                                => [ 'Hi-Tech', 'Amaze S230' ],
+        'AMAZE S250'                                => [ 'Hi-Tech', 'Amaze S250' ],
+        'Amaze S305'                                => [ 'Hi-Tech', 'Amaze S305' ],
+        'Amaze S310'                                => [ 'Hi-Tech', 'Amaze S310' ],
+        'AMAZE S330'                                => [ 'Hi-Tech', 'Amaze S330' ],
+        'Amaze S400'                                => [ 'Hi-Tech', 'Amaze S400' ],
+        'Amaze S405'                                => [ 'Hi-Tech', 'Amaze S405' ],
+        'Amaze S406'                                => [ 'Hi-Tech', 'Amaze S406' ],
+        'Amaze S430 Plus'                           => [ 'Hi-Tech', 'Amaze S430 Plus' ],
+        'Hitech S450'                               => [ 'Hi-Tech', 'Amaze S450' ],
+        'Amaze S500'                                => [ 'Hi-Tech', 'Amaze S500' ],
+        'AMAZE TAB'                                 => [ 'Hi-Tech', 'Amaze Tab', DeviceType::TABLET ],
+        'AMAZE TAB 2'                               => [ 'Hi-Tech', 'Amaze Tab 2', DeviceType::TABLET ],
+        'AMAZE TAB 3'                               => [ 'Hi-Tech', 'Amaze Tab 3', DeviceType::TABLET ],
+    ],
+
+    'HITO HT-3'                                 => [ 'Hito', 'HT-3' ],
+    'HKPHONE H8-3G'                             => [ 'HKPhone', 'H8 3G' ],
+    'HT17Pro'                                   => [ 'Homtom', 'HT17 Pro' ],
+    'HT20Pro'                                   => [ 'Homtom', 'HT20 Pro' ],
+    'D7800AD'                                   => [ 'Honeywell', 'D7800AD' ],
+    'Dolphin 70e Black'                         => [ 'Honeywell', 'Dolphin 70e' ],
+    'D75E'                                      => [ 'Honeywell', 'Dolphin 75e' ],
+    'CT50'                                      => [ 'Honeywell', 'Dolphin CT50' ],
+    'CN51 [NQ]!'                                => [ 'Honeywell', 'Intermec CN51' ],
+
+    'HOSIN!!' => [
+        'HOSIN A608'                                => [ 'Hosin', 'A608' ],
+        'HOSIN T70(OPEN)'                           => [ 'Hosin', 'T70' ],
+        'HOSIN T70'                                 => [ 'Hosin', 'T70' ],
+        'HOSIN T80'                                 => [ 'Hosin', 'T80' ],
+        'HOSIN U2'                                  => [ 'Hosin', 'U2' ],
+        'HOSIN U3'                                  => [ 'Hosin', 'U3' ],
+        'Hosin U7'                                  => [ 'Hosin', 'U7' ],
+        'HOSIN V60'                                 => [ 'Hosin', 'V60' ],
+        'HOSIN V70'                                 => [ 'Hosin', 'V70' ],
+        'HOSIN V708T'                               => [ 'Hosin', 'V708T' ],
+    ],
+
+    '(HP|Slate)!!' => [
+        'HP 7'                                      => [ 'HP', '7', DeviceType::TABLET ],
+        'HP 7.1'                                    => [ 'HP', '7.1', DeviceType::TABLET ],
+        'HP 7 G2'                                   => [ 'HP', '7 G2', DeviceType::TABLET ],
+        'HP 7 Plus'                                 => [ 'HP', '7 Plus', DeviceType::TABLET ],
+        'HP 7 Plus G2'                              => [ 'HP', '7 Plus G2', DeviceType::TABLET ],
+        'HP 8'                                      => [ 'HP', '8', DeviceType::TABLET ],
+        'HP 8 G2'                                   => [ 'HP', '8 G2', DeviceType::TABLET ],
+        'HP 10'                                     => [ 'HP', '10', DeviceType::TABLET ],
+        'HP 10 Tablet'                              => [ 'HP', '10', DeviceType::TABLET ],
+        'HP 10 G2 Tablet'                           => [ 'HP', '10 G2', DeviceType::TABLET ],
+        'HP 10 G2 Tablet 2301'                      => [ 'HP', '10 G2', DeviceType::TABLET ],
+        'HP 10 Plus'                                => [ 'HP', '10 Plus', DeviceType::TABLET ],
+        'HP Slate 6 Voice Tab'                      => [ 'HP', 'Slate 6 Voice Tab', DeviceType::TABLET ],
+        'HP Slate 6 VoiceTab Plus'                  => [ 'HP', 'Slate 6 Voice Tab Plus', DeviceType::TABLET ],
+        'HP Slate 6 Voice Tab II'                   => [ 'HP', 'Slate 6 Voice Tab II', DeviceType::TABLET ],
+        'HP Slate 7'                                => [ 'HP', 'Slate 7', DeviceType::TABLET ],
+        'HP Slate 7 3G'                             => [ 'HP', 'Slate 7', DeviceType::TABLET ],
+        'HP Slate 7 Beats Special Edition'          => [ 'HP', 'Slate 7', DeviceType::TABLET ],
+        'HP Slate7 Beats Special Edition'           => [ 'HP', 'Slate 7', DeviceType::TABLET ],
+        'HP Slate 7 Plus'                           => [ 'HP', 'Slate 7 Plus', DeviceType::TABLET ],
+        'HP Slate 7 HD'                             => [ 'HP', 'Slate 7 HD', DeviceType::TABLET ],
+        'HP Slate7 Extreme'                         => [ 'HP', 'Slate 7 Extreme', DeviceType::TABLET ],
+        'HP Slate 7 Voice Tab'                      => [ 'HP', 'Slate 7 Voice Tab', DeviceType::TABLET ],
+        'HP 7 VoiceTab'                             => [ 'HP', 'Slate 7 Voice Tab', DeviceType::TABLET ],
+        'HP Slate 7 VoiceTab Ultra'                 => [ 'HP', 'Slate 7 Voice Tab Ultra', DeviceType::TABLET ],
+        'HP Slate 8 Plus'                           => [ 'HP', 'Slate 8 Plus', DeviceType::TABLET ],
+        'HP Slate 8 Pro'                            => [ 'HP', 'Slate 8 Pro', DeviceType::TABLET ],
+        'HP Slate 10 HD'                            => [ 'HP', 'Slate 10 HD', DeviceType::TABLET ],
+        'Slate 10 HD'                               => [ 'HP', 'Slate 10 HD', DeviceType::TABLET ],
+        'HP Slate 10 Plus'                          => [ 'HP', 'Slate 10 Plus', DeviceType::TABLET ],
+        'HP Slate 17'                               => [ 'HP', 'Slate 17', DeviceType::TABLET ],
+        'Slate 21'                                  => [ 'HP', 'Slate 21', DeviceType::TABLET ],
+        'Slate 21 Pro'                              => [ 'HP', 'Slate 21 Pro', DeviceType::TABLET ],
+        'HP SlateBook 10 x2 PC'                     => [ 'HP', 'SlateBook 10 x2', DeviceType::TABLET ],
+        'HP SlateBook 14 PC'                        => [ 'HP', 'SlateBook 14 HD', DeviceType::TABLET ],
+        'HP Pro Slate 8'                            => [ 'HP', 'Pro Slate 8', DeviceType::TABLET ],
+        'HP Pro Slate 10 EE G1'                     => [ 'HP', 'Pro Slate 10', DeviceType::TABLET ],
+        'HP Pro Slate 12'                           => [ 'HP', 'Pro Slate 12', DeviceType::TABLET ],
+    ],
+
+    'HP!!' => [
+        'HP Compaq ([0-9]{4,4}[a-z])!'              => [ 'HP', 'Compaq $1', DeviceType::DESKTOP ],
+        'HP Compaq ([a-z]{2,2}[0-9]{4,4})!'         => [ 'HP', 'Compaq $1', DeviceType::DESKTOP ],
+        'HP Elite ([0-9]{4,4})!'                    => [ 'HP', 'Elite $1', DeviceType::DESKTOP ],
+        'HP EliteBook ([0-9]{4,4}[a-z])!'           => [ 'HP', 'EliteBook $1', DeviceType::DESKTOP ],
+        'HP EliteBook Revolve ([0-9]{3,3})!'        => [ 'HP', 'EliteBook Revolve $1', DeviceType::DESKTOP ],
+        'HP ENVY (.*) Notebook PC!'                 => [ 'HP', 'ENVY $1', DeviceType::DESKTOP ],
+        'HP ENVY Sleekbook (.*) PC!'                => [ 'HP', 'ENVY Sleekbook $1', DeviceType::DESKTOP ],
+        'HP ([0-9]{2,4}) Notebook PC!'              => [ 'HP', '$1', DeviceType::DESKTOP ],
+        'HP ([0-9]{2,4} G[0-9]{1,2}) Notebook PC!'  => [ 'HP', '$1', DeviceType::DESKTOP ],
+        'HP (G[0-9]{2,4}) Notebook PC!'             => [ 'HP', '$1', DeviceType::DESKTOP ],
+        'HP Mini!'                                  => [ 'HP', 'Mini', DeviceType::DESKTOP ],
+        'HP Pavilion ([0-9]+)!'                     => [ 'HP', 'Pavilion $1', DeviceType::DESKTOP ],
+        'HP Pavilion ([a-z]{1,2} ?[0-9]+)!'         => [ 'HP', 'Pavilion $1', DeviceType::DESKTOP ],
+        'HP Pavilion Sleekbook (.*) PC!'            => [ 'HP', 'Pavilion Sleekbook $1', DeviceType::DESKTOP ],
+        'HP ProBook ([0-9]{4,4}[a-z])!'             => [ 'HP', 'ProBook $1', DeviceType::DESKTOP ],
+        'HP ProBook ([0-9]{3,3} G[0-9])!'           => [ 'HP', 'ProBook $1', DeviceType::DESKTOP ],
+        'HP Spectre ((?:[0-9]+ )?x2)!'              => [ 'HP', 'Spectre $1', DeviceType::DESKTOP ],
+        'HP Split ((?:[0-9]+ )?x2)!'                => [ 'HP', 'Split $1', DeviceType::DESKTOP ],
+    ],
+
+    'HP-TouchPad'                               => [ 'HP', 'TouchPad', DeviceType::TABLET ],
+    '(HP )?Touchpad!'                           => [ 'HP', 'TouchPad', DeviceType::TABLET ],
+    '(cm|aokp) tenderloin!'                     => [ 'HP', 'TouchPad', DeviceType::TABLET ],
+
+    'HTC!!' => [
+        'HTC (Amaze|Ruby)!'                         => [ 'HTC', 'Amaze 4G' ],
+        'HTC (Aria|Gratia|Liberty)!'                => [ 'HTC', 'Aria' ],
+        'HTC A63(66|80)!'                           => [ 'HTC', 'Aria' ],
+        'HTC Bee'                                   => [ 'HTC', 'Bee' ],
+        'HTC ?ChaCha!'                              => [ 'HTC', 'ChaCha' ],
+        'HTC A810e'                                 => [ 'HTC', 'ChaCha' ],
+        'HTC Status'                                => [ 'HTC', 'ChaCha' ],
+        'HTC PH06130'                               => [ 'HTC', 'ChaCha' ],
+        'HTC A9188!'                                => [ 'HTC', 'Cullinan' ],
+        'HTC Desire 10 lifestyle'                   => [ 'HTC', 'Desire 10 Lifestyle' ],
+        'HTC Desire 10 pro'                         => [ 'HTC', 'Desire 10 Pro' ],
+        'HTC D10i'                                  => [ 'HTC', 'Desire 10 Pro' ],
+        'HTC Desire 200'                            => [ 'HTC', 'Desire 200' ],
+        'HTC Desire 210 dual sim'                   => [ 'HTC', 'Desire 210' ],
+        'HTC Desire 300'                            => [ 'HTC', 'Desire 300' ],
+        'HTC 0P6A1'                                 => [ 'HTC', 'Desire 300' ],
+        'HTC 301e'                                  => [ 'HTC', 'Desire 300' ],
+        'HTC D310(n|w)!'                            => [ 'HTC', 'Desire 310' ],
+        'HTC Desire 310'                            => [ 'HTC', 'Desire 310' ],
+        'HTC Desire 310 dual sim'                   => [ 'HTC', 'Desire 310' ],
+        'HTC 0PF11'                                 => [ 'HTC', 'Desire 310' ],
+        'HTC 0PF110'                                => [ 'HTC', 'Desire 310' ],
+        'HTC 0PF120'                                => [ 'HTC', 'Desire 310' ],
+        'HTC V1'                                    => [ 'HTC', 'Desire 310' ],
+        'HTC D316d'                                 => [ 'HTC', 'Desire 316' ],
+        'HTC Desire 320'                            => [ 'HTC', 'Desire 320' ],
+        'htc v01'                                   => [ 'HTC', 'Desire 320' ],
+        'HTC Desire 326G dual sim'                  => [ 'HTC', 'Desire 326G' ],
+        'HTC 2PNT1'                                 => [ 'HTC', 'Desire 326G' ],
+        'HTC Desire 400'                            => [ 'HTC', 'Desire 400' ],
+        'HTC Desire 400 dual sim'                   => [ 'HTC', 'Desire 400' ],
+        'HTC Desire 500'                            => [ 'HTC', 'Desire 500' ],
+        'HTC Desire 500 dual sim'                   => [ 'HTC', 'Desire 500' ],
+        'HTC 5060'                                  => [ 'HTC', 'Desire 500' ],
+        'HTC 0P3Z11'                                => [ 'HTC', 'Desire 500' ],
+        'HTC 0PFJ50'                                => [ 'HTC', 'Desire 500' ],
+        'HTC Desire 501'                            => [ 'HTC', 'Desire 501' ],
+        'HTC Desire 501 dual sim'                   => [ 'HTC', 'Desire 501' ],
+        'HTC 603h'                                  => [ 'HTC', 'Desire 501' ],
+        'HTC PO091'                                 => [ 'HTC', 'Desire 501' ],
+        'HTC Desire 510'                            => [ 'HTC', 'Desire 510' ],
+        'HTC D510'                                  => [ 'HTC', 'Desire 510' ],
+        'HTC 0PCV2'                                 => [ 'HTC', 'Desire 510' ],
+        'HTC 0PCV20'                                => [ 'HTC', 'Desire 510' ],
+        'HTC 0PCV220'                               => [ 'HTC', 'Desire 510' ],
+        'HTC Desire 512'                            => [ 'HTC', 'Desire 512' ],
+        'HTC D516'                                  => [ 'HTC', 'Desire 516' ],
+        'HTC D516(d|t|w)!'                          => [ 'HTC', 'Desire 516' ],
+        'HTC Desire 516 dual sim'                   => [ 'HTC', 'Desire 516' ],
+        'HTC C2'                                    => [ 'HTC', 'Desire 516' ],
+        'HTC V2'                                    => [ 'HTC', 'Desire 516' ],
+        'HTC Desire 520'                            => [ 'HTC', 'Desire 520' ],
+        'HTC 0PGQ1'                                 => [ 'HTC', 'Desire 520' ],
+        'HTC Desire 526'                            => [ 'HTC', 'Desire 526' ],
+        'HTCD100LVW'                                => [ 'HTC', 'Desire 526' ],
+        'HTC D100LVW'                               => [ 'HTC', 'Desire 526' ],
+        'HTC D100LVWPP'                             => [ 'HTC', 'Desire 526' ],
+        'HTC 0PM31'                                 => [ 'HTC', 'Desire 526' ],
+        'HTC 0PM1100'                               => [ 'HTC', 'Desire 526G' ],
+        'HTC Desire 526G'                           => [ 'HTC', 'Desire 526G' ],
+        'HTC Desire 526G dual sim'                  => [ 'HTC', 'Desire 526G' ],
+        'HTC D526(h)!'                              => [ 'HTC', 'Desire 526G+' ],
+        'HTC Desire 526GPLUS dual sim'              => [ 'HTC', 'Desire 526G+' ],
+        'HTC 0PL41!'                                => [ 'HTC', 'Desire 526G+' ],
+        'HTC 0PL42!'                                => [ 'HTC', 'Desire 526G+' ],
+        'HTC Desire 530'                            => [ 'HTC', 'Desire 530' ],
+        'HTC D530u'                                 => [ 'HTC', 'Desire 530' ],
+        'HTC 2PST1!'                                => [ 'HTC', 'Desire 530' ],
+        'HTC 2PST2!'                                => [ 'HTC', 'Desire 530' ],
+        'HTCD160LVW'                                => [ 'HTC', 'Desire 530' ],
+        'HTCD160LVWPP'                              => [ 'HTC', 'Desire 530' ],
+        'HTC Desire 600'                            => [ 'HTC', 'Desire 600' ],
+        'HTC Desire 600 dual sim'                   => [ 'HTC', 'Desire 600' ],
+        'HTC PO491'                                 => [ 'HTC', 'Desire 600' ],
+        'HTC PO49120'                               => [ 'HTC', 'Desire 600' ],
+        'HTC Desire 600c dual sim'                  => [ 'HTC', 'Desire 600c' ],
+        'HTC 609d'                                  => [ 'HTC', 'Desire 600c' ],
+        'HTC Desire 601'                            => [ 'HTC', 'Desire 601' ],
+        'HTC Desire 601 dual sim'                   => [ 'HTC', 'Desire 601' ],
+        'HTC Desire 601-LS'                         => [ 'HTC', 'Desire 601' ],
+        'HTC ?0P4E!'                                => [ 'HTC', 'Desire 601' ],
+        'HTC 606w'                                  => [ 'HTC', 'Desire 606w' ],
+        'HTC 608'                                   => [ 'HTC', 'Desire 608' ],
+        'HTC 608t'                                  => [ 'HTC', 'Desire 608t' ],
+        'HTC Desire 610'                            => [ 'HTC', 'Desire 610' ],
+        'HTC D610'                                  => [ 'HTC', 'Desire 610' ],
+        'HTC D610t'                                 => [ 'HTC', 'Desire 610' ],
+        'HTC D610x'                                 => [ 'HTC', 'Desire 610' ],
+        'HTC 0P9O110'                               => [ 'HTC', 'Desire 610' ],
+        'HTC 0P9O2'                                 => [ 'HTC', 'Desire 610' ],
+        'HTC331ZLVW'                                => [ 'HTC', 'Desire 610' ],
+        'htc a3qhdul'                               => [ 'HTC', 'Desire 610' ],
+        'HTC Desire 612'                            => [ 'HTC', 'Desire 612' ],
+        'HTC331ZLVWPP'                              => [ 'HTC', 'Desire 612' ],
+        'HTC 0P9O30'                                => [ 'HTC', 'Desire 612' ],
+        'HTC Desire 616'                            => [ 'HTC', 'Desire 616' ],
+        'HTC Desire 616 dual sim!'                  => [ 'HTC', 'Desire 616' ],
+        'HTC 616 Dual Sim'                          => [ 'HTC', 'Desire 616' ],
+        'HTC D616w!'                                => [ 'HTC', 'Desire 616' ],
+        'HTC V3'                                    => [ 'HTC', 'Desire 616' ],
+        'HTC 619d!'                                 => [ 'HTC', 'Desire 619d' ],
+        'HTC D620(h|u)!'                            => [ 'HTC', 'Desire 620' ],
+        'HTC Desire 620'                            => [ 'HTC', 'Desire 620' ],
+        'HTC Desire 620 dual sim'                   => [ 'HTC', 'Desire 620' ],
+        'HTC 0PE64!'                                => [ 'HTC', 'Desire 620' ],
+        'HTC Desire 620G'                           => [ 'HTC', 'Desire 620G' ],
+        'HTC Desire 620G dual sim'                  => [ 'HTC', 'Desire 620G' ],
+        'HTC 0PE65'                                 => [ 'HTC', 'Desire 620G' ],
+        'HTC Desire 625'                            => [ 'HTC', 'Desire 625' ],
+        'HTC D626(d|q|t|w|x)!'                      => [ 'HTC', 'Desire 626' ],
+        'HTC Desire 626'                            => [ 'HTC', 'Desire 626' ],
+        'HTC Desire 626 dual sim'                   => [ 'HTC', 'Desire 626' ],
+        'HTC 0PKX2'                                 => [ 'HTC', 'Desire 626' ],
+        'HTC D630x'                                 => [ 'HTC', 'Desire 626' ],
+        'HTC D200LVW'                               => [ 'HTC', 'Desire 626' ],
+        'HTC D200LVWPP'                             => [ 'HTC', 'Desire 626' ],
+        'HTC DESIRE 626G'                           => [ 'HTC', 'Desire 626G' ],
+        'HTC Desire 626G dual sim'                  => [ 'HTC', 'Desire 626G' ],
+        'HTC D626(ph)!'                             => [ 'HTC', 'Desire 626G' ],
+        'HTC Desire 626GPLUS dual sim'              => [ 'HTC', 'Desire 626G+' ],
+        'HTC 0PM11'                                 => [ 'HTC', 'Desire 626G+' ],
+        'HTC Desire 626s'                           => [ 'HTC', 'Desire 626s' ],
+        'HTC 0PM91'                                 => [ 'HTC', 'Desire 626s' ],
+        'HTC 0PM912!'                               => [ 'HTC', 'Desire 626s' ],
+        'HTC 0PM92'                                 => [ 'HTC', 'Desire 626s' ],
+        'HTC Desire 628'                            => [ 'HTC', 'Desire 628' ],
+        'HTC Desire 628 dual sim'                   => [ 'HTC', 'Desire 628' ],
+        'HTC Desire 630 dual sim'                   => [ 'HTC', 'Desire 630' ],
+        'HTC 2PST5'                                 => [ 'HTC', 'Desire 630' ],
+        'HTC Desire 650'                            => [ 'HTC', 'Desire 650' ],
+        'HTC 2PYR1'                                 => [ 'HTC', 'Desire 650' ],
+        'HTC 2PYR2'                                 => [ 'HTC', 'Desire 650' ],
+        'HTC Desire 700 dual sim'                   => [ 'HTC', 'Desire 700' ],
+        'HTC 709d'                                  => [ 'HTC', 'Desire 709d' ],
+        'HTC Desire 728'                            => [ 'HTC', 'Desire 728' ],
+        'HTC Desire 728 dual sim'                   => [ 'HTC', 'Desire 728' ],
+        'HTC D728(w|x)!'                            => [ 'HTC', 'Desire 728' ],
+        'HTC Desire 728G dual sim'                  => [ 'HTC', 'Desire 728G' ],
+        'HTC 2PQ83'                                 => [ 'HTC', 'Desire 728G' ],
+        'HTC D816'                                  => [ 'HTC', 'Desire 816' ],
+        'HTC D816(d|t|v|w|x)!'                      => [ 'HTC', 'Desire 816' ],
+        'HTC D816(h)!'                              => [ 'HTC', 'Desire 816G' ],
+        'HTC Desire 816'                            => [ 'HTC', 'Desire 816' ],
+        'HTC Desire 816 dual sim'                   => [ 'HTC', 'Desire 816' ],
+        'htc a5ul'                                  => [ 'HTC', 'Desire 816' ],
+        'htc a5chl'                                 => [ 'HTC', 'Desire 816' ],
+        'HTC 0P9C2'                                 => [ 'HTC', 'Desire 816' ],
+        'HTC 0P9C8'                                 => [ 'HTC', 'Desire 816' ],
+        'HTC D816e'                                 => [ 'HTC', 'Desire 816' ],
+        'HTC Desire 816G'                           => [ 'HTC', 'Desire 816G' ],
+        'HTC Desire 816G dual sim!'                 => [ 'HTC', 'Desire 816G' ],
+        'HTC 816G dual sim'                         => [ 'HTC', 'Desire 816G' ],
+        'HTC Desire 816W'                           => [ 'HTC', 'Desire 816W' ],
+        'HTC D820(G|pi|ts|us)!'                     => [ 'HTC', 'Desire 820G' ],
+        'HTC Desire 820G dual sim'                  => [ 'HTC', 'Desire 820G' ],
+        'HTC Desire 820G !'                         => [ 'HTC', 'Desire 820G' ],
+        'HTC Desire 820G+'                          => [ 'HTC', 'Desire 820G+' ],
+        'HTC Desire 820G PLUS dual sim'             => [ 'HTC', 'Desire 820G+' ],
+        'HTC D820'                                  => [ 'HTC', 'Desire 820' ],
+        'HTC D820(f|m|mt|mu|s|t|u|x)!'              => [ 'HTC', 'Desire 820' ],
+        'HTC Desire 820'                            => [ 'HTC', 'Desire 820' ],
+        'HTC Desire 820 dual sim'                   => [ 'HTC', 'Desire 820' ],
+        'HTC 0PFJ4'                                 => [ 'HTC', 'Desire 820' ],
+        'htc a51dtul'                               => [ 'HTC', 'Desire 820' ],
+        'HTC Desire 820q dual sim'                  => [ 'HTC', 'Desire 820q' ],
+        'HTC Desire 820s'                           => [ 'HTC', 'Desire 820s' ],
+        'HTC Desire 820s dual sim'                  => [ 'HTC', 'Desire 820s' ],
+        'HTC D820(ys)!'                             => [ 'HTC', 'Desire 820s' ],
+        'HTC Desire 820ts'                          => [ 'HTC', 'Desire 820ts' ],
+        'HTC Desire 820 mini'                       => [ 'HTC', 'Desire 820 mini' ],
+        'HTC Desire 825'                            => [ 'HTC', 'Desire 825' ],
+        'HTC Desire 825 dual sim'                   => [ 'HTC', 'Desire 825' ],
+        'HTC D825u'                                 => [ 'HTC', 'Desire 825' ],
+        'HTC 2PUK2!'                                => [ 'HTC', 'Desire 825' ],
+        'HTC Desire 826'                            => [ 'HTC', 'Desire 826' ],
+        'HTC Desire 826 dual sim'                   => [ 'HTC', 'Desire 826' ],
+        'HTC D826'                                  => [ 'HTC', 'Desire 826' ],
+        'HTC D826(d|t|w|y)!'                        => [ 'HTC', 'Desire 826' ],
+        'HTC D828(w|x)!'                            => [ 'HTC', 'Desire 828' ],
+        'HTC Desire 828'                            => [ 'HTC', 'Desire 828' ],
+        'HTC Desire 828 dual sim'                   => [ 'HTC', 'Desire 828' ],
+        'HTC 2PRE2'                                 => [ 'HTC', 'Desire 828' ],
+        'HTC Desire 830'                            => [ 'HTC', 'Desire 830' ],
+        'HTC Desire 830 dual sim'                   => [ 'HTC', 'Desire 830' ],
+        'HTC D830(u|x)!'                            => [ 'HTC', 'Desire 830' ],
+        'HTC 5088'                                  => [ 'HTC', 'Desire 5088' ],
+        'HTC 6160'                                  => [ 'HTC', 'Desire 6160' ],
+        'HTC 7060'                                  => [ 'HTC', 'Desire 7060' ],
+        'HTC ?7088!'                                => [ 'HTC', 'Desire 7088' ],
+        'HTC 8060'                                  => [ 'HTC', 'Desire 8060' ],
+        'HTC Desire C'                              => [ 'HTC', 'Desire C' ],
+        'HTC Desire C N'                            => [ 'HTC', 'Desire C' ],
+        'HTC H1000C'                                => [ 'HTC', 'Desire C' ],
+        'HTC A320e'                                 => [ 'HTC', 'Desire C' ],
+        'HTC Desire ?HD!'                           => [ 'HTC', 'Desire HD' ],
+        'HTC A91(91|92)!'                           => [ 'HTC', 'Desire HD' ],
+        'HTC 0PFH1!'                                => [ 'HTC', 'Desire Eye' ],
+        'HTC 0PFH2!'                                => [ 'HTC', 'Desire Eye' ],
+        'HTC Desire EYE'                            => [ 'HTC', 'Desire Eye' ],
+        'HTC M910x'                                 => [ 'HTC', 'Desire Eye' ],
+        'HTC Desire L dual sim'                     => [ 'HTC', 'Desire L' ],
+        'HTC PM6014'                                => [ 'HTC', 'Desire L' ],
+        'HTC Desire P'                              => [ 'HTC', 'Desire P' ],
+        'HTC Desire Q'                              => [ 'HTC', 'Desire Q' ],
+        'HTC ?Desire ?S( |$)!'                      => [ 'HTC', 'Desire S' ],
+        'HTC S510(b|e)!'                            => [ 'HTC', 'Desire S' ],
+        'HTC Passion S510e'                         => [ 'HTC', 'Desire S' ],
+        'HTC Desire Saga'                           => [ 'HTC', 'Desire S' ],
+        'HTC Saga'                                  => [ 'HTC', 'Desire S' ],
+        'HTC DesireSV'                              => [ 'HTC', 'Desire SV' ],
+        'HTC Desire SV'                             => [ 'HTC', 'Desire SV' ],
+        'HTC DesireU'                               => [ 'HTC', 'Desire U' ],
+        'HTC Desire U'                              => [ 'HTC', 'Desire U' ],
+        'HTC Desire U dual sim'                     => [ 'HTC', 'Desire U' ],
+        'HTC T327w'                                 => [ 'HTC', 'Desire U' ],
+        'HTC Desire V'                              => [ 'HTC', 'Desire V' ],
+        'HTC T328w'                                 => [ 'HTC', 'Desire V' ],
+        'HTC PROMIN U'                              => [ 'HTC', 'Desire V' ],
+        'HTC PRO DS'                                => [ 'HTC', 'Desire V' ],
+        'HTC Desire VC'                             => [ 'HTC', 'Desire VC' ],
+        'HTC Desire VC T328d'                       => [ 'HTC', 'Desire VC' ],
+        'HTC T328d'                                 => [ 'HTC', 'Desire VC' ],
+        'HTC PRO DD'                                => [ 'HTC', 'Desire VC' ],
+        'HTC Desire VT'                             => [ 'HTC', 'Desire VT' ],
+        'HTC T328t'                                 => [ 'HTC', 'Desire VT' ],
+        'HTC Desire XC!'                            => [ 'HTC', 'Desire XC' ],
+        'HTC Desire XS!'                            => [ 'HTC', 'Desire XS' ],
+        'HTC Desire ?X!'                            => [ 'HTC', 'Desire X' ],
+        'HTC T329w'                                 => [ 'HTC', 'Desire X' ],
+        'HTC POO U'                                 => [ 'HTC', 'Desire X' ],
+        'HTC Desire ?Z!'                            => [ 'HTC', 'Desire Z' ],
+        'HTC A72(71|72|75)!'                        => [ 'HTC', 'Desire Z' ],
+        'HTC ?Vision!'                              => [ 'HTC', 'Desire Z' ],
+        'HTC T329d'                                 => [ 'HTC', 'T329d' ],
+        'HTC ?Desire!'                              => [ 'HTC', 'Desire' ],
+        'HTC Bravo'                                 => [ 'HTC', 'Desire' ],
+        'HTC Bravo C'                               => [ 'HTC', 'Desire' ],
+        'HTC eris'                                  => [ 'HTC', 'Desire' ],
+        'HTC A81(81|83)!'                           => [ 'HTC', 'Desire' ],
+        'HTC ?X06HTII!'                             => [ 'HTC', 'Desire X06HTII', 'carrier' => 'Softbank' ],
+        'HTC ?X06HT!'                               => [ 'HTC', 'Desire X06HT', 'carrier' => 'Softbank' ],
+        'HTC Desire CDMA'                           => [ 'HTC', 'Desire' ],
+        'HTC PLS7373ADR'                            => [ 'HTC', 'Detail' ],
+        'HTC 603e'                                  => [ 'HTC', 'E1' ],
+        'HTC Evo'                                   => [ 'HTC', 'EVO 3D' ],
+        'HTC ?EVO ?3D!'                             => [ 'HTC', 'EVO 3D' ],
+        'HTC X51(5a|5c|5d|5m)!'                     => [ 'HTC', 'EVO 3D' ],
+        'HTC Shooter'                               => [ 'HTC', 'EVO 3D' ],
+        'htc shooteru'                              => [ 'HTC', 'EVO 3D' ],
+        'HTC ?EVO ?V ?4G!'                          => [ 'HTC', 'EVO 3D' ],
+        'HTC EVO 4G\+!'                             => [ 'HTC', 'EVO 4G+' ],
+        'HTC X515e!'                                => [ 'HTC', 'EVO 4G+' ],
+        'HTC ?EVO ?4G!'                             => [ 'HTC', 'EVO 4G' ],
+        'HTC jewel'                                 => [ 'HTC', 'EVO 4G' ],
+        'HTC EVO LTE'                               => [ 'HTC', 'EVO 4G' ],
+        'HTC EVO G20 T9399  For Sprint'             => [ 'HTC', 'EVO 4G' ],
+        'htc supersonic'                            => [ 'HTC', 'EVO 4G' ],
+        'HTC ?(EVO ?)?Design ?4G!'                  => [ 'HTC', 'EVO Design 4G' ],
+        'HTC EVO Design C715e!'                     => [ 'HTC', 'EVO Design 4G' ],
+        'HTC C715c'                                 => [ 'HTC', 'EVO Design 4G' ],
+        'HTC Acquire'                               => [ 'HTC', 'EVO Design 4G' ],
+        'HTC Kingdom'                               => [ 'HTC', 'EVO Design 4G' ],
+        'HTC EVO Shift!'                            => [ 'HTC', 'EVO Shift' ],
+        'HTC EVO View 4G'                           => [ 'HTC', 'EVO View 4G' ],
+        'HTC ?Explorer!'                            => [ 'HTC', 'Explorer' ],
+        'HTC A31(0b|0e)!'                           => [ 'HTC', 'Explorer' ],
+        'HTC Pico Incredible HD'                    => [ 'HTC', 'Explorer' ],
+        'HTC first'                                 => [ 'HTC', 'First' ],
+        'HTC PM33100'                               => [ 'HTC', 'First' ],
+        'HTC Flyer!'                                => [ 'HTC', 'Flyer', DeviceType::TABLET ],
+        'HTC P51(0e|2|5e)!'                         => [ 'HTC', 'Flyer', DeviceType::TABLET ],
+        'HTC HD'                                    => [ 'HTC', 'HD' ],
+        'HTC HD2!'                                  => [ 'HTC', 'HD2' ],
+        'HTC T8585'                                 => [ 'HTC', 'HD2' ],
+        'HTC HD7!'                                  => [ 'HTC', 'HD7' ],
+        'HTC T92(98|99)!'                           => [ 'HTC', 'HD7' ],
+        'HTC HD7S!'                                 => [ 'HTC', 'HD7s' ],
+        'HTC T(93|98)99!'                           => [ 'HTC', 'HD7s' ],
+        'HTC HD Mini'                               => [ 'HTC', 'HD mini' ],
+        'HTC HERO200'                               => [ 'HTC', 'Hero 200' ],               /* Sprint */
+        'HTC Hero ?S!'                              => [ 'HTC', 'Hero S' ],             /* US Cellular */
+        'HTC Hero!'                                 => [ 'HTC', 'Hero' ],
+        'HTC IMAGIO'                                => [ 'HTC', 'Imagio' ],
+        'HTC Incredible'                            => [ 'HTC', 'Incredible' ],
+        'HTC Incredible CDMA'                       => [ 'HTC', 'Incredible' ],
+        'HTC Incredible T9199 for Vodafone'         => [ 'HTC', 'Incredible' ],
+        'HTC Incredible E S715e'                    => [ 'HTC', 'Incredible E' ],
+        'HTC Incredible ?S!'                        => [ 'HTC', 'Incredible S' ],
+        'HTC ?Vivo!'                                => [ 'HTC', 'Incredible S' ],
+        'HTC S710e!'                                => [ 'HTC', 'Incredible S' ],
+        'HTC S710d'                                 => [ 'HTC', 'Incredible S' ],
+        'HTC Incredible 2'                          => [ 'HTC', 'Incredible S' ],
+        'HTC Innovation'                            => [ 'HTC', 'Innovation' ],
+        'HTC (HD7 )?Inspire!'                       => [ 'HTC', 'Inspire 4G' ],
+        'HTC J Z321e'                               => [ 'HTC', 'J' ],
+        'HTC X920e'                                 => [ 'HTC', 'J Butterfly' ],
+        'HTC Butterfly'                             => [ 'HTC', 'J Butterfly' ],
+        'HTC J Butterfly'                           => [ 'HTC', 'J Butterfly' ],
+        'HTC Butterfly J'                           => [ 'HTC', 'J Butterfly' ],
+        'HTC DLX WLJ'                               => [ 'HTC', 'J Butterfly' ],
+        'HTC DLX WL'                                => [ 'HTC', 'J Butterfly' ],
+        'HTC DLX U'                                 => [ 'HTC', 'J Butterfly' ],
+        'HTC DLXUB1'                                => [ 'HTC', 'J Butterfly' ],
+        'HTC J One'                                 => [ 'HTC', 'J One' ],
+        'HTC Butterfly s'                           => [ 'HTC', 'Butterfly S' ],
+        'HTC Butterfly s 901s'                      => [ 'HTC', 'Butterfly S' ],
+        'HTC PO68'                                  => [ 'HTC', 'Butterfly S' ],
+        'HTC 9060'                                  => [ 'HTC', 'Butterfly S' ],
+        'HTC 9088'                                  => [ 'HTC', 'Butterfly S' ],
+        'HTC 901e'                                  => [ 'HTC', 'Butterfly S' ],
+        'HTC 909d'                                  => [ 'HTC', 'Butterfly S' ],
+        'HTC 919d'                                  => [ 'HTC', 'Butterfly S' ],
+        'HTC B810x'                                 => [ 'HTC', 'Butterfly 2' ],
+        'HTC Butterfly 2'                           => [ 'HTC', 'Butterfly 2' ],
+        'HTC Butterfly 3'                           => [ 'HTC', 'Butterfly 3' ],
+        'HTC B830x'                                 => [ 'HTC', 'Butterfly 3' ],
+        'HTC P715!'                                 => [ 'HTC', 'Jetstream', DeviceType::TABLET ],
+        'HTC PG09410'                               => [ 'HTC', 'Jetstream', DeviceType::TABLET ],
+        'HTC Legend!'                               => [ 'HTC', 'Legend' ],
+        'HTC Magic!'                                => [ 'HTC', 'Magic' ],
+        'HTC Sapphire'                              => [ 'HTC', 'Magic' ],
+        'HTC Merge'                                 => [ 'HTC', 'Merge' ],
+        'HTC Lexikon'                               => [ 'HTC', 'Merge' ],
+        'HTC One SC'                                => [ 'HTC', 'One SC' ],
+        'HTC One SC T528d'                          => [ 'HTC', 'One SC' ],
+        'HTC T528d'                                 => [ 'HTC', 'One SC' ],
+        'HTC T528t'                                 => [ 'HTC', 'One ST' ],
+        'HTC T528w'                                 => [ 'HTC', 'One SU' ],
+        'HTC One Su'                                => [ 'HTC', 'One SU' ],
+        'HTC One ?SV!'                              => [ 'HTC', 'One SV' ],
+        'HTC C525c'                                 => [ 'HTC', 'One SV' ],
+        'HTC C525u'                                 => [ 'HTC', 'One SV' ],
+        'HTC H3000C'                                => [ 'HTC', 'One SV' ],
+        'HTC K2!'                                   => [ 'HTC', 'One SV' ],
+        'HTC One S'                                 => [ 'HTC', 'One S' ],
+        'HTC One S !'                               => [ 'HTC', 'One S' ],
+        'HTC Ville!'                                => [ 'HTC', 'One S' ],
+        'HTC Z(52|56)0e!'                           => [ 'HTC', 'One S' ],
+        'HTC One VX'                                => [ 'HTC', 'One VX' ],
+        'htc totem'                                 => [ 'HTC', 'One VX' ],
+        'HTC PM36100'                               => [ 'HTC', 'One VX' ],
+        'HTC One V'                                 => [ 'HTC', 'One V' ],
+        'HTC T120C'                                 => [ 'HTC', 'One V' ],
+        'HTC T320e'                                 => [ 'HTC', 'One V' ],
+        'HTC H2000C'                                => [ 'HTC', 'One V' ],
+        'htc primou'                                => [ 'HTC', 'One V' ],
+        'HTC X720d'                                 => [ 'HTC', 'One XC' ],
+        'HTC ?One ?XL+!'                            => [ 'HTC', 'One XL+' ],
+        'HTC ?One ?XL!'                             => [ 'HTC', 'One XL' ],
+        'htc evita'                                 => [ 'HTC', 'One XL' ],
+        'HTC S720t!'                                => [ 'HTC', 'One XT' ],
+        'HTC One X+'                                => [ 'HTC', 'One X+' ],
+        'HTC OneXplus!'                             => [ 'HTC', 'One X+' ],
+        'HTC PM63100'                               => [ 'HTC', 'One X+' ],
+        'HTC ?One ?X!'                              => [ 'HTC', 'One X' ],
+        'HTC Endeavour!'                            => [ 'HTC', 'One X' ],
+        'HTC S720e'                                 => [ 'HTC', 'One X' ],
+        'HTC One X S720e'                           => [ 'HTC', 'One X' ],
+        'HTC One X with Beats Audio'                => [ 'HTC', 'One X' ],
+        'HTC M7'                                    => [ 'HTC', 'One' ],
+        'HTC 801e'                                  => [ 'HTC', 'One' ],
+        'HTC 801s'                                  => [ 'HTC', 'One' ],
+        'HTC ?802d!'                                => [ 'HTC', 'One' ],
+        'HTC ?802t!'                                => [ 'HTC', 'One' ],
+        'HTC 802w'                                  => [ 'HTC', 'One' ],
+        'HTC PN071'                                 => [ 'HTC', 'One' ],
+        'HTC PN072'                                 => [ 'HTC', 'One' ],
+        'HTC PN0711'                                => [ 'HTC', 'One' ],
+        'HTC PN07120'                               => [ 'HTC', 'One' ],
+        'HTC PN07310'                               => [ 'HTC', 'One' ],
+        'HTC HTC6500LVW'                            => [ 'HTC', 'One' ],
+        'HTC6500LVW'                                => [ 'HTC', 'One' ],
+        'HTC6500LVW 4G'                             => [ 'HTC', 'One' ],
+        'HTC6445LVW 4G'                             => [ 'HTC', 'One' ],
+        'HTC One 801e'                              => [ 'HTC', 'One' ],
+        'HTC One 801s'                              => [ 'HTC', 'One' ],
+        'HTC one 802d'                              => [ 'HTC', 'One' ],
+        'HTC One dual'                              => [ 'HTC', 'One' ],
+        'HTC One dual 802d'                         => [ 'HTC', 'One' ],
+        'HTC One dual sim'                          => [ 'HTC', 'One' ],
+        'HTCONE'                                    => [ 'HTC', 'One' ],
+        'HTC6515LVW'                                => [ 'HTC', 'One Remix' ],
+        'HTC 601e'                                  => [ 'HTC', 'One Mini' ],
+        'HTC PO581'                                 => [ 'HTC', 'One Mini' ],
+        'HTC PO582'                                 => [ 'HTC', 'One Mini' ],
+        'HTC PO58220'                               => [ 'HTC', 'One Mini' ],
+        'HTC One mini'                              => [ 'HTC', 'One Mini' ],
+        'HTC One mini 601e'                         => [ 'HTC', 'One Mini' ],
+        'HTC 809d'                                  => [ 'HTC', 'One Max' ],
+        'HTC 8060'                                  => [ 'HTC', 'One Max' ],
+        'HTC 8088'                                  => [ 'HTC', 'One Max' ],
+        'HTC 8160'                                  => [ 'HTC', 'One Max' ],
+        'HTC ?0P3P[0-9]!'                           => [ 'HTC', 'One Max' ],
+        'HTC6600LVW'                                => [ 'HTC', 'One Max' ],
+        'HTC6600LVW 4G'                             => [ 'HTC', 'One Max' ],
+        'HTC One max'                               => [ 'HTC', 'One Max' ],
+        'HTC One max dual'                          => [ 'HTC', 'One Max' ],
+        'HTC One A9'                                => [ 'HTC', 'One (A9)' ],
+        'HTC A9(u|w)!'                              => [ 'HTC', 'One (A9)' ],
+        'HTC 2PQ910'                                => [ 'HTC', 'One (A9)' ],
+        'HTC 2PQ912!'                               => [ 'HTC', 'One (A9)' ],
+        'HTC One A9s'                               => [ 'HTC', 'One (A9s)' ],
+        'HTC E9'                                    => [ 'HTC', 'One (E9)' ],
+        'HTC One E9'                                => [ 'HTC', 'One (E9)' ],
+        'HTC One E9 dual sim'                       => [ 'HTC', 'One (E9)' ],
+        'HTC 0PL31'                                 => [ 'HTC', 'One (E9)' ],
+        'HTCE9t'                                    => [ 'HTC', 'One (E9)' ],
+        'HTC E9 Plus'                               => [ 'HTC', 'One (E9 Plus)' ],
+        'HTC One E9PLUS dual sim'                   => [ 'HTC', 'One (E9 Plus)' ],
+        'HTC One E9s dual sim'                      => [ 'HTC', 'One (E9s)' ],
+        'HTC D826sw'                                => [ 'HTC', 'One (E9s)' ],
+        'HTC E9sx'                                  => [ 'HTC', 'One (E9s)' ],
+        'HTC One M9'                                => [ 'HTC', 'One (M9)' ],
+        'HTC One M9s'                               => [ 'HTC', 'One (M9)' ],
+        'HTC 0PJA1!'                                => [ 'HTC', 'One (M9)' ],
+        'HTC 0PJA2!'                                => [ 'HTC', 'One (M9)' ],
+        'HTC6535LRA'                                => [ 'HTC', 'One (M9)' ],
+        'HTC6535LVW'                                => [ 'HTC', 'One (M9)' ],
+        'HTC M9(e|pt|px|u|w)!'                      => [ 'HTC', 'One (M9)' ],
+        'HTC One M9PLUS'                            => [ 'HTC', 'One (M9 Plus)' ],
+        'HTC One M9PLUS Prime Camera Edition'       => [ 'HTC', 'One (M9 Plus)' ],
+        'HTC M9pw'                                  => [ 'HTC', 'One (M9 Plus)' ],
+        'HTC 0PK71'                                 => [ 'HTC', 'One (M9 Plus)' ],
+        'HTC 0PK72'                                 => [ 'HTC', 'One (M9 Plus)' ],
+        'HTC X9u'                                   => [ 'HTC', 'One (X9)' ],
+        'HTC 2PS5200'                               => [ 'HTC', 'One (X9)' ],
+        'HTC 2PXH1'                                 => [ 'HTC', 'One (X10)' ],
+        'HTC 2PXH2'                                 => [ 'HTC', 'One (X10)' ],
+        'HTC M9et'                                  => [ 'HTC', 'One ME' ],
+        'HTC M9ew'                                  => [ 'HTC', 'One ME' ],
+        'htc hima ace ml dtul'                      => [ 'HTC', 'One ME' ],
+        'HTC One ME dual sim'                       => [ 'HTC', 'One ME' ],
+        'HTC 0PLA1'                                 => [ 'HTC', 'One ME' ],
+        'HTC One M8'                                => [ 'HTC', 'One (M8)' ],
+        'HTC One M8 dual sim'                       => [ 'HTC', 'One (M8)' ],
+        'HTC One(M8)'                               => [ 'HTC', 'One (M8)' ],
+        'htc m8'                                    => [ 'HTC', 'One (M8)' ],
+        'HTC M8(d|dug|e|si|t|v|w|x)!'               => [ 'HTC', 'One (M8)' ],
+        'HTCM8t'                                    => [ 'HTC', 'One (M8)' ],
+        'HTC6525LVW'                                => [ 'HTC', 'One (M8)' ],
+        'HTC One M8 Eye'                            => [ 'HTC', 'One (M8 Eye)' ],
+        'HTC M8(et|Et|Ew)!'                         => [ 'HTC', 'One (M8 Eye)' ],
+        'HTCM8Et'                                   => [ 'HTC', 'One (M8 Eye)' ],
+        'HTC 0P6B!'                                 => [ 'HTC', 'One (M8 Eye)' ],
+        'htc melstuhl'                              => [ 'HTC', 'One (M8 Eye)' ],
+        'HTC One M8s'                               => [ 'HTC', 'One (M8s)' ],
+        'HTC 0PKV1'                                 => [ 'HTC', 'One (M8s)' ],
+        'HTC One E8'                                => [ 'HTC', 'One (E8)' ],
+        'HTC One E8 dual sim'                       => [ 'HTC', 'One (E8)' ],
+        'HTC M8S(d|s|t|w|x|y)!'                     => [ 'HTC', 'One (E8)' ],
+        'HTCM8St'                                   => [ 'HTC', 'One (E8)' ],
+        'htc mecwhl'                                => [ 'HTC', 'One (E8)' ],
+        'HTC 0PAJ1'                                 => [ 'HTC', 'One (E8)' ],
+        'HTC 0PAJ2'                                 => [ 'HTC', 'One (E8)' ],
+        'HTC 0PAJ4'                                 => [ 'HTC', 'One (E8)' ],
+        'HTC E9(pw|pt|t|w|x)!'                      => [ 'HTC', 'One (E9)' ],
+        'HTC One E9s dual sim'                      => [ 'HTC', 'One (E9)' ],
+        'HTC 0P8B2!'                                => [ 'HTC', 'One Mini 2' ],
+        'HTC M8MINx'                                => [ 'HTC', 'One Mini 2' ],
+        'HTC One mini 2'                            => [ 'HTC', 'One Mini 2' ],
+        'htc memul'                                 => [ 'HTC', 'One Mini 2' ],
+        'HTC 10'                                    => [ 'HTC', '10' ],                     // a.k.a. HTC One (M10)
+        'HTC M10(h|u)!'                             => [ 'HTC', '10' ],                     // a.k.a. HTC One (M10)
+        'HTC 2PS62'                                 => [ 'HTC', '10' ],                     // a.k.a. HTC One (M10)
+        'HTC 2PS6200'                               => [ 'HTC', '10' ],                     // a.k.a. HTC One (M10)
+        'HTC 2PS650'                                => [ 'HTC', '10' ],                     // a.k.a. HTC One (M10)
+        'HTC6545LVW'                                => [ 'HTC', '10' ],                     // a.k.a. HTC One (M10)
+        'HTC Raider!'                               => [ 'HTC', 'Raider 4G' ],
+        'HTC Holiday'                               => [ 'HTC', 'Raider 4G' ],
+        'HTC X710(a|e|s)!'                          => [ 'HTC', 'Raider 4G' ],
+        'HTC PH39100!'                              => [ 'HTC', 'Raider 4G' ],
+        'HTCRaider'                                 => [ 'HTC', 'Raider 4G' ],
+        'HTC Rezound'                               => [ 'HTC', 'Rezound' ],
+        'HTC Rhyme!'                                => [ 'HTC', 'Rhyme' ],
+        'HTC Bliss!'                                => [ 'HTC', 'Rhyme' ],
+        'HTC S510b'                                 => [ 'HTC', 'Rhyme' ],
+        'HTC Salsa!'                                => [ 'HTC', 'Salsa' ],
+        'HTC C510e'                                 => [ 'HTC', 'Salsa' ],
+        'HTC Sensation.*XE!'                        => [ 'HTC', 'Sensation XE' ],
+        'HTC .*Z715(a|e)!'                          => [ 'HTC', 'Sensation XE' ],
+        'HTC Sensation.*XL!'                        => [ 'HTC', 'Sensation XL' ],
+        'HTC Runnymede'                             => [ 'HTC', 'Sensation XL' ],
+        'HTC .*X315(b|e)!'                          => [ 'HTC', 'Sensation XL' ],
+        'HTC G21!'                                  => [ 'HTC', 'Sensation XL' ],
+        'HTC ?Sensation!'                           => [ 'HTC', 'Sensation' ],
+        'HTC Pyramid!'                              => [ 'HTC', 'Sensation' ],
+        'HTC .*Z710(a|e|t)?!'                       => [ 'HTC', 'Sensation' ],
+        'HTC G14!'                                  => [ 'HTC', 'Sensation' ],
+        'HTC Tattoo!'                               => [ 'HTC', 'Tattoo' ],
+        'HTC Click'                                 => [ 'HTC', 'Tattoo' ],
+        'HTC A3288'                                 => [ 'HTC', 'Tattoo' ],
+        'HTC A9188'                                 => [ 'HTC', 'Tianxi' ],
+        'HTC X310e'                                 => [ 'HTC', 'Titan' ],
+        'HTC ETERNITY'                              => [ 'HTC', 'Titan' ],
+        'HTC Polaris'                               => [ 'HTC', 'Touch Cruise' ],
+        'HTC TOUCH DUAL'                            => [ 'HTC', 'Touch Dual' ],
+        'HTC DiamondII EX'                          => [ 'HTC', 'Touch Diamond II' ],
+        'HTC T7373'                                 => [ 'HTC', 'Touch Pro II' ],
+        'HTC Touch Pro'                             => [ 'HTC', 'Touch Pro' ],
+        'HTC ThunderBolt( 4G)?!'                    => [ 'HTC', 'ThunderBolt'],
+        'HTC Mecha'                                 => [ 'HTC', 'ThunderBolt'],
+        'HTC Kaiser'                                => [ 'HTC', 'TyTN II'],
+        'HTC Velocity!'                             => [ 'HTC', 'Velocity 4G'],
+        'HTCVelocity 4G'                            => [ 'HTC', 'Velocity 4G'],
+        'HTC Vivid'                                 => [ 'HTC', 'Vivid'],
+        'HTC ?Wildfire ?S!'                         => [ 'HTC', 'Wildfire S' ],
+        'HTC .*A510(a|b|c|e)!'                      => [ 'HTC', 'Wildfire S' ],
+        'HTC ?PG762!'                               => [ 'HTC', 'Wildfire S' ],
+        'HTC Wildfire!'                             => [ 'HTC', 'Wildfire' ],
+        'HTC Buzz!'                                 => [ 'HTC', 'Wildfire' ],
+        'HTC .*A33(33|35|66|80)!'                   => [ 'HTC', 'Wildfire' ],
+        'HTC A3360'                                 => [ 'HTC', 'Wildfire' ],
+        'HTC A6390'                                 => [ 'HTC', 'A6390' ],
+        'HTC A8180'                                 => [ 'HTC', 'A8180' ],
+        'HTC S610d'                                 => [ 'HTC', 'S610d' ],
+        'HTC S715e'                                 => [ 'HTC', 'S715e' ],
+        'HTC T327d'                                 => [ 'HTC', 'T327d' ],
+        'HTC T327t'                                 => [ 'HTC', 'T327t' ],
+        'HTC T329t'                                 => [ 'HTC', 'T329t' ],
+        'HTC Z510d'                                 => [ 'HTC', 'Z510d' ],
+        'HTC PO681'                                 => [ 'HTC', 'Droid DNA 2' ],
+        'HTC PO682'                                 => [ 'HTC', 'Butterfly S' ],
+        'HTC GOF U'                                 => [ 'HTC', 'Desire C' ],
+        'HTC VLE U'                                 => [ 'HTC', 'One S' ],
+        'HTC VLE#U'                                 => [ 'HTC', 'One S' ],
+        'HTC VIE U'                                 => [ 'HTC', 'One S' ],
+        'HTC K2 UL'                                 => [ 'HTC', 'One SV' ],
+        'HTC Droid DNA'                             => [ 'HTC', 'Droid DNA' ],
+        'HTC6435LRA'                                => [ 'HTC', 'Droid DNA' ],
+        'HTC6435LVW!'                               => [ 'HTC', 'Droid DNA' ],
+        'HTC Droid Incredible'                      => [ 'HTC', 'Droid Incredible' ],
+        'HTC IncredibleC'                           => [ 'HTC', 'Droid Incredible' ],
+        'HTC Droid Incredible 2'                    => [ 'HTC', 'Droid Incredible 2' ],
+        'HTC EVA UTL'                               => [ 'HTC', 'One X' ],
+        'HTC EVA UL'                                => [ 'HTC', 'One X' ],
+        'HTC ENR U'                                 => [ 'HTC', 'One X' ],
+        'HTC EVARE UL'                              => [ 'HTC', 'One X+' ],
+        'HTC ENRC2B'                                => [ 'HTC', 'One X+' ],
+        'HTC 9089'                                  => [ 'HTC', '9089' ],                                           // COS
+        'HTC ?909d!'                                => [ 'HTC', '909d' ],                                           // COS
+    ],
+
+    'DLX'                                       => [ 'HTC', 'Droid DNA' ],
+    'DLXU'                                      => [ 'HTC', 'Butterfly' ],
+    'ENR U'                                     => [ 'HTC', 'One X' ],
+
+    'Amaze 4G'                                  => [ 'HTC', 'Amaze 4G' ],
+    'Liberty'                                   => [ 'HTC', 'Aria' ],
+    'Butterfly S'                               => [ 'HTC', 'Butterfly S' ],
+    'desire200'                                 => [ 'HTC', 'Desire 200' ],
+    'Desire 310 dual sim'                       => [ 'HTC', 'Desire 310' ],
+    'Desire 500'                                => [ 'HTC', 'Desire 500' ],
+    'Desire 500 Plus'                           => [ 'HTC', 'Desire 500' ],
+    'Desire 510'                                => [ 'HTC', 'Desire 510' ],
+    'Desire 610'                                => [ 'HTC', 'Desire 610' ],
+    'Desire 619d'                               => [ 'HTC', 'Desire 619d' ],
+    'Desire 816'                                => [ 'HTC', 'Desire 816' ],
+    'Desire 816 dual sim'                       => [ 'HTC', 'Desire 816' ],
+    'Desire ?HD!'                               => [ 'HTC', 'Desire HD' ],
+    'Inspire HD'                                => [ 'HTC', 'Desire HD' ],
+    'desirec'                                   => [ 'HTC', 'Desire C' ],
+    'Desire L by HTC'                           => [ 'HTC', 'Desire L' ],
+    'Desire ?S!'                                => [ 'HTC', 'Desire S' ],
+    'Desire X'                                  => [ 'HTC', 'Desire X' ],
+    'Desire Z'                                  => [ 'HTC', 'Desire Z' ],
+    'Desire!'                                   => [ 'HTC', 'Desire' ],
+    'Dream'                                     => [ 'HTC', 'Dream' ],
+    'GinDream/GinMagic'                         => [ 'HTC', 'Dream' ],
+    'SiRF Dream'                                => [ 'HTC', 'Dream' ],
+    'Eris'                                      => [ 'HTC', 'Droid Eris' ],
+    'Droid Incredible'                          => [ 'HTC', 'Droid Incredible' ],
+    'Incredible'                                => [ 'HTC', 'Droid Incredible' ],   /* Verizon */
+    'Incredible 2'                              => [ 'HTC', 'Droid Incredible 2' ], /* Verizon */
+    'EVO'                                       => [ 'HTC', 'EVO' ],
+    'Evo HD2'                                   => [ 'HTC', 'EVO HD' ],
+    'EVO ?3D!'                                  => [ 'HTC', 'EVO 3D' ],
+    'EVO 4G'                                    => [ 'HTC', 'EVO 4G' ],
+    'Evo V 4G'                                  => [ 'HTC', 'EVO V 4G' ],
+    'Explorer A310e'                            => [ 'HTC', 'Explorer' ],
+    'Flyer'                                     => [ 'HTC', 'Flyer', DeviceType::TABLET ],
+    'photon'                                    => [ 'HTC', 'HD mini' ],
+    'HD2'                                       => [ 'HTC', 'HD2' ],
+    'NexusHD2'                                  => [ 'HTC', 'HD2' ],
+    'Nexus HD2'                                 => [ 'HTC', 'HD2' ],
+    'HD2 LEO'                                   => [ 'HTC', 'HD2' ],
+    'HD7  Pro'                                  => [ 'HTC', 'HD7 Pro' ],
+    'Hero'                                      => [ 'HTC', 'Hero' ],
+    'HERO CDMA'                                 => [ 'HTC', 'Hero' ],
+    'HERO200'                                   => [ 'HTC', 'Hero 200' ],
+    'Incredible ?S!'                            => [ 'HTC', 'Incredible S' ],
+    'Incredible ?2!'                            => [ 'HTC', 'Incredible 2' ],
+    'Incredible 4G LTE'                         => [ 'HTC', 'Incredible' ],
+    'Inspire 4G'                                => [ 'HTC', 'Inspire 4G' ],
+    'Legend'                                    => [ 'HTC', 'Legend' ],
+    'Docomo HT-03A'                             => [ 'HTC', 'Magic HT-03A', 'carrier' => 'DoCoMo' ],
+    'One S'                                     => [ 'HTC', 'One S' ],
+    'One X'                                     => [ 'HTC', 'One X' ],
+    'One X+'                                    => [ 'HTC', 'One X+' ],
+    'One XL'                                    => [ 'HTC', 'One XL' ],
+    'One V'                                     => [ 'HTC', 'One V' ],
+    'One'                                       => [ 'HTC', 'One' ],
+    'One M7'                                    => [ 'HTC', 'One' ],
+    'EndeavorU'                                 => [ 'HTC', 'One X' ],
+    '2PQ93'                                     => [ 'HTC', 'One (A9)' ],
+    'one m8'                                    => [ 'HTC', 'One (M8)' ],
+    'Rezound'                                   => [ 'HTC', 'Rezound' ],
+    'MIUI.us Sensation 4G'                      => [ 'HTC', 'Sensation 4G' ],
+    'SensationXE!'                              => [ 'HTC', 'Sensation XE' ],
+    'SensationXL!'                              => [ 'HTC', 'Sensation XL' ],
+    'Sensation XL with Beats Audio'             => [ 'HTC', 'Sensation XL' ],
+    'Sensation!'                                => [ 'HTC', 'Sensation' ],
+    'Pyramid'                                   => [ 'HTC', 'Sensation' ],
+    'Touch Pro 2'                               => [ 'HTC', 'Touch Pro II' ],
+    'TripNiCE Pyramid'                          => [ 'HTC', 'Sensation' ],
+    'VitMod ExtraLite 1.6.5.fullodex for HTC HD7 Pro'       => [ 'HTC', 'HD7 Pro' ],
+    'Vivid 4G'                                  => [ 'HTC', 'Vivid 4G' ],
+    'Wildfire S!'                               => [ 'HTC', 'Wildfire S' ],
+    'Wildfire!'                                 => [ 'HTC', 'Wildfire' ],
+    'Click'                                     => [ 'HTC', 'Tattoo' ],
+
+    'Sprint!!' => [
+        'Sprint APX515CKT'                          => [ 'HTC', 'EVO 3D' ],
+        'Sprint APA9292KT'                          => [ 'HTC', 'EVO 4G' ],
+        'Sprint APA7373KT'                          => [ 'HTC', 'EVO Shift 4G' ],
+        'Sprint APC715CKT'                          => [ 'HTC', 'EVO Design 4G' ],
+        'Sprint ATP515CKIT'                         => [ 'HTC', 'EVO View 4G', DeviceType::TABLET ],
+    ],
+
+    '710C'                                      => [ 'HTC', 'Desire 816' ],
+    '801a'                                      => [ 'HTC', 'One' ],
+    '801s'                                      => [ 'HTC', 'One' ],
+    '802w'                                      => [ 'HTC', 'One' ],
+    '831C'                                      => [ 'HTC', 'One (M8)' ],
+    '909d'                                      => [ 'HTC', '909d' ],                                           // COS
+    '9088'                                      => [ 'HTC', '9088' ],                                           // COS
+
+    'A320a'                                     => [ 'HTC', 'Desire C' ],
+    'A3380'                                     => [ 'HTC', 'Wildfire' ],
+    'A6277'                                     => [ 'HTC', 'Hero' ],
+    'a7272'                                     => [ 'HTC', 'Desire Z' ],
+    'A7272+(HTC DesireZ)'                       => [ 'HTC', 'Desire Z' ],
+    'C525c'                                     => [ 'HTC', 'One SV' ],
+    'D816(d|t|v|w|x)!'                          => [ 'HTC', 'Desire 816' ],
+    'D816G'                                     => [ 'HTC', 'Desire 816G' ],
+    'D820mt'                                    => [ 'HTC', 'Desire 820 Mini' ],
+    'S710d'                                     => [ 'HTC', 'Droid Incredible 2' ],
+    'S710D'                                     => [ 'HTC', 'Droid Incredible 2' ],
+    'T320a'                                     => [ 'HTC', 'One V' ],
+    'X325a'                                     => [ 'HTC', 'One X' ],
+    'X515d'                                     => [ 'HTC', 'EVO 3D' ],
+    'X515e'                                     => [ 'HTC', 'EVO 4G+' ],
+    'X525a'                                     => [ 'HTC', 'One X+' ],
+    'X710E'                                     => [ 'HTC', 'Raider 4G' ],
+    'X920e'                                     => [ 'HTC', 'J Butterfly' ],
+    'Z520e'                                     => [ 'HTC', 'One S' ],
+    'Z520m'                                     => [ 'HTC', 'One S' ],
+    'Z710'                                      => [ 'HTC', 'Sensation' ],
+    'Z710e'                                     => [ 'HTC', 'Sensation' ],
+    'Z715e'                                     => [ 'HTC', 'Sensation XE' ],
+    'T9199h'                                    => [ 'HTC', 'T9199h' ],
+
+    '(HTC|PCD|USCC)?ADR[0-9]{4,4}!!' => [
+        'ADR6200'                                   => [ 'HTC', 'Droid Eris' ],
+        'ADR6225'                                   => [ 'HTC', 'Wildfire 6225' ],
+        'HTCADR6290US'                              => [ 'HTC', 'One V' ],
+        'ADR6300'                                   => [ 'HTC', 'Droid Incredible' ],
+        'ADR6325!'                                  => [ 'HTC', 'Merge' ],
+        'ADR6330VW'                                 => [ 'HTC', 'Rhyme' ],
+        'ADR6350'                                   => [ 'HTC', 'Droid Incredible 2' ],
+        'ADR6400L!'                                 => [ 'HTC', 'Thunderbolt 4G' ],
+        'ADR6410LRA!'                               => [ 'HTC', 'Droid Incredible 4G' ],
+        'ADR6410LVW!'                               => [ 'HTC', 'Droid Incredible 4G' ],
+        'ADR6410OM'                                 => [ 'HTC', 'Droid Incredible 4G' ],
+        'ADR6425LVW!'                               => [ 'HTC', 'Rezound' ],
+        'pcdadr6350'                                => [ 'HTC', 'Droid Incredible 2' ],
+        'USCCADR6275US!'                            => [ 'HTC', 'Desire' ],
+        'USCCADR6285US!'                            => [ 'HTC', 'Hero S' ],
+        'USCCADR6325US!'                            => [ 'HTC', 'Merge' ],
+        'USCCADR6230US!'                            => [ 'HTC', 'Wildfire S' ],
+    ],
+
+    'ERIS ADR6200'                              => [ 'HTC', 'Droid Eris' ],
+    'ATP515CKIT'                                => [ 'HTC', 'EVO View 4G' ],
+    'Coquettish Red'                            => [ 'HTC', 'Rezound' ],
+    'PB99400'                                   => [ 'HTC', 'Desire' ],
+    'PC36100!'                                  => [ 'HTC', 'EVO 4G' ],
+    'PG06100'                                   => [ 'HTC', 'EVO Shift 4G' ],
+    'PG41200'                                   => [ 'HTC', 'EVO View 4G', DeviceType::TABLET ],
+    'PG86100!'                                  => [ 'HTC', 'EVO 3D' ],
+    'PH44100'                                   => [ 'HTC', 'EVO Design 4G' ],
+    'PJ83100'                                   => [ 'HTC', 'One X' ],
+    'PJ35100'                                   => [ 'HTC', 'One VX' ],
+    'PM36100'                                   => [ 'HTC', 'One VX' ],
+    'PM63100'                                   => [ 'HTC', 'One X+' ],
+    '0PCV1'                                     => [ 'HTC', 'Desire 510' ],
+    '0PM92'                                     => [ 'HTC', 'Desire 626s' ],
+    '0PJA1!'                                    => [ 'HTC', 'One (M9)' ],
+    '0PJA2!'                                    => [ 'HTC', 'One (M9)' ],
+    '0PKV1'                                     => [ 'HTC', 'One (M8s)' ],
+    '0PAJ5'                                     => [ 'HTC', 'One (E8)' ],
+    'M7CDTU'                                    => [ 'HTC', 'One' ],
+
+    '[SX0][0-9]{2,2}HT!!' => [
+        'S31HT'                                     => [ 'HTC', 'Aria S31HT', 'carrier' => 'EMOBILE' ],
+        'X06HT'                                     => [ 'HTC', 'Desire X06HT', 'carrier' => 'Softbank' ],
+        '001HT'                                     => [ 'HTC', 'Desire HD 001HT', 'carrier' => 'Softbank' ],
+    ],
+
+    'ISW[0-9]{2,2}HT!!' => [
+        'ISW11HT!'                                  => [ 'HTC', 'EVO WiMAX ISW11HT', 'carrier' => 'au' ],
+        'ISW12HT!'                                  => [ 'HTC', 'EVO 3D ISW12HT', 'carrier' => 'au' ],
+        'ISW13HT!'                                  => [ 'HTC', 'J ISW13HT', 'carrier' => 'au' ],
+    ],
+
+    '(HTC )?HT[LV][0-9]{2,2}!!' => [
+        'HTL21!'                                    => [ 'HTC', 'J Butterfly HTL21', 'carrier' => 'au' ],
+        'HTL22'                                     => [ 'HTC', 'J One HTL22', 'carrier' => 'au' ],
+        'HTC HTL22'                                 => [ 'HTC', 'J One HTL22', 'carrier' => 'au' ],
+        'HTL23!'                                    => [ 'HTC', 'J Butterfly HTL23', 'carrier' => 'au' ],
+        'HTV31!'                                    => [ 'HTC', 'J Butterfly HTV31', 'carrier' => 'au' ],
+        'HTV32!'                                    => [ 'HTC', '10 HTV32', 'carrier' => 'au' ],
+    ],
+
+    'GT-T9500'                                  => [ 'HTM', 'GT-T9500' ],
+    'SM-H900A'                                  => [ 'HTM', 'SM-H900A' ],
+    'Z1-H39LW'                                  => [ 'HTM', 'Z1-H39LW' ],
+
+    'Huawei MediaPad'                           => [ 'Huawei', 'MediaPad', DeviceType::TABLET ],
+    'Huawei OsiMood MediaPad'                   => [ 'Huawei', 'MediaPad', DeviceType::TABLET ],
+    'HUAWEI MediaPad M1 8.0'                    => [ 'Huawei', 'MediaPad M1', DeviceType::TABLET ],
+    'Huawei MediaPad T1 7.0 3G'                 => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+    'Huawei MediaPad T1 8.0 4G'                 => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+    'Huawei MediaPad T1 10 4G'                  => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+
+    'MediaPad!!' => [
+        'MediaPad'                                  => [ 'Huawei', 'MediaPad', DeviceType::TABLET ],
+        'MediaPad 7 FHD'                            => [ 'Huawei', 'MediaPad 7', DeviceType::TABLET ],
+        'MediaPad 7 Classic'                        => [ 'Huawei', 'MediaPad 7 Classic', DeviceType::TABLET ],
+        'MediaPad 7 Lite'                           => [ 'Huawei', 'MediaPad 7 Lite', DeviceType::TABLET ],
+        'MediaPad 7 Lite+'                          => [ 'Huawei', 'MediaPad 7 Lite+', DeviceType::TABLET ],
+        'MediaPad 7 Lite II'                        => [ 'Huawei', 'MediaPad 7 Lite II', DeviceType::TABLET ],
+        'MediaPad 7 Vivid'                          => [ 'Huawei', 'MediaPad 7 Vivid', DeviceType::TABLET ],
+        'MediaPad 7 Vogue'                          => [ 'Huawei', 'MediaPad 7 Vogue', DeviceType::TABLET ],
+        'MediaPad 7 Voguevivi'                      => [ 'Huawei', 'MediaPad 7 Vogue', DeviceType::TABLET ],
+        'MediaPad 7 Youth'                          => [ 'Huawei', 'MediaPad 7 Youth', DeviceType::TABLET ],
+        'MediaPad 7 Youth2'                         => [ 'Huawei', 'MediaPad 7 Youth 2', DeviceType::TABLET ],
+        'MediaPad 7 Youth 2'                        => [ 'Huawei', 'MediaPad 7 Youth 2', DeviceType::TABLET ],
+        'MediaPad 8 Vogue'                          => [ 'Huawei', 'MediaPad 8 Vogue', DeviceType::TABLET ],
+        'MediaPad 10 FHD'                           => [ 'Huawei', 'MediaPad 10', DeviceType::TABLET ],
+        'MediaPad 10 LINK'                          => [ 'Huawei', 'MediaPad 10 Link', DeviceType::TABLET ],
+        'MediaPad 10 Link+'                         => [ 'Huawei', 'MediaPad 10 Link', DeviceType::TABLET ],
+        'MediaPad M1 8.0'                           => [ 'Huawei', 'MediaPad M1', DeviceType::TABLET ],
+        'MediaPad M1 8.0 (LTE)'                     => [ 'Huawei', 'MediaPad M1', DeviceType::TABLET ],
+        'MediaPad M1 8.0 (WIFI)'                    => [ 'Huawei', 'MediaPad M1', DeviceType::TABLET ],
+        'MediaPad T1 8.0'                           => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+        'MediaPad T1 8.0 LTE'                       => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+        'MediaPad T1 8.0 Pro'                       => [ 'Huawei', 'MediaPad T1 Pro', DeviceType::TABLET ],
+        'MediaPad X1 7.0'                           => [ 'Huawei', 'MediaPad X1', DeviceType::TABLET ],
+        'MediaPad X1'                               => [ 'Huawei', 'MediaPad X1', DeviceType::TABLET ],
+        'MediaPad 7D'                               => [ 'Huawei', 'MediaPad X1', DeviceType::TABLET ],
+        'MediaPad X1 S 7.0'                         => [ 'Huawei', 'MediaPad X1 S', DeviceType::TABLET ],
+    ],
+
+    '(Huawei )?[MSTX](1|2|7|8|10)\-[A-Z0-9][0-9]{2,2}!!' => [
+        'Huawei S7-312u'                            => [ 'Huawei', 'MediaPad', DeviceType::TABLET ],
+        'S7-721u'                                   => [ 'Huawei', 'MediaPad 7 Youth 2', DeviceType::TABLET ],
+        'S10-232L'                                  => [ 'Huawei', 'MediaPad 10 Link', DeviceType::TABLET ],
+        'S8-303L'                                   => [ 'Huawei', 'MediaPad M1', DeviceType::TABLET ],
+        'S8-303LT'                                  => [ 'Huawei', 'MediaPad M1', DeviceType::TABLET ],
+        'S8-306L'                                   => [ 'Huawei', 'MediaPad M1', DeviceType::TABLET ],
+        'HUAWEI M2-A01L'                            => [ 'Huawei', 'MediaPad M2', DeviceType::TABLET ],
+        'HUAWEI M2-A01W'                            => [ 'Huawei', 'MediaPad M2', DeviceType::TABLET ],
+        'HUAWEI M2-801L'                            => [ 'Huawei', 'MediaPad M2', DeviceType::TABLET ],
+        'HUAWEI M2-801W'                            => [ 'Huawei', 'MediaPad M2', DeviceType::TABLET ],
+        'Huawei M2-802L'                            => [ 'Huawei', 'MediaPad M2', DeviceType::TABLET ],
+        'HUAWEI M2-803L'                            => [ 'Huawei', 'MediaPad M2', DeviceType::TABLET ],
+        'S8-701u'                                   => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+        'T1-A21L'                                   => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+        'T1-A21w'                                   => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+        'T1-A22L'                                   => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+        'T1-A23L'                                   => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+        'T1-701u'                                   => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+        'T1-701ua'                                  => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+        'T1-701w'                                   => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+        'T1-821w'                                   => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+        'T1-821L'                                   => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+        'T1-823L'                                   => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+        'S8-701w'                                   => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+        'S8-821w'                                   => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+    ],
+
+    'T1 7.0'                                    => [ 'Huawei', 'MediaPad T1', DeviceType::TABLET ],
+    'X1 7.0'                                    => [ 'Huawei', 'MediaPad X1', DeviceType::TABLET ],
+    '7D-501u'                                   => [ 'Huawei', 'MediaPad X1', DeviceType::TABLET ],
+    'HUAWEI GEM-703L'                           => [ 'Huawei', 'MediaPad X2', DeviceType::TABLET ],
+    'PLE-703L'                                  => [ 'Huawei', 'MediaPad T2', DeviceType::TABLET ],
+    'FDR-A01w'                                  => [ 'Huawei', 'MediaPad T2', DeviceType::TABLET ],
+    'BGO-DL09'                                  => [ 'Huawei', 'MediaPad T2', DeviceType::TABLET ],
+
+    '(HUAWEI )?(CRR|LON|MATE|MHA|MT1|MT2|MT7|M200|NXT|Z100)!!' => [
+        '(HW-|HUAWEI )?MT1-(T00|U06)!'                                  => [ 'Huawei', 'Ascend Mate' ],
+        '(HW-|HUAWEI )?MATE-U06!'                                       => [ 'Huawei', 'Ascend Mate' ],
+        '(HW-|HUAWEI )?MT2-?(C00|L01|L02|L03|L05)!'                     => [ 'Huawei', 'Ascend Mate 2' ],
+        '(HW-|HUAWEI )?MT7-(L09|J1|CL00|TL00|TL10|UL00)!'               => [ 'Huawei', 'Ascend Mate 7' ],
+        '(HW-|HUAWEI )?Z100-(L09|TL00|TL10)!'                           => [ 'Huawei', 'Ascend Mate 7' ],
+        '(HW-|HUAWEI )?NXT-(AL10|CL00|DL00|L09|L29|TL00|UL00|UL10)!'    => [ 'Huawei', 'Mate 8' ],
+        '(HW-|HUAWEI )?M200-(UL00)!'                                    => [ 'Huawei', 'Mate 8' ],
+        '(HW-|HUAWEI )?MHA-(AL00)!'                                     => [ 'Huawei', 'Mate 9' ],
+        '(HW-|HUAWEI )?LON-(AL00|L29)!'                                 => [ 'Huawei', 'Mate 9 Pro' ],
+        '(HW-|HUAWEI )?CRR-(L09|CL00|CL20|TL00|UL00|UL20)!'             => [ 'Huawei', 'Mate S' ],
+    ],
+
+    '(HW-|HUAWEI )?(TIT|TAG|NCE)!!' => [
+        '(HW-|HUAWEI )?TIT-(AL00|CL00|CL10|L01|TL00|U02)!'              => [ 'Huawei', 'Enjoy 5' ],
+        '(HW-|HUAWEI )?TAG-(AL00|CL00|L13|TL00)!'                       => [ 'Huawei', 'Enjoy 5S' ],
+        '(HW-|HUAWEI )?NCE-(AL00|AL10)!'                                => [ 'Huawei', 'Enjoy 6' ],
+    ],
+
+    '(HW-|HUAWEI |HONOR )?(ATH|BLN|CHE|CHM|EDI|FRD|HN3|H30|H60|HOL|KIW|NEM|NMO|PE|PLK|SCL|KNT|CAM)!!' => [
+        'H30 U10'                                                       => [ 'Huawei', 'Honor 3C' ],
+        '(HW-|HUAWEI )?HN3-(U00|U01)!'                                  => [ 'Huawei', 'Honor 3' ],
+        '(HW-|HUAWEI |HONOR )?H30[- ](C00|L01|L02|T00|T10|U10)!'        => [ 'Huawei', 'Honor 3C' ],
+        '(HW-|HUAWEI )?HOL-(T00|U10|U19|U40)!'                          => [ 'Huawei', 'Honor 3C' ],
+        '(HW-|HUAWEI )?CHM-(CL00|TL00H|TL00|U01|UL00)!'                 => [ 'Huawei', 'Honor Play 4C' ],
+        '(HW-|HUAWEI )?SCL-(L01|L02|L03|L04|L21|L32|L001|L004|AL00|CL00|TL00|TL00H|U23|U31)!'    => [ 'Huawei', 'Honor 4A' ],
+        '(HW-|HUAWEI )?CHE-(TL00|TL00H)!'                               => [ 'Huawei', 'Honor 4X' ],
+        '(HW-|HUAWEI )?Che1-(L04|CL10|CL20)!'                           => [ 'Huawei', 'Honor 4X' ],
+        '(HW-|HUAWEI )?Che2-(L11|L12|L23|TL00|UL00)!'                   => [ 'Huawei', 'Honor 4X' ],
+        '(HW-|HUAWEI )?NEM-(AL10|L21|L22|L51|TL00|TL00H|UL10)!'         => [ 'Huawei', 'Honor 5C' ],
+        '(HW-|HUAWEI )?NMO-(L23|L31)!'                                  => [ 'Huawei', 'Honor 5C' ],
+        '(HW-|HUAWEI )?KIW-(AL10|CL00|L21|L22|L24|UL00|TL00|TL00H)!'    => [ 'Huawei', 'Honor 5X' ],
+        '(HW-|HUAWEI )?H60-(J1|L01|L02|L03|L04|L11|L12|L21)!'           => [ 'Huawei', 'Honor 6' ],
+        '(HW-|HUAWEI )?BLN-(AL10|AL20|L21|L22|L24|TL10)!'               => [ 'Huawei', 'Honor 6X' ],
+        '(HW-|HUAWEI )?PE-(CL00|TL00|TL00M|TL10|TL20|UL00)!'            => [ 'Huawei', 'Honor 6 Plus' ],
+        '(HW-|HUAWEI )?PLK-(L01|AL10|CL00|UL00|TL00|TL01H)!'            => [ 'Huawei', 'Honor 7' ],
+        '(HW-|HUAWEI )?ATH-(AL00|CL00|TL00|TL00H|UL00)!'                => [ 'Huawei', 'Honor 7i' ],
+        '(HW-|HUAWEI )?FRD-(AL00|AL10|DL00|L02|L04|L09|L14|L19)!'       => [ 'Huawei', 'Honor 8' ],
+        '(HW-|HUAWEI )?ATH-(UL01|UL06)!'                                => [ 'Huawei', 'Honor ShotX' ],
+        '(HW-|HUAWEI )?KNT-(AL10|AL20|TL10|UL10)!'                      => [ 'Huawei', 'Honor V8' ],
+        '(HW-|HUAWEI )?EDI-(AL10)!'                                     => [ 'Huawei', 'Honor Note 8' ],
+    ],
+
+    '(HW-|HUAWEI )?(CHC|TAG|KII)!!' => [
+        '(HW-|HUAWEI )?CHC-(U01|U03|U23)!'                              => [ 'Huawei', 'G Play Mini' ],
+        '(HW-|HUAWEI )?TAG-(L01|L03|L21|L22|L23|L32)!'                  => [ 'Huawei', 'GR3' ],
+        '(HW-|HUAWEI )?KII-(L03|L05|L21|L22|L23|L33)!'                  => [ 'Huawei', 'GR5' ],
+    ],
+
+    '(HW-|HUAWEI )?(ALE|D2|DAV|EVA|G6|G7|GRA|M100|P2|P6|P7|PRA|RIO|SC|Sophia|VIE|VKY|VNS|VTR|WAS)!!' => [
+        'HUAWEI D2'                                                     => [ 'Huawei', 'Ascend D2' ],
+        '(HW-|HUAWEI )?D2-(0082|2010|5000|6070|6114)!'                  => [ 'Huawei', 'Ascend D2' ],
+        '(HW-|HUAWEI )?G6-(C00|L11|L22|L33|T00|U00|U10|U34|U251)!'      => [ 'Huawei', 'Ascend G6' ],
+        '(HW-|HUAWEI )?G7-(L01|L02|L03|L11|TL00|UL20)!'                 => [ 'Huawei', 'Ascend G7' ],
+        'HUAWEI G7'                                                     => [ 'Huawei', 'Ascend G7' ],
+        '(HW-|HUAWEI )?RIO-(L01|L02|L03|AL00|UL00|CL00|TL00)!'          => [ 'Huawei', 'Ascend G8' ],
+        '(HW-|HUAWEI )?SC-(CL00|UL10)!'                                 => [ 'Huawei', 'Ascend GX1' ],
+        '(HW-|HUAWEI )?P2-(0000|6011|6070)!'                            => [ 'Huawei', 'Ascend P2' ],
+        '(HW-|HUAWEI )?P6-(C00|U00|U06|T00|T00V|VIP)!'                  => [ 'Huawei', 'Ascend P6' ],
+        '(HW-|HUAWEI )?P6 ?S-U06!'                                      => [ 'Huawei', 'Ascend P6' ],
+        '(HW-|HUAWEI )?Sophia-(L07|L10)!'                               => [ 'Huawei', 'Ascend P7' ],
+        '(HW-|HUAWEI )?P7-(L00|L01|L05|L07|L09|L10|L11|L12)!'           => [ 'Huawei', 'Ascend P7' ],
+        '(HW-|HUAWEI )?M100-(CL00|L09|TL00|UL00)!'                      => [ 'Huawei', 'P8' ],
+        '(HW-|HUAWEI )?GRA-(CL00|CL10|L09|TL00|UL00|UL10)!'             => [ 'Huawei', 'P8' ],
+        '(HW-|HUAWEI )?ALE-?(L02|L04|L21|L23|CL00|TL00|UL00)!'          => [ 'Huawei', 'P8 Lite' ],
+        '(HW-|HUAWEI )?PRA-?(AL00|LA1|LX1|LX2)!'                        => [ 'Huawei', 'P8 Lite (2017)' ],
+        '(HW-|HUAWEI )?DAV-?(703L)!'                                    => [ 'Huawei', 'P8 Max' ],
+        '(HW-|HUAWEI )?EVA-?(AL00|AL10|CL00|DL00|L09|L19|L29|TL00)!'    => [ 'Huawei', 'P9' ],
+        '(HW-|HUAWEI )?VNS-?(AL00|DL00|L21|L22|L23|L31|L52|L53|L62|TL00)!'          => [ 'Huawei', 'P9 Lite' ],
+        '(HW-|HUAWEI )?VIE-?(AL00|AL10|L09|L29)!'                       => [ 'Huawei', 'P9 Plus' ],
+        '(HW-|HUAWEI )?VTR-?(AL00|L09|L29)!'                            => [ 'Huawei', 'P10' ],
+        '(HW-|HUAWEI )?WAS-?(AL00|LX1|LX1A|LX2|LX2J|LX3)!'              => [ 'Huawei', 'P10 Lite' ],
+        '(HW-|HUAWEI )?VKY-?(AL00|L09|L29)!'                            => [ 'Huawei', 'P10 Plus' ],
+    ],
+
+    '(HW-|HUAWEI )?(LUA|CUN|SCC|CAM|LYO)!!' => [
+        '(HW-|HUAWEI )?LUA-(L01|L02|L03|L13|L21|L22|L23|U03|U22|U23)!'  => [ 'Huawei', 'Y3 II' ],
+        '(HW-|HUAWEI )?CUN-(AL00|L01|L02|L03|L21|L22|L23||L33|TL00|U29)!'   => [ 'Huawei', 'Y5 II' ],
+        '(HW-|HUAWEI )?SCC-(U21)!'                                      => [ 'Huawei', 'Y6' ],
+        '(HW-|HUAWEI )?CAM-(L01|L03|L11|L21|L23|AL00|CL00|TL00)!'       => [ 'Huawei', 'Y6 II' ],
+        '(HW-|HUAWEI )?LYO-(L01|L02|L21)!'                              => [ 'Huawei', 'Y6 II Compact' ],
+    ],
+
+    '(HW-|HUAWEI )?CAZ-(AL10|TL10)!'                => [ 'Huawei', 'Nova' ],
+    '(HW-|HUAWEI )?CAN-(L01|L11)!'                  => [ 'Huawei', 'Nova' ],
+    '(HW-|HUAWEI )?MLA-(L01|L03|L11|L12)!'          => [ 'Huawei', 'Nova Plus' ],
+    '(HW-|HUAWEI )?MLA-(AL00|AL10)!'                => [ 'Huawei', 'Maimang 5' ],
+    '(HW-|HUAWEI )?MLA-(TL00|TL10|UL00)!'           => [ 'Huawei', 'G9 Plus' ],
+
+    'Huawei P7 mini'                                => [ 'Huawei', 'Ascend P7 mini' ],
+    'Huawei P8max'                                  => [ 'Huawei', 'P8 Max' ],
+
+    'G[0-9]{3,3}!!' => [
+        'G350-U151'                                 => [ 'Huawei', 'Ascend G350' ],
+        'G521-(L076|L176)!'                         => [ 'Huawei', 'Ascend G521' ],
+        'G526-(L11|L22|L33)!'                       => [ 'Huawei', 'Ascend G526' ],
+        'G527-(U081)!'                              => [ 'Huawei', 'Ascend G527' ],
+        'G535-(L11)!'                               => [ 'Huawei', 'Ascend G535' ],
+        'G610[ -](T00|T11|U00)!'                    => [ 'Huawei', 'Ascend G610' ],
+        'G615-U10'                                  => [ 'Huawei', 'Ascend G615' ],
+        'G616-T00'                                  => [ 'Huawei', 'Ascend G616' ],
+        'G618'                                      => [ 'Huawei', 'Ascend G618' ],
+        'G620-L75'                                  => [ 'Huawei', 'Ascend G620' ],
+        'G620S-(L01|L02|L03|UL00)!'                 => [ 'Huawei', 'Ascend G620S' ],
+        'G621-(TL00|TL00M)!'                        => [ 'Huawei', 'Ascend G621' ],
+        'G629-(UL00)!'                              => [ 'Huawei', 'Ascend G629' ],
+        'G630-(U00|U10|U20|U251)!'                  => [ 'Huawei', 'Ascend G630' ],
+        'G735-(L03|L12|L23)!'                       => [ 'Huawei', 'Ascend G735' ],
+        'G740-L00'                                  => [ 'Huawei', 'Ascend G740' ],
+        'G750-(T00|T01)!'                           => [ 'Huawei', 'Ascend G750' ],
+        'G760-(L01|TL00)!'                          => [ 'Huawei', 'Ascend G760' ],
+    ],
+
+    'Y[0-9]{3,3}!!' => [
+        'Y220-(U00|U05|U10|U17)!'                   => [ 'Huawei', 'Ascend Y220' ],
+        'Y220T'                                     => [ 'Huawei', 'Ascend Y220' ],
+        'Y221-(U22)!'                               => [ 'Huawei', 'Ascend Y221' ],
+        'Y301-(A1|A2)!'                             => [ 'Huawei', 'Valiant' ],
+        'Y320-(U01|U10)!'                           => [ 'Huawei', 'Ascend Y320' ],
+        'Y325-T00'                                  => [ 'Huawei', 'Ascend Y325' ],
+        'Y330-U11'                                  => [ 'Huawei', 'Ascend Y330' ],
+        'Y340-U081'                                 => [ 'Huawei', 'Ascend Y340' ],
+        'Y511'                                      => [ 'Huawei', 'Ascend Y511' ],
+        'Y511-(T00|U00|U30)!'                       => [ 'Huawei', 'Ascend Y511' ],
+        'Y536A1'                                    => [ 'Huawei', 'Ascend Y536' ],
+        'Y540-U01'                                  => [ 'Huawei', 'Ascend Y540' ],
+        'Y541-U02'                                  => [ 'Huawei', 'Ascend Y541' ],
+        'Y550-(L02|L03)!'                           => [ 'Huawei', 'Ascend Y550' ],
+        'Y560-L01'                                  => [ 'Huawei', 'Ascend Y560' ],
+        'Y600-U00'                                  => [ 'Huawei', 'Ascend Y600' ],
+        'Y618-T00'                                  => [ 'Huawei', 'Ascend Y618' ],
+        'Y635-(L01|L02|L03|L21|L22)!'               => [ 'Huawei', 'Ascend Y635' ],
+    ],
+
+    '(Huawei|Ascend|HW-)!!' => [
+        'Huawei A199'                               => [ 'Huawei', 'A199' ],
+        'Huawei B199'                               => [ 'Huawei', 'B199' ],
+        'Huawei C199'                               => [ 'Huawei', 'C199' ],
+        'HUAWEI C199s'                              => [ 'Huawei', 'C199s' ],
+        'Huawei C8500!'                             => [ 'Huawei', 'C8500' ],
+        'HUAWEI C8550!'                             => [ 'Huawei', 'C8550' ],
+        'Huawei C8600'                              => [ 'Huawei', 'C8600' ],
+        'HW-C8600!'                                 => [ 'Huawei', 'C8600' ],
+        'Huawei C8650!'                             => [ 'Huawei', 'C8650' ],
+        'Huawei C8655'                              => [ 'Huawei', 'Ascend Y201C' ],
+        'Huawei C8800'                              => [ 'Huawei', 'IDEOS X5' ],
+        'Huawei C8810!'                             => [ 'Huawei', 'Ascend G300' ],
+        'Huawei C8812!'                             => [ 'Huawei', 'Ascend C8812' ],
+        'Ascend C8812'                              => [ 'Huawei', 'Ascend C8812' ],
+        'Huawei C8813!'                             => [ 'Huawei', 'Ascend C8813' ],
+        'Ascend c8813'                              => [ 'Huawei', 'Ascend C8813' ],
+        'Ascend C8813Q'                             => [ 'Huawei', 'Ascend C8813' ],
+        'Huawei C8815!'                             => [ 'Huawei', 'Ascend C8815' ],
+        'Huawei C8816!'                             => [ 'Huawei', 'Ascend C8816' ],
+        'Huawei C8817!'                             => [ 'Huawei', 'C8817' ],
+        'HW-C8817D!'                                => [ 'Huawei', 'C8817' ],
+        'HUAWEI C8818!'                             => [ 'Huawei', 'C8818' ],
+        'Huawei C8825D'                             => [ 'Huawei', 'Ascend G330C' ],
+        'Huawei C8826D'                             => [ 'Huawei', 'Ascend G500C' ],
+        'Huawei C8850'                              => [ 'Huawei', 'C8850' ],
+        'Huawei C8860E'                             => [ 'Huawei', 'Honor' ],
+        'Huawei C8950D'                             => [ 'Huawei', 'Honor+' ],
+        'Huawei G7500'                              => [ 'Huawei', 'G7500' ],
+        'Huawei CM990'                              => [ 'Huawei', 'Evolución 3' ],
+        'Huawei Evolucion 3'                        => [ 'Huawei', 'Evolución 3' ],
+        'Huawei H866C'                              => [ 'Huawei', 'H866C' ],
+        'Huawei H867G'                              => [ 'Huawei', 'H867G' ],
+        'Huawei H868C'                              => [ 'Huawei', 'Glory' ],
+        'Huawei H870C'                              => [ 'Huawei', 'H870C' ],
+        'Huawei H871G'                              => [ 'Huawei', 'Magna' ],
+        'Huawei H881C'                              => [ 'Huawei', 'Ascend Plus' ],
+        'HUAWEI H891L'                              => [ 'Huawei', 'Pronto' ],
+        'HUAWEI H892L'                              => [ 'Huawei', 'Honor 4X' ],
+        'Huawei M835'                               => [ 'Huawei', 'M835' ],
+        'Huawei M860'                               => [ 'Huawei', 'Ascend' ],
+        'Huawei M866'                               => [ 'Huawei', 'Ascend Y' ],
+        'Huawei M868'                               => [ 'Huawei', 'M868' ],
+        'HUAWEI M881'                               => [ 'Huawei', 'Asura' ],
+        'Huawei M920'                               => [ 'Huawei', 'M920' ],
+        'Huawei M921'                               => [ 'Huawei', 'M921' ],
+        'Huawei M931'                               => [ 'Huawei', 'M931' ],
+        'Ascend Mate 2'                             => [ 'Huawei', 'Ascend Mate 2' ],
+        'Huawei S8520'                              => [ 'Huawei', 'S8520' ],
+        'Huawei S8600'                              => [ 'Huawei', 'S8600' ],
+        'Huawei T8100'                              => [ 'Huawei', 'T8100' ],
+        'Huawei T8300'                              => [ 'Huawei', 'T8300' ],
+        'Huawei ?T8500!'                            => [ 'Huawei', 'T8500' ],
+        'Huawei T8600'                              => [ 'Huawei', 'T8600' ],
+        'Huawei T8620'                              => [ 'Huawei', 'Ascend Y200T' ],
+        'Huawei T8808D'                             => [ 'Huawei', 'Ascend G306T' ],
+        'Huawei T8828'                              => [ 'Huawei', 'Ascend G305T' ],
+        'Huawei T8830'                              => [ 'Huawei', 'Ascend G309T' ],
+        'Huawei T8830 ?Pro!'                        => [ 'Huawei', 'Ascend G309T Pro' ],
+        'Huawei T8833'                              => [ 'Huawei', 'Ascend Y300' ],
+        'Huawei T8950!'                             => [ 'Huawei', 'Honor+' ],
+        'Huawei T8951!'                             => [ 'Huawei', 'Ascend G510' ],
+        'Huawei T9200'                              => [ 'Huawei', 'Ascend P1' ],
+        'Huawei U8110'                              => [ 'Huawei', 'U8110' ],
+        'Huawei U8160'                              => [ 'Huawei', 'U8160' ],
+        'Huawei U8220'                              => [ 'Huawei', 'U8220' ],
+        'Huawei ?U8300!'                            => [ 'Huawei', 'U8300' ],
+        'Huawei ?U8500!'                            => [ 'Huawei', 'IDEOS X2' ],
+        'Huawei ?U8520!'                            => [ 'Huawei', 'U8520 Duplex' ],
+        'Huawei U8600'                              => [ 'Huawei', 'U8600' ],
+        'Huawei ?U8650!'                            => [ 'Huawei', 'Sonic' ],
+        'Huawei U8651'                              => [ 'Huawei', 'Prism' ],
+        'Huawei U8652'                              => [ 'Huawei', 'Sonic' ],
+        'Huawei U8661'                              => [ 'Huawei', 'Sonic+' ],
+        'Huawei U8665'                              => [ 'Huawei', 'Fusion 2' ],
+        'Huawei U8666!'                             => [ 'Huawei', 'Ascend Y201' ],
+        'Huawei U8681'                              => [ 'Huawei', 'Ascend G312' ],
+        'Huawei U8687'                              => [ 'Huawei', 'Chronos' ],
+        'Huawei U8800!'                             => [ 'Huawei', 'IDEOS X5' ],
+        'Huawei U8815!'                             => [ 'Huawei', 'Ascend G300' ],
+        'Huawei U8818'                              => [ 'Huawei', 'Ascend G300' ],
+        'Huawei U8825D'                             => [ 'Huawei', 'Ascend G330D' ],
+        'Huawei U8825-1'                            => [ 'Huawei', 'Ascend G330' ],
+        'HUAWEI G330-0100'                          => [ 'Huawei', 'Ascend G330' ],
+        'Huawei u8833'                              => [ 'Huawei', 'Ascend Y300' ],
+        'Huawei u8836d'                             => [ 'Huawei', 'Ascend G500' ],
+        'Huawei U8850'                              => [ 'Huawei', 'Vision' ],
+        'Huawei U8860'                              => [ 'Huawei', 'Honor' ],
+        'Huawei Honor'                              => [ 'Huawei', 'Honor' ],
+        'Huawei U8950!'                             => [ 'Huawei', 'Ascend G600' ],
+        'HUAWEI U8951!'                             => [ 'Huawei', 'Ascend G510' ],
+        'Huawei ?U9000!'                            => [ 'Huawei', 'Ascend X' ],
+        'HUAWEI HONOR 2'                            => [ 'Huawei', 'Honor 2' ],
+        'Huawei U9508'                              => [ 'Huawei', 'Honor 2' ],
+        'Huawei ?U9508!'                            => [ 'Huawei', 'Honor 2 Quad-core' ],
+        'Ascend D1'                                 => [ 'Huawei', 'Ascend D1' ],
+        'Huawei U9510!'                             => [ 'Huawei', 'Ascend D quad' ],
+        'Huawei EDGE'                               => [ 'Huawei', 'Ascend P6' ],
+        'Huawei Ascend P6'                          => [ 'Huawei', 'Ascend P6' ],
+        'Ascend P7'                                 => [ 'Huawei', 'Ascend P7' ],
+        'Huawei Ideos X1'                           => [ 'Huawei', 'IDEOS X1' ],
+        'Huawei IDEOS U8500'                        => [ 'Huawei', 'IDEOS X2' ],
+        'Huawei IDEOS U8650'                        => [ 'Huawei', 'Sonic' ],
+        'Huawei IDEOS X3'                           => [ 'Huawei', 'IDEOS X3' ],
+        'Huawei Ideos X5!'                          => [ 'Huawei', 'IDEOS X5' ],
+        'Huawei X6'                                 => [ 'Huawei', 'IDEOS X6' ],
+        'Huawei IDEOS Y 200'                        => [ 'Huawei', 'IDEOS Y200' ],
+        'Huawei SONIC'                              => [ 'Huawei', 'Sonic' ],
+        'Huawei 8100-9'                             => [ 'Huawei', 'U8100' ],
+        'Huawei UM840'                              => [ 'Huawei', 'UM840' ],
+        'Huawei Ascend G 300'                       => [ 'Huawei', 'Ascend G300' ],
+        'Huawei G300'                               => [ 'Huawei', 'Ascend G300' ],
+        'Ascend G300'                               => [ 'Huawei', 'Ascend G300' ],
+        'Ascend G301'                               => [ 'Huawei', 'Ascend G301' ],
+        'Ascend G330'                               => [ 'Huawei', 'Ascend G330' ],
+        'Huawei Ascend G 330'                       => [ 'Huawei', 'Ascend G330' ],
+        'Huawei G350!'                              => [ 'Huawei', 'Ascend G350' ],
+        'Huawei G506!'                              => [ 'Huawei', 'Ascend G506' ],
+        'Huawei ?G510!'                             => [ 'Huawei', 'Ascend G510' ],
+        'Ascend G510c'                              => [ 'Huawei', 'Ascend G510c' ],
+        'Huawei Ascend G510'                        => [ 'Huawei', 'Ascend G510' ],
+        'Ascend G510'                               => [ 'Huawei', 'Ascend G510' ],
+        'Huawei G520!'                              => [ 'Huawei', 'Ascend G520' ],
+        'HUAWEI G521!'                              => [ 'Huawei', 'Ascend G521' ],
+        'Huawei G525!'                              => [ 'Huawei', 'Ascend G525' ],
+        'HUAWEI Ascend G525'                        => [ 'Huawei', 'Ascend G525' ],
+        'Huawei G535!'                              => [ 'Huawei', 'Ascend G535' ],
+        'Ascend G600'                               => [ 'Huawei', 'Ascend G600' ],
+        'Huawei G606!'                              => [ 'Huawei', 'Ascend G606' ],
+        'Huawei G610!'                              => [ 'Huawei', 'Ascend G610' ],
+        'Huawei G615!'                              => [ 'Huawei', 'Ascend G615' ],
+        'HUAWEI G616!'                              => [ 'Huawei', 'Ascend G616' ],
+        'Huawei G620!'                              => [ 'Huawei', 'Ascend G620' ],
+        'Huawei G621!'                              => [ 'Huawei', 'Ascend G621' ],
+        'Huawei G628!'                              => [ 'Huawei', 'Ascend G628' ],
+        'Huawei G629!'                              => [ 'Huawei', 'Ascend G629' ],
+        'Huawei G630!'                              => [ 'Huawei', 'Ascend G630' ],
+        'HUAWEI G660!'                              => [ 'Huawei', 'Ascend G660' ],
+        'Huawei G700!'                              => [ 'Huawei', 'Ascend G700' ],
+        'Huawei G701!'                              => [ 'Huawei', 'Ascend G701' ],
+        'Huawei ?G716!'                             => [ 'Huawei', 'Ascend G716' ],
+        'Huawei G718!'                              => [ 'Huawei', 'Ascend G718' ],
+        'Huawei G730!'                              => [ 'Huawei', 'Ascend G730' ],
+        'Huawei G750!'                              => [ 'Huawei', 'Ascend G750' ],
+        'Huawei G760-(L01|L071)!'                   => [ 'Huawei', 'Ascend G760' ],
+        'Huawei G760S-(UL00)!'                      => [ 'Huawei', 'Ascend G760' ],
+        'Huawei Ascend Y 210'                       => [ 'Huawei', 'Ascend Y210' ],
+        'Huawei Ascend Y 210D'                      => [ 'Huawei', 'Ascend Y210' ],
+        'Huawei Asend Y 210D'                       => [ 'Huawei', 'Ascend Y210' ],
+        'Huawei Y210!'                              => [ 'Huawei', 'Ascend Y210' ],
+        'Ascend Y201PRO'                            => [ 'Huawei', 'Ascend Y210 Pro' ],
+        'Huawei Y ?220T!'                           => [ 'Huawei', 'Ascend Y220' ],
+        'Huawei Y-220T'                             => [ 'Huawei', 'Ascend Y220' ],
+        'Huawei Y220-(T10)!'                        => [ 'Huawei', 'Ascend Y220' ],
+        'HUAWEI Y221-(U03|U12|U22|U33|U43|U53)!'    => [ 'Huawei', 'Ascend Y221' ],
+        'Huawei ?Y300!'                             => [ 'Huawei', 'Ascend Y300' ],
+        'Ascend Y300'                               => [ 'Huawei', 'Ascend Y300' ],
+        'Huawei Ascend Y300'                        => [ 'Huawei', 'Ascend Y300' ],
+        'Huawei Y301!'                              => [ 'Huawei', 'Ascend Y301' ],
+        'Huawei Y310!'                              => [ 'Huawei', 'Ascend Y310' ],
+        'Huawei Y320!'                              => [ 'Huawei', 'Ascend Y320' ],
+        'Huawei Y321!'                              => [ 'Huawei', 'Ascend Y321' ],
+        'Huawei Y325!'                              => [ 'Huawei', 'Ascend Y325' ],
+        'Huawei Y330!'                              => [ 'Huawei', 'Ascend Y330' ],
+        'HUAWEI Y336!'                              => [ 'Huawei', 'Ascend Y336' ],
+        'HUAWEI Y360!'                              => [ 'Huawei', 'Ascend Y360' ],
+        'Huawei Y500!'                              => [ 'Huawei', 'Ascend Y500' ],
+        'Huawei Y511!'                              => [ 'Huawei', 'Ascend Y511' ],
+        'Huawei Y516!'                              => [ 'Huawei', 'Ascend Y516' ],
+        'Huawei Y518!'                              => [ 'Huawei', 'Ascend Y518' ],
+        'HUAWEI Y520!'                              => [ 'Huawei', 'Ascend Y520' ],
+        'Huawei Y523!'                              => [ 'Huawei', 'Ascend Y523' ],
+        'Huawei Y530!'                              => [ 'Huawei', 'Ascend Y530' ],
+        'HUAWEI Y535!'                              => [ 'Huawei', 'Ascend Y535' ],
+        'HUAWEI Y536A1'                             => [ 'AT&T', 'Tribute' ],
+        'HUAWEI Y536!'                              => [ 'Huawei', 'Ascend Y536' ],
+        'HUAWEI Y540-(U01)!'                        => [ 'Huawei', 'Ascend Y540' ],
+        'HUAWEI Y541!'                              => [ 'Huawei', 'Ascend Y541' ],
+        'HUAWEI Y550'                               => [ 'Huawei', 'Ascend Y550' ],
+        'HUAWEI Y550-(L01|L02|L03)!'                => [ 'Huawei', 'Ascend Y550' ],
+        'HUAWEI Y552-(L02)!'                        => [ 'Huawei', 'Ascend Y552' ],
+        'HUAWEI Y560-(CL00|L01|L02|L03|L23|U02|U03|U12|U23)!' => [ 'Huawei', 'Ascend Y560' ],
+        'Huawei Y600-(U00|U20|U40|U151|U351)!'      => [ 'Huawei', 'Ascend Y600' ],
+        'HUAWEI Y600D-C00'                          => [ 'Huawei', 'Ascend Y600D' ],
+        'HUAWEI Y604-U155'                          => [ 'Huawei', 'Ascend Y604' ],
+        'HUAWEI Y610-U00'                           => [ 'Huawei', 'Ascend Y610' ],
+        'HUAWEI Y618-T00'                           => [ 'Huawei', 'Ascend Y618' ],
+        'HUAWEI Y625-(U13|U21|U32|U43|U51)!'        => [ 'Huawei', 'Ascend Y625' ],
+        'HUAWEI Y635!'                              => [ 'Huawei', 'Ascend Y635' ],
+        'Huawei Ascend'                             => [ 'Huawei', 'Ascend' ],
+        'Huawei Ascend X'                           => [ 'Huawei', 'Ascend X' ],
+    ],
+
+    'M650'                                      => [ 'Huawei', 'Express' ],
+    'M660'                                      => [ 'Huawei', 'Ascend Q' ],
+    'unknown M200-L09'                          => [ 'Huawei', 'Mate 8' ],
+    'Honor3c2G-T'                               => [ 'Huawei', 'Honor 3C' ],
+    'HUAWEI Honor 3c w'                         => [ 'Huawei', 'Honor 3C' ],
+    'Orange HUAWEI GRA-L09'                     => [ 'Huawei', 'Ascend P8' ],
+    'FUSIONideos'                               => [ 'Huawei', 'IDEOS' ],
+    'Gnappo Ideos'                              => [ 'Huawei', 'IDEOS' ],
+    'hwu8812D'                                  => [ 'Huawei', 'Ascend G302D' ],
+
+    'IDEOS!!' => [
+        'Ideos'                                     => [ 'Huawei', 'IDEOS' ],
+        'IDEOS X1'                                  => [ 'Huawei', 'IDEOS X1' ],
+        'IDEOS X5'                                  => [ 'Huawei', 'IDEOS X5' ],
+        'IDEOS X5 PRO'                              => [ 'Huawei', 'IDEOS X5 Pro' ],
+        'IDEOS S7!'                                 => [ 'Huawei', 'IDEOS S7', DeviceType::TABLET ],
+    ],
+
+    'Huawei S7'                                 => [ 'Huawei', 'IDEOS S7', DeviceType::TABLET ],
+    'SONIC'                                     => [ 'Huawei', 'Sonic' ],
+    'Lucky Ultra Sonic U8650'                   => [ 'Huawei', 'Sonic' ],
+    'MTC Android'                               => [ 'Huawei', 'U8110' ],
+
+    '[0-9AS][0-9]{2,2}HW!!' => [
+        'A01HW'                                     => [ 'Huawei', 'A01HW', DeviceType::TABLET, 'carrier' => 'EMOBILE' ],
+        'S31HW'                                     => [ 'Huawei', 'Pocket WiFi S S31HW', 'carrier' => 'EMOBILE' ],
+        'S41HW'                                     => [ 'Huawei', 'Pocket WiFi S II S41HW', 'carrier' => 'EMOBILE' ],
+        'S42HW'                                     => [ 'Huawei', 'smart bar S42HW', 'carrier' => 'EMOBILE' ],
+        '007HW'                                     => [ 'Huawei', 'Vision 007HW', 'carrier' => 'Softbank' ],
+        '201HW'                                     => [ 'Huawei', 'STREAM 201HW', 'carrier' => 'Softbank' ],
+        '204HW'                                     => [ 'Huawei', '204HW', 'carrier' => 'Softbank' ],
+        '301HW'                                     => [ 'Huawei', 'Pocket WiFi 301HW', 'carrier' => 'Softbank' ],
+        '302HW'                                     => [ 'Huawei', 'STREAM S 302HW', 'carrier' => 'Y! Mobile' ],
+        '402HW'                                     => [ 'Huawei', 'MediaPad 10 Link+ 402HW', DeviceType::TABLET, 'carrier' => 'Softbank' ],
+        '403HW'                                     => [ 'Huawei', 'MediaPad M1 8.0 403HW', DeviceType::TABLET, 'carrier' => 'Y! Mobile' ],
+        '503HW'                                     => [ 'Huawei', 'LUMIERE 503HW', 'carrier' => 'Y! Mobile' ],
+    ],
+
+    'CM980'                                     => [ 'Huawei', 'Evolution II' ],
+    'CM990'                                     => [ 'Huawei', 'Evolución 3' ],
+    'UM840'                                     => [ 'Huawei', 'Evolution' ],
+    'M310'                                      => [ 'Huawei', 'MediaQ M310', DeviceType::TELEVISION ],
+    'M860'                                      => [ 'Huawei', 'Ascend' ],
+    'M865'                                      => [ 'Huawei', 'Ascend II' ],
+    'M886'                                      => [ 'Huawei', 'Glory' ],
+    'S8600'                                     => [ 'Huawei', 'S8600' ],
+
+    'C8[0-9]{3,3}!!' => [
+        'C8150'                                     => [ 'Huawei', 'IDEOS' ],
+        'C8500!'                                    => [ 'Huawei', 'C8500' ],
+        'C8600'                                     => [ 'Huawei', 'C8600' ],
+        'C8650!'                                    => [ 'Huawei', 'C8650' ],
+        'C8800'                                     => [ 'Huawei', 'C8800' ],
+        'C8810'                                     => [ 'Huawei', 'Ascend G300C' ],
+        'C8812!'                                    => [ 'Huawei', 'Ascend C8812' ],
+        'C8815!'                                    => [ 'Huawei', 'Ascend C8815' ],
+        'C8860!'                                    => [ 'Huawei', 'Honor' ],
+    ],
+
+    'T8[0-9]{3,3}!!' => [
+        'T8620'                                     => [ 'Huawei', 'Ascend Y200T' ],
+        'T8808!'                                    => [ 'Huawei', 'Ascend G306T' ],
+        'T8830!'                                    => [ 'Huawei', 'Ascend G309T' ],
+    ],
+
+    'T9[0-9]{3,3}!!' => [
+        'T9200'                                     => [ 'Huawei', 'Ascend P1' ],
+        'T9510E'                                    => [ 'Huawei', 'Ascend D1 Quad XL' ],
+    ],
+
+    'U8[0-9]{3,3}!!' => [
+        'U8100'                                     => [ 'Huawei', 'U8100' ],
+        'U8110'                                     => [ 'Huawei', 'U8110' ],
+        'U8120'                                     => [ 'Huawei', 'U8120' ],
+        'U8180'                                     => [ 'Huawei', 'IDEOS X1' ],
+        'U8300'                                     => [ 'Huawei', 'U8300' ],
+        'U8350'                                     => [ 'Huawei', 'Boulder' ],
+        'U8150'                                     => [ 'Huawei', 'IDEOS' ],
+        'U8160'                                     => [ 'Huawei', 'U8160' ],
+        'U8180'                                     => [ 'Huawei', 'IDEOS X1' ],
+        'U8185'                                     => [ 'Huawei', 'Ascend Y100' ],
+        'U8186'                                     => [ 'Huawei', 'Ascend Y101' ],
+        'U8230'                                     => [ 'Huawei', 'U8230' ],
+        'U8500'                                     => [ 'Huawei', 'IDEOS X2' ],
+        'U8500 HiQQ'                                => [ 'Huawei', 'U8500 HiQQ Edition' ],
+        'U8510!'                                    => [ 'Huawei', 'IDEOS X3' ],
+        'U8520'                                     => [ 'Huawei', 'U8520 Duplex' ],
+        'U8600'                                     => [ 'Huawei', 'U8600' ],
+        'U8650!'                                    => [ 'Huawei', 'Sonic' ],
+        'U8651!'                                    => [ 'Huawei', 'Talon U8651' ],
+        'U8652!'                                    => [ 'Huawei', 'Fusion U8652' ],
+        'U8655!'                                    => [ 'Huawei', 'Ascend Y200' ],
+        'U8660'                                     => [ 'Huawei', 'Sonic' ],
+        'U8665'                                     => [ 'Huawei', 'Fusion 2' ],
+        'U8666!'                                    => [ 'Huawei', 'Ascend Y201' ],
+        'U8667'                                     => [ 'Huawei', 'U8667' ],
+        'U8800 ?Pro!'                               => [ 'Huawei', 'IDEOS X5 Pro' ],
+        'U8800!'                                    => [ 'Huawei', 'IDEOS X5' ],
+        'U8812'                                     => [ 'Huawei', 'Ascend G302D' ],
+        'U8812D'                                    => [ 'Huawei', 'Ascend G302D' ],
+        'U8815N'                                    => [ 'Huawei', 'Ascend G300' ],
+        'U8815-51'                                  => [ 'Huawei', 'Ascend G300' ],
+        'U8815'                                     => [ 'Huawei', 'Ascend G300' ],
+        'U8816'                                     => [ 'Huawei', 'Ascend G301' ],
+        'U8818'                                     => [ 'Huawei', 'Ascend G300' ],
+        'U8820'                                     => [ 'Huawei', 'Titan' ],
+        'U8832D'                                    => [ 'Huawei', 'Ascend G500' ],
+        'U8836D'                                    => [ 'Huawei', 'Ascend G500' ],
+        'U8850'                                     => [ 'Huawei', 'Vision' ],
+        'U8860!'                                    => [ 'Huawei', 'Honor' ],
+    ],
+
+    'U9[0-9]{3,3}!!' => [
+        'U9000'                                     => [ 'Huawei', 'Ascend X' ],
+        'U9200!'                                    => [ 'Huawei', 'Ascend P1' ],
+        'U9202!'                                    => [ 'Huawei', 'Ascend P1' ],
+        'U9500'                                     => [ 'Huawei', 'Ascend D1' ],
+        'U9500E'                                    => [ 'Huawei', 'Ascend D1 XL' ],
+        'U9501L'                                    => [ 'Huawei', 'Ascend D LTE' ],
+        'U9508'                                     => [ 'Huawei', 'Honor 2' ],
+        'U9510!'                                    => [ 'Huawei', 'Ascend D quad' ],
+    ],
+
+    'Comet'                                     => [ 'Huawei', 'Comet' ],
+    'Joy'                                       => [ 'Huawei', 'Joy' ],
+    'DroniX-0.5'                                => [ 'Huawei', 'U8180' ],
+    'TSP21'                                     => [ 'Huawei', 'U8110' ],
+
+    'GS02'                                      => [ 'Huawei', 'GS02', 'carrier' => 'EMOBILE' ],
+    'GS03'                                      => [ 'Huawei', 'GS03', 'carrier' => 'EMOBILE' ],
+    'GL07S'                                     => [ 'Huawei', 'STREAM X GL07S', 'carrier' => 'EMOBILE' ],
+    'HW-01E'                                    => [ 'Huawei', 'Ascend HW-01E', 'carrier' => 'DoCoMo' ],
+    'HW-03E'                                    => [ 'Huawei', 'Ascend D2 HW-03E', 'carrier' => 'DoCoMo' ],
+    'H866C'                                     => [ 'Huawei', 'Ascend Y H866C' ],
+    'H882L'                                     => [ 'Huawei', 'Ascend Y301-A' ],
+
+    'USCCADR[0-9]{4,4}!!' => [
+        'USCCADR3305'                               => [ 'Huawei', 'Ascend II' ],
+        'USCCADR3310'                               => [ 'Huawei', 'Ascend II' ],
+    ],
+
+    'HYUNDAI!!' => [
+        'HYUNDAI H6'                                => [ 'Hyundai', 'Storm H6' ],
+        'HYUNDAI H6 B'                              => [ 'Hyundai', 'Storm H6' ],
+        'HYUNDAI H8'                                => [ 'Hyundai', 'H8' ],
+        'HYUNDAI H8Q'                               => [ 'Hyundai', 'H8Q' ],
+        'HYUNDAI H9'                                => [ 'Hyundai', 'H9' ],
+        'HYUNDAI H10'                               => [ 'Hyundai', 'H10' ],
+        'HYUNDAI H11'                               => [ 'Hyundai', 'H11' ],
+        'Hyundai HT-10G'                            => [ 'Hyundai', 'HT-10G', DeviceType::TABLET ],
+        'HYUNDAI Q5'                                => [ 'Hyundai', 'Q5' ],
+        'HYUNDAI Q5X'                               => [ 'Hyundai', 'Q5X' ],
+        'HYUNDAI T7'                                => [ 'Hyundai', 'T7', DeviceType::TABLET ],
+        'HYUNDAI T7S'                               => [ 'Hyundai', 'T7s', DeviceType::TABLET ],
+        'HYUNDAI T10'                               => [ 'Hyundai', 'T10', DeviceType::TABLET ],
+        'HYUNDAI T31'                               => [ 'Hyundai', 'T31', DeviceType::TABLET ],
+        'HYUNDAI X7'                                => [ 'Hyundai', 'X7' ],
+        'HYUNDAI X900'                              => [ 'Hyundai', 'X900', DeviceType::TABLET ],
+    ],
+
+    'Ultra Air'                                 => [ 'Hyundai', 'Ultra Air' ],
+    'Ultra Charm'                               => [ 'Hyundai', 'Ultra Charm' ],
+    'Ultra Energy'                              => [ 'Hyundai', 'Ultra Energy' ],
+    'Ultra Energy Lite'                         => [ 'Hyundai', 'Ultra Energy Lite' ],
+    'Ultra Energy Plus'                         => [ 'Hyundai', 'Ultra Energy Plus' ],
+    'Ultra Latitude'                            => [ 'Hyundai', 'Ultra Latitude' ],
+    'Ultra Style'                               => [ 'Hyundai', 'Ultra Style' ],
+    'Ultra Wave'                                => [ 'Hyundai', 'Ultra Wave' ],
+    'A7 HD'                                     => [ 'Hyundai', 'A7 HD', DeviceType::TABLET ],
+    'MW1031'                                    => [ 'Hyundai', 'MW1031', DeviceType::TABLET ],
+    'Elektra L'                                 => [ 'i-Joy', 'Elektra L' ],
+    'Elektra XL'                                => [ 'i-Joy', 'Elektra XL' ],
+    'i-Joy i-Call'                              => [ 'i-Joy', 'i-Call' ],
+    'i-Call 300'                                => [ 'i-Joy', 'i-Call 300' ],
+    'i-Call 300v2'                              => [ 'i-Joy', 'i-Call 300' ],
+    'i-Call 504'                                => [ 'i-Joy', 'i-Call 504' ],
+    'DEOX'                                      => [ 'i-Joy', 'Deox', DeviceType::TABLET ],
+    'Neon7'                                     => [ 'i-Joy', 'Neon7', DeviceType::TABLET ],
+    'Neon9'                                     => [ 'i-Joy', 'Neon9', DeviceType::TABLET ],
+    'Planet II v2'                              => [ 'i-Joy', 'Planet II', DeviceType::TABLET ],
+    'Sygnus'                                    => [ 'i-Joy', 'Sygnus', DeviceType::TABLET ],
+
+    '(NMP|MBR|XDK|XDS|XMP)\-!!' => [
+        'NMP-302w'                                  => [ 'IAdea', 'MBR-1100', DeviceType::SIGNAGE ],
+        'MBR-1100'                                  => [ 'IAdea', 'MBR-1100', DeviceType::SIGNAGE ],
+        'XDK-1160'                                  => [ 'IAdea', 'XDK-1160', DeviceType::SIGNAGE ],
+        'XDK-1560'                                  => [ 'IAdea', 'XDK-1560', DeviceType::SIGNAGE ],
+        'XDS-0548'                                  => [ 'IAdea', 'XDS-0548', DeviceType::SIGNAGE ],
+        'XDS-1078'                                  => [ 'IAdea', 'XDS-1078', DeviceType::SIGNAGE ],
+        'XDS-2170'                                  => [ 'IAdea', 'XDS-2170', DeviceType::SIGNAGE ],
+        'XDS-2370'                                  => [ 'IAdea', 'XDS-2370', DeviceType::SIGNAGE ],
+        'XMP-6200'                                  => [ 'IAdea', 'XMP-6200', DeviceType::SIGNAGE ],
+        'XMP-6250'                                  => [ 'IAdea', 'XMP-6250', DeviceType::SIGNAGE ],
+        'XMP-6400'                                  => [ 'IAdea', 'XMP-6400', DeviceType::SIGNAGE ],
+        'XMP-7300'                                  => [ 'IAdea', 'XMP-7300', DeviceType::SIGNAGE ],
+    ],
+
+    '(iBall )?Andi!!' => [
+        'Andi3n'                                    => [ 'iBall', 'Andi 3n' ],
+        'iBall Andi3e'                              => [ 'iBall', 'Andi 3e' ],
+        'iBall Andi3.5'                             => [ 'iBall', 'Andi 3.5' ],
+        'Andi 3.5i'                                 => [ 'iBall', 'Andi 3.5i' ],
+        'Andi3.5r'                                  => [ 'iBall', 'Andi 3.5r' ],
+        'iBall Andi3.5 Classique'                   => [ 'iBall', 'Andi 3.5 Classique' ],
+        'Andi3.5F  Grabit'                          => [ 'iBall', 'Andi 3.5F Grabit' ],
+        'Andi3.5KKe'                                => [ 'iBall', 'Andi 3.5KKe' ],
+        'Andi 3.5KKe+'                              => [ 'iBall', 'Andi 3.5KKe Plus' ],
+        'iBall Andi 3.5KKe Genius'                  => [ 'iBall', 'Andi 3.5KKe Genius' ],
+        'Andi3.5KKe Glam'                           => [ 'iBall', 'Andi 3.5KKe Glam' ],
+        'Andi3.5KKe Glory'                          => [ 'iBall', 'Andi 3.5KKe Glory' ],
+        'Andi3.5KKe Super'                          => [ 'iBall', 'Andi 3.5KKe Super' ],
+        'iBall Andi 3.5KKe Winner'                  => [ 'iBall', 'Andi 3.5KKe Winner' ],
+        'Andi  3.5KKe  Winner+'                     => [ 'iBall', 'Andi 3.5KKe Winner Plus' ],
+        'Andi3.5V Genius2'                          => [ 'iBall', 'Andi 3.5V Genius 2' ],
+        'Andi4  Arc'                                => [ 'iBall', 'Andi 4 Arc' ],
+        'Andi 4 IPS GEM(1GB)'                       => [ 'iBall', 'Andi 4 Gem' ],
+        'iBall Andi 4 IPS TIGER 1GB'                => [ 'iBall', 'Andi 4 Tiger' ],
+        'Andi 4 IPS Tiger'                          => [ 'iBall', 'Andi 4 Tiger' ],
+        'Andi4a Projector'                          => [ 'iBall', 'Andi 4A Projector' ],
+        'Andi4a Radium'                             => [ 'iBall', 'Andi 4A Radium' ],
+        'iBall Andi4-B2'                            => [ 'iBall', 'Andi 4B2' ],
+        'Andi4-B2 3G'                               => [ 'iBall', 'Andi 4B2' ],
+        'Andi4 B20'                                 => [ 'iBall', 'Andi 4B20' ],
+        'Andi4d'                                    => [ 'iBall', 'Andi 4D' ],
+        'iball Andi4di'                             => [ 'iBall', 'Andi 4Di' ],
+        'iBall Andi 4di+'                           => [ 'iBall', 'Andi 4Di' ],
+        'Andi 4F ARC3'                              => [ 'iBall', 'Andi 4F Arc3' ],
+        'Andi4F Waves'                              => [ 'iBall', 'Andi 4F Waves' ],
+        'Andi4G ARC2'                               => [ 'iBall', 'Andi 4G Arc2' ],
+        'Andi4H Tiger+'                             => [ 'iBall', 'Andi 4H Tiger Plus' ],
+        'Andi 4P Class-X'                           => [ 'iBall', 'Andi 4P Class-X' ],
+        'iBall Andi4P IPS GEM'                      => [ 'iBall', 'Andi 4P Gem' ],
+        'iBall Andi4P IPS Velvet'                   => [ 'iBall', 'Andi 4P Velvet' ],
+        'Andi4U Frisbee'                            => [ 'iBall', 'Andi 4U Frisbee' ],
+        'Andi4U Frisbee(8GB)'                       => [ 'iBall', 'Andi 4U Frisbee' ],
+        'Andi4v'                                    => [ 'iBall', 'Andi 4V' ],
+        'Andi 4.3a'                                 => [ 'iBall', 'Andi 4.3A' ],
+        'iBall Andi4.3J'                            => [ 'iBall', 'Andi 4.3J' ],
+        'iBall Andi4.3J+'                           => [ 'iBall', 'Andi 4.3J' ],
+        'Andi 4.5 O\'Buddy'                         => [ 'iBall', 'Andi 4.5 O\'Buddy' ],
+        'iBall Andi4.5 Ripple 3G'                   => [ 'iBall', 'Andi 4.5 Ripple' ],
+        'iBall Andi4.5 Ripple'                      => [ 'iBall', 'Andi 4.5 Ripple' ],
+        'Andi4.5 Ripple 3G 1GB IPS'                 => [ 'iBall', 'Andi 4.5 Ripple' ],
+        'Andi 4.5C Magnifico'                       => [ 'iBall', 'Andi 4.5C Magnifico' ],
+        'Andi 4.5C Magnifico(1+8 GB)'               => [ 'iBall', 'Andi 4.5C Magnifico' ],
+        'iBall Andi4.5d quadro'                     => [ 'iBall', 'Andi 4.5D Quadro' ],
+        'iBALL Andi4.5h'                            => [ 'iBall', 'Andi 4.5H' ],
+        'Andi4.5h'                                  => [ 'iBall', 'Andi 4.5H' ],
+        'Andi4.5K6'                                 => [ 'iBall', 'Andi 4.5K6' ],
+        'Andi4.5K6+'                                => [ 'iBall', 'Andi 4.5K6 Plus' ],
+        'Andi4.5 K6+'                               => [ 'iBall', 'Andi 4.5K6 Plus' ],
+        'Andi4.5M Enigma'                           => [ 'iBall', 'Andi 4.5M Enigma' ],
+        'Andi4.5M Enigma+'                          => [ 'iBall', 'Andi 4.5M Enigma Plus' ],
+        'Andi 4.5P Glitter'                         => [ 'iBall', 'Andi 4.5P Glitter' ],
+        'Andi4.5P IPS Glitter'                      => [ 'iBall', 'Andi 4.5P Glitter' ],
+        'iBall Andi4.5q'                            => [ 'iBall', 'Andi 4.5Q' ],
+        'Andi4.5V Baby Panther'                     => [ 'iBall', 'Andi 4.5V Baby Panther' ],
+        'Andi 4.5z'                                 => [ 'iBall', 'Andi 4.5Z' ],
+        'iBall Cobalt Oomph 4.7D'                   => [ 'iBall', 'Andi 4.7D Cobalt Oomph' ],
+        'Andi4.7G COBALT'                           => [ 'iBall', 'Andi 4.7G Cobalt' ],
+        'Andi5 Stallion'                            => [ 'iBall', 'Andi 5 Stallion' ],
+        'Andi5 Stallion+'                           => [ 'iBall', 'Andi 5 Stallion Plus' ],
+        'Andi 5F Infinito'                          => [ 'iBall', 'Andi 5F Infinito' ],
+        'Andi 5G Blink 4G'                          => [ 'iBall', 'Andi 5G Blink' ],
+        'Andi5h quadro'                             => [ 'iBall', 'Andi 5H Quadro' ],
+        'Andi 5K infinito2'                         => [ 'iBall', 'Andi 5K Infinito 2' ],
+        'Andi5K Panther'                            => [ 'iBall', 'Andi 5K Panther' ],
+        'Andi5K Sparkle'                            => [ 'iBall', 'Andi 5K Sparkle' ],
+        'Andi5K Sparkle(1GB)'                       => [ 'iBall', 'Andi 5K Sparkle' ],
+        'iBall Andi5L'                              => [ 'iBall', 'Andi 5L' ],
+        'Andi 5L Rider'                             => [ 'iBall', 'Andi 5L Rider' ],
+        'Andi5Li'                                   => [ 'iBall', 'Andi 5Li' ],
+        'Andi5M Xotic 2GB'                          => [ 'iBall', 'Andi 5M Xotic' ],
+        'Andi5Q Cobalt Solus'                       => [ 'iBall', 'Andi 5Q Cobalt Solus' ],
+        'Andi 5Q Gold 4G'                           => [ 'iBall', 'Andi 5Q Gold' ],
+        'Andi 5S Cobalt3'                           => [ 'iBall', 'Andi 5S Cobalt 3' ],
+        'iBall Andi5T Cobalt2'                      => [ 'iBall', 'Andi 5T Cobalt 2' ],
+        'iBall Andi 5T Cobalt2'                     => [ 'iBall', 'Andi 5T Cobalt 2' ],
+        'Andi5U_Platino'                            => [ 'iBall', 'Andi 5U Platino' ],
+        'Andi5U Platino(1+8GB)'                     => [ 'iBall', 'Andi 5U Platino' ],
+        'iBall Andi5-E7'                            => [ 'iBall', 'Andi 5-E7' ],
+        'iBall Andi5-M8'                            => [ 'iBall', 'Andi 5-M8' ],
+        'Andi 5.5H Weber'                           => [ 'iBall', 'Andi 5.5H Weber' ],
+        'Andi 5.5H Weber 4G'                        => [ 'iBall', 'Andi 5.5H Weber' ],
+        'Andi5.5 N2'                                => [ 'iBall', 'Andi 5.5 N2' ],
+        'Andi107'                                   => [ 'iBall', 'Andi 107' ],
+        'Andi Avonte5'                              => [ 'iBall', 'Andi Avonte 5' ],
+        'Andi Hd6'                                  => [ 'iBall', 'Andi HD6' ],
+        'Andi Sprinter 4G'                          => [ 'iBall', 'Andi Sprinter 4G' ],
+        'Andi Uddaan'                               => [ 'iBall', 'Andi Uddaan' ],
+        'Andi Uddaan (1GB )'                        => [ 'iBall', 'Andi Uddaan' ],
+        'Andi Uddaan Quad core'                     => [ 'iBall', 'Andi Uddaan' ],
+        'Andi Mini Uddaan'                          => [ 'iBall', 'Andi Uddaan Mini' ],
+    ],
+
+    'iBall!!' => [
+        'iBall Slide Brillante'                     => [ 'iBall', 'Slide Brillante', DeviceType::TABLET ],
+        'iBall Slide i5715'                         => [ 'iBall', 'Slide i5715', DeviceType::TABLET ],
+        'iBall i6012'                               => [ 'iBall', 'Slide i6012', DeviceType::TABLET ],
+        'iBall Slide i6030'                         => [ 'iBall', 'Slide i6030', DeviceType::TABLET ],
+        'iBall Slide 6309i'                         => [ 'iBall', 'Slide i6309', DeviceType::TABLET ],
+        'iBall Slide 6318i'                         => [ 'iBall', 'Slide i6318', DeviceType::TABLET ],
+        'iBall Slide i6516'                         => [ 'iBall', 'Slide i6516', DeviceType::TABLET ],
+        'iBall Slide i7011'                         => [ 'iBall', 'Slide i7011', DeviceType::TABLET ],
+        'iBall Slide i7119'                         => [ 'iBall', 'Slide i7119', DeviceType::TABLET ],
+        'iBall Slide i9702'                         => [ 'iBall', 'Slide i9702', DeviceType::TABLET ],
+        'iBall Slide 3G7271'                        => [ 'iBall', 'Slide 3G 7271', DeviceType::TABLET ],
+        'iBall Slide 3G 7307'                       => [ 'iBall', 'Slide 3G 7307', DeviceType::TABLET ],
+        'IBall 3G 7316'                             => [ 'iBall', 'Slide 3G 7316', DeviceType::TABLET ],
+        'iBall Slide 3G 7316'                       => [ 'iBall', 'Slide 3G 7316', DeviceType::TABLET ],
+        'iBall Slide 3G 7334'                       => [ 'iBall', 'Slide 3G 7334', DeviceType::TABLET ],
+        'iBall Slide 3G Q45i'                       => [ 'iBall', 'Slide 3G Q45i', DeviceType::TABLET ],
+        'iBall Slide 3G Q1035'                      => [ 'iBall', 'Slide 3G Q1035', DeviceType::TABLET ],
+    ],
+
+    '3G7334i'                                   => [ 'iBall', 'Slide 3G 7334', DeviceType::TABLET ],
+
+    '(Aura|iberry|AUXUS)!!' => [
+        'Aura A1'                                   => [ 'iBerry', 'Auxus Aura A1', DeviceType::TABLET ],
+        'AUXUS AX01'                                => [ 'iBerry', 'Auxus AX01', DeviceType::TABLET ],
+        'iberry AUXUS AX02'                         => [ 'iBerry', 'Auxus AX02', DeviceType::TABLET ],
+        'AUXUS CoreX2 3G'                           => [ 'iBerry', 'Auxus CoreX2', DeviceType::TABLET ],
+        'AUXUS CoreX4 3G'                           => [ 'iBerry', 'Auxus CoreX4', DeviceType::TABLET ],
+        'AUXUS Nuclea N1'                           => [ 'iBerry', 'Auxus Nuclea N1' ],
+        'AUXUS Nuclea N2'                           => [ 'iBerry', 'Auxus Nuclea N2' ],
+    ],
+
+    '(NetTab|NT-)!!' => [
+        'NetTab iconBIT'                            => [ 'IconBit', 'NetTab', DeviceType::TABLET ],
+        'NetTAB Matrix'                             => [ 'IconBit', 'NetTab Matrix', DeviceType::TABLET ],
+        'NT-0704M'                                  => [ 'IconBit', 'NetTab Matrix Ultra', DeviceType::TABLET ],
+        'NT-0705M'                                  => [ 'IconBit', 'NetTab Matrix Quad', DeviceType::TABLET ],
+        'NetTAB MATRIX HD'                          => [ 'IconBit', 'NetTab Matrix HD', DeviceType::TABLET ],
+        'NT-0708M'                                  => [ 'IconBit', 'NetTab Matrix HD', DeviceType::TABLET ],
+        'NT-0709M'                                  => [ 'IconBit', 'NetTab Matrix DX', DeviceType::TABLET ],
+        'NT-0711M'                                  => [ 'IconBit', 'NetTab Matrix DX', DeviceType::TABLET ],
+        'NetTAB Pocket'                             => [ 'IconBit', 'NetTab Pocket', DeviceType::TABLET ],
+        'NetTAB PRIDE'                              => [ 'IconBit', 'NetTab Pride', DeviceType::TABLET ],
+        'NetTAB RUNE'                               => [ 'IconBit', 'NetTab Rune', DeviceType::TABLET ],
+        'NT-0801C'                                  => [ 'IconBit', 'NetTab Skat RX', DeviceType::TABLET ],
+        'NT-0806C'                                  => [ 'IconBit', 'NetTab Skat LE', DeviceType::TABLET ],
+        'NetTAB SKY'                                => [ 'IconBit', 'NetTab Sky', DeviceType::TABLET ],
+        'NT-0701S'                                  => [ 'IconBit', 'NetTab Sky Net', DeviceType::TABLET ],
+        'NetTAB SKY II'                             => [ 'IconBit', 'NetTab Sky II', DeviceType::TABLET ],
+        'NetTAB Space 3G'                           => [ 'IconBit', 'NetTab Space', DeviceType::TABLET ],
+        'NetTAB SPACE II'                           => [ 'IconBit', 'NetTab Space II', DeviceType::TABLET ],
+        'NetTAB SPACE II Plus'                      => [ 'IconBit', 'NetTab Space II Plus', DeviceType::TABLET ],
+        'NetTAB SPACE III'                          => [ 'IconBit', 'NetTab Space III', DeviceType::TABLET ],
+        'NT-0901S'                                  => [ 'IconBit', 'NetTab Space Quad HD', DeviceType::TABLET ],
+        'NT-0902S'                                  => [ 'IconBit', 'NetTab Space Quad RX', DeviceType::TABLET ],
+        'NetTAB THOR'                               => [ 'IconBit', 'NetTab Thor', DeviceType::TABLET ],
+        'NetTAB THOR V4.10'                         => [ 'IconBit', 'NetTab Thor', DeviceType::TABLET ],
+        'NT-0907T'                                  => [ 'IconBit', 'NetTab Thor ZX', DeviceType::TABLET ],
+        'NT-0909T'                                  => [ 'IconBit', 'NetTab Thor IZ', DeviceType::TABLET ],
+        'NetTAB THOR mini'                          => [ 'IconBit', 'NetTab Thor Mini', DeviceType::TABLET ],
+        'NetTAB THOR-LE'                            => [ 'IconBit', 'NetTab Thor LE', DeviceType::TABLET ],
+        'NT-1001T'                                  => [ 'IconBit', 'NetTab Thor LE', DeviceType::TABLET ],
+        'NT-1002T'                                  => [ 'IconBit', 'NetTab Thor LE', DeviceType::TABLET ],
+        'NT-1004T'                                  => [ 'IconBit', 'NetTab Thor Quad FHD', DeviceType::TABLET ],
+        'NT-1005T'                                  => [ 'IconBit', 'NetTab Thor Quad', DeviceType::TABLET ],
+        'NT-1006T'                                  => [ 'IconBit', 'NetTab Thor Quad MX', DeviceType::TABLET ],
+        'NT-1008T'                                  => [ 'IconBit', 'NetTab Thor 3GTS', DeviceType::TABLET ],
+        'NT-1009T'                                  => [ 'IconBit', 'NetTab Thor Quad II', DeviceType::TABLET ],
+        'NT-1010T'                                  => [ 'IconBit', 'NetTab Thor LE', DeviceType::TABLET ],
+        'NT-1011T'                                  => [ 'IconBit', 'NetTab Thor LE', DeviceType::TABLET ],
+        'NT-1020T'                                  => [ 'IconBit', 'NetTab Thor LX', DeviceType::TABLET ],
+        'NT-1021T'                                  => [ 'IconBit', 'NetTab Thor LX', DeviceType::TABLET ],
+        'NT-1501C'                                  => [ 'IconBit', 'NetTab Callisto 100', DeviceType::WATCH ],
+        'NT-3506M'                                  => [ 'IconBit', 'NetTab Mercury Quad FHD' ],
+        'NT-3507M'                                  => [ 'IconBit', 'NetTab Mercury Quad' ],
+        'NT-3509M'                                  => [ 'IconBit', 'NetTab Mercury Q4' ],
+        'NT-3510M'                                  => [ 'IconBit', 'NetTab Mercury Q5' ],
+        'NT-3513M!'                                 => [ 'IconBit', 'NetTab Mercury LX' ],
+        'NT-3601P!'                                 => [ 'IconBit', 'NetTab Pocket' ],
+        'NT-3602M'                                  => [ 'IconBit', 'NetTab Mercury Q7' ],
+        'NT-3701S'                                  => [ 'IconBit', 'NetTab Sky 3G Duo', DeviceType::TABLET ],
+        'NT-3702M'                                  => [ 'IconBit', 'NetTab Matrix 3G Duo', DeviceType::TABLET ],
+        'NT-3702S'                                  => [ 'IconBit', 'NetTab Sky HD 3G', DeviceType::TABLET ],
+        'NT-3710S'                                  => [ 'IconBit', 'NetTab Sky 3G Plus', DeviceType::TABLET ],
+        'NT-3801P'                                  => [ 'IconBit', 'NetTab Parus 3G Duo', DeviceType::TABLET ],
+        'NT-3803C'                                  => [ 'IconBit', 'NetTab Skat 3G', DeviceType::TABLET ],
+        'NT-3805C'                                  => [ 'IconBit', 'NetTab Skat 3G Quad', DeviceType::TABLET ],
+        'NT-3902S'                                  => [ 'IconBit', 'NetTab Space 3G Duo', DeviceType::TABLET ],
+    ],
+
+    'IconBit NetTab Thor Mini'                  => [ 'IconBit', 'NetTab Thor Mini', DeviceType::TABLET ],
+    'D70W'                                      => [ 'Icoo', 'D70W', DeviceType::TABLET ],
+    'D80'                                       => [ 'Icoo', 'D80', DeviceType::TABLET ],
+    'AURUS III'                                 => [ 'Idea', 'Aurus III' ],
+
+    'CT720G'                                    => [ 'IdeaUSA', 'CT720G', DeviceType::TABLET ],
+    'CT720HD'                                   => [ 'IdeaUSA', 'CT720HD', DeviceType::TABLET ],
+    'CT920'                                     => [ 'IdeaUSA', 'CT920', DeviceType::TABLET ],
+    'CT1006'                                    => [ 'IdeaUSA', 'CT1006', DeviceType::TABLET ],
+
+    'INFOBAR!!' => [
+        'INFOBAR A01'                               => [ 'iida', 'INFOBAR A01', 'carrier' => 'au' ],               // by Sharp
+        'INFOBAR A01-2'                             => [ 'iida', 'INFOBAR A01', 'carrier' => 'au' ],               // by Sharp
+        'INFOBAR C01'                               => [ 'iida', 'INFOBAR C01', 'carrier' => 'au' ],               // by Sharp
+    ],
+
+    'HTX21'                                     => [ 'iida', 'INFOBAR A02', 'carrier' => 'au' ],                   // by HTC
+    'KYV33'                                     => [ 'iida', 'INFOBAR A03', 'carrier' => 'au' ],                   // by Kyocera
+
+
+    'IMO!!' => [
+        'IMO Discovery II'                          => [ 'IMO', 'Discovery II' ],
+        'IMO Discovery 2'                           => [ 'IMO', 'Discovery II' ],
+        'IMO Q8'                                    => [ 'IMO', 'Q8 Clarity' ],
+        'IMO S67'                                   => [ 'IMO', 'Blast S67' ],
+        'IMO S68'                                   => [ 'IMO', 'Snow S68' ],
+        'IMO S70'                                   => [ 'IMO', 'Miracle 2 S70' ],
+        'IMO S78'                                   => [ 'IMO', 'Glory S78' ],
+        'IMO S78 NEW STYLE'                         => [ 'IMO', 'Glory S78' ],
+        'IMO S79'                                   => [ 'IMO', 'Explorer S79' ],
+        'IMO S79 EXPLORER'                          => [ 'IMO', 'Explorer S79' ],
+        'IMO S79 MIUI'                              => [ 'IMO', 'Explorer S79' ],
+        'IMO S87'                                   => [ 'IMO', 'Raptor S87' ],
+        'Imo Raptor S87'                            => [ 'IMO', 'Raptor S87' ],
+        'IMO S88'                                   => [ 'IMO', 'Discovery S88' ],
+        'IMO S89'                                   => [ 'IMO', 'Miracle S89' ],
+        'IMO S90'                                   => [ 'IMO', 'Buzz S90' ],
+        'IMO S98'                                   => [ 'IMO', 'Champion S98' ],
+        'IMO S99'                                   => [ 'IMO', 'Ocean S99' ],
+        'IMO S900'                                  => [ 'IMO', 'Groovy S900' ],
+        'IMO X2'                                    => [ 'IMO', 'Normandy X2' ],
+        'IMO X2 NORMANDY'                           => [ 'IMO', 'Normandy X2' ],
+        'IMO TAB'                                   => [ 'IMO', 'Tab', DeviceType::TABLET ],
+        'IMO X5'                                    => [ 'IMO', 'Tab X5 Mars', DeviceType::TABLET ],
+        'IMO TAB X9'                                => [ 'IMO', 'Tab X9 Claire', DeviceType::TABLET ],
+        'IMO Y-ONE'                                 => [ 'IMO', 'Tab Y-One', DeviceType::TABLET ],
+        'IMO Y5'                                    => [ 'IMO', 'Tab Y3', DeviceType::TABLET ],
+        'IMO Y5'                                    => [ 'IMO', 'Tab Y5 i-Play', DeviceType::TABLET ],
+        'IMO Z-ONE'                                 => [ 'IMO', 'Tab Z-One', DeviceType::TABLET ],
+        'IMO Z6'                                    => [ 'IMO', 'Tab Z6 Avengers', DeviceType::TABLET ],
+        'IMO Z7'                                    => [ 'IMO', 'Tab Z7 Orion', DeviceType::TABLET ],
+        'IMO Z8'                                    => [ 'IMO', 'Tab Z8 Spin', DeviceType::TABLET ],
+        'IMO Z9'                                    => [ 'IMO', 'Tab Z9 Ice', DeviceType::TABLET ],
+        'IMO Z10'                                   => [ 'IMO', 'Tab Z10 Fortune', DeviceType::TABLET ],
+    ],
+
+    'S88 DISCOVERY'                             => [ 'IMO', 'Discovery S88' ],
+
+    'Im(Smart|PAD)!!' => [
+        'ImSmart 1.40'                              => [ 'Impression', 'ImSMART 1.40' ],
+        'ImPAD 0114'                                => [ 'Impression', 'ImPAD 0114', DeviceType::TABLET ],
+        'ImPAD 0413'                                => [ 'Impression', 'ImPAD 0413', DeviceType::TABLET ],
+        'ImPAD1001'                                 => [ 'Impression', 'ImPAD 1001', DeviceType::TABLET ],
+        'ImPAD1311'                                 => [ 'Impression', 'ImPAD 1311', DeviceType::TABLET ],
+        'ImPAD 1412'                                => [ 'Impression', 'ImPAD 1412', DeviceType::TABLET ],
+        'ImPAD 1412 rev2'                           => [ 'Impression', 'ImPAD 1412', DeviceType::TABLET ],
+        'ImPAD 2113'                                => [ 'Impression', 'ImPAD 2113', DeviceType::TABLET ],
+        'ImPAD 2413'                                => [ 'Impression', 'ImPAD 2413', DeviceType::TABLET ],
+        'ImPAD 3113'                                => [ 'Impression', 'ImPAD 3113', DeviceType::TABLET ],
+        'ImPAD 3412'                                => [ 'Impression', 'ImPAD 3412', DeviceType::TABLET ],
+        'ImPAD 4213'                                => [ 'Impression', 'ImPAD 4213', DeviceType::TABLET ],
+        'ImPAD 4313'                                => [ 'Impression', 'ImPAD 4313', DeviceType::TABLET ],
+        'ImPAD 6213M'                               => [ 'Impression', 'ImPAD 6213M', DeviceType::TABLET ],
+        'ImPAD6213M v2'                             => [ 'Impression', 'ImPAD 6213M', DeviceType::TABLET ],
+        'ImPAD 6413'                                => [ 'Impression', 'ImPAD 6413', DeviceType::TABLET ],
+        'ImPAD 8213'                                => [ 'Impression', 'ImPAD 8213', DeviceType::TABLET ],
+        'ImPAD 8901'                                => [ 'Impression', 'ImPAD 8901', DeviceType::TABLET ],
+        'ImPAD 9702'                                => [ 'Impression', 'ImPAD 9702', DeviceType::TABLET ],
+        'ImPAD9704'                                 => [ 'Impression', 'ImPAD 9704', DeviceType::TABLET ],
+        'ImPAD 9707'                                => [ 'Impression', 'ImPAD 9707', DeviceType::TABLET ],
+    ],
+
+    'TX85'                                      => [ 'iMuz', 'TX85', DeviceType::TABLET ],
+    'i3000'                                     => [ 'iNew', 'i3000' ],
+    'i6000'                                     => [ 'iNew', 'i6000' ],
+
+    'Infinix!!' => [
+        'Infinix BUZZ'                              => [ 'Infinix', 'Buzz X260' ],
+        'Infinix X351'                              => [ 'Infinix', 'Surf Smart X351' ],
+        'Infinix X352'                              => [ 'Infinix', 'Surf Smart 2 X352' ],
+        'Infinix X400'                              => [ 'Infinix', 'Race X400' ],
+        'Infinix X401'                              => [ 'Infinix', 'Race Lite X401' ],
+        'Infinix X402'                              => [ 'Infinix', 'Diamond X402' ],
+        'Infinix X405'                              => [ 'Infinix', 'Surf Viva X405' ],
+        'Infinix X450'                              => [ 'Infinix', 'Race Bolt X450' ],
+        'Infinix X451'                              => [ 'Infinix', 'Race Bolt Q X451' ],
+        'Infinix X452'                              => [ 'Infinix', 'Surf Goal X452' ],
+        'Infinix X454'                              => [ 'Infinix', 'Race Bolt 2 X454' ],
+        'Infinix X455'                              => [ 'Infinix', 'Race Bolt 3 X455' ],
+        'Infinix X500'                              => [ 'Infinix', 'Race Eagle X500' ],
+        'Infinix X501'                              => [ 'Infinix', 'Race Jet X501' ],
+        'Infinix X502'                              => [ 'Infinix', 'Alpha Marvel X502' ],
+        'Infinix X503'                              => [ 'Infinix', 'Surf Bravo X503' ],
+        'Infinix X505'                              => [ 'Infinix', 'Race Jet X505' ],
+        'Infinix X506'                              => [ 'Infinix', 'Zero X506' ],
+        'Infinix X506S'                             => [ 'Infinix', 'Zero X506' ],
+        'Infinix Zero X506'                         => [ 'Infinix', 'Zero X506' ],
+        'Infinix X507'                              => [ 'Infinix', 'Hot X507' ],
+        'Infinix X509'                              => [ 'Infinix', 'Zero 2 X509' ],
+        'Infinix X510'                              => [ 'Infinix', 'Hot 2 X510' ],
+        'Infinix Hot 2'                             => [ 'Infinix', 'Hot 2 X510' ],
+        'Infinix X511'                              => [ 'Infinix', 'Hot Note X511' ],
+        'Infinix-X521'                              => [ 'Infinix', 'Hot S X521' ],
+        'Infinix X521'                              => [ 'Infinix', 'Hot S X521' ],
+        'Infinix X530'                              => [ 'Infinix', 'Race Max Q X530' ],
+        'Infinix X550'                              => [ 'Infinix', 'Alpha 8 X550' ],
+        'Infinix X551'                              => [ 'Infinix', 'Hot Note X551' ],
+        'Infinix-X551'                              => [ 'Infinix', 'Hot Note X551' ],
+        'Infinix-X552'                              => [ 'Infinix', 'Zero 3 X552' ],
+        'Infinix-X554'                              => [ 'Infinix', 'Hot 3 X554' ],
+        'Infinix HOT 3'                             => [ 'Infinix', 'Hot 3 X554' ],
+        'Infinix HOT 3 LTE'                         => [ 'Infinix', 'Hot 3 X554' ],
+        'Infinix X556 LTE'                          => [ 'Infinix', 'Hot 4 Pro X556' ],
+        'Infinix HOT 4 Pro'                         => [ 'Infinix', 'Hot 4 Pro X556' ],
+        'Infinix X557'                              => [ 'Infinix', 'Hot 4 X557' ],
+        'Infinix HOT 4'                             => [ 'Infinix', 'Hot 4 X557' ],
+        'Infinix HOT 4 Lite'                        => [ 'Infinix', 'Hot 4 Lite X557' ],
+        'Infinix X570'                              => [ 'Infinix', 'Alpha X570' ],
+        'INFINIX-X600'                              => [ 'Infinix', 'Note 2 X600' ],
+        'Infinix-X600-LTE'                          => [ 'Infinix', 'Note 2 X600' ],
+        'Infinix NOTE 2'                            => [ 'Infinix', 'Note 2 X600' ],
+        'Infinix NOTE 2 LTE'                        => [ 'Infinix', 'Note 2 X600' ],
+        'Infinix X601 LTE'                          => [ 'Infinix', 'Note 3 X601' ],
+        'Infinix NOTE 3'                            => [ 'Infinix', 'Note 3 X601' ],
+        'Infinix NOTE 3 Pro'                        => [ 'Infinix', 'Note 3 Pro X601' ],
+        'Infinix Zero 4'                            => [ 'Infinix', 'Zero 4 X602' ],
+        'Infinix Zero 4 Plus'                       => [ 'Infinix', 'Zero 4 Plus X602' ],
+        'Infinix X800'                              => [ 'Infinix', 'Joypad 8 X800', DeviceType::TABLET ],
+        'Infinix X801'                              => [ 'Infinix', 'Joypad 8S X801', DeviceType::TABLET ],
+        'Infinix X1000'                             => [ 'Infinix', 'Joypad 10 X1000', DeviceType::TABLET ],
+    ],
+
+    'IN[0-9]{3,3}!!' => [
+        'IN260'                                     => [ 'InFocus', 'IN260' ],
+        'IN330'                                     => [ 'InFocus', 'IN330' ],
+        'IN335'                                     => [ 'InFocus', 'IN335' ],
+        'IN610'                                     => [ 'InFocus', 'IN610' ],
+        'IN810'                                     => [ 'InFocus', 'IN810' ],
+        'IN815'                                     => [ 'InFocus', 'IN815' ],
+    ],
+
+    'M210'                                      => [ 'InFocus', 'M210' ],
+    'M370i'                                     => [ 'InFocus', 'M370' ],
+
+    'Infocus!!' => [
+        'InFocus M2'                                => [ 'InFocus', 'M2' ],
+        'InFocus M2 3G'                             => [ 'InFocus', 'M2' ],
+        'InFocus M2PLUS'                            => [ 'InFocus', 'M2 Plus' ],
+        'InFocus M260'                              => [ 'InFocus', 'M260' ],
+        'InFocus M310'                              => [ 'InFocus', 'M310' ],
+        'InFocus M320!'                             => [ 'InFocus', 'M320' ],
+        'InFocus M330!'                             => [ 'InFocus', 'M330' ],
+        'InFocus M350!'                             => [ 'InFocus', 'M350' ],
+        'InFocus M415'                              => [ 'InFocus', 'M415' ],
+        'InFocus M425'                              => [ 'InFocus', 'M425' ],
+        'InFocus M430'                              => [ 'InFocus', 'M430' ],
+        'InFocus M510!'                             => [ 'InFocus', 'M510' ],
+        'InFocus M511!'                             => [ 'InFocus', 'M511' ],
+        'InFocus M512!'                             => [ 'InFocus', 'M512' ],
+        'InFocus M530'                              => [ 'InFocus', 'M530' ],
+        'InFocus M535'                              => [ 'InFocus', 'M535' ],
+        'InFocus M550!'                             => [ 'InFocus', 'M550' ],
+        'InFocus M560'                              => [ 'InFocus', 'M560' ],
+        'InFocus M680'                              => [ 'InFocus', 'M680' ],
+        'InFocus M808!'                             => [ 'InFocus', 'M808' ],
+        'InFocus M810!'                             => [ 'InFocus', 'M810' ],
+        'InFocus M812!'                             => [ 'InFocus', 'M812' ],
+    ],
+
+    'M009F'                                     => [ 'Infotmic', 'M009F' ],
+    'Dk1031'                                    => [ 'Infotmic', 'Flytouch 3', DeviceType::TABLET ],
+    'INHON PAPILIO G1'                          => [ 'Inhon', 'Papilio G1' ],
+    'intki E86'                                 => [ 'intki', 'E86' ],
+
+    'Innos!!' => [
+        'Innos D5C'                                 => [ 'Innos', 'D5C' ],
+        'innos D9'                                  => [ 'Innos', 'D9' ],
+        'innos D9C'                                 => [ 'Innos', 'D9C' ],
+        'innos i5'                                  => [ 'Innos', 'i5' ],
+        'innos i6'                                  => [ 'Innos', 'i6' ],
+        'INNOS I6 (DNS S4503)'                      => [ 'Innos', 'i6' ],
+        'innos i6C'                                 => [ 'Innos', 'i6C' ],
+        'Innos i6cp'                                => [ 'Innos', 'i6CP' ],
+    ],
+
+    'NS-14T002'                                 => [ 'Insignia', 'Flex 8', DeviceType::TABLET ],
+
+    '(AZ|BT)[0-9]{3,3}!!' => [
+        'AZ210A'                                    => [ 'Intel', 'AZ210A' ],
+        'AZ210B'                                    => [ 'Intel', 'AZ210B' ],
+        'AZ510'                                     => [ 'Intel', 'AZ510' ],
+        'BT210'                                     => [ 'Intel', 'BT210' ],
+        'BT230'                                     => [ 'Intel', 'BT230' ],
+        'BT510'                                     => [ 'Intel', 'BT510' ],
+    ],
+
+    'greenridge'                                => [ 'Intel', 'Green Ridge', DeviceType::TABLET ],
+
+    '(Intex )?Aqua!!' => [
+        'Aqua 3G'                                   => [ 'Intex', 'Aqua 3G' ],
+        'Aqua 3G 512'                               => [ 'Intex', 'Aqua 3G' ],
+        'Aqua 3G+'                                  => [ 'Intex', 'Aqua 3G+' ],
+        'Aqua 3G mini'                              => [ 'Intex', 'Aqua 3G mini' ],
+        'Aqua 3G N'                                 => [ 'Intex', 'Aqua 3G N' ],
+        'Aqua 3G NS'                                => [ 'Intex', 'Aqua 3G NS' ],
+        'Aqua 3G Neo'                               => [ 'Intex', 'Aqua 3G Neo' ],
+        'Aqua 3G Pro'                               => [ 'Intex', 'Aqua 3G Pro' ],
+        'Aqua 3G Pro Q'                             => [ 'Intex', 'Aqua 3G Pro Q' ],
+        'Aqua 3G Star'                              => [ 'Intex', 'Aqua 3G Star' ],
+        'Aqua 3G Strong'                            => [ 'Intex', 'Aqua 3G Strong' ],
+        'Aqua 4G'                                   => [ 'Intex', 'Aqua 4G' ],
+        'Aqua 4G+'                                  => [ 'Intex', 'Aqua 4G+' ],
+        'Aqua 4G Strong'                            => [ 'Intex', 'Aqua 4G Strong' ],
+        'Intex Aqua 3X'                             => [ 'Intex', 'Aqua 3X' ],
+        'AQUA 4X'                                   => [ 'Intex', 'Aqua 4X' ],
+        'Aqua 5X'                                   => [ 'Intex', 'Aqua 5X' ],
+        'Intex Aqua 3.2'                            => [ 'Intex', 'Aqua 3.2' ],
+        'AQUA 4.0'                                  => [ 'Intex', 'Aqua 4.0' ],
+        'Intex Aqua 4.5E'                           => [ 'Intex', 'Aqua 4.5E' ],
+        'Aqua 4.5Pro'                               => [ 'Intex', 'Aqua 4.5 Pro' ],
+        'AQUA 5.0'                                  => [ 'Intex', 'Aqua 5.0' ],
+        'Aqua 5.5 VR'                               => [ 'Intex', 'Aqua 5.5 VR' ],
+        'Aqua Ace'                                  => [ 'Intex', 'Aqua Ace' ],
+        'Aqua Ace II'                               => [ 'Intex', 'Aqua Ace II' ],
+        'Aqua Ace Mini'                             => [ 'Intex', 'Aqua Ace Mini' ],
+        'Aqua.Active'                               => [ 'Intex', 'Aqua Active' ],
+        'Aqua Active'                               => [ 'Intex', 'Aqua Active' ],
+        'Aqua Air'                                  => [ 'Intex', 'Aqua Air' ],
+        'Aqua Air II'                               => [ 'Intex', 'Aqua Air II' ],
+        'Aqua Amaze'                                => [ 'Intex', 'Aqua Amaze' ],
+        'Aqua Amoled'                               => [ 'Intex', 'Aqua Amoled' ],
+        'Aqua Classic'                              => [ 'Intex', 'Aqua Classic' ],
+        'Aqua Cloud V'                              => [ 'Intex', 'Cloud V' ],
+        'aQUa COSTA'                                => [ 'Intex', 'Aqua Costa' ],
+        'Aqua Craze'                                => [ 'Intex', 'Aqua Craze' ],
+        'Aqua Craze 2'                              => [ 'Intex', 'Aqua Craze 2' ],
+        'Aqua Curve'                                => [ 'Intex', 'Aqua Curve' ],
+        'Aqua Curve mini'                           => [ 'Intex', 'Aqua Curve Mini' ],
+        'Aqua Desire'                               => [ 'Intex', 'Aqua Desire' ],
+        'Intex Aqua Desire HD'                      => [ 'Intex', 'Aqua Desire HD' ],
+        'Aqua Dream II'                             => [ 'Intex', 'Aqua Dream II' ],
+        'Aqua Eco'                                  => [ 'Intex', 'Aqua Eco' ],
+        'Aqua Eco 4G'                               => [ 'Intex', 'Aqua Eco 4G' ],
+        'Aqua flash'                                => [ 'Intex', 'Aqua Flash' ],
+        'Aqua Freedom'                              => [ 'Intex', 'Aqua Freedom' ],
+        'Aqua GenX'                                 => [ 'Intex', 'Aqua GenX' ],
+        'Aqua Glam'                                 => [ 'Intex', 'Aqua Glam' ],
+        'Aqua Glory'                                => [ 'Intex', 'Aqua Glory' ],
+        'Aqua Glow'                                 => [ 'Intex', 'Aqua Glow' ],
+        'Aqua HD'                                   => [ 'Intex', 'Aqua HD' ],
+        'Aqua HD 5.0'                               => [ 'Intex', 'Aqua HD' ],
+        'Aqua HD Power'                             => [ 'Intex', 'Aqua HD Power' ],
+        'Aqua Joy'                                  => [ 'Intex', 'Aqua Joy' ],
+        'Aqua KAT'                                  => [ 'Intex', 'Aqua KAT' ],
+        'Aqua Life'                                 => [ 'Intex', 'Aqua Life' ],
+        'Aqua Life II'                              => [ 'Intex', 'Aqua Life II' ],
+        'Aqua LifeIII'                              => [ 'Intex', 'Aqua Life III' ],
+        'Aqua Life V'                               => [ 'Intex', 'Aqua Life V' ],
+        'Aqua Lions 3G'                             => [ 'Intex', 'Aqua Lions 3G' ],
+        'Aqua Lions 3G S'                           => [ 'Intex', 'Aqua Lions 3G S' ],
+        'Aqua Lite'                                 => [ 'Intex', 'Aqua Lite' ],
+        'Intex Aqua Marvel'                         => [ 'Intex', 'Aqua Marvel' ],
+        'Aqua Music'                                => [ 'Intex', 'Aqua Music' ],
+        'AQUA OCTA'                                 => [ 'Intex', 'Aqua Octa' ],
+        'Intex Aqua Play'                           => [ 'Intex', 'Aqua Play' ],
+        'Aqua Power'                                => [ 'Intex', 'Aqua Power' ],
+        'Aqua Power+'                               => [ 'Intex', 'Aqua Power+' ],
+        'Aqua Power HD'                             => [ 'Intex', 'Aqua Power HD' ],
+        'Aqua Power HD-4G'                          => [ 'Intex', 'Aqua Power HD 4G' ],
+        'Aqua Power II'                             => [ 'Intex', 'Aqua Power II' ],
+        'Aqua Power 4G'                             => [ 'Intex', 'Aqua Power 4G' ],
+        'Aqua Pride'                                => [ 'Intex', 'Aqua Pride' ],
+        'Aqua Pro'                                  => [ 'Intex', 'Aqua Pro' ],
+        'Aqua Pro 4G'                               => [ 'Intex', 'Aqua Pro 4G' ],
+        'Aqua QWERTY'                               => [ 'Intex', 'Aqua Qwerty' ],
+        'Aqua Raze'                                 => [ 'Intex', 'Aqua Raze' ],
+        'Aqua Ring'                                 => [ 'Intex', 'Aqua Ring' ],
+        'Aqua S'                                    => [ 'Intex', 'Aqua S' ],
+        'Aqua Sx'                                   => [ 'Intex', 'Aqua Sx' ],
+        'Aqua Secure'                               => [ 'Intex', 'Aqua Secure' ],
+        'AquaSense5.0'                              => [ 'Intex', 'Aqua Sense 5.0' ],
+        'Aqua Sense 5 1'                            => [ 'Intex', 'Aqua Sense 5.1' ],
+        'Aqua Shine 4G'                             => [ 'Intex', 'Aqua Shine 4G' ],
+        'Aqua Slice'                                => [ 'Intex', 'Aqua Slice' ],
+        'Aqua Slice II'                             => [ 'Intex', 'Aqua Slice II' ],
+        'Aqua Speed'                                => [ 'Intex', 'Aqua Speed' ],
+        'Aqua Speed HD'                             => [ 'Intex', 'Aqua Speed HD' ],
+        'Aqua Star'                                 => [ 'Intex', 'Aqua Star' ],
+        'Aqua Star 4G'                              => [ 'Intex', 'Aqua Star 4G' ],
+        'Aqua Star L'                               => [ 'Intex', 'Aqua Star L' ],
+        'Aqua Star II'                              => [ 'Intex', 'Aqua Star II' ],
+        'Aqua Star II 16GB'                         => [ 'Intex', 'Aqua Star II' ],
+        'Aqua Star II HD'                           => [ 'Intex', 'Aqua Star II HD' ],
+        'Aqua Star 5.0'                             => [ 'Intex', 'Aqua Star 5.0' ],
+        'Aqua Star HD'                              => [ 'Intex', 'Aqua Star HD' ],
+        'Aqua Star Power'                           => [ 'Intex', 'Aqua Star Power' ],
+        'Aqua Strong 5.1'                           => [ 'Intex', 'Aqua Strong 5.1' ],
+        'Aqua Style'                                => [ 'Intex', 'Aqua Style' ],
+        'Aqua Style 4.0'                            => [ 'Intex', 'Aqua Style 4.0' ],
+        'Aqua Style Mini'                           => [ 'Intex', 'Aqua Style Mini' ],
+        'Aqua Style Pro'                            => [ 'Intex', 'Aqua Style Pro' ],
+        'Aqua Style VX'                             => [ 'Intex', 'Aqua Style VX' ],
+        'Aqua Style X'                              => [ 'Intex', 'Aqua Style X' ],
+        'Aqua Super'                                => [ 'Intex', 'Aqua Super' ],
+        'Intex Aqua Superb'                         => [ 'Intex', 'Aqua Superb' ],
+        'Intex Aqua Swadesh'                        => [ 'Intex', 'Aqua Swadesh' ],
+        'Aqua Trend'                                => [ 'Intex', 'Aqua Trend' ],
+        'Aqua Trendy'                               => [ 'Intex', 'Aqua Trendy' ],
+        'Aqua Turbo 4G'                             => [ 'Intex', 'Aqua Turbo 4G' ],
+        'Aqua Twist'                                => [ 'Intex', 'Aqua Twist' ],
+        'Aqua View'                                 => [ 'Intex', 'Aqua View' ],
+        'Aqua Wing'                                 => [ 'Intex', 'Aqua Wing' ],
+        'Aqua Wonder'                               => [ 'Intex', 'Aqua Wonder' ],
+        'Aqua Wonder Quad Core'                     => [ 'Intex', 'Aqua Wonder' ],
+        'Aqua X'                                    => [ 'Intex', 'Aqua X' ],
+        'Aqua Xtreme'                               => [ 'Intex', 'Aqua Xtreme' ],
+        'Aqua XtremeV'                              => [ 'Intex', 'Aqua Xtreme V' ],
+        'Aqua Young'                                => [ 'Intex', 'Aqua Young' ],
+        'Aqua i2'                                   => [ 'Intex', 'Aqua i2' ],
+        'Intex Aqua I3'                             => [ 'Intex', 'Aqua i3' ],
+        'Aqua I-4'                                  => [ 'Intex', 'Aqua i4' ],
+        'Aqua i-4+'                                 => [ 'Intex', 'Aqua i4' ],
+        'Aqua I-5'                                  => [ 'Intex', 'Aqua i5' ],
+        'Aqua I5'                                   => [ 'Intex', 'Aqua i5' ],
+        'Aqua i5 HD'                                => [ 'Intex', 'Aqua i5 HD' ],
+        'Aqua i5 mini'                              => [ 'Intex', 'Aqua i5 mini' ],
+        'Aqua I5 Octa'                              => [ 'Intex', 'Aqua i5 Octa' ],
+        'Aqua i6'                                   => [ 'Intex', 'Aqua i6' ],
+        'Aqua i7'                                   => [ 'Intex', 'Aqua i7' ],
+        'Aqua I14'                                  => [ 'Intex', 'Aqua i14' ],
+        'Aqua i15'                                  => [ 'Intex', 'Aqua i15' ],
+        'Aqua A1'                                   => [ 'Intex', 'Aqua A1' ],
+        'Aqua A2'                                   => [ 'Intex', 'Aqua A2' ],
+        'Aqua G2'                                   => [ 'Intex', 'Aqua G2' ],
+        'Aqua M5'                                   => [ 'Intex', 'Aqua M5' ],
+        'Aqua N2'                                   => [ 'Intex', 'Aqua N2' ],
+        'Aqua N7'                                   => [ 'Intex', 'Aqua N7' ],
+        'Aqua N8'                                   => [ 'Intex', 'Aqua N8' ],
+        'Aqua N15'                                  => [ 'Intex', 'Aqua N15' ],
+        'Aqua N17'                                  => [ 'Intex', 'Aqua N17' ],
+        'Aqua P2'                                   => [ 'Intex', 'Aqua P2' ],
+        'Aqua P3'                                   => [ 'Intex', 'Aqua P3' ],
+        'Aqua Q1'                                   => [ 'Intex', 'Aqua Q1' ],
+        'Aqua Q1+'                                  => [ 'Intex', 'Aqua Q1' ],
+        'AQUA Q2'                                   => [ 'Intex', 'Aqua Q2' ],
+        'Aqua Q3'                                   => [ 'Intex', 'Aqua Q3' ],
+        'Aqua Q4'                                   => [ 'Intex', 'Aqua Q4' ],
+        'Aqua Q5'                                   => [ 'Intex', 'Aqua Q5' ],
+        'Aqua Q7'                                   => [ 'Intex', 'Aqua Q7' ],
+        'Aqua Q7N'                                  => [ 'Intex', 'Aqua Q7N' ],
+        'Aqua Q7 Pro'                               => [ 'Intex', 'Aqua Q7 Pro' ],
+        'Aqua R2'                                   => [ 'Intex', 'Aqua R2' ],
+        'Aqua R3'                                   => [ 'Intex', 'Aqua R3' ],
+        'Aqua R3+'                                  => [ 'Intex', 'Aqua R3' ],
+        'Aqua R4'                                   => [ 'Intex', 'Aqua R4' ],
+        'Aqua R4+'                                  => [ 'Intex', 'Aqua R4' ],
+        'Aqua S7'                                   => [ 'Intex', 'Aqua S7' ],
+        'Aqua T2'                                   => [ 'Intex', 'Aqua T2' ],
+        'Aqua T3'                                   => [ 'Intex', 'Aqua T3' ],
+        'Aqua T4'                                   => [ 'Intex', 'Aqua T4' ],
+        'Aqua T6'                                   => [ 'Intex', 'Aqua T6' ],
+        'Aqua V+'                                   => [ 'Intex', 'Aqua V+' ],
+        'Aqua V2'                                   => [ 'Intex', 'Aqua V2' ],
+        'Aqua V3'                                   => [ 'Intex', 'Aqua V3' ],
+        'Aqua V3G'                                  => [ 'Intex', 'Aqua V3G' ],
+        'Aqua V4'                                   => [ 'Intex', 'Aqua V4' ],
+        'Aqua V5'                                   => [ 'Intex', 'Aqua V5' ],
+        'Aqua X15'                                  => [ 'Intex', 'Aqua X15' ],
+        'Aqua Y2'                                   => [ 'Intex', 'Aqua Y2' ],
+        'Aqua Y2 1GB'                               => [ 'Intex', 'Aqua Y2' ],
+        'Aqua Y2 IPS'                               => [ 'Intex', 'Aqua Y2' ],
+        'Aqua Y2+'                                  => [ 'Intex', 'Aqua Y2+' ],
+        'Aqua Y2 Pro'                               => [ 'Intex', 'Aqua Y2 Pro' ],
+        'Aqua Y2 Power'                             => [ 'Intex', 'Aqua Y2 Power' ],
+        'Aqua Y2 Remote'                            => [ 'Intex', 'Aqua Y2 Remote' ],
+        'Aqua Y2 Ultra'                             => [ 'Intex', 'Aqua Y2 Ultra' ],
+        'Aqua Y3'                                   => [ 'Intex', 'Aqua Y3' ],
+        'Aqua Y4'                                   => [ 'Intex', 'Aqua Y3' ],
+    ],
+
+    '(Intex )?Cloud!!' => [
+        'Cloud N12'                                 => [ 'Intex', 'Cloud N12' ],
+        'Cloud Q11'                                 => [ 'Intex', 'Cloud Q11' ],
+        'Intex Cloud X+'                            => [ 'Intex', 'Cloud X' ],
+        'INTEX CLOUD X1'                            => [ 'Intex', 'Cloud X1' ],
+        'Cloud X2'                                  => [ 'Intex', 'Cloud X2' ],
+        'Cloud X3'                                  => [ 'Intex', 'Cloud X3' ],
+        'Intex Cloud X4'                            => [ 'Intex', 'Cloud X4' ],
+        'Cloud X5'                                  => [ 'Intex', 'Cloud X5' ],
+        'INTEX Cloud X11'                           => [ 'Intex', 'Cloud X11' ],
+        'Cloud X12'                                 => [ 'Intex', 'Cloud X12' ],
+        'Intex Cloud Y1'                            => [ 'Intex', 'Cloud Y1' ],
+        'Cloud Y2'                                  => [ 'Intex', 'Cloud Y2' ],
+        'Cloud Y3'                                  => [ 'Intex', 'Cloud Y3' ],
+        'INTEX Cloud Y4'                            => [ 'Intex', 'Cloud Y4' ],
+        'INTEX Cloud Y4+'                           => [ 'Intex', 'Cloud Y4+' ],
+        'Cloud Y5'                                  => [ 'Intex', 'Cloud Y5' ],
+        'Intex Cloud Y7'                            => [ 'Intex', 'Cloud Y7' ],
+        'Intex Cloud Y11'                           => [ 'Intex', 'Cloud Y11' ],
+        'Intex Cloud y12'                           => [ 'Intex', 'Cloud Y12' ],
+        'Cloud Y13 Plus'                            => [ 'Intex', 'Cloud Y13 Plus' ],
+        'Cloud Y17+'                                => [ 'Intex', 'Cloud Y17 Plus' ],
+        'Cloud Z5'                                  => [ 'Intex', 'Cloud Z5' ],
+        'Cloud 4G Smart'                            => [ 'Intex', 'Cloud 4G Smart' ],
+        'Cloud 4G Star'                             => [ 'Intex', 'Cloud 4G Star' ],
+        'Cloud Cube'                                => [ 'Intex', 'Cloud Cube' ],
+        'Cloud Flash'                               => [ 'Intex', 'Cloud Flash' ],
+        'Cloud Force'                               => [ 'Intex', 'Cloud Force' ],
+        'Cloud Gem+'                                => [ 'Intex', 'Cloud Gem+' ],
+        'Cloud Jewel'                               => [ 'Intex', 'Cloud Jewel' ],
+        'Cloud Pace'                                => [ 'Intex', 'Cloud Pace' ],
+        'Cloud Power+'                              => [ 'Intex', 'Cloud Power+' ],
+        'Cloud String HD'                           => [ 'Intex', 'Cloud String HD' ],
+        'Cloud Swift'                               => [ 'Intex', 'Cloud Swift' ],
+        'Cloud Zest'                                => [ 'Intex', 'Cloud Zest' ],
+    ],
+
+    'INTEX IRIS-II'                             => [ 'Intex', 'Iris 2', DeviceType::TABLET ],
+    'INQ Cloud Touch'                           => [ 'INQ', 'Cloud Touch' ],
+    'INQ Mayfair (EU)'                          => [ 'INQ', 'Mayfair' ],
+    'A19S'                                      => [ 'ISA', 'A19S' ],
+    'NS-13T001'                                 => [ 'Insignia', 'Flex Tablet', DeviceType::TABLET ],
+    'IPRO i5S'                                  => [ 'IPRO', 'i5S' ],
+    'TX18'                                      => [ 'Irbis', 'TX18', DeviceType::TABLET ],
+    'ILT-MX100'                                 => [ 'iRiver', 'Tab', DeviceType::TABLET ],
+
+    '(iNote|itel)!!' => [
+        'iNote beyond'                              => [ 'iTel', 'iNote beyond' ],
+        'iNote mini'                                => [ 'iTel', 'iNote mini' ],
+        'itel IT1351'                               => [ 'iTel', 'IT1351' ],
+        'itel IT1351E'                              => [ 'iTel', 'IT1351E' ],
+        'itel it1400'                               => [ 'iTel', 'IT1400' ],
+        'itel it1500'                               => [ 'iTel', 'IT1500' ],
+        'itel it1508'                               => [ 'iTel', 'IT1508' ],
+    ],
+
+    'IVIO!!' => [
+        'IVIO-DG20'                                 => [ 'Ivio', 'DG20' ],
+        'IVIO DE38'                                 => [ 'Ivio', 'DE38' ],
+    ],
+
+    'iwoo i900'                                 => [ 'iwoo', 'i900' ],
+
+    '(JIAYU|JY-)!!' => [
+        'JIAYU F1'                                  => [ 'Jiayu', 'F1' ],
+        'JY-F1'                                     => [ 'Jiayu', 'F1' ],
+        'JY-F2'                                     => [ 'Jiayu', 'F2' ],
+        'JY-G1'                                     => [ 'Jiayu', 'G1' ],
+        'JY-G2'                                     => [ 'Jiayu', 'G2' ],
+        'JY-G2 DualCore(Standard)'                  => [ 'Jiayu', 'G2' ],
+        'JY-G2 Plus'                                => [ 'Jiayu', 'G2 Plus' ],
+        'JY-G2 64'                                  => [ 'Jiayu', 'G2' ],
+        'JY G2F'                                    => [ 'Jiayu', 'G2F' ],
+        'JY-G2F'                                    => [ 'Jiayu', 'G2F' ],
+        'JY-G2H'                                    => [ 'Jiayu', 'G2H' ],
+        'JY-G2L'                                    => [ 'Jiayu', 'G2L' ],
+        'JY-G2LS'                                   => [ 'Jiayu', 'G2LS' ],
+        'Jiayu G2'                                  => [ 'Jiayu', 'G2' ],
+        'Jiayu G2H'                                 => [ 'Jiayu', 'G2H' ],
+        'Jiayu G2L'                                 => [ 'Jiayu', 'G2L' ],
+        'Jiayu G2s'                                 => [ 'Jiayu', 'G2 Plus' ],
+        'JY-G3'                                     => [ 'Jiayu', 'G3' ],
+        'Jiayu G3'                                  => [ 'Jiayu', 'G3' ],
+        'JIAYU-G3'                                  => [ 'Jiayu', 'G3' ],
+        'JY-G3C'                                    => [ 'Jiayu', 'G3C' ],
+        'JY-G3N!'                                   => [ 'Jiayu', 'G3N' ],
+        'JYG3N'                                     => [ 'Jiayu', 'G3N' ],
+        'JY-G3S'                                    => [ 'Jiayu', 'G3S' ],
+        'JIAYU G3S'                                 => [ 'Jiayu', 'G3S' ],
+        'JIAYU.G3S'                                 => [ 'Jiayu', 'G3S' ],
+        'JY-G4'                                     => [ 'Jiayu', 'G4' ],
+        'JY-G4\G5'                                  => [ 'Jiayu', 'G4' ],
+        'JY-G4 G5'                                  => [ 'Jiayu', 'G4' ],
+        'JY-G4C'                                    => [ 'Jiayu', 'G4C' ],
+        'JY G4C'                                    => [ 'Jiayu', 'G4C' ],
+        'Jiayu G4S'                                 => [ 'Jiayu', 'G4S' ],
+        'JY-G4S'                                    => [ 'Jiayu', 'G4S' ],
+        'JIAYU-G4S'                                 => [ 'Jiayu', 'G4S' ],
+        'JY-G4T'                                    => [ 'Jiayu', 'G4T' ],
+        'JY-G5'                                     => [ 'Jiayu', 'G5' ],
+        'Jiayu G5S'                                 => [ 'Jiayu', 'G5S' ],
+        'JY-G5S'                                    => [ 'Jiayu', 'G5S' ],
+        'JY-G5S+'                                   => [ 'Jiayu', 'G5S+' ],
+        'JY-G6'                                     => [ 'Jiayu', 'G6' ],
+        'JY-S1'                                     => [ 'Jiayu', 'S1' ],
+        'JY-S2'                                     => [ 'Jiayu', 'S2' ],
+        'JY-S3'                                     => [ 'Jiayu', 'S3' ],
+        'JY-S3S'                                    => [ 'Jiayu', 'S3S' ],
+    ],
+
+    'G2S'                                       => [ 'Jiayu', 'G2 Plus' ],
+    'JT-Smart PC01'                             => [ 'Joy-IT', 'JT-Smart PC-01' ],
+    'JJ5S+'                                     => [ 'Jugate', 'JJ5S+' ],
+
+    'JC-A[0-9]{3,3}!!' => [
+        'JC-A107'                                   => [ 'JuiCell', 'JC-A107' ],
+        'JC-A109'                                   => [ 'JuiCell', 'JC-A109' ],
+    ],
+
+    'JXD!!' => [
+        'JXD S601WIFI'                              => [ 'JXD', 'S601 WIFI', 'media' ],
+        'JXD V5200'                                 => [ 'JXD', 'V5200', 'media' ],
+        'JXD P200'                                  => [ 'JXD', 'P200', DeviceType::TABLET ],
+        'JXD P300'                                  => [ 'JXD', 'P300', DeviceType::TABLET ],
+        'JXD-P1000!'                                => [ 'JXD', 'P1000', DeviceType::TABLET ],
+        'JXD-S80'                                   => [ 'JXD', 'S80', DeviceType::TABLET ],
+        'JXD-S6600!'                                => [ 'JXD', 'S6600', DeviceType::TABLET ],
+        'JXD S7600'                                 => [ 'JXD', 'S7600', DeviceType::TABLET ],
+        'JXD-S8000'                                 => [ 'JXD', 'S8000', DeviceType::TABLET ],
+        'JXD-S9000'                                 => [ 'JXD', 'S9000', DeviceType::TABLET ],
+        'JXD-S9100'                                 => [ 'JXD', 'S9100', DeviceType::TABLET ],
+    ],
+
+    'A2'                                        => [ 'KakaTech', 'A2' ],
+
+    'Karbonn!!' => [
+        'Karbonn A1'                                => [ 'Karbonn', 'A1' ],
+        'Karbonn A1 Plus Champ'                     => [ 'Karbonn', 'A1' ],
+        'Karbonn A1 1 Plus Champ'                   => [ 'Karbonn', 'A1' ],
+        'Karbonn A1*'                               => [ 'Karbonn', 'A1' ],
+        'Karbonn A1+ Duple'                         => [ 'Karbonn', 'A1+' ],
+        'Karbonn A1+ Super'                         => [ 'Karbonn', 'A1+' ],
+        'Karbonn A2'                                => [ 'Karbonn', 'A2' ],
+        'Karbonn A2+'                               => [ 'Karbonn', 'A2+' ],
+        'Karbonn A4'                                => [ 'Karbonn', 'A4' ],
+        'Karbonn A5'                                => [ 'Karbonn', 'A5' ],
+        'Karbonn A5i'                               => [ 'Karbonn', 'A5i' ],
+        'Karbonn A5s'                               => [ 'Karbonn', 'A5s' ],
+        'Karbonn A6'                                => [ 'Karbonn', 'A6' ],
+        'Karbonn A6+'                               => [ 'Karbonn', 'A6+' ],
+        'Karbonn A7*'                               => [ 'Karbonn', 'A7' ],
+        'Karbonn A8'                                => [ 'Karbonn', 'A8' ],
+        'Karbonn A9'                                => [ 'Karbonn', 'A9' ],
+        'Karbonn A9*'                               => [ 'Karbonn', 'A9' ],
+        'Karbonn A9s'                               => [ 'Karbonn', 'A9s' ],
+        'Karbonn A9+'                               => [ 'Karbonn', 'A9+' ],
+        'Karbonn A10'                               => [ 'Karbonn', 'A10' ],
+        'Karbonn A11*'                              => [ 'Karbonn', 'A11' ],
+        'Karbonn A12'                               => [ 'Karbonn', 'A12' ],
+        'Karbonn A12*'                              => [ 'Karbonn', 'A12' ],
+        'Karbonn A12+'                              => [ 'Karbonn', 'A12+' ],
+        'Karbonn A14'                               => [ 'Karbonn', 'A14' ],
+        'Karbonn A18'                               => [ 'Karbonn', 'A18' ],
+        'Karbonn A18+'                              => [ 'Karbonn', 'A18+' ],
+        'Karbonn A19'                               => [ 'Karbonn', 'A19' ],
+        'Karbonn A20'                               => [ 'Karbonn', 'A20' ],
+        'Karbonn A21!'                              => [ 'Karbonn', 'A21' ],
+        'Karbonn A25'                               => [ 'Karbonn', 'A25' ],
+        'Karbonn A25+'                              => [ 'Karbonn', 'A25+' ],
+        'Karbonn A26'                               => [ 'Karbonn', 'A26' ],
+        'KarbonnA26'                                => [ 'Karbonn', 'A26' ],
+        'Karbonn A27+'                              => [ 'Karbonn', 'A27' ],
+        'Karbonn A30'                               => [ 'Karbonn', 'A30' ],
+        'Karbonn A35'                               => [ 'Karbonn', 'A35' ],
+        'Karbonn A40'                               => [ 'Karbonn', 'A40' ],
+        'Karbonn A50'                               => [ 'Karbonn', 'A50' ],
+        'Karbonn A51 Lite'                          => [ 'Karbonn', 'A51 Lite' ],
+        'Karbonn A52+'                              => [ 'Karbonn', 'A52+' ],
+        'Karbonn A66'                               => [ 'Karbonn', 'A66' ],
+        'Karbonn A91'                               => [ 'Karbonn', 'A91' ],
+        'Karbonn A92Plus'                           => [ 'Karbonn', 'A92 Plus' ],
+        'Karbonn A93'                               => [ 'Karbonn', 'A93' ],
+        'Karbonn A108'                              => [ 'Karbonn', 'A108' ],
+        'Karbonn A119'                              => [ 'Karbonn', 'A119' ],
+        'Karbonn A240'                              => [ 'Karbonn', 'A240' ],
+        'Karbonn E8222'                             => [ 'Karbonn', 'E8222' ],
+        'Karbonn ST52'                              => [ 'Karbonn', 'ST52', DeviceType::TABLET ],
+        'Karbonn ST72'                              => [ 'Karbonn', 'ST72', DeviceType::TABLET ],
+    ],
+
+    'TA-FONE!!' => [
+        'TA-FONE A34'                               => [ 'Karbonn', 'Ta-Fone A34' ],
+        'TA-FONE A34 HD'                            => [ 'Karbonn', 'Ta-Fone A34 HD' ],
+        'TA-FONE A37'                               => [ 'Karbonn', 'Ta-Fone A37' ],
+        'TA-FONE A37 HD'                            => [ 'Karbonn', 'Ta-Fone A37 HD' ],
+        'TA-FONE A39 HD'                            => [ 'Karbonn', 'Ta-Fone A39 HD' ],
+    ],
+
+    '(Karbonn|Titanium)!!' => [
+        'Karbonn Titanium Hexa'                     => [ 'Karbonn', 'Titanium Hexa' ],
+        'Titanium Octane'                           => [ 'Karbonn', 'Titanium Octane' ],
+        'Titanium Octane Plus'                      => [ 'Karbonn', 'Titanium Octane Plus' ],
+        'Titanium K9 Smart'                         => [ 'Karbonn', 'Titanium K9 Smart' ],
+        'Titanium S1'                               => [ 'Karbonn', 'Titanium S1' ],
+        'Titanium S1 Plus'                          => [ 'Karbonn', 'Titanium S1 Plus' ],
+        'Karbonn Titanium S1 Plus'                  => [ 'Karbonn', 'Titanium S1 Plus' ],
+        'Karbonn S2'                                => [ 'Karbonn', 'Titanium S2' ],
+        'Karbonn Titanium S3'                       => [ 'Karbonn', 'Titanium S3' ],
+        'Titanium S2 Plus'                          => [ 'Karbonn', 'Titanium S2 Plus' ],
+        'Titanium S2Plus'                           => [ 'Karbonn', 'Titanium S2 Plus' ],
+        'Karbonn Titanium S4'                       => [ 'Karbonn', 'Titanium S4' ],
+        'Karbonn Titanium S4 Plus'                  => [ 'Karbonn', 'Titanium S4 Plus' ],
+        'Titanium S5'                               => [ 'Karbonn', 'Titanium S5' ],
+        'karbonn Titanium S5'                       => [ 'Karbonn', 'Titanium S5' ],
+        'TitaniumS5-Karbonnroms'                    => [ 'Karbonn', 'Titanium S5' ],
+        'Karbonn S5i'                               => [ 'Karbonn', 'Titanium S5i' ],
+        'Karbonn Titanium S5 Plus'                  => [ 'Karbonn', 'Titanium S5 Plus' ],
+        'Karbonn Titanium S5+'                      => [ 'Karbonn', 'Titanium S5 Plus' ],
+        'Titanium S5+!'                             => [ 'Karbonn', 'Titanium S5 Plus' ],
+        'Titanium S5 Ultra'                         => [ 'Karbonn', 'Titanium S5 Ultra' ],
+        'Karbonn Titanium S6'                       => [ 'Karbonn', 'Titanium S6' ],
+        'Karbonn Titanium S9'                       => [ 'Karbonn', 'Titanium S9' ],
+        'Titanium S10'                              => [ 'Karbonn', 'Titanium S10' ],
+        'Titanium S12 Delite'                       => [ 'Karbonn', 'Titanium S12 Delite' ],
+        'Titanium S15'                              => [ 'Karbonn', 'Titanium S15' ],
+        'Titanium S15 Ultra'                        => [ 'Karbonn', 'Titanium S15 Ultra' ],
+        'Titanium S18'                              => [ 'Karbonn', 'Titanium S18' ],
+        'Titanium S19'                              => [ 'Karbonn', 'Titanium S19' ],
+        'Karbonn TITANIUM S20'                      => [ 'Karbonn', 'Titanium S20' ],
+        'Titanium S21'                              => [ 'Karbonn', 'Titanium S21' ],
+        'Titanium S22'                              => [ 'Karbonn', 'Titanium S22' ],
+        'Karbonn Titanium S25'                      => [ 'Karbonn', 'Titanium S25' ],
+        'Titanium S30'                              => [ 'Karbonn', 'Titanium S30' ],
+        'Titanium S35'                              => [ 'Karbonn', 'Titanium S35' ],
+        'Titanium S99'                              => [ 'Karbonn', 'Titanium S99' ],
+        'Karbonn Titanium S99'                      => [ 'Karbonn', 'Titanium S99' ],
+        'Titanium S109'                             => [ 'Karbonn', 'Titanium S109' ],
+        'Titanium S200 HD'                          => [ 'Karbonn', 'Titanium S200 HD' ],
+        'Titanium S201'                             => [ 'Karbonn', 'Titanium Dazzle S201' ],
+        'Titanium S202'                             => [ 'Karbonn', 'Titanium Dazzle2 S202' ],
+        'Titanium S203'                             => [ 'Karbonn', 'Titanium High 2 S203' ],
+        'Titanium S204'                             => [ 'Karbonn', 'Titanium Dazzle3 S204' ],
+        'TITANIUM S205 2GB'                         => [ 'Karbonn', 'Titanium S205' ],
+        'S2052GB'                                   => [ 'Karbonn', 'Titanium S205' ],
+        'Titanium S315'                             => [ 'Karbonn', 'Titanium Pop S315' ],
+        'Titanium S320'                             => [ 'Karbonn', 'Titanium S320' ],
+        'Titanium S360'                             => [ 'Karbonn', 'Titanium Mach Two S360' ],
+        'Karbonn Titanium X'                        => [ 'Karbonn', 'Titanium X' ],
+    ],
+
+    'A7*'                                       => [ 'Karbonn', 'A7' ],
+    'A7+'                                       => [ 'Karbonn', 'A7+' ],
+    'A11'                                       => [ 'Karbonn', 'A11' ],
+    'A21'                                       => [ 'Karbonn', 'A21' ],
+    'A55i'                                      => [ 'Karbonn', 'Smart A55i' ],
+    'Alfa A93 POP'                              => [ 'Karbonn', 'Alfa A93 Pop' ],
+    'A111'                                      => [ 'Karbonn', 'A111' ],
+    'K9 Smart 4G'                               => [ 'Karbonn', 'K9 Smart 4G' ],
+    'Sparkle V'                                 => [ 'Karbonn', 'Sparkle V' ],
+    'ST10'                                      => [ 'Karbonn', 'Smart Tab 10 Cosmic', DeviceType::TABLET ],
+    'SmartTab1'                                 => [ 'Karbonn', 'Smart Tab 1', DeviceType::TABLET ],
+    'KB901'                                     => [ 'Kaser', 'KB901', DeviceType::TABLET ],
+
+    '(KAZAM|Thunder|Tornado|Trooper)!!' => [
+        'KAZAM TV 45'                               => [ 'KAZAM', 'TV 45' ],
+        'KAZAM Thunder 345'                         => [ 'KAZAM', 'Thunder 345' ],
+        'KAZAM Thunder 345 LTE'                     => [ 'KAZAM', 'Thunder 345' ],
+        'KAZAM Thunder 345L'                        => [ 'KAZAM', 'Thunder 345L' ],
+        'Thunder 347'                               => [ 'KAZAM', 'Thunder 347' ],
+        'KAZAM Thunder 350L'                        => [ 'KAZAM', 'Thunder 350L' ],
+        'KAZAM Thunder 550'                         => [ 'KAZAM', 'Thunder 550' ],
+        'KAZAM Thunder 550L'                        => [ 'KAZAM', 'Thunder 550L' ],
+        'KAZAM Thunder Q45'                         => [ 'KAZAM', 'Thunder Q4.5' ],
+        'KAZAM THUNDER2 45L'                        => [ 'KAZAM', 'Thunder 2 4.5L' ],
+        'KAZAM Thunder2 50'                         => [ 'KAZAM', 'Thunder 2 5.0' ],
+        'Thunder3 45 LTE'                           => [ 'KAZAM', 'Thunder 3 4.5' ],
+        'Tornado 348'                               => [ 'KAZAM', 'Tornado 348' ],
+        'KAZAM Tornado 350'                         => [ 'KAZAM', 'Tornado 350' ],
+        'KAZAM Tornado 455L'                        => [ 'KAZAM', 'Tornado 455L' ],
+        'KAZAM Tornado2 50'                         => [ 'KAZAM', 'Tornado 2 5.0' ],
+        'KAZAM Trooper 440L'                        => [ 'KAZAM', 'Trooper 440L' ],
+        'KAZAM Trooper 445L'                        => [ 'KAZAM', 'Trooper 445L' ],
+        'KAZAM Trooper 450'                         => [ 'KAZAM', 'Trooper 450' ],
+        'KAZAM Trooper 450L'                        => [ 'KAZAM', 'Trooper 450L' ],
+        'KAZAM Trooper 451'                         => [ 'KAZAM', 'Trooper 451' ],
+        'KAZAM Trooper 455'                         => [ 'KAZAM', 'Trooper 455' ],
+        'KAZAM Trooper 540'                         => [ 'KAZAM', 'Trooper 540' ],
+        'KAZAM Trooper 550'                         => [ 'KAZAM', 'Trooper 550' ],
+        'KAZAM Trooper 550L'                        => [ 'KAZAM', 'Trooper 550L' ],
+        'KAZAM Trooper 551'                         => [ 'KAZAM', 'Trooper 551' ],
+        'KAZAM Trooper 555'                         => [ 'KAZAM', 'Trooper 555' ],
+        'Trooper X35'                               => [ 'KAZAM', 'Trooper X3.5' ],
+        'Trooper X40'                               => [ 'KAZAM', 'Trooper X4.0' ],
+        'KAZAM Trooper X45'                         => [ 'KAZAM', 'Trooper X4.5' ],
+        'KAZAM Trooper X50'                         => [ 'KAZAM', 'Trooper X5.0' ],
+        'Trooper X55'                               => [ 'KAZAM', 'Trooper X5.5' ],
+        'KAZAM Trooper2 40'                         => [ 'KAZAM', 'Trooper 2 4.0' ],
+        'Trooper2 45'                               => [ 'KAZAM', 'Trooper 2 4.5' ],
+        'KAZAM Trooper2 50'                         => [ 'KAZAM', 'Trooper 2 5.0' ],
+        'Kazam Trooper2 60'                         => [ 'KAZAM', 'Trooper 2 6.0' ],
+    ],
+
+    'MT791'                                     => [ 'Keen High', 'MT791' ],
+
+    'KENEKSI' => [
+        'KENEKSI FIRE'                              => [ 'KENEKSI', 'Fire' ],
+        'KENEKSI-Fire'                              => [ 'KENEKSI', 'Fire' ],
+        'KENEKSI-Norma'                             => [ 'KENEKSI', 'Norma' ],
+        'KENEKSI-SIGMA'                             => [ 'KENEKSI', 'Sigma' ],
+        'KENEKSI-ZETA'                              => [ 'KENEKSI', 'Zeta' ],
+    ],
+
+    'Pro 10 dual core'                          => [ 'Kiano', 'Pro 10 Dual', DeviceType::TABLET ],
+    'KIOTO 793'                                 => [ 'KIOTO', '793' ],
+    'D91'                                       => [ 'KK', 'D91', DeviceType::TABLET ],
+    'K080'                                      => [ 'Kobo', 'K080', DeviceType::EREADER ],
+    'Vox'                                       => [ 'Kobo', 'Vox', DeviceType::EREADER ],
+    'M1050S'                                    => [ 'KOCASO', 'M1050S', DeviceType::TABLET ],
+    'SX9701W'                                   => [ 'KOCASO', 'SX9701W', DeviceType::TABLET ],
+
+    '(KATBL|Agora)!!' => [
+        'KATBL07AND'                                => [ 'Kogan', 'Agora' ],
+        'KATBL10A16DA'                              => [ 'Kogan', 'Agora' ],
+        'KATBL10A16E'                               => [ 'Kogan', 'Agora' ],
+        'KATBL10AND'                                => [ 'Kogan', 'Agora' ],
+        'Agora 4G'                                  => [ 'Kogan', 'Agora 4G' ],
+        'Agora HD+'                                 => [ 'Kogan', 'Agora HD+' ],
+        'Agora Quad Core'                           => [ 'Kogan', 'Agora Quad Core' ],
+    ],
+
+    'KOMU!!' => [
+        'Komu Color'                                => [ 'Komu', 'Color' ],
+        'KOMU ENERGY'                               => [ 'Komu', 'Energy' ],
+        'KOMU-MINI'                                 => [ 'Komu', 'Mini' ],
+    ],
+
+    'V1'                                        => [ 'Konka', 'KOMI V1' ],
+
+    'KONKA!!' => [
+        'KONKA V615'                                => [ 'Konka', 'V615' ],
+        'KONKA-V915'                                => [ 'Konka', 'V915' ],
+        'KONKA V923'                                => [ 'Konka', 'V923' ],
+        'KONKA V926'                                => [ 'Konka', 'V926' ],
+        'KONKA V927'                                => [ 'Konka', 'V927' ],
+        'KONKA V931'                                => [ 'Konka', 'V931' ],
+        'KONKA V980'                                => [ 'Konka', 'V980' ],
+        'KONKA V983'                                => [ 'Konka', 'V983' ],
+        'konka W970'                                => [ 'Konka', 'W970' ],
+        'konka W976'                                => [ 'Konka', 'W976' ],
+    ],
+
+    'K3'                                        => [ 'Konka', 'K3' ],
+    'W990'                                      => [ 'Konka', 'W990' ],
+    'A106'                                      => [ 'koobee', 'A160' ],
+    'koobee-T550'                               => [ 'koobee', 'T550' ],
+
+    'Koobe!!' => [
+        'Koobe S7 Easy tablet'                      => [ 'Koobe', 'S7 Easy tablet', DeviceType::TABLET ],
+        'Koobe X8 Slim Quadrum tablet'              => [ 'Koobe', 'X8 Slim Quadrum tablet', DeviceType::TABLET ],
+    ],
+
+    'KORIDY H15'                                => [ 'Koridy', 'H15' ],
+    'KORIDY H16'                                => [ 'Koridy', 'H16' ],
+
+    'KPT!!' => [
+        'KPT A5'                                    => [ 'KPT', 'A5' ],
+        'KPT A6'                                    => [ 'KPT', 'A6' ],
+        'KPT A9'                                    => [ 'KPT', 'A9' ],
+        'KPT A9PLUS'                                => [ 'KPT', 'A9+' ],
+        'KPT A11PLUS'                               => [ 'KPT', 'A11+' ],
+        'KPT A58T'                                  => [ 'KPT', 'A58T' ],
+        'KPT A81PLUS'                               => [ 'KPT', 'A81+' ],
+        'KPT A88'                                   => [ 'KPT', 'A88' ],
+    ],
+
+    '(EV|KM)-[ES][0-9]{3,3}!!' => [
+        'EV-S100'                                   => [ 'Kttech', 'Take EV-S100' ],
+        'KM-E100'                                   => [ 'Kttech', 'Take LTE KM-E100' ],
+        'KM-S120'                                   => [ 'Kttech', 'Take 2 KM-S120' ],
+        'KM-S200'                                   => [ 'Kttech', 'Take Janus KM-S200' ],
+        'KM-S220'                                   => [ 'Kttech', 'Take Tachy KM-S220' ],
+        'KM-S220H'                                  => [ 'Kttech', 'Take Tachy KM-S220' ],
+        'KM-S300'                                   => [ 'Kttech', 'Take HD KM-S300' ],
+        'KM-S330'                                   => [ 'Kttech', 'Take Fit KM-S330' ],
+    ],
+
+    'Kurio!!' => [
+        'KurioPhone'                                => [ 'Kurio', 'Phone' ],
+        'Kurio4S'                                   => [ 'Kurio', '4S' ],
+        'Kurio7'                                    => [ 'Kurio', '7', DeviceType::TABLET ],
+        'Kurio7S'                                   => [ 'Kurio', '7S', DeviceType::TABLET ],
+        'Kurio-LTE'                                 => [ 'Kurio', '7X', DeviceType::TABLET ],
+        'Kurio10S'                                  => [ 'Kurio', '10S', DeviceType::TABLET ],
+        'Kurio-Lite'                                => [ 'Kurio', 'Lite', DeviceType::TABLET ],
+    ],
+
+    'Kyobo mirasol eReader'                     => [ 'Kyobo', 'eReader', DeviceType::EREADER ],
+    'ISW11K'                                    => [ 'Kyocera', 'DIGNO ISW11K', 'carrier' => 'au' ],
+
+    'KYL[0-9]{2,2}!!' => [
+        'KYL21'                                     => [ 'Kyocera', 'DIGNO S KYL21', 'carrier' => 'au' ],
+        'KYL22'                                     => [ 'Kyocera', 'DIGNO M KYL22', 'carrier' => 'au' ],
+    ],
+
+    'KC-01'                                     => [ 'Kyocera', 'KC-01' ],
+    'KC-S301AE'                                 => [ 'Kyocera', 'S301' ],
+    'KC-S701'                                   => [ 'Kyocera', 'TORQUE' ],
+    'KCP01K'                                    => [ 'Kyocera', 'LUCE' ],
+    'SKT01'                                     => [ 'Kyocera', 'TORQUE SKT01' ],
+
+    'WX04K'                                     => [ 'Kyocera', 'DIGNO Dual WX04K', 'carrier' => 'Willcom' ],
+    'WX06K'                                     => [ 'Kyocera', 'HONEY BEE WX06K', 'carrier' => 'Willcom' ],
+    'WX10K'                                     => [ 'Kyocera', 'DIGNO Dual 2 WX10K', 'carrier' => 'Willcom' ],
+    'JC-KSP8000'                                => [ 'Kyocera', 'Echo' ],
+    'KSP8000'                                   => [ 'Kyocera', 'Echo' ],
+    'Event'                                     => [ 'Kyocera', 'Event' ],
+    'Rise'                                      => [ 'Kyocera', 'Rise' ],
+    'Torque'                                    => [ 'Kyocera', 'Torque' ],
+    'Zio'                                       => [ 'Kyocera', 'Zio' ],
+    'E6782'                                     => [ 'Kyocera', 'Brigadier' ],
+    'Hydro'                                     => [ 'Kyocera', 'Hydro' ],
+    'Hydro PLUS'                                => [ 'Kyocera', 'Hydro PLUS' ],
+
+    '(USCC-|KYOCERA-)?E[0-9]{4,4}!!' => [
+        'KYOCERA-E6560'                             => [ 'Kyocera', 'DuraForce' ],
+        'E6560C'                                    => [ 'Kyocera', 'DuraForce' ],
+        'E6560L'                                    => [ 'Kyocera', 'DuraForce' ],
+        'E6560T'                                    => [ 'Kyocera', 'DuraForce' ],
+        'E6715'                                     => [ 'Kyocera', 'Torque XT' ],
+        'KYOCERA-E6715'                             => [ 'Kyocera', 'Torque XT' ],
+        'USCC-E6762'                                => [ 'Kyocera', 'DuraForce' ],
+        'KYOCERA-E6762'                             => [ 'Kyocera', 'DuraForce' ],
+        'E6782L'                                    => [ 'Kyocera', 'DuraScout' ],
+        'KYOCERA-E6790'                             => [ 'Kyocera', 'DuraForce XD' ],
+    ],
+
+    '(USCC-|KYOCERA-)?C[0-9]{4,4}!!' => [
+        'C51(20|21)!'                               => [ 'Kyocera', 'Milano' ],
+        'C5155'                                     => [ 'Kyocera', 'Rise' ],
+        'C5170'                                     => [ 'Kyocera', 'Hydro' ],
+        'C5215'                                     => [ 'Kyocera', 'Hydro EDGE' ],
+        'C5216'                                     => [ 'Kyocera', 'Hydro EDGE' ],
+        'C6522'                                     => [ 'Kyocera', 'Hydro XTRM' ],
+        'C6522N'                                    => [ 'Kyocera', 'Hydro XTRM' ],
+        'USCC-C6721'                                => [ 'Kyocera', 'Hydro XTRM' ],
+        'C6530'                                     => [ 'Kyocera', 'Hydro LIFE' ],
+        'C6530N'                                    => [ 'Kyocera', 'Hydro LIFE' ],
+        'C6725'                                     => [ 'Kyocera', 'Hydro VIBE' ],
+        'C6730'                                     => [ 'Kyocera', 'Hydro ICON' ],
+        'C6740'                                     => [ 'Kyocera', 'Hydro WAVE' ],
+        'C6740N'                                    => [ 'Kyocera', 'Hydro WAVE' ],
+        'C6742'                                     => [ 'Kyocera', 'Hydro VIEW' ],
+        'KYOCERA-C6742'                             => [ 'Kyocera', 'Hydro VIEW' ],
+        'C6743'                                     => [ 'Kyocera', 'Hydro REACH' ],
+        'C6745'                                     => [ 'Kyocera', 'Hydro AIR' ],
+        'KYOCERA-C6745'                             => [ 'Kyocera', 'Hydro AIR' ],
+        'C6750'                                     => [ 'Kyocera', 'Hydro Elite' ],
+    ],
+
+    'M9300'                                     => [ 'Kyocera', 'Echo' ],
+
+    'KY[FLTYV][0-9]{2,2}!!' => [
+        'KYF31'                                     => [ 'Kyocera', 'GRATINA KYF31', 'carrier' => 'au' ],
+        'KYL23'                                     => [ 'Kyocera', 'miraie KYL23', 'carrier' => 'au' ],
+        'KYY21'                                     => [ 'Kyocera', 'URBANO L01', 'carrier' => 'au' ],
+        'KYY22'                                     => [ 'Kyocera', 'URBANO L02', 'carrier' => 'au' ],
+        'KYY23'                                     => [ 'Kyocera', 'URBANO L03', 'carrier' => 'au' ],
+        'KYY24'                                     => [ 'Kyocera', 'TORQUE G01', 'carrier' => 'au' ],
+        'KYV31'                                     => [ 'Kyocera', 'URBANO V01', 'carrier' => 'au' ],
+        'KYV32'                                     => [ 'Kyocera', 'BASIO KYV32', 'carrier' => 'au' ],
+        'KYV34'                                     => [ 'Kyocera', 'URBANO V02', 'carrier' => 'au' ],
+        'KYV35'                                     => [ 'Kyocera', 'TORQUE G02', 'carrier' => 'au' ],
+        'KYV36'                                     => [ 'Kyocera', 'DIGNO rafre', 'carrier' => 'au' ],
+        'KYV37'                                     => [ 'Kyocera', 'Qua phone', 'carrier' => 'au' ],
+        'KYT31'                                     => [ 'Kyocera', 'Qua tab', DeviceType::TABLET, 'carrier' => 'au' ],
+    ],
+
+    'URBANO PROGRESSO'                          => [ 'Kyocera', 'URBANO PROGRESSO', 'carrier' => 'au' ],
+
+    '[0-9]0[0-9]KC?!!' => [
+        '101K'                                      => [ 'Kyocera', 'HONEY BEE 101K', 'carrier' => 'Softbank' ],
+        '201K'                                      => [ 'Kyocera', 'HONEY BEE 201K', 'carrier' => 'Softbank' ],
+        '202K'                                      => [ 'Kyocera', 'DIGNO R 202K', 'carrier' => 'Softbank' ],
+        '302KC'                                     => [ 'Kyocera', 'DIGNO T 302KC', 'carrier' => 'EMOBILE' ],
+        '404KC'                                     => [ 'Kyocera', 'DIGNO C 404KC', 'carrier' => 'Y! Mobile' ],
+        '503KC'                                     => [ 'Kyocera', 'DIGNO E 503KC', 'carrier' => 'Y! Mobile' ],
+    ],
+
+    'K-?Touch!!' => [
+        'K-touch A9'                                => [ 'K-Touch', 'A9' ],
+        'K-touch A10 Pro'                           => [ 'K-Touch', 'A10 Pro' ],
+        'Ktouch A11'                                => [ 'K-Touch', 'A11' ],
+        'K-touch A11plus'                           => [ 'K-Touch', 'A11+' ],
+        'Ktouch A15'                                => [ 'K-Touch', 'A15' ],
+        'K-Touch C666t'                             => [ 'K-Touch', 'C666' ],
+        'K-Touch C960t'                             => [ 'K-Touch', 'C960' ],
+        'K-Touch C966e'                             => [ 'K-Touch', 'C966' ],
+        'K-Touch C980t'                             => [ 'K-Touch', 'C980' ],
+        'K-Touch C986t'                             => [ 'K-Touch', 'C986' ],
+        'K-Touch C986t+'                            => [ 'K-Touch', 'C986' ],
+        'K-Touch C988t'                             => [ 'K-Touch', 'C988' ],
+        'K-Touch C990'                              => [ 'K-Touch', 'C990' ],
+        'K-Touch E7'                                => [ 'K-Touch', 'E7' ],
+        'K-Touch E79'                               => [ 'K-Touch', 'E79' ],
+        'K-Touch E70'                               => [ 'K-Touch', 'E70' ],
+        'K-Touch E80'                               => [ 'K-Touch', 'E80' ],
+        'K-Touch E88'                               => [ 'K-Touch', 'E88' ],
+        'K-Touch E616'                              => [ 'K-Touch', 'E616' ],
+        'K Touch E616'                              => [ 'K-Touch', 'E616' ],
+        'K-Touch E619'                              => [ 'K-Touch', 'E619' ],
+        'K-Touch E619+'                             => [ 'K-Touch', 'E619+' ],
+        'K-Touch E621'                              => [ 'K-Touch', 'E621' ],
+        'K-Touch E656'                              => [ 'K-Touch', 'E656' ],
+        'K-Touch E688'                              => [ 'K-Touch', 'E688' ],
+        'K-Touch E780'                              => [ 'K-Touch', 'E780' ],
+        'K-Touch E800'                              => [ 'K-Touch', 'E800' ],
+        'K-Touch E806'                              => [ 'K-Touch', 'E806' ],
+        'K-Touch L820'                              => [ 'K-Touch', 'L820' ],
+        'K-Touch Q4'                                => [ 'K-Touch', 'Q4' ],
+        'K-Touch S2'                                => [ 'K-Touch', 'S2' ],
+        'K-Touch S5'                                => [ 'K-Touch', 'S5' ],
+        'K-Touch S5 Beiaigeqian'                    => [ 'K-Touch', 'S5' ],
+        'K-Touch S5t'                               => [ 'K-Touch', 'S5t' ],
+        'K-Touch Titan S100'                        => [ 'K-Touch', 'Titan S100' ],
+        'K-Touch S757!'                             => [ 'K-Touch', 'S757' ],
+        'K-Touch S787'                              => [ 'K-Touch', 'S787' ],
+        'K-Touch T6'                                => [ 'K-Touch', 'T6' ],
+        'K-Touch T60'                               => [ 'K-Touch', 'T60' ],
+        'K-Touch T85+'                              => [ 'K-Touch', 'T85' ],
+        'K-Touch T90'                               => [ 'K-Touch', 'T90' ],
+        'K-Touch T91'                               => [ 'K-Touch', 'T91' ],
+        'K-Touch T93'                               => [ 'K-Touch', 'T93' ],
+        'K-Touch T96'                               => [ 'K-Touch', 'T96' ],
+        'K-TouchT580'                               => [ 'K-Touch', 'T580' ],
+        'K-Touch T619'                              => [ 'K-Touch', 'T619' ],
+        'K-Touch T-619'                             => [ 'K-Touch', 'T619' ],
+        'K-Touch T619+'                             => [ 'K-Touch', 'T619+' ],
+        'K-Touch T621'                              => [ 'K-Touch', 'T621' ],
+        'K-Touch T660'                              => [ 'K-Touch', 'T660' ],
+        'K-Touch T760'                              => [ 'K-Touch', 'T760' ],
+        'K-Touch T780'                              => [ 'K-Touch', 'T780' ],
+        'K-Touch T780+'                             => [ 'K-Touch', 'T780+' ],
+        'K-Touch T789'                              => [ 'K-Touch', 'T789' ],
+        'K-Touch T800'                              => [ 'K-Touch', 'T800' ],
+        'K-touch U2'                                => [ 'K-Touch', 'U2' ],
+        'K-Touch U6'                                => [ 'K-Touch', 'U6' ],
+        'K-Touch U7'                                => [ 'K-Touch', 'U7' ],
+        'K-Touch U8'                                => [ 'K-Touch', 'U8' ],
+        'K-Touch U9'                                => [ 'K-Touch', 'U9' ],
+        'K-Touch U10'                               => [ 'K-Touch', 'U10' ],
+        'K-Touch U81t'                              => [ 'K-Touch', 'U81t' ],
+        'K-Touch U83t'                              => [ 'K-Touch', 'U83t' ],
+        'K-Touch U86'                               => [ 'K-Touch', 'U86 Kiss' ],
+        'K-Touch Kiss'                              => [ 'K-Touch', 'U86 Kiss' ],
+        'K-Touch U90'                               => [ 'K-Touch', 'U90' ],
+        'K-Touch V5'                                => [ 'K-Touch', 'V5' ],
+        'KTouch v8'                                 => [ 'K-Touch', 'V8' ],
+        'K-Touch V8'                                => [ 'K-Touch', 'V8' ],
+        'KTouch v9'                                 => [ 'K-Touch', 'V9' ],
+        'K-Touch V9'                                => [ 'K-Touch', 'V9' ],
+        'K-Touch W68'                               => [ 'K-Touch', 'W68' ],
+        'K-Touch W70'                               => [ 'K-Touch', 'W70' ],
+        'K-Touch W88'                               => [ 'K-Touch', 'W88' ],
+        'K-Touch W610'                              => [ 'K-Touch', 'W610' ],
+        'K-TOUCH W610D'                             => [ 'K-Touch', 'W610D' ],
+        'K-Touch W619!'                             => [ 'K-Touch', 'W619' ],
+        'K-Touch W621'                              => [ 'K-Touch', 'W621' ],
+        'K-Touch W650!'                             => [ 'K-Touch', 'W650' ],
+        'K-Touch W655'                              => [ 'K-Touch', 'W655' ],
+        'K-Touch W656'                              => [ 'K-Touch', 'W656' ],
+        'K-Touch W658'                              => [ 'K-Touch', 'W658' ],
+        'K-Touch W688'                              => [ 'K-Touch', 'W688' ],
+        'K-Touch W700'                              => [ 'K-Touch', 'W700' ],
+        'Ktouch w700'                               => [ 'K-Touch', 'W700' ],
+        'K-Touch W700+'                             => [ 'K-Touch', 'W700+' ],
+        'K-Touch W710'                              => [ 'K-Touch', 'W710' ],
+        'K-Touch W719'                              => [ 'K-Touch', 'W719' ],
+        'K-Touch W760'                              => [ 'K-Touch', 'W760' ],
+        'K-Touch W780'                              => [ 'K-Touch', 'W780' ],
+        'K-Touch W806!'                             => [ 'K-Touch', 'W806' ],
+        'K-Touch W808'                              => [ 'K-Touch', 'W808' ],
+        'K-Touch Kis 1'                             => [ 'K-Touch', 'Kis 1' ],
+        'K-Touch Kis 2'                             => [ 'K-Touch', 'Kis 2' ],
+        'K-Touch Tou ch 1'                          => [ 'K-Touch', 'Tou ch 1' ],
+        'K-Touch Tou ch 2'                          => [ 'K-Touch', 'Tou ch 2' ],
+        'K-Touch Tou ch2'                           => [ 'K-Touch', 'Tou ch 2' ],
+        'K-Touch Tou ch 2c'                         => [ 'K-Touch', 'Tou ch 2 c' ],
+        'K-Touch Tou ch 3'                          => [ 'K-Touch', 'Tou ch 3' ],
+        'K-Touch Tou ch3'                           => [ 'K-Touch', 'Tou ch 3' ],
+        'K-Touch Tou ch3c'                          => [ 'K-Touch', 'Tou ch 3 c' ],
+        'K-Touch Tou ch3es'                         => [ 'K-Touch', 'Tou ch 3 es' ],
+        'K-Touch Tou ch 5'                          => [ 'K-Touch', 'Tou ch 5' ],
+    ],
+
+    'Nibiru H1'                                 => [ 'K-Touch', 'Niburu Mars One H1' ],
+    'E650'                                      => [ 'K-Touch', 'E650' ],
+    'E780'                                      => [ 'K-Touch', 'E780' ],
+    'E800'                                      => [ 'K-Touch', 'E800' ],
+    'E815'                                      => [ 'K-Touch', 'E815' ],
+    'W606'                                      => [ 'K-Touch', 'W606' ],
+    'W619'                                      => [ 'K-Touch', 'W619' ],
+    'W686'                                      => [ 'K-Touch', 'W686' ],
+    'W700'                                      => [ 'K-Touch', 'W700' ],
+    'W732'                                      => [ 'K-Touch', 'W732' ],
+    'W800'                                      => [ 'K-Touch', 'W800' ],
+    'W806'                                      => [ 'K-Touch', 'W806' ],
+    'W808'                                      => [ 'K-Touch', 'W808' ],
+    'W810'                                      => [ 'K-Touch', 'W810' ],
+    'W880'                                      => [ 'K-Touch', 'W880' ],
+
+    '(Lanix )?(Ilium|llium)!!' => [
+        'ILIUM L400'                                => [ 'Lanix', 'Ilium L400' ],
+        'Ilium L820'                                => [ 'Lanix', 'Ilium L820' ],
+        'ILIUM L900'                                => [ 'Lanix', 'Ilium L900' ],
+        'ILIUM L950'                                => [ 'Lanix', 'Ilium L950' ],
+        'ILIUM L1000'                               => [ 'Lanix', 'Ilium L1000' ],
+        'ILIUM L1100'                               => [ 'Lanix', 'Ilium L1100' ],
+        'Ilium L1200'                               => [ 'Lanix', 'Ilium L1200' ],
+        'Ilium LT500'                               => [ 'Lanix', 'Ilium LT500' ],
+        'Ilium S100'                                => [ 'Lanix', 'Ilium S100' ],
+        'Ilium S105'                                => [ 'Lanix', 'Ilium S105' ],
+        'ILIUM S106'                                => [ 'Lanix', 'Ilium S106' ],
+        'Lanix Ilium S115'                          => [ 'Lanix', 'Ilium S115' ],
+        'Ilium S115'                                => [ 'Lanix', 'Ilium S115' ],
+        'LANIX ILIUM S120'                          => [ 'Lanix', 'Ilium S120' ],
+        'ILIUM S120'                                => [ 'Lanix', 'Ilium S120' ],
+        'LANIX S120-U151'                           => [ 'Lanix', 'Ilium S120' ],
+        'ILIUM S130'                                => [ 'Lanix', 'Ilium S130' ],
+        'Ilium S200'                                => [ 'Lanix', 'Ilium S200' ],
+        'Lanix Ilium S210'                          => [ 'Lanix', 'Ilium S210' ],
+        'ILIUM S215'                                => [ 'Lanix', 'Ilium S215' ],
+        'LANIX ILIUM S220'                          => [ 'Lanix', 'Ilium S220' ],
+        'Lanix Ilium S400'                          => [ 'Lanix', 'Ilium S400' ],
+        'Ilium S400'                                => [ 'Lanix', 'Ilium S400' ],
+        'Lanix ILIUM S410'                          => [ 'Lanix', 'Ilium S410' ],
+        'Lanix Ilium S420'                          => [ 'Lanix', 'Ilium S420' ],
+        'Lanix Ilium S500'                          => [ 'Lanix', 'Ilium S500' ],
+        'ILIUM S520'                                => [ 'Lanix', 'Ilium S520' ],
+        'ILIUM S600'                                => [ 'Lanix', 'Ilium S600' ],
+        'ILIUM S670'                                => [ 'Lanix', 'Ilium S670' ],
+        'LANIX ILIUM S700'                          => [ 'Lanix', 'Ilium S700' ],
+        'ILIUM S700'                                => [ 'Lanix', 'Ilium S700' ],
+        'ILIUM X100'                                => [ 'Lanix', 'Ilium X100' ],
+        'ILIUM X110'                                => [ 'Lanix', 'Ilium X110' ],
+        'Ilium X200'                                => [ 'Lanix', 'Ilium X200' ],
+        'ILIUM X400'                                => [ 'Lanix', 'Ilium X400' ],
+        'Ilium X500B'                               => [ 'Lanix', 'Ilium X500B' ],
+        'iliumPAD'                                  => [ 'Lanix', 'Ilium Pad', DeviceType::TABLET ],
+        'ilium Pad E8'                              => [ 'Lanix', 'Ilium Pad E8', DeviceType::TABLET ],
+        'ilium Pad E10'                             => [ 'Lanix', 'Ilium Pad E10', DeviceType::TABLET ],
+        'ILIUM PAD E10Si'                           => [ 'Lanix', 'Ilium Pad E10 Si', DeviceType::TABLET ],
+        'llium Pad L8'                              => [ 'Lanix', 'Ilium Pad L8', DeviceType::TABLET ],
+    ],
+
+    'Lark!!' => [
+        'Lark Evolution X2 7'                       => [ 'Lark', 'Evolution X2 7', DeviceType::TABLET ],
+        'Lark Evolution X2 7 3G-GPS'                => [ 'Lark', 'Evolution X2 7', DeviceType::TABLET ],
+        'Lark FreeMe X2 7'                          => [ 'Lark', 'FreeMe X2 7', DeviceType::TABLET ],
+        'Lark FreeMe X2 7 ver.2'                    => [ 'Lark', 'FreeMe X2 7', DeviceType::TABLET ],
+    ],
+
+    'FlairE3'                                   => [ 'Lava', 'Flair E3' ],
+    'Flair P8'                                  => [ 'Lava', 'Flair P8' ],
+    'Flair Z1'                                  => [ 'Lava', 'Flair Z1' ],
+
+    'Iris!!' => [
+        'Iris78W'                                   => [ 'Lava', 'Iris 78w' ],
+        'iris 250'                                  => [ 'Lava', 'Iris 250' ],
+        'iris310s'                                  => [ 'Lava', 'Iris 310s' ],
+        'Iris 349'                                  => [ 'Lava', 'Iris 349' ],
+        'Iris 349+'                                 => [ 'Lava', 'Iris 349+' ],
+        'Iris349i'                                  => [ 'Lava', 'Iris 349i' ],
+        'Iris349s'                                  => [ 'Lava', 'Iris 349s' ],
+        'Iris 350'                                  => [ 'Lava', 'Iris 350' ],
+        'iris 350m'                                 => [ 'Lava', 'Iris 350M' ],
+        'iris 352Flair'                             => [ 'Lava', 'Iris 352 Flair' ],
+        'iris 352E'                                 => [ 'Lava', 'Iris 352e' ],
+        'iris353'                                   => [ 'Lava', 'Iris 353' ],
+        'iris354'                                   => [ 'Lava', 'Iris 354' ],
+        'iris 354'                                  => [ 'Lava', 'Iris 354' ],
+        'iris354e'                                  => [ 'Lava', 'Iris 354e' ],
+        'IRIS355'                                   => [ 'Lava', 'Iris 355' ],
+        'iris356'                                   => [ 'Lava', 'Iris 356' ],
+        'Iris 300'                                  => [ 'Lava', 'Iris 300' ],
+        'iris 360m'                                 => [ 'Lava', 'Iris 360M' ],
+        'iris400c'                                  => [ 'Lava', 'Iris 400 Colour' ],
+        'iris 400s'                                 => [ 'Lava', 'Iris 400s' ],
+        'iris 401e'                                 => [ 'Lava', 'Iris 401e' ],
+        'IRIS402'                                   => [ 'Lava', 'Iris 402' ],
+        'iris402+'                                  => [ 'Lava', 'Iris 402' ],
+        'iris 402e'                                 => [ 'Lava', 'Iris 402e' ],
+        'iris402e'                                  => [ 'Lava', 'Iris 402e' ],
+        'iris402P'                                  => [ 'Lava', 'Iris 402P' ],
+        'iris 404Flair'                             => [ 'Lava', 'Iris 404 Flair' ],
+        'iris404e'                                  => [ 'Lava', 'Iris 404e' ],
+        'iris405'                                   => [ 'Lava', 'Iris 405' ],
+        'iris405+'                                  => [ 'Lava', 'Iris 405+' ],
+        'iris 406Q'                                 => [ 'Lava', 'Iris 406Q' ],
+        'iris 408e'                                 => [ 'Lava', 'Iris 408e' ],
+        'iris 412'                                  => [ 'Lava', '3G 412' ],
+        'Iris 415'                                  => [ 'Lava', '3G 415' ],
+        'iris450'                                   => [ 'Lava', 'Iris 450' ],
+        'iris 450P'                                 => [ 'Lava', 'Iris 450P' ],
+        'iris454'                                   => [ 'Lava', '3G 454' ],
+        'IRIS 455'                                  => [ 'Lava', 'Iris 455' ],
+        'iris456'                                   => [ 'Lava', 'Iris 456' ],
+        'iris458Q'                                  => [ 'Lava', 'Iris 458Q' ],
+        'iris460'                                   => [ 'Lava', 'Iris 460' ],
+        'iris500'                                   => [ 'Lava', 'Iris 500' ],
+        'iris 500'                                  => [ 'Lava', 'Iris 500' ],
+        'IRIS 501'                                  => [ 'Lava', 'Iris 501' ],
+        'iris502'                                   => [ 'Lava', 'Iris 502' ],
+        'iris503'                                   => [ 'Lava', 'Iris 503' ],
+        'iris503e'                                  => [ 'Lava', 'Iris 503e' ],
+        'iris504Q'                                  => [ 'Lava', 'Iris 504Q' ],
+        'iris505'                                   => [ 'Lava', 'Iris 505' ],
+        'iris 505'                                  => [ 'Lava', 'Iris 505' ],
+        'iris506Q'                                  => [ 'Lava', 'Iris 506Q' ],
+        'iris510'                                   => [ 'Lava', 'Iris 510' ],
+        'iris 600'                                  => [ 'Lava', 'Iris 600' ],
+        'iris700'                                   => [ 'Lava', 'Iris 700' ],
+        'iris702'                                   => [ 'Lava', 'Iris 702' ],
+        'iris 705'                                  => [ 'Lava', 'Iris 705' ],
+        'iris708'                                   => [ 'Lava', 'Iris 708' ],
+        'iris 750'                                  => [ 'Lava', 'Iris 750' ],
+        'iris 810'                                  => [ 'Lava', 'Iris 810' ],
+        'iris 870'                                  => [ 'Lava', 'Iris 870' ],
+        'iris fuel10'                               => [ 'Lava', 'Iris fuel10' ],
+        'iris Fuel50'                               => [ 'Lava', 'Iris fuel50' ],
+        'iris Fuel60'                               => [ 'Lava', 'Iris fuel60' ],
+        'Iris Fuel F1'                              => [ 'Lava', 'Iris Fuel F1' ],
+        'iris pro 20'                               => [ 'Lava', 'Iris Pro 20' ],
+        'iris pro 30'                               => [ 'Lava', 'Iris Pro 30' ],
+        'iris SELFIE50'                             => [ 'Lava', 'Iris selfie 50' ],
+        'iris X1'                                   => [ 'Lava', 'Iris X1' ],
+        'irisX1+'                                   => [ 'Lava', 'Iris X1+' ],
+        'iris X5'                                   => [ 'Lava', 'Iris X5' ],
+        'irisX8'                                    => [ 'Lava', 'Iris X8' ],
+        'Iris X8 L'                                 => [ 'Lava', 'Iris X8 L' ],
+        'iris X9'                                   => [ 'Lava', 'Iris X9' ],
+    ],
+
+    '504Q'                                      => [ 'Lava', 'Iris 504Q' ],
+    '504Q+'                                     => [ 'Lava', 'Iris 504Q+' ],
+    '504QP'                                     => [ 'Lava', 'Iris 504QP' ],
+    'Alfa L'                                    => [ 'Lava', 'Iris Alfa L' ],
+    'Fuel F2'                                   => [ 'Lava', 'Iris Fuel F2' ],
+    'N320'                                      => [ 'Lava', 'Iris N320' ],
+    'X1 atom'                                   => [ 'Lava', 'Iris X1 Atom' ],
+    'X1 atom L'                                 => [ 'Lava', 'Iris X1 Atom L' ],
+    'X1 Atom s'                                 => [ 'Lava', 'Iris X1 Atom S' ],
+    'X1 Beats'                                  => [ 'Lava', 'Iris X1 Beats' ],
+    'X1 Grand'                                  => [ 'Lava', 'Iris X1 Grand' ],
+    'X1 mini'                                   => [ 'Lava', 'Iris X1 mini' ],
+    'X1 Selfie'                                 => [ 'Lava', 'Iris X1 Selfie' ],
+    'X9'                                        => [ 'Lava', 'Iris X9' ],
+    'LAVA iris 351'                             => [ 'Lava', 'Iris 351' ],
+    'LAVA iRIS 504q'                            => [ 'Lava', 'Iris 504Q' ],
+
+    'PixelV1'                                   => [ 'Lava', 'Pixel V1' ],
+    'Pixel V2'                                  => [ 'Lava', 'Pixel V2' ],
+    'Pixel V2+'                                 => [ 'Lava', 'Pixel V2+' ],
+
+    'Lava A89'                                  => [ 'Lava', 'A89' ],
+    'LAVA S12'                                  => [ 'Lava', 'S12' ],
+    'LAVA V5'                                   => [ 'Lava', 'V5' ],
+
+    'R30GT'                                     => [ 'Lavios', 'Revo R30GT', DeviceType::TABLET ],
+    'LEAGOOLG13'                                => [ 'LEAGOOL', 'G13' ],
+
+    'Le 1S'                                     => [ 'LeEco', 'Le 1s X500' ],
+    'Le X500'                                   => [ 'LeEco', 'Le 1s X500' ],
+    'Le X501'                                   => [ 'LeEco', 'Le 1s X501' ],
+    'Le X506'                                   => [ 'LeEco', 'Le 1s X506' ],
+    'Le X507'                                   => [ 'LeEco', 'Le 1s X507' ],
+    'Le X509'                                   => [ 'LeEco', 'Le 1s X509' ],
+    'Le X520'                                   => [ 'LeEco', 'Le 2 X520' ],
+    'Le X522'                                   => [ 'LeEco', 'Le S3 X522' ],
+    'Le X526'                                   => [ 'LeEco', 'Le 2 X526' ],
+    'Le X527'                                   => [ 'LeEco', 'Le 2 X527' ],
+    'Le X528'                                   => [ 'LeEco', 'Le 2 X528' ],
+    'Le X620'                                   => [ 'LeEco', 'Le 2 Pro X620' ],
+    'Le X621'                                   => [ 'LeEco', 'Le 2 Pro X621' ],
+    'Le X625'                                   => [ 'LeEco', 'Le 2 Pro X625' ],
+    'LEX720'                                    => [ 'LeEco', 'Le 3 Pro X720' ],
+    'Le X820'                                   => [ 'LeEco', 'Le Max 2 X820' ],
+    'Le X821'                                   => [ 'LeEco', 'Le Max 2 X821' ],
+    'Le X822'                                   => [ 'LeEco', 'Le Max 2 X822' ],
+    'Le X829'                                   => [ 'LeEco', 'Le Max 2 X829' ],
+    'Le X829M'                                  => [ 'LeEco', 'Le Max 2 X829' ],
+    'Le X920'                                   => [ 'LeEco', 'Le Max 3 X920' ],
+
+    'X527'                                      => [ 'LeEco', 'Le 2 X527' ],
+
+    'leepoo!!' => [
+        'leepoo i500'                               => [ 'Leepoo', 'i500' ],
+        'leepoo i580'                               => [ 'Leepoo', 'i580' ],
+        'leepoo i600'                               => [ 'Leepoo', 'i600' ],
+        'leepoo i800'                               => [ 'Leepoo', 'i800' ],
+    ],
+
+    'P5'                                        => [ 'Lemon', 'P5' ],
+    'LEMON P7'                                  => [ 'Lemon', 'P7' ],
+    'P105'                                      => [ 'Lemon', 'P105' ],
+    'Lemon S3'                                  => [ 'Lemon', 'S3' ],
+    'Lemon S8'                                  => [ 'Lemon', 'S8' ],
+
+    'Lenco!!' => [
+        'Lenco CARTAB-920'                          => [ 'Lenco', 'CarTab 920', DeviceType::TABLET ],
+        'Lenco CARTAB-925'                          => [ 'Lenco', 'CarTab 925', DeviceType::TABLET ],
+        'Lenco CoolTab-70'                          => [ 'Lenco', 'CoolTab 70', DeviceType::TABLET ],
+        'Lenco CoolTAB-72'                          => [ 'Lenco', 'CoolTab 72', DeviceType::TABLET ],
+        'Lenco CoolTab-80'                          => [ 'Lenco', 'CoolTab 80', DeviceType::TABLET ],
+        'Lenco KidzTab-70'                          => [ 'Lenco', 'KidzTab 70', DeviceType::TABLET ],
+        'Lenco KidzTab-520'                         => [ 'Lenco', 'KidzTab 520', DeviceType::TABLET ],
+        'Lenco TAB-704'                             => [ 'Lenco', 'TAB 704', DeviceType::TABLET ],
+        'Lenco TAB-712'                             => [ 'Lenco', 'TAB 712', DeviceType::TABLET ],
+        'Lenco TAB-813'                             => [ 'Lenco', 'TAB 813', DeviceType::TABLET ],
+        'Lenco TAB-832'                             => [ 'Lenco', 'TAB 832', DeviceType::TABLET ],
+        'Lenco TAB-900'                             => [ 'Lenco', 'TAB 900', DeviceType::TABLET ],
+        'Lenco TAB-925'                             => [ 'Lenco', 'TAB 925', DeviceType::TABLET ],
+        'Lenco TAB-1014'                            => [ 'Lenco', 'TAB 1014', DeviceType::TABLET ],
+        'Lenco TAB-1020'                            => [ 'Lenco', 'TAB 1020', DeviceType::TABLET ],
+        'Lenco TAB-1022'                            => [ 'Lenco', 'TAB 1022', DeviceType::TABLET ],
+        'Lenco TAB-1030'                            => [ 'Lenco', 'TAB 1030', DeviceType::TABLET ],
+        'Lenco TAB-9720'                            => [ 'Lenco', 'TAB 9720', DeviceType::TABLET ],
+    ],
+
+    'LENCM900HZ'                                => [ 'Lenco', 'TAB 811', DeviceType::TABLET ],
+    'TAB1011'                                   => [ 'Lenco', 'TAB 1011', DeviceType::TABLET ],
+    'TAB-1030'                                  => [ 'Lenco', 'TAB 1030', DeviceType::TABLET ],
+    'ThinkPad( Tablet)?!'                       => [ 'Lenovo', 'ThinkPad Tablet', DeviceType::TABLET ],
+    'IdeaPad A1'                                => [ 'Lenovo', 'IdeaPad A1', DeviceType::TABLET ],
+    'Lenovo A1-32AB0'                           => [ 'Lenovo', 'IdeaPad A1', DeviceType::TABLET ],
+    'Lenovo A1-32AJ0'                           => [ 'Lenovo', 'IdeaPad A1', DeviceType::TABLET ],
+    'IdeaPadA10'                                => [ 'Lenovo', 'IdeaPad A10', DeviceType::TABLET ],
+    'K1'                                        => [ 'Lenovo', 'IdeaPad K1', DeviceType::TABLET ],
+    'Ideapad K1!'                               => [ 'Lenovo', 'IdeaPad K1', DeviceType::TABLET ],
+    'Ideapad S10-3T'                            => [ 'Lenovo', 'IdeaPad S10-3T', DeviceType::TABLET ],
+    'Lenovo IdeaPad Yoga 11S'                   => [ 'Lenovo', 'IdeaPad Yoga 11S', DeviceType::TABLET ],
+    'Lenovo IdeaPad Yoga 13'                    => [ 'Lenovo', 'IdeaPad Yoga 13', DeviceType::TABLET ],
+
+    '(Lenovo ?)?(IdeaTab ?)?[AB][0-9]{4,4}!!' => [
+        'Lenovo A1000L-F'                           => [ 'Lenovo', 'IdeaTab A1000', DeviceType::TABLET ],
+        'IdeaTab ?A1000(-F|-G|-T)!'                 => [ 'Lenovo', 'IdeaTab A1000', DeviceType::TABLET ],
+        'IdeaTab ?A1000(L-F)!'                      => [ 'Lenovo', 'IdeaTab A1000', DeviceType::TABLET ],
+        'IdeaTab ?A1010(-T)!'                       => [ 'Lenovo', 'IdeaTab A1010', DeviceType::TABLET ],
+        'IdeaTab ?A1020(-T)!'                       => [ 'Lenovo', 'IdeaTab A1020', DeviceType::TABLET ],
+        'IdeaTab ?A1107!'                           => [ 'Lenovo', 'IdeaTab A1107', DeviceType::TABLET ],
+        'Lenovo A2010-a'                            => [ 'Lenovo', 'IdeaTab A2010', DeviceType::TABLET ],
+        'Lenovo A2010l36'                           => [ 'Lenovo', 'IdeaTab A2010', DeviceType::TABLET ],
+        'Lenovo A2105'                              => [ 'Lenovo', 'IdeaTab A2105', DeviceType::TABLET ],
+        'Lenovo A2107'                              => [ 'Lenovo', 'IdeaTab A2107', DeviceType::TABLET ],
+        'IdeaTab ?A2107(A-F|A-H)!'                  => [ 'Lenovo', 'IdeaTab A2107', DeviceType::TABLET ],
+        'A2107A-H'                                  => [ 'Lenovo', 'IdeaTab A2107', DeviceType::TABLET ],
+        'IdeaTab ?A2109(A)!'                        => [ 'Lenovo', 'IdeaTab A2109', DeviceType::TABLET ],
+        'A2109A'                                    => [ 'Lenovo', 'IdeaTab A2109', DeviceType::TABLET ],
+        'IdeaTab ?A2207(A-H)!'                      => [ 'Lenovo', 'IdeaTab A2207', DeviceType::TABLET ],
+        'IdeaTab ?A3000-(F|H)!'                     => [ 'Lenovo', 'IdeaTab A3000', DeviceType::TABLET ],
+        'Lenovo A3000-H!'                           => [ 'Lenovo', 'IdeaTab A3000', DeviceType::TABLET ],
+        'LENOVO IdeaTab A3000-H'                    => [ 'Lenovo', 'IdeaTab A3000', DeviceType::TABLET ],
+        'Lenovo ?A3300(-H|-HV|-GV|-T)!'             => [ 'Lenovo', 'IdeaTab A3300', DeviceType::TABLET ],
+        'Lenovo A3500(-F|-FL|-H|-HV)!'              => [ 'Lenovo', 'IdeaTab A3500', DeviceType::TABLET ],
+        'IdeaTab ?A5000-E!'                         => [ 'Lenovo', 'IdeaTab A5000', DeviceType::TABLET ],
+        'Lenovo A5500(-F|-HV|-H|HV)?!'              => [ 'Lenovo', 'IdeaTab A5500', DeviceType::TABLET ],
+        'Lenovo A7600(-F|-HV|-H|H)!'                => [ 'Lenovo', 'IdeaTab A7600', DeviceType::TABLET ],
+        'Lenovo B6000(-F|-H)!'                      => [ 'Lenovo', 'B6000 Yoga Tablet 8', DeviceType::TABLET ],
+        'Lenovo B8000(-F|-H)!'                      => [ 'Lenovo', 'B8000 Yoga Tablet 10', DeviceType::TABLET ],
+        'Lenovo B8080(-F|-H|-HV)!'                  => [ 'Lenovo', 'B8080 Yoga Tablet 10', DeviceType::TABLET ],
+    ],
+
+    'YOGA Tablet!!' => [
+        'YOGA Tablet 2-830F'                        => [ 'Lenovo', 'Yoga Tablet 2 830F', DeviceType::TABLET ],
+        'YOGA Tablet 2-830L'                        => [ 'Lenovo', 'Yoga Tablet 2 830L', DeviceType::TABLET ],
+        'YOGA Tablet 2-830LC'                       => [ 'Lenovo', 'Yoga Tablet 2 830LC', DeviceType::TABLET ],
+        'YOGA Tablet 2-1050F'                       => [ 'Lenovo', 'Yoga Tablet 2 1050F', DeviceType::TABLET ],
+        'YOGA Tablet 2-1050L'                       => [ 'Lenovo', 'Yoga Tablet 2 1050L', DeviceType::TABLET ],
+        'YOGA Tablet 2-1050LC'                      => [ 'Lenovo', 'Yoga Tablet 2 1050LC', DeviceType::TABLET ],
+        'YOGA Tablet 2 Pro-1380F'                   => [ 'Lenovo', 'Yoga Tablet 2 Pro 1380F', DeviceType::TABLET ],
+        'YOGA Tablet 2 Pro-1380L'                   => [ 'Lenovo', 'Yoga Tablet 2 Pro 1380L', DeviceType::TABLET ],
+        'YOGA Tablet 3 Pro-1381L'                   => [ 'Lenovo', 'Yoga Tablet 3 Pro 1381L', DeviceType::TABLET ],
+        'YOGA Tablet 8 Pro-1386L'                   => [ 'Lenovo', 'Yoga Tablet 8 Pro 1386L', DeviceType::TABLET ],
+    ],
+
+    'Lenovo YB1-X90L'                           => [ 'Lenovo', 'Yoga Book', DeviceType::TABLET ],
+    'Lenovo YT3-X50F'                           => [ 'Lenovo', 'Yoga Tablet 3', DeviceType::TABLET ],
+    'Lenovo YT3-X90L'                           => [ 'Lenovo', 'Yoga Tablet 3 Pro', DeviceType::TABLET ],
+
+    '(Lenovo )?(Tab ?)?(2 ?)?[AS](7|8|10)!!' => [
+        'Lenovo A7'                                 => [ 'Lenovo', 'Tab A7', DeviceType::TABLET ],
+        'Lenovo A7-60HC'                            => [ 'Lenovo', 'Tab A7', DeviceType::TABLET ],
+        'Lenovo A10-70LC'                           => [ 'Lenovo', 'Tab A10', DeviceType::TABLET ],
+        'Lenovo 2 A7-30(F|HC|TC)!'                  => [ 'Lenovo', 'Tab 2 A7', DeviceType::TABLET ],
+        'Tab2A7-(10|20)!'                           => [ 'Lenovo', 'Tab 2 A7', DeviceType::TABLET ],
+        'Lenovo TAB 2 A7-30(D|F|H|DC|GC|HC)!'       => [ 'Lenovo', 'Tab 2 A7', DeviceType::TABLET ],
+        'Lenovo 2 A8-50(F|L|LC)!'                   => [ 'Lenovo', 'Tab 2 A8', DeviceType::TABLET ],
+        'Lenovo TAB 2 A8-50(F|L|LC)!'               => [ 'Lenovo', 'Tab 2 A8', DeviceType::TABLET ],
+        'Lenovo TAB 2 A10-70(F|L)!'                 => [ 'Lenovo', 'Tab 2 A10', DeviceType::TABLET ],
+        'Lenovo TAB S8-50(F|L|LC)!'                 => [ 'Lenovo', 'Tab S8', DeviceType::TABLET ],
+        'Lenovo S8-50LC'                            => [ 'Lenovo', 'Tab S8', DeviceType::TABLET ],
+    ],
+
+    '(Lenovo ?)?(IdeaTab ?)?[KSV][0-9]{4,4}!!' => [
+        'IdeaTab ?K2110A-(F)!'                      => [ 'Lenovo', 'IdeaTab K2110', DeviceType::TABLET ],
+        'S2005A-H'                                  => [ 'Lenovo', 'IdeaTab S2005', DeviceType::TABLET ],
+        'lenovo S2005'                              => [ 'Lenovo', 'IdeaTab S2005', DeviceType::TABLET ],
+        'IdeaTab ?S2007A-(D|F|H)!'                  => [ 'Lenovo', 'IdeaTab S2007', DeviceType::TABLET ],
+        'IdeaTab ?S2010A-(D|F|H)!'                  => [ 'Lenovo', 'IdeaTab S2010', DeviceType::TABLET ],
+        'IdeaTab ?S2109A-(F)!'                      => [ 'Lenovo', 'IdeaTab S2109', DeviceType::TABLET ],
+        'IdeaTab ?S2110(AF|AH)!'                    => [ 'Lenovo', 'IdeaTab S2110', DeviceType::TABLET ],
+        'IdeaTab ?A2207A-(F)!'                      => [ 'Lenovo', 'IdeaTab S2207', DeviceType::TABLET ],
+        'Lenovo S5000'                              => [ 'Lenovo', 'IdeaTab S5000', DeviceType::TABLET ],
+        'Lenovo S5000-(F|H)!'                       => [ 'Lenovo', 'IdeaTab S5000', DeviceType::TABLET ],
+        'IdeaTab ?S6000L?-(F|H)!'                   => [ 'Lenovo', 'IdeaTab S6000', DeviceType::TABLET ],
+        'Lenovo S6000-H'                            => [ 'Lenovo', 'IdeaTab S6000', DeviceType::TABLET ],
+        'Lenovo S6000L-(F|H)!'                      => [ 'Lenovo', 'IdeaTab S6000', DeviceType::TABLET ],
+        'LENOVO IdeaTab S6000-H'                    => [ 'Lenovo', 'IdeaTab S6000', DeviceType::TABLET ],
+        'IdeaTab ?V2007(A|A-D-I)!'                  => [ 'Lenovo', 'IdeaTab V2007', DeviceType::TABLET ],
+        'IdeaTab ?V2010(A)!'                        => [ 'Lenovo', 'IdeaTab V2010', DeviceType::TABLET ],
+    ],
+
+    'Lenovo Pad A4'                             => [ 'Lenovo', 'Pad A4', DeviceType::TABLET ],
+
+    'Lenovo'                                    => [ 'Lenovo', 'LePad', DeviceType::TABLET ],
+    'A1 07'                                     => [ 'Lenovo', 'LePad', DeviceType::TABLET ],
+    'lepad 001b'                                => [ 'Lenovo', 'LePad', DeviceType::TABLET ],
+    'lepad 001n'                                => [ 'Lenovo', 'LePad', DeviceType::TABLET ],
+
+    '(Lenovo |Lephone )?3GC101!'                => [ 'Lenovo', 'LePhone 3GC101' ],
+    '(Lenovo |Lephone )?3GW100!'                => [ 'Lenovo', 'LePhone 3GW100' ],
+    '(Lenovo |Lephone )?3GW101!'                => [ 'Lenovo', 'LePhone 3GW101' ],
+    '(Lenovo )?S1[- ]37AH0!'                    => [ 'Lenovo', 'LePhone S1' ],
+    '(Lenovo )?S2[- ]38A(H0|T0)!'               => [ 'Lenovo', 'LePhone S2' ],
+
+    'Lenovo!!' => [
+        'Lenovo A1000'                              => [ 'Lenovo', 'A1000' ],
+        'Lenovo A1600-d'                            => [ 'Lenovo', 'A1600' ],
+        'Lenovo A1900'                              => [ 'Lenovo', 'A1900' ],
+        'Lenovo A2580'                              => [ 'Lenovo', 'A2580' ],
+        'Lenovo A2800-d'                            => [ 'Lenovo', 'A2800' ],
+        'Lenovo A2860!'                             => [ 'Lenovo', 'A2860' ],
+        'Lenovo A3500'                              => [ 'Lenovo', 'A3500' ],
+        'Lenovo A5000!'                             => [ 'Lenovo', 'A5000' ],
+        'Lenovo A6000!'                             => [ 'Lenovo', 'A6000' ],
+        'Lenovo A7000!'                             => [ 'Lenovo', 'A7000' ],
+        'Lenovo A116!'                              => [ 'Lenovo', 'A116' ],
+        'Lenovo A208!'                              => [ 'Lenovo', 'A208' ],
+        'Lenovo A218!'                              => [ 'Lenovo', 'A218' ],
+        'Lenovo A228t'                              => [ 'Lenovo', 'A228t' ],
+        'Lenovo A238!'                              => [ 'Lenovo', 'A238' ],
+        'Lenovo A269!'                              => [ 'Lenovo', 'A269' ],
+        'Lenovo A278!'                              => [ 'Lenovo', 'A278' ],
+        'Lenovo ?A288!'                             => [ 'Lenovo', 'A288' ],
+        'Lenovo ?A298!'                             => [ 'Lenovo', 'A298' ],
+        'Lenovo A300!'                              => [ 'Lenovo', 'A300' ],
+        'Lenovo A305!'                              => [ 'Lenovo', 'A305' ],
+        'Lenovo A308!'                              => [ 'Lenovo', 'A308' ],
+        'Lenovo A316!'                              => [ 'Lenovo', 'A316' ],
+        'Lenovo A318!'                              => [ 'Lenovo', 'A318' ],
+        'Lenovo A319!'                              => [ 'Lenovo', 'A319' ],
+        'Lenovo A320!'                              => [ 'Lenovo', 'A320' ],
+        'Lenovo A326!'                              => [ 'Lenovo', 'A326' ],
+        'Lenovo A328!'                              => [ 'Lenovo', 'A328' ],
+        'Lenovo A330!'                              => [ 'Lenovo', 'A330' ],
+        'Lenovo A338!'                              => [ 'Lenovo', 'A338' ],
+        'Lenovo A355!'                              => [ 'Lenovo', 'A355' ],
+        'Lenovo A356!'                              => [ 'Lenovo', 'A356' ],
+        'Lenovo A358!'                              => [ 'Lenovo', 'A358' ],
+        'Lenovo A360!'                              => [ 'Lenovo', 'A360' ],
+        'Lenovo A365!'                              => [ 'Lenovo', 'A365' ],
+        'Lenovo A366!'                              => [ 'Lenovo', 'A366' ],
+        'Lenovo A368!'                              => [ 'Lenovo', 'A368' ],
+        'Lenovo A369!'                              => [ 'Lenovo', 'A369' ],
+        'Lenovo A370!'                              => [ 'Lenovo', 'A370' ],
+        'Lenovo A370!'                              => [ 'Lenovo', 'A370' ],
+        'Lenovo A375!'                              => [ 'Lenovo', 'A375' ],
+        'Lenovo A376!'                              => [ 'Lenovo', 'A376' ],
+        'Lenovo A378!'                              => [ 'Lenovo', 'A378' ],
+        'Lenovo A380!'                              => [ 'Lenovo', 'A380' ],
+        'Lenovo A385!'                              => [ 'Lenovo', 'A385' ],
+        'Lenovo A388!'                              => [ 'Lenovo', 'A388' ],
+        'Lenovo A390!'                              => [ 'Lenovo', 'A390' ],
+        'Lenovo A395!'                              => [ 'Lenovo', 'A395' ],
+        'Lenovo A396!'                              => [ 'Lenovo', 'A396' ],
+        'Lenovo A398!'                              => [ 'Lenovo', 'A398' ],
+        'Lenovo A399'                               => [ 'Lenovo', 'A399' ],
+        'Lenovo A500!'                              => [ 'Lenovo', 'A505' ],
+        'Lenovo A505!'                              => [ 'Lenovo', 'A500' ],
+        'Lenovo A516!'                              => [ 'Lenovo', 'A516' ],
+        'Lenovo A520!'                              => [ 'Lenovo', 'A520' ],
+        'Lenovo A526!'                              => [ 'Lenovo', 'A526' ],
+        'Lenovo A529!'                              => [ 'Lenovo', 'A529' ],
+        'Lenovo A530!'                              => [ 'Lenovo', 'A530' ],
+        'Lenovo A536!'                              => [ 'Lenovo', 'A536' ],
+        'Lenovo A560!'                              => [ 'Lenovo', 'A560' ],
+        'Lenovo A580!'                              => [ 'Lenovo', 'A580' ],
+        'Lenovo A586!'                              => [ 'Lenovo', 'A586' ],
+        'Lenovo ?A588!'                             => [ 'Lenovo', 'A588' ],
+        'Lenovo A590!'                              => [ 'Lenovo', 'A590' ],
+        'Lenovo A600!'                              => [ 'Lenovo', 'A600' ],
+        'Lenovo A606!'                              => [ 'Lenovo', 'A606' ],
+        'Lenovo A616!'                              => [ 'Lenovo', 'A616' ],
+        'Lenovo A628!'                              => [ 'Lenovo', 'A628' ],
+        'Lenovo A630!'                              => [ 'Lenovo', 'A630' ],
+        'Lenovo A656!'                              => [ 'Lenovo', 'A656' ],
+        'Lenovo A658!'                              => [ 'Lenovo', 'A658' ],
+        'Lenovo A660!'                              => [ 'Lenovo', 'A660' ],
+        'Lenovo A668!'                              => [ 'Lenovo', 'A668' ],
+        'Lenovo A670!'                              => [ 'Lenovo', 'A670' ],
+        'Lenovo A678!'                              => [ 'Lenovo', 'A678' ],
+        'Lenovo A680!'                              => [ 'Lenovo', 'A680' ],
+        'Lenovo A690!'                              => [ 'Lenovo', 'A690' ],
+        'Lenovo A698!'                              => [ 'Lenovo', 'A698' ],
+        'Lenovo A700!'                              => [ 'Lenovo', 'A700' ],
+        'Lenovo A706!'                              => [ 'Lenovo', 'A706' ],
+        'Lenovo A708!'                              => [ 'Lenovo', 'A708' ],
+        'Lenovo A710!'                              => [ 'Lenovo', 'A710' ],
+        'Lenovo A718!'                              => [ 'Lenovo', 'A718' ],
+        'Lenovo A720!'                              => [ 'Lenovo', 'A720' ],
+        'Lenovo A750!'                              => [ 'Lenovo', 'A750' ],
+        'Lenovo A760!'                              => [ 'Lenovo', 'A760' ],
+        'Lenovo A765!'                              => [ 'Lenovo', 'A765' ],
+        'Lenovo A766!'                              => [ 'Lenovo', 'A766' ],
+        'Lenovo A768t'                              => [ 'Lenovo', 'A768t' ],
+        'Lenovo A770!'                              => [ 'Lenovo', 'A770' ],
+        'Lenovo A780!'                              => [ 'Lenovo', 'A780' ],
+        'Lenovo A785!'                              => [ 'Lenovo', 'A785' ],
+        'Lenovo A788!'                              => [ 'Lenovo', 'A788' ],
+        'Lenovo A789!'                              => [ 'Lenovo', 'A789' ],
+        'Lenovo A790!'                              => [ 'Lenovo', 'A790' ],
+        'Lenovo A798!'                              => [ 'Lenovo', 'A798' ],
+        'Lenovo A800!'                              => [ 'Lenovo', 'A800' ],
+        'Lenovo A805!'                              => [ 'Lenovo', 'A805' ],
+        'Lenovo A806!'                              => [ 'Lenovo', 'A806' ],
+        'Lenovo A808!'                              => [ 'Lenovo', 'A808' ],
+        'Lenovo A816!'                              => [ 'Lenovo', 'A816' ],
+        'Lenovo ?A820!'                             => [ 'Lenovo', 'A820' ],
+        'lenovo-A820t'                              => [ 'Lenovo', 'A820' ],
+        'Lenovo A828!'                              => [ 'Lenovo', 'A828' ],
+        'Lenovo A830!'                              => [ 'Lenovo', 'A830' ],
+        'Lenovo A850!'                              => [ 'Lenovo', 'A850' ],
+        'Lenovo A858!'                              => [ 'Lenovo', 'A858' ],
+        'Lenovo A859!'                              => [ 'Lenovo', 'A859' ],
+        'Lenovo A860!'                              => [ 'Lenovo', 'A860' ],
+        'Lenovo A880!'                              => [ 'Lenovo', 'A880' ],
+        'Lenovo A889!'                              => [ 'Lenovo', 'A889' ],
+        'Lenovo A890!'                              => [ 'Lenovo', 'A890' ],
+        'Lenovo A916!'                              => [ 'Lenovo', 'A916' ],
+        'Lenovo A936!'                              => [ 'Lenovo', 'A936' ],
+        'Lenovo A938!'                              => [ 'Lenovo', 'A938' ],
+        'Lenovo A998!'                              => [ 'Lenovo', 'A998' ],
+        'Lenovo A60+?!'                             => [ 'Lenovo', 'A60' ],
+        'Lenovo A65!'                               => [ 'Lenovo', 'A65' ],
+        'Lenovo A66!'                               => [ 'Lenovo', 'A66' ],
+        'Lenovo A68!'                               => [ 'Lenovo', 'A68' ],
+        'Lenovo K800'                               => [ 'Lenovo', 'K800' ],
+        'Lenovo K860!'                              => [ 'Lenovo', 'K860' ],
+        'Lenovo K900!'                              => [ 'Lenovo', 'K900' ],
+        'Lenovo K910!'                              => [ 'Lenovo', 'K910' ],
+        'Lenovo K920!'                              => [ 'Lenovo', 'K920' ],
+        'Lenovo K80M'                               => [ 'Lenovo', 'K80' ],
+        'Lenovo K2'                                 => [ 'Lenovo', 'K2' ],
+        'Lenovo k30'                                => [ 'Lenovo', 'K3' ],
+        'Lenovo K30-T'                              => [ 'Lenovo', 'K3' ],
+        'Lenovo K30-TM'                             => [ 'Lenovo', 'K3' ],
+        'Lenovo K30-W'                              => [ 'Lenovo', 'K3' ],
+        'Lenovo K31-t3'                             => [ 'Lenovo', 'K3' ],
+        'Lenovo K3'                                 => [ 'Lenovo', 'K3' ],
+        'Lenovo K50a40'                             => [ 'Lenovo', 'K3 Note' ],
+        'Lenovo K50-t3s'                            => [ 'Lenovo', 'K3 Note' ],
+        'Lenovo K50-T5'                             => [ 'Lenovo', 'K3 Note' ],
+        'Lenovo K6'                                 => [ 'Lenovo', 'K6' ],
+        'Lenovo N300'                               => [ 'Lenovo', 'N300', DeviceType::DESKTOP ],
+        'Lenovo N308'                               => [ 'Lenovo', 'N308', DeviceType::DESKTOP ],
+        'Lenovo N908'                               => [ 'Lenovo', 'N908' ],
+        'Lenovo O3'                                 => [ 'Lenovo', 'O3' ],
+        'Lenovo P70'                                => [ 'Lenovo', 'P70' ],
+        'Lenovo P70-A'                              => [ 'Lenovo', 'P70' ],
+        'Lenovo P70-t'                              => [ 'Lenovo', 'P70' ],
+        'Lenovo P90'                                => [ 'Lenovo', 'P90' ],
+        'Lenovo P700!'                              => [ 'Lenovo', 'P700' ],
+        'Lenovo P770!'                              => [ 'Lenovo', 'P770' ],
+        'Lenovo-P770'                               => [ 'Lenovo', 'P770' ],
+        'Lenovo P780!'                              => [ 'Lenovo', 'P780' ],
+        'Lenovo P786!'                              => [ 'Lenovo', 'P786' ],
+        'Lenovo S60-a'                              => [ 'Lenovo', 'S60' ],
+        'Lenovo S60-t'                              => [ 'Lenovo', 'S60' ],
+        'Lenovo S60-w'                              => [ 'Lenovo', 'S60' ],
+        'Lenovo S90-A'                              => [ 'Lenovo', 'S90' ],
+        'Lenovo S90-e'                              => [ 'Lenovo', 'S90' ],
+        'Lenovo S90-L'                              => [ 'Lenovo', 'S90' ],
+        'Lenovo S90-t'                              => [ 'Lenovo', 'S90' ],
+        'Lenovo S90-u'                              => [ 'Lenovo', 'S90' ],
+        'Lenovo S560'                               => [ 'Lenovo', 'S560' ],
+        'Lenovo S580'                               => [ 'Lenovo', 'S580' ],
+        'Lenovo S650'                               => [ 'Lenovo', 'S650' ],
+        'Lenovo S658t'                              => [ 'Lenovo', 'S658' ],
+        'Lenovo S660'                               => [ 'Lenovo', 'S660' ],
+        'Lenovo S668t'                              => [ 'Lenovo', 'S668' ],
+        'Lenovo S680'                               => [ 'Lenovo', 'S680' ],
+        'Lenovo S686'                               => [ 'Lenovo', 'S686' ],
+        'Lenovo S696'                               => [ 'Lenovo', 'S696' ],
+        'Lenovo S720!'                              => [ 'Lenovo', 'S720' ],
+        'Lenovo S750'                               => [ 'Lenovo', 'S750' ],
+        'Lenovo S760'                               => [ 'Lenovo', 'S760' ],
+        'Lenovo S790'                               => [ 'Lenovo', 'S790' ],
+        'Lenovo S810!'                              => [ 'Lenovo', 'S810' ],
+        'Lenovo S820!'                              => [ 'Lenovo', 'S820' ],
+        'Lenovo S850!'                              => [ 'Lenovo', 'S850' ],
+        'Lenovo S856!'                              => [ 'Lenovo', 'S856' ],
+        'Lenovo S858!'                              => [ 'Lenovo', 'S858' ],
+        'Lenovo S860!'                              => [ 'Lenovo', 'S860' ],
+        'Lenovo S868t'                              => [ 'Lenovo', 'S868' ],
+        'Lenovo S870e'                              => [ 'Lenovo', 'S870' ],
+        'Lenovo S880!'                              => [ 'Lenovo', 'S880' ],
+        'Lenovo S890'                               => [ 'Lenovo', 'S890' ],
+        'Lenovo S898!'                              => [ 'Lenovo', 'S898' ],
+        'Lenovo ?S899!'                             => [ 'Lenovo', 'S899' ],
+        'lenovo S900i'                              => [ 'Lenovo', 'S900' ],
+        'Lenovo ?S920!'                             => [ 'Lenovo', 'S920' ],
+        'Lenovo S930'                               => [ 'Lenovo', 'S930' ],
+        'Lenovo S938!'                              => [ 'Lenovo', 'S938' ],
+        'Lenovo S939'                               => [ 'Lenovo', 'S939' ],
+        'Lenovo S950'                               => [ 'Lenovo', 'S950' ],
+        'Lenovo S960'                               => [ 'Lenovo', 'S960' ],
+        'Lenovo S968!'                              => [ 'Lenovo', 'S968' ],
+        'Lenovo W100'                               => [ 'Lenovo', 'W100' ],
+        'Lenovo A1010a20'                           => [ 'Lenovo', 'A Plus' ],
+        'Lenovo A2016a40'                           => [ 'Lenovo', 'Vibe B' ],
+        'Lenovo A7010a48'                           => [ 'Lenovo', 'Vibe K4 Note' ],
+        'Lenovo A7020a40'                           => [ 'Lenovo', 'Vibe K5 Note' ],
+        'Lenovo A7020a48'                           => [ 'Lenovo', 'Vibe K5 Note' ],
+        'Lenovo K10a40'                             => [ 'Lenovo', 'Vibe C2' ],
+        'Lenovo P2a42'                              => [ 'Lenovo', 'Vibe P2' ],
+        'Lenovo S1a40'                              => [ 'Lenovo', 'Vibe S1' ],
+        'Lenovo X2-(AP|CU|EU|TO|TR)!'               => [ 'Lenovo', 'Vibe X2' ],
+        'Lenovo Z90!'                               => [ 'Lenovo', 'Vibe Shot' ],
+        'Lenovo PB1-750M'                           => [ 'Lenovo', 'Phab' ],
+        'Lenovo PB1-770(M|N|P)!'                    => [ 'Lenovo', 'Phab Plus' ],
+        'Lenovo PB2-670M'                           => [ 'Lenovo', 'Phab 2 Plus' ],
+        'Lenovo X910'                               => [ 'Lenovo', 'X910' ],
+    ],
+
+    'A750'                                      => [ 'Lenovo', 'A750' ],
+    'A30t'                                      => [ 'Lenovo', 'A30' ],
+    'OPPOLenovo A60'                            => [ 'Lenovo', 'A60' ],
+    'K3 Note'                                   => [ 'Lenovo', 'K3 Note' ],
+    'P700i'                                     => [ 'Lenovo', 'P700i' ],
+    'S658t'                                     => [ 'Lenovo', 'S658' ],
+    'S720i'                                     => [ 'Lenovo', 'S720' ],
+    'S880'                                      => [ 'Lenovo', 'S880' ],
+
+    'VIBE X2 (X2)'                              => [ 'Lenovo', 'Vibe X2' ],
+    'VIBE X3'                                   => [ 'Lenovo', 'Vibe X3' ],
+    'VIBE Z2 Pro (K920)'                        => [ 'Lenovo', 'Vibe Z2 Pro' ],
+
+    'idea ?tv!!' => [
+        'ideatv A21'                                => [ 'Lenovo', 'IDEA TV', DeviceType::TELEVISION ],
+        'ideatv K72'                                => [ 'Lenovo', 'IDEA TV', DeviceType::TELEVISION ],
+        'ideatv K82'                                => [ 'Lenovo', 'IDEA TV', DeviceType::TELEVISION ],
+        'ideatv K91'                                => [ 'Lenovo', 'IDEA TV', DeviceType::TELEVISION ],
+        'IDEA TV T100'                              => [ 'Lenovo', 'IDEA TV', DeviceType::TELEVISION ],
+        'IDEA TV K91'                               => [ 'Lenovo', 'IDEA TV', DeviceType::TELEVISION ],
+        'ideatv S9'                                 => [ 'Lenovo', 'IDEA TV', DeviceType::TELEVISION ],
+        'ideatv S31'                                => [ 'Lenovo', 'IDEA TV', DeviceType::TELEVISION ],
+        'ideatv S51'                                => [ 'Lenovo', 'IDEA TV', DeviceType::TELEVISION ],
+        'ideatv S52'                                => [ 'Lenovo', 'IDEA TV', DeviceType::TELEVISION ],
+        'ideatv S61'                                => [ 'Lenovo', 'IDEA TV', DeviceType::TELEVISION ],
+    ],
+
+    'LenovoTV 40S9'                             => [ 'Lenovo', 'TV 40S9', DeviceType::TELEVISION ],
+    'LenovoTV 50S52'                            => [ 'Lenovo', 'TV 50S52', DeviceType::TELEVISION ],
+    '501LV'                                     => [ 'Lenovo', 'Tab2 501LV', 'carrier' => 'Softbank' ],
+
+    'ZUK Z1'                                    => [ 'Lenovo', 'ZUK Z1' ],
+    'ZUK Z2'                                    => [ 'Lenovo', 'ZUK Z2' ],
+    'ZUK Z2131'                                 => [ 'Lenovo', 'ZUK Z2' ],
+    'ZUK Z2151'                                 => [ 'Lenovo', 'ZUK Z2' ],
+    'Z2 Plus'                                   => [ 'Lenovo', 'ZUK Z2 Plus' ],
+    'ZUK Z2132'                                 => [ 'Lenovo', 'ZUK Z2 Plus' ],
+    'ZUK Z2121'                                 => [ 'Lenovo', 'ZUK Z2 Pro' ],
+
+    '(BLF-)?lephone!!' => [
+        'lephone 1800'                              => [ 'Lephone', '1800' ],
+        'BLF-lephone 1900'                          => [ 'Lephone', '1900' ],
+        'lephone 2800'                              => [ 'Lephone', '2800' ],
+        'lephone 2900'                              => [ 'Lephone', '2900' ],
+        'lephone T708'                              => [ 'Lephone', 'T708' ],
+        'Lephone TD506'                             => [ 'Lephone', 'TD506' ],
+        'Lephone TD8208'                            => [ 'Lephone', 'TD8208' ],
+    ],
+
+    'TD506'                                     => [ 'Lephone', 'TD506' ],
+
+    'MFC[0-9]!!' => [
+        'MFC190BBFR'                                => [ 'Lexibook', 'Barbie Tablet', DeviceType::TABLET ],
+        'MFC150DEX'                                 => [ 'Lexibook', 'First Tablet', DeviceType::TABLET ],
+        'MFC195FUDE'                                => [ 'Lexibook', 'Furby Tablet', DeviceType::TABLET ],
+        'MFC195FUFR'                                => [ 'Lexibook', 'Furby Tablet', DeviceType::TABLET ],
+        'MFC140FR1'                                 => [ 'Lexibook', 'LapTab', DeviceType::TABLET ],
+        'MFC141FR'                                  => [ 'Lexibook', 'LapTab 2', DeviceType::TABLET ],
+        'MFC162DE'                                  => [ 'Lexibook', 'Power Tablet', DeviceType::TABLET ],
+        'MFC162FR'                                  => [ 'Lexibook', 'Power Tablet', DeviceType::TABLET ],
+        'MFC180FR'                                  => [ 'Lexibook', 'Tablet Advanced', DeviceType::TABLET ],
+        'MFC181FR'                                  => [ 'Lexibook', 'Tablet Advanced 2', DeviceType::TABLET ],
+        'MFC195DCFR'                                => [ 'Lexibook', 'Tablet Disney Cars HD', DeviceType::TABLET ],
+        'MFC195DPFR'                                => [ 'Lexibook', 'Tablet Disney Princesse HD', DeviceType::TABLET ],
+        'MFC250FR'                                  => [ 'Lexibook', 'Tablet Junior', DeviceType::TABLET ],
+        'MFC280FR'                                  => [ 'Lexibook', 'Tablet Junior 2', DeviceType::TABLET ],
+        'MFC280DE'                                  => [ 'Lexibook', 'Tablet Junior 2', DeviceType::TABLET ],
+        'MFC270DE'                                  => [ 'Lexibook', 'Tablet Junior Power Touch', DeviceType::TABLET ],
+        'MFC270EN 09'                               => [ 'Lexibook', 'Tablet Junior Power Touch', DeviceType::TABLET ],
+        'MFC270FR'                                  => [ 'Lexibook', 'Tablet Junior Power Touch', DeviceType::TABLET ],
+        'mfc142fr'                                  => [ 'Lexibook', 'Tablet Kids', DeviceType::TABLET ],
+        'MFC155EN 09'                               => [ 'Lexibook', 'Tablet Master', DeviceType::TABLET ],
+        'MFC155ES'                                  => [ 'Lexibook', 'Tablet Master', DeviceType::TABLET ],
+        'MFC155FR'                                  => [ 'Lexibook', 'Tablet Master', DeviceType::TABLET ],
+        'MFC157FR'                                  => [ 'Lexibook', 'Tablet Master 2', DeviceType::TABLET ],
+        'MFC157CZ'                                  => [ 'Lexibook', 'Tablet Master 2', DeviceType::TABLET ],
+        'MFC163FR'                                  => [ 'Lexibook', 'Tablet Master 3', DeviceType::TABLET ],
+        'MFC156FR'                                  => [ 'Lexibook', 'Tablet One', DeviceType::TABLET ],
+        'MFC170FR'                                  => [ 'Lexibook', 'Tablet Ultra', DeviceType::TABLET ],
+        'MFC175FR'                                  => [ 'Lexibook', 'Tablet Ultra', DeviceType::TABLET ],
+        'MFC375FR'                                  => [ 'Lexibook', 'Tablet Ultra 2', DeviceType::TABLET ],
+        'mfc500fr'                                  => [ 'Lexibook', 'Tablet XL', DeviceType::TABLET ],
+        'MFC045FR'                                  => [ 'Lexibook', 'TabTab', DeviceType::TABLET ],
+    ],
+
+    'Le Pan TC802A'                             => [ 'Le Pan', 'Mini', DeviceType::TABLET ],
+    'TC970'                                     => [ 'Le Pan', 'TC970', DeviceType::TABLET ],
+    'TC970 (Wi-Fi)'                             => [ 'Le Pan', 'TC970', DeviceType::TABLET ],
+    'Le Pan TC1010'                             => [ 'Le Pan', 'TC1010', DeviceType::TABLET ],
+    'Le Pan TC1020'                             => [ 'Le Pan', 'TC1020', DeviceType::TABLET ],
+    'LePanII'                                   => [ 'Le Pan', 'II', DeviceType::TABLET ],
+    'TC975'                                     => [ 'Le Pan', 'III', DeviceType::TABLET ],
+    'Le Pan S'                                  => [ 'Le Pan', 'S', DeviceType::TABLET ],
+    'LG-AN160'                                  => [ 'LG', 'Fluid' ],
+
+    'LG-?AS[0-9]{3,3}!!' => [
+        'LGAS323'                                   => [ 'LG', 'L70' ],
+        'LG-AS323'                                  => [ 'LG', 'L70' ],
+        'LG-AS680'                                  => [ 'LG', 'Optimus 2' ],
+        'LG-AS695'                                  => [ 'LG', 'Optimus Plus' ],
+        'LG-AS730'                                  => [ 'LG', 'Optimus Select' ],
+        'LG-AS750'                                  => [ 'LG', 'L70' ],
+        'LG-AS780'                                  => [ 'LG', 'Optimus F7' ],
+        'LG-AS811'                                  => [ 'LG', 'G4' ],
+        'LG-AS840'                                  => [ 'LG', 'Optimus Tag' ],
+        'LG-AS855'                                  => [ 'LG', 'Ignite' ],
+        'LG-AS870'                                  => [ 'LG', 'Optimus F5' ],
+        'LG-AS876'                                  => [ 'LG', 'L70' ],
+        'LG-AS9(85|90)!'                            => [ 'LG', 'G3' ],
+        'LGAS991'                                   => [ 'LG', 'G4' ],
+
+        'LG-AS9(91)!'                               => [ 'LG', 'G4' ],
+        'LGAS995'                                   => [ 'LG', 'G Flex 2' ],
+    ],
+
+    'LG-?C[0-9]{3,3}!!' => [
+        'LG-C520'                                   => [ 'LG', 'C520' ],
+        'LG-C5(50|55)!'                             => [ 'LG', 'Optimus Chat' ],
+        'LGC660!'                                   => [ 'LG', 'Optimus Pro' ],
+        'LG-C660!'                                  => [ 'LG', 'Optimus Pro' ],
+        'LG-C710!'                                  => [ 'LG', 'Aloha' ],
+        'LG-C729'                                   => [ 'LG', 'DoublePlay' ],
+        'LG-C800G'                                  => [ 'LG', 'Eclypse' ],
+    ],
+
+    'LG-CX670'                                  => [ 'LG', 'Optimus One' ],
+
+    'LG-?D[0-9]{3,3}!!' => [
+        'LG-D1(00|05|07)!'                          => [ 'LG', 'L20' ],
+        'LG-D1(20|23|25|27)!'                       => [ 'LG', 'L30 Sporty' ],
+        'LG-D1(50|57)!'                             => [ 'LG', 'L35' ],
+        'LG-D1(60|65|70|75|80)!'                    => [ 'LG', 'L40' ],
+        'LG-D2(13|21|27)!'                          => [ 'LG', 'L50 Sporty' ],
+        'LG-D2(80|85)!'                             => [ 'LG', 'L65' ],
+        'LG-D2(90|95)!'                             => [ 'LG', 'L Fino' ],
+        'LG-D3(15|17)!'                             => [ 'LG', 'F70' ],
+        'LG-D3(20|21|25|29|30)!'                    => [ 'LG', 'L70' ],
+        'LGD321'                                    => [ 'LG', 'L70' ],
+        'LG-D3(30|31|35)!'                          => [ 'LG', 'L Bello' ],
+        'LG-D3(32)!'                                => [ 'LG', 'L80+' ],
+        'LG-D3(37)!'                                => [ 'LG', 'L Prime' ],
+        'LG-D340!'                                  => [ 'LG', 'L70 Tri' ],
+        'LG-D3(70|73|75|80|85)!'                    => [ 'LG', 'L80' ],
+        'LG-D3(90|92|93)!'                          => [ 'LG', 'F60' ],
+        'LG-D4(00|05|10|15)!'                       => [ 'LG', 'L90' ],
+        'LG-D486!'                                  => [ 'LG', 'Wine Smart' ],
+        'LGD500'                                    => [ 'LG', 'Optimus F6' ],
+        'LG-D5(00|05)!'                             => [ 'LG', 'Optimus F6' ],
+        'LG-D520!'                                  => [ 'LG', 'Optimus F3Q' ],
+        'LG-D605!'                                  => [ 'LG', 'Optimus L9 II' ],
+        'LG-D6(10|18|20|25)!'                       => [ 'LG', 'G2 mini' ],
+        'LGD618'                                    => [ 'LG', 'G2 mini' ],
+        'LG-D6(31)!'                                => [ 'LG', 'G3 Vista' ],
+        'LG-D6(80|81|82|83|84)!'                    => [ 'LG', 'G Pro Lite' ],
+        'LG-D6(85|86)!'                             => [ 'LG', 'G Pro Lite Dual' ],
+        'LG-D6(90|93)!'                             => [ 'LG', 'G3 Stylus' ],
+        'LG-D700!'                                  => [ 'LG', 'Optimus L9' ],
+        'LG-D722J!'                                 => [ 'LG', 'G3 Beat' ],
+        'LG-D7(22|24)!'                             => [ 'LG', 'G3 S' ],
+        'LG-D7(23)!'                                => [ 'LG', 'G3 mini' ],
+        'LG-D7(25|26|27)!'                          => [ 'LG', 'G3 Vigor' ],
+        'LG-D7(28|29)!'                             => [ 'LG', 'G3 Beat' ],
+        'LG-D8(00|01|02|03|05|06)!'                 => [ 'LG', 'G2' ],
+        'LG-D8(20|21)!'                             => [ 'LG', 'Nexus 5' ],
+        'LG-D8(30|37|38)!'                          => [ 'LG', 'G Pro 2' ],
+        'LG-D8(50|51|52|55|56|58|59)!'              => [ 'LG', 'G3' ],
+        'LG-D8(57)!'                                => [ 'LG', 'Titan' ],
+        'LG-D9(50|51|55|56|58|59)!'                 => [ 'LG', 'G Flex' ],
+    ],
+
+    'LG-DS1203'                                 => [ 'LG', 'G2' ],
+
+    'LG-?E[0-9]{3,3}!!' => [
+        'LG-E400!'                                  => [ 'LG', 'Optimus L3' ],
+        'LG-E405!'                                  => [ 'LG', 'Optimus L3 Dual' ],
+        'LG-E4(10|11)!'                             => [ 'LG', 'Optimus L1 II' ],
+        'LG-E4(15|20)!'                             => [ 'LG', 'Optimus L1 II Dual' ],
+        'LG-E4(25|30|31)!'                          => [ 'LG', 'Optimus L3 II' ],
+        'LG-E435!'                                  => [ 'LG', 'Optimus L3 II Dual' ],
+        'LG-E440!'                                  => [ 'LG', 'Optimus L4 II' ],
+        'LG-E445!'                                  => [ 'LG', 'Optimus L4 II Dual' ],
+        'LG-E4(50|51|60)!'                          => [ 'LG', 'Optimus L5 II' ],
+        'LG-E455!'                                  => [ 'LG', 'Optimus L5 II Dual' ],
+        'LG-E465!'                                  => [ 'LG', 'Optimus L4 II' ],
+        'LG-E467!'                                  => [ 'LG', 'Optimus L4 II Dual' ],
+        'LG-E470!'                                  => [ 'LG', 'Optimus L4 II Triple' ],
+        'LG-E475!'                                  => [ 'LG', 'Optimus L1 II Tri' ],
+        'LG-E510!'                                  => [ 'LG', 'Optimus Hub' ],
+        'LG-E6(10|12|17)!'                          => [ 'LG', 'Optimus L5' ],
+        'LGE610'                                    => [ 'LG', 'Optimus L5' ],
+        'LG-E6(14|15)!'                             => [ 'LG', 'Optimus L5 Dual' ],
+        'LGE615F'                                   => [ 'LG', 'Optimus L5 Dual' ],
+        'LG-E720!'                                  => [ 'LG', 'Optimus Chic' ],
+        'LG-E730!'                                  => [ 'LG', 'Optimus Sol' ],
+        'LG-E805!'                                  => [ 'LG', 'Optimus G2' ],
+        'LG-E940!'                                  => [ 'LG', 'Optimus G Pro' ],
+        'LG-E960!'                                  => [ 'LG', 'Nexus 4' ],
+        'LG-E9(70|71|73|75|76|77|78|87)!'           => [ 'LG', 'Optimus G' ],
+        'LG-E9(80|81|85|86|88|89)!'                 => [ 'LG', 'Optimus G Pro' ],
+    ],
+
+    'LG-F[0-9]{3,3}!!' => [
+        'LG-F100!'                                  => [ 'LG', 'Optimus Vu' ],
+        'LG-F120!'                                  => [ 'LG', 'Optimus LTE Tag' ],
+        'LG-F160!'                                  => [ 'LG', 'Optimus LTE II' ],
+        'LG-F180!'                                  => [ 'LG', 'Optimus G' ],
+        'LG-F200!'                                  => [ 'LG', 'Optimus Vu II' ],
+        'LG-F220!'                                  => [ 'LG', 'Optimus GK' ],
+        'LG-F240!'                                  => [ 'LG', 'Optimus G Pro' ],
+        'LG-F260!'                                  => [ 'LG', 'Optimus LTE III' ],
+        'LG-F300!'                                  => [ 'LG', 'Vu 3' ],
+        'LG-F310!'                                  => [ 'LG', 'GX' ],
+        'LG-F320!'                                  => [ 'LG', 'G2' ],
+        'LG-F340!'                                  => [ 'LG', 'G Flex' ],
+        'LG-F350!'                                  => [ 'LG', 'G Pro 2' ],
+        'LG-F370!'                                  => [ 'LG', 'F70' ],
+        'LG-F390!'                                  => [ 'LG', 'G2 mini' ],
+        'LG-F400!'                                  => [ 'LG', 'G3' ],
+        'LG-F410!'                                  => [ 'LG', 'G3 A' ],
+        'LG-F430!'                                  => [ 'LG', 'Gx2' ],
+        'LG-F440!'                                  => [ 'LG', 'ice cream smart' ],
+        'LG-F460!'                                  => [ 'LG', 'G3 Cat.6' ],
+        'LG-F470!'                                  => [ 'LG', 'G3 Beat' ],
+        'LG-F480!'                                  => [ 'LG', 'Wine Smart' ],
+        'LG-F490!'                                  => [ 'LG', 'G3 Screen' ],
+        'LG-F500!'                                  => [ 'LG', 'G4' ],
+        'LG-F510!'                                  => [ 'LG', 'G Flex 2' ],
+        'LG-F520!'                                  => [ 'LG', 'AKA' ],
+        'LG-F540!'                                  => [ 'LG', 'Volt' ],
+        'LG-F560!'                                  => [ 'LG', 'G Stylo' ],
+        'LG-F570!'                                  => [ 'LG', 'band Play' ],
+        'LG-F580!'                                  => [ 'LG', 'Gentle' ],
+        'LG-F590!'                                  => [ 'LG', 'L5000' ],
+        'LG-F600!'                                  => [ 'LG', 'V10' ],
+        'LG-F610!'                                  => [ 'LG', 'Wine Smart Jazz' ],
+        'LG-F620!'                                  => [ 'LG', 'Class' ],
+        'LG-F640!'                                  => [ 'LG', 'Volt S' ],
+        'LG-F650!'                                  => [ 'LG', 'X Screen' ],
+        'LG-F670!'                                  => [ 'LG', 'K10' ],
+        'LG-F700!'                                  => [ 'LG', 'G5' ],
+        'LG-F720!'                                  => [ 'LG', 'Stylus 2' ],
+        'LG-F740!'                                  => [ 'LG', 'X Skin' ],
+        'LG-F750!'                                  => [ 'LG', 'X Power' ],
+        'LG-F770!'                                  => [ 'LG', 'X5' ],
+        'LG-F800!'                                  => [ 'LG', 'V20' ],
+        'LG-F820!'                                  => [ 'LG', 'U' ],
+    ],
+
+    'LG-GT540!'                                 => [ 'LG', 'Optimus' ],
+    'LG-GW620!'                                 => [ 'LG', 'GW620 Eve' ],
+
+    'LG-H[0-9]{3,3}!!' => [
+        'LG-H2(20|21|22)!'                          => [ 'LG', 'Joy' ],
+        'LG-H3(20|24|26)!'                          => [ 'LG', 'Leon' ],
+        'LG-H3(40|42|45)!'                          => [ 'LG', 'Leon' ],
+        'LG-H3(43)!'                                => [ 'LG', 'Risio' ],
+        'LG-H410!'                                  => [ 'LG', 'Wine Smart' ],
+        'LG-H4(20|40|41)!'                          => [ 'LG', 'Spirit' ],
+        'LG-H4(22|42)!'                             => [ 'LG', 'Volt' ],
+        'LG-H4(43|45)!'                             => [ 'LG', 'Escape2' ],
+        'LG-H5(00|02|20)!'                          => [ 'LG', 'Magna' ],
+        'LG-H5(22)!'                                => [ 'LG', 'Prime Plus' ],
+        'LG-H5(25)!'                                => [ 'LG', 'G4c' ],
+        'LG-H5(40|42)!'                             => [ 'LG', 'G4 Stylus' ],
+        'LG-H6(30|31|34|35|36)!'                    => [ 'LG', 'G Stylo' ],
+        'LG-H650!'                                  => [ 'LG', 'Zero' ],
+        'LG-H700!'                                  => [ 'LG', 'H700' ],
+        'LG-H7(31)!'                                => [ 'LG', 'G4 Vigor' ],
+        'LG-H7(34|35|36)!'                          => [ 'LG', 'G4s' ],
+        'LG-H7(40)!'                                => [ 'LG', 'G Vista 2' ],
+        'LG-H7(78|79|88)!'                          => [ 'LG', 'AKA' ],
+        'LG-H8(10|11|12|15|18|19)!'                 => [ 'LG', 'G4' ],
+        'LG-H8(20|30|31|50|60|68)!'                 => [ 'LG', 'G5' ],
+        'LG-H8(40|45|48)!'                          => [ 'LG', 'G5 SE' ],
+        'LG-H8(58)!'                                => [ 'LG', 'G5 Speed' ],
+        'LG-H8(70|73)!'                             => [ 'LG', 'G6' ],
+        'LG-H9(10|15|18)!'                          => [ 'LG', 'V20' ],
+        'LG-H9(50|55|59)!'                          => [ 'LG', 'G Flex 2' ],
+        'LG-H9(00|01|60|61|62|68)!'                 => [ 'LG', 'V10' ],
+        'LG-H9(90)!'                                => [ 'LG', 'V20' ],
+    ],
+
+    'LG-K[0-9]{3,3}!!' => [
+        'LG-K1(00)!'                                => [ 'LG', 'K3' ],
+        'LG-K1(20|21|30)!'                          => [ 'LG', 'K4' ],
+        'LG-K2(00)!'                                => [ 'LG', 'X Style' ],
+        'LG-K2(10|20)!'                             => [ 'LG', 'X Power' ],
+        'LG-K2(40)!'                                => [ 'LG', 'X Mach' ],
+        'LG-K3(30|32|)!'                            => [ 'LG', 'K7' ],
+        'LG-K4(10|20|25|28|30)!'                    => [ 'LG', 'K10' ],
+        'LG-K4(50)!'                                => [ 'LG', 'X Power' ],
+        'LG-K5(00)!'                                => [ 'LG', 'X Screen' ],
+        'LG-K5(20)!'                                => [ 'LG', 'Stylus 2' ],
+        'LG-K5(30|35)!'                             => [ 'LG', 'Stylus 2 Plus' ],
+        'LG-K5(40)!'                                => [ 'LG', 'Stylo 2' ],
+        'LG-K5(50|57)!'                             => [ 'LG', 'Stylo 2 Plus' ],
+        'LG-K5(80)!'                                => [ 'LG', 'X Cam' ],
+        'LG-K6(00)!'                                => [ 'LG', 'X Mach' ],
+    ],
+
+    'LG-KH5200'                                 => [ 'LG', 'Andro-1' ],
+    'LG-KS1024'                                 => [ 'LG', 'KS1024' ],
+
+    'LG-KU[0-9]{4,4}!!' => [
+        'LG-KU3700'                                 => [ 'LG', 'Optimus One' ],
+        'LG-KU5400!'                                => [ 'LG', 'PRADA 3.0' ],
+        'LG-KU5900'                                 => [ 'LG', 'Optimus Black' ],
+        'LG-KU6900'                                 => [ 'LG', 'Optimus Pad', DeviceType::TABLET ],
+        'LG-KU8800'                                 => [ 'LG', 'Optimus EX' ],
+    ],
+
+    'LG-?L[0-9]{2,3}[A-Z]!!' => [
+        'LG-L01F'                                   => [ 'LG', 'G2' ],
+        'LGL15G!'                                   => [ 'LG', 'Sunrise' ],
+        'LG-L15G'                                   => [ 'LG', 'Sunrise' ],
+        'LGL16C!'                                   => [ 'LG', 'Lucky' ],
+        'LGL17AG'                                   => [ 'LG', 'Classic' ],
+        'LGL18VC'                                   => [ 'LG', 'Classic' ],
+        'LGL21G!'                                   => [ 'LG', 'Destiny' ],
+        'LGL22C!'                                   => [ 'LG', 'Power' ],
+        'LGL25L'                                    => [ 'LG', 'Optimus Quest' ],
+        'LG-L25L'                                   => [ 'LG', 'Optimus Quest' ],
+        'LG-L30L'                                   => [ 'LG', 'F70' ],
+        'LGL31L!'                                   => [ 'LG', 'Access' ],
+        'LG-L31L'                                   => [ 'LG', 'Access' ],
+        'LGL33L!'                                   => [ 'LG', 'Sunset' ],
+        'LGL34C!'                                   => [ 'LG', 'Optimus Fuel' ],
+        'LG-L34C'                                   => [ 'LG', 'Optimus Fuel' ],
+        'LGL35G!'                                   => [ 'LG', 'Optimus Logic' ],
+        'LG-L38C!'                                  => [ 'LG', 'Optimus Dynamic' ],
+        'LGL38C!'                                   => [ 'LG', 'Optimus Dynamic' ],
+        'LGL39C!'                                   => [ 'LG', 'Optimus Dynamic II' ],
+        'LG-L40G'                                   => [ 'LG', 'Optimus Extreme' ],
+        'LGL41C!'                                   => [ 'LG', 'Ultimate 2' ],
+        'LG-L41C'                                   => [ 'LG', 'Ultimate 2' ],
+        'LG-L42G'                                   => [ 'LG', 'L70' ],
+        'LGL43AL!'                                  => [ 'LG', 'Rebel' ],
+        'LGL44VL!'                                  => [ 'LG', 'Rebel' ],
+        'LGL45C!'                                   => [ 'LG', 'Optimus Net' ],
+        'LGL51AL!'                                  => [ 'LG', 'Treasure' ],
+        'LGL52VL!'                                  => [ 'LG', 'Treasure' ],
+        'LGL53BL!'                                  => [ 'LG', 'X Style' ],
+        'LGL55C!'                                   => [ 'LG', 'Optimus Q' ],
+        'LGL56VL!'                                  => [ 'LG', 'X Style' ],
+        'LGL61AL!'                                  => [ 'LG', 'Premier' ],
+        'LGL62VL!'                                  => [ 'LG', 'Premier' ],
+        'LGL75C!'                                   => [ 'LG', 'Optimus Zip' ],
+        'LGL81AL!'                                  => [ 'LG', 'Stylo 2' ],
+        'LGL82VL!'                                  => [ 'LG', 'Stylo 2' ],
+        'LGL85C!'                                   => [ 'LG', 'Optimus Black' ],
+        'LGL86C!'                                   => [ 'LG', 'Optimus Showtime' ],
+        'LG-L95G!'                                  => [ 'LG', 'L95G' ],
+        'LGL96G'                                    => [ 'LG', 'Ultimate' ],
+        'LG-L160L'                                  => [ 'LG', 'L160L' ],                           // Unknown
+        'LGL996L!'                                  => [ 'LG', 'G2' ],
+    ],
+
+    'LG-LG[0-9]{3,3}!!' => [
+        'LG-LG730'                                  => [ 'LG', 'Venice' ],
+        'LG-LG855'                                  => [ 'LG', 'Marquee' ],
+        'LG-LG870'                                  => [ 'LG', 'Optimus F7' ],
+    ],
+
+    'LGLK430'                                   => [ 'LG', 'G Pad F 7.0', DeviceType::TABLET ],
+
+    'LG-?LS[0-9]{3,3}!!' => [
+        'LGLS450'                                   => [ 'LG', 'K3' ],
+        'LG-LS620'                                  => [ 'LG', 'Realm' ],
+        'LGLS620'                                   => [ 'LG', 'Realm' ],
+        'LG-LS660'                                  => [ 'LG', 'Tribute' ],
+        'LGLS660'                                   => [ 'LG', 'Tribute' ],
+        'LGLS665'                                   => [ 'LG', 'Tribute 2' ],
+        'LG-LS670'                                  => [ 'LG', 'Optimus S' ],
+        'LGLS675'                                   => [ 'LG', 'M1' ],
+        'LGLS676'                                   => [ 'LG', 'Tribute HD' ],
+        'LG-LS685'                                  => [ 'LG', 'Optimus Net' ],
+        'LG-LS696'                                  => [ 'LG', 'Elite' ],
+        'LG-LS700'                                  => [ 'LG', 'Optimus Slider' ],
+        'LG-LS720'                                  => [ 'LG', 'Optimus F3' ],
+        'LGLS740'                                   => [ 'LG', 'Volt' ],
+        'LG-LS740'                                  => [ 'LG', 'Volt' ],
+        'LGLS751'                                   => [ 'LG', 'Volt 2' ],
+        'LGLS755'                                   => [ 'LG', 'X Power' ],
+        'LGLS770'                                   => [ 'LG', 'G Stylo' ],
+        'LGLS775'                                   => [ 'LG', 'G Stylo 2' ],
+        'LG-LS840'                                  => [ 'LG', 'Viper' ],
+        'LG-LS855'                                  => [ 'LG', 'Marquee' ],
+        'LG-LS860'                                  => [ 'LG', 'Mach' ],
+        'LGLS885'                                   => [ 'LG', 'G3 Vigor' ],
+        'LG-LS885'                                  => [ 'LG', 'G3 Vigor' ],
+        'LG-LS970'                                  => [ 'LG', 'Optimus G' ],
+        'LG-LS980'                                  => [ 'LG', 'G2' ],
+        'LGLS990'                                   => [ 'LG', 'G3' ],
+        'LG-LS990'                                  => [ 'LG', 'G3' ],
+        'LGLS991'                                   => [ 'LG', 'G4' ],
+        'LG-LS991'                                  => [ 'LG', 'G4' ],
+        'LGLS992'                                   => [ 'LG', 'G5' ],
+        'LG-LS993'                                  => [ 'LG', 'G6' ],
+        'LG-LS995'                                  => [ 'LG', 'G Flex' ],
+        'LGLS996'                                   => [ 'LG', 'G Flex 2' ],
+        'LG-LS996'                                  => [ 'LG', 'G Flex 2' ],
+        'LG-LS997'                                  => [ 'LG', 'V20' ],
+    ],
+
+    'LG-LU[0-9]{4,4}!!' => [
+        'LG-LU3000'                                 => [ 'LG', 'Optimus Mach' ],
+        'LG-LU3100'                                 => [ 'LG', 'Optimus Chic' ],
+        'LG-LU3700'                                 => [ 'LG', 'Optimus One' ],
+        'LG-LU5400'                                 => [ 'LG', 'PRADA 3.0' ],
+        'LG-LU6200'                                 => [ 'LG', 'Optimus LTE' ],
+        'LG-LU6500'                                 => [ 'LG', 'Optimus Q2' ],
+        'LG-LU6800'                                 => [ 'LG', 'Optimus Big' ],
+        'LG-LU6900'                                 => [ 'LG', 'Optimus Pad', DeviceType::TABLET ],
+        'LG-LU8300'                                 => [ 'LG', 'Optimus Pad LTE', DeviceType::TABLET ],
+    ],
+
+    'LG-LW690'                                  => [ 'LG', 'Optimus C' ],
+    'LG-LW770'                                  => [ 'LG', 'Regard' ],
+
+    'LG-M[0-9]{3,3}!!' => [
+        'LG-M1(50)!'                                => [ 'LG', 'Phoenix 3' ],
+        'LG-M1(51|60)!'                             => [ 'LG', 'K4 2017' ],
+        'LG-M2(00)!'                                => [ 'LG', 'K8 2017' ],
+        'LG-M2(10)!'                                => [ 'LG', 'Aristo' ],
+        'LG-M2(50)!'                                => [ 'LG', 'K10 2017' ],
+        'LG-M4(30)!'                                => [ 'LG', 'Stylo 3' ],
+        'LG-M4(70)!'                                => [ 'LG', 'Stylo 3 Plus' ],
+    ],
+
+    'LG-?MS[0-9]{3,3}!!' => [
+        'LGMS323'                                   => [ 'LG', 'L70' ],
+        'LG-MS323'                                  => [ 'LG', 'L70' ],
+        'LGMS330'                                   => [ 'LG', 'M1' ],
+        'LGMS345'                                   => [ 'LG', 'Leon' ],
+        'LGMS395'                                   => [ 'LG', 'F60' ],
+        'LG-MS415'                                  => [ 'LG', 'L90' ],
+        'LGMS428'                                   => [ 'LG', 'K10' ],
+        'LGMS500'                                   => [ 'LG', 'Optimus F6' ],
+        'LG-MS500'                                  => [ 'LG', 'Optimus F6' ],
+        'LGMS550'                                   => [ 'LG', 'G Stylo 2' ],
+        'LGMS631'                                   => [ 'LG', 'G Stylo' ],
+        'LG-MS659'                                  => [ 'LG', 'Optimus F3' ],
+        'LGMS659'                                   => [ 'LG', 'Optimus F3' ],
+        'LG-MS690'                                  => [ 'LG', 'Optimus M' ],
+        'LGMS769'                                   => [ 'LG', 'Optimus L9' ],
+        'LG-MS770'                                  => [ 'LG', 'Motion 4G' ],
+        'LGMS770'                                   => [ 'LG', 'Motion 4G' ],
+        'LG-MS790'                                  => [ 'LG', 'Optimus F3' ],
+        'LG-MS840'                                  => [ 'LG', 'Connect 4G' ],
+        'LG-MS870'                                  => [ 'LG', 'Spirit 4G' ],
+        'LG-MS910'                                  => [ 'LG', 'Esteem' ],
+        'LG-MS695'                                  => [ 'LG', 'Optimus M+' ],
+    ],
+
+    'LG-P[0-9]{3,3}!!' => [
+        'LG-P350!'                                  => [ 'LG', 'Optimus Me' ],
+        'LG-P355'                                   => [ 'LG', 'P355' ],
+        'LG-P490!'                                  => [ 'LG', 'P490' ],                    // Unknown
+        'LG-P5(00|03|04)!'                          => [ 'LG', 'Optimus One' ],
+        'LG-P505!'                                  => [ 'LG', 'Phoenix' ],
+        'LG-P506'                                   => [ 'LG', 'Thrive' ],
+        'LG-P509'                                   => [ 'LG', 'Optimus T' ],
+        'LG-P6(55|59)!'                             => [ 'LG', 'Optimus F3' ],
+        'LG-P6(90|92|99)!'                          => [ 'LG', 'Optimus Net' ],
+        'LG-P693!'                                  => [ 'LG', 'P693' ],
+        'LG-P698!'                                  => [ 'LG', 'Optimus Net Dual' ],
+        'LG-P7(00|05|08)!'                          => [ 'LG', 'Optimus L7' ],
+        'LG-P7(10|12|13|14)!'                       => [ 'LG', 'Optimus L7 II' ],
+        'LG-P7(15|16)!'                             => [ 'LG', 'Optimus L7 II Dual' ],
+        'LG-P720!'                                  => [ 'LG', 'Optimus Chic' ],
+        'LG-P725'                                   => [ 'LG', 'Optimus 3D Max' ],
+        'LG-P7(60|65|68|69|78)!'                    => [ 'LG', 'Optimus L9' ],
+        'LG-P815!'                                  => [ 'LG', 'G Pad II 8.3', DeviceType::TABLET ],
+        'LG-P860'                                   => [ 'LG', 'P860' ],
+        'LG-P870!'                                  => [ 'LG', 'Escape' ],
+        'LG-P875!'                                  => [ 'LG', 'Optimus F5' ],
+        'LG-P880!'                                  => [ 'LG', 'Optimus 4X HD' ],
+        'LG-P895!'                                  => [ 'LG', 'Optimus Vu' ],
+        'LG-P920!'                                  => [ 'LG', 'Optimus 3D' ],
+        'LG-P9(25|29)!'                             => [ 'LG', 'Thrill' ],
+        'LG-P930!'                                  => [ 'LG', 'Nitro HD' ],
+        'LG-P9(35|36)!'                             => [ 'LG', 'Optimus LTE' ],
+        'LG-P940!'                                  => [ 'LG', 'PRADA 3.0' ],
+        'LG-P970!'                                  => [ 'LG', 'Optimus Black' ],
+        'LG-P990!'                                  => [ 'LG', 'Optimus 2X Speed' ],
+        'LG-P993'                                   => [ 'LG', 'Optimus 2X' ],
+    ],
+
+    'LG-SU[0-9]{3,3}!!' => [
+        'LG-SU370'                                  => [ 'LG', 'Optimus One' ],
+        'LG-SU540'                                  => [ 'LG', 'PRADA 3.0' ],
+        'LG-SU640'                                  => [ 'LG', 'Optimus LTE' ],
+        'LG-SU660'                                  => [ 'LG', 'Optimus 2X' ],
+        'LG-SU760'                                  => [ 'LG', 'Optimus 3D' ],
+        'LG-SU870'                                  => [ 'LG', 'Optimus 3D Cube' ],
+        'LG-SU880'                                  => [ 'LG', 'Optimus EX' ],
+    ],
+
+    'LG-TP260'                                  => [ 'LG', 'K20 Plus' ],
+
+    'LG-SU-760'                                 => [ 'LG', 'Optimus 3D' ],
+    'LGUK410'                                   => [ 'LG', 'G Pad 7.0', DeviceType::TABLET ],
+    'LG-UK495'                                  => [ 'LG', 'G Pad F 8.0', DeviceType::TABLET ],
+    'LGUK750'                                   => [ 'LG', 'G Pad X II 10.1', DeviceType::TABLET ],
+    'LGUK932'                                   => [ 'LG', 'G Pad II 10.1', DeviceType::TABLET ],
+    'LG-UN350'                                  => [ 'LG', 'UN350' ],
+
+    'LG-?US[0-9]{3,3}!!' => [
+        'LGUS375'                                   => [ 'LG', 'K8' ],
+        'LGUS550'                                   => [ 'LG', 'Logos' ],
+        'LGUS610'                                   => [ 'LG', 'X Power' ],
+        'LG-US670'                                  => [ 'LG', 'Optimus U' ],
+        'LG-US730'                                  => [ 'LG', 'Splendor' ],
+        'LG-US780'                                  => [ 'LG', 'Optimus F7' ],
+        'LGUS990!'                                  => [ 'LG', 'G3' ],
+        'LG-US990'                                  => [ 'LG', 'G3' ],
+        'LGUS991!'                                  => [ 'LG', 'G4' ],
+        'LGUS992'                                   => [ 'LG', 'G5' ],
+        'LGUS995!'                                  => [ 'LG', 'G Flex 2' ],
+        'LG-US996!'                                 => [ 'LG', 'V20' ],
+    ],
+
+    'LG-V[0-9]{3,3}!!' => [
+        'LG-V4(00|10|11)!'                          => [ 'LG', 'G Pad 7.0', DeviceType::TABLET ],
+        'LG-V4(80|90)!'                             => [ 'LG', 'G Pad 8.0', DeviceType::TABLET ],
+        'LG-V4(95|96|97|99)!'                       => [ 'LG', 'G Pad F 8.0', DeviceType::TABLET ],
+        'LG-V498!'                                  => [ 'LG', 'G Pad II 8.0', DeviceType::TABLET ],
+        'LG-V5(00|07)!'                             => [ 'LG', 'G Pad 8.3', DeviceType::TABLET ],
+        'LG-V510!'                                  => [ 'LG', 'G Pad 8.3 (Google Edition)', DeviceType::TABLET ],
+        'LG-V5(20|21)!'                             => [ 'LG', 'G Pad X 8.0', DeviceType::TABLET ],
+        'LG-V5(22|25)!'                             => [ 'LG', 'G Pad III 8.0', DeviceType::TABLET ],
+        'LG-V607L'                                  => [ 'LG', 'G Pad II 8.0', DeviceType::TABLET ],
+        'LG-V700!'                                  => [ 'LG', 'G Pad 10.1', DeviceType::TABLET ],
+        'LG-V9(00|01)!'                             => [ 'LG', 'Optimus Pad', DeviceType::TABLET ],
+        'LG-V9(05|09)!'                             => [ 'LG', 'Optimus G-Slate', DeviceType::TABLET ],
+        'LG-V930'                                   => [ 'LG', 'G Pad X 10.1', DeviceType::TABLET ],
+        'LG-V9(35|40)!'                             => [ 'LG', 'G Pad II 10.1', DeviceType::TABLET ],
+    ],
+
+    'LG-VK[0-9]{3,3}!!' => [
+        'LG-VK410'                                  => [ 'LG', 'G Pad 7.0', DeviceType::TABLET ],
+        'LG-VK700'                                  => [ 'LG', 'G Pad 10.1', DeviceType::TABLET ],
+        'LG-VK810'                                  => [ 'LG', 'G Pad 8.3', DeviceType::TABLET ],
+        'LG-VK815'                                  => [ 'LG', 'G Pad X 8.3', DeviceType::TABLET ],
+    ],
+
+    'LG-VN[0-9]{3,3}!!' => [
+        'LG-VN170'                                  => [ 'LG', 'VN-170' ],                              // Unknown
+        'LG-VN280'                                  => [ 'LG', 'Extravert 2' ],
+        'LG-VN360'                                  => [ 'LG', 'Exalt' ],
+    ],
+
+    'LG-VM[0-9]{3,3}!!' => [
+        'LG-VM670'                                  => [ 'LG', 'Optimus V' ],
+        'LG-VM696'                                  => [ 'LG', 'Optimus Elite' ],
+        'LG-VM701'                                  => [ 'LG', 'Optimus Slider' ],
+        'LG-VM720'                                  => [ 'LG', 'Optimus F5' ],
+    ],
+
+    'LG-VS[0-9]{3,3}!!' => [
+        'LG-VS410!'                                 => [ 'LG', 'Optimus Zone' ],
+        'LG-VS415!'                                 => [ 'LG', 'Optimus Zone 2' ],                      // aka L40
+        'LG-VS450!'                                 => [ 'LG', 'Optimus Exceed 2' ],                    // aka L70
+        'LG-VS660'                                  => [ 'LG', 'Vortex' ],
+        'LG-VS700!'                                 => [ 'LG', 'Enlighten' ],
+        'LG-VS740'                                  => [ 'LG', 'Ally' ],
+        'LG-VS810'                                  => [ 'LG', 'Transpyre' ],
+        'LG-VS840'                                  => [ 'LG', 'Lucid' ],
+        'LG-VS870'                                  => [ 'LG', 'Lucid 2' ],
+        'LG-VS876'                                  => [ 'LG', 'Lucid 3' ],                         // aka F90
+        'LG-VS880'                                  => [ 'LG', 'G3 Vista' ],
+        'LG-VS890'                                  => [ 'LG', 'Enact' ],
+        'LG-VS910'                                  => [ 'LG', 'Revolution' ],
+        'LG-VS930'                                  => [ 'LG', 'Spectrum II' ],
+        'LG-VS950'                                  => [ 'LG', 'Intuition' ],
+        'LG-VS980!'                                 => [ 'LG', 'G2' ],
+        'LG-VS985'                                  => [ 'LG', 'G3' ],
+        'LG-VS999'                                  => [ 'LG', 'G4' ],
+    ],
+
+    'LG-X[0-9]{3,3}!!' => [
+        'LG-X130!'                                  => [ 'LG', 'L40' ],
+        'LG-X132'                                   => [ 'LG', 'L45' ],
+        'LG-X1(35|40|45|47)!'                       => [ 'LG', 'L60' ],
+        'LG-X137'                                   => [ 'LG', 'L60i' ],
+        'LG-X150'                                   => [ 'LG', 'Bello 2' ],
+        'LG-X1(55|60|65)!'                          => [ 'LG', 'Max' ],
+        'LG-X1(70)!'                                => [ 'LG', 'Prime 2' ],
+        'LG-X180!'                                  => [ 'LG', 'Zone' ],
+        'LG-X190'                                   => [ 'LG', 'Ray' ],
+        'LG-X210'                                   => [ 'LG', 'K7' ],
+        'LG-X220'                                   => [ 'LG', 'K5' ],
+        'LG-X230'                                   => [ 'LG', 'K7 2017' ],
+    ],
+
+    'lge-F160!'                                 => [ 'LG', 'Optimus LTE II' ],
+    'LGE-E988!'                                 => [ 'LG', 'Optimus G Pro' ],
+    'lgp-970'                                   => [ 'LG', 'Optimus Black' ],
+    'AS740'                                     => [ 'LG', 'Axis' ],
+    'AS870 4G'                                  => [ 'LG', 'Optimus F5' ],
+    'AS985'                                     => [ 'LG', 'G3' ],
+    'E900'                                      => [ 'LG', 'Optimus 7' ],
+    'GT540'                                     => [ 'LG', 'Optimus' ],
+    'GT540f'                                    => [ 'LG', 'Optimus' ],
+    'GW620'                                     => [ 'LG', 'Eve' ],
+    'KU9500'                                    => [ 'LG', 'Optimus Z' ],
+
+    'LG[LSTV][0-9]{2,2}!!' => [
+        'LGL21'                                     => [ 'LG', 'Optimus G LGL21', 'carrier' => 'au' ],
+        'LGL22'                                     => [ 'LG', 'isai LGL22', 'carrier' => 'au' ],
+        'LGL23'                                     => [ 'LG', 'G Flex LGL23', 'carrier' => 'au' ],
+        'LGL24'                                     => [ 'LG', 'isai FL LGL24', 'carrier' => 'au' ],
+        'LGL25'                                     => [ 'LG', 'Fx0 LGL25', 'carrier' => 'au' ],
+        'LGS01'                                     => [ 'LG', 'Wine Smart LGS01', 'carrier' => 'J:COM' ],
+        'LGV31'                                     => [ 'LG', 'isai VL LGV31', 'carrier' => 'au' ],
+        'LGV32'                                     => [ 'LG', 'isai vivid LGV32', 'carrier' => 'au' ],
+        'LGV33'                                     => [ 'LG', 'Qua phone PX LGV33', 'carrier' => 'au' ],
+        'LGV34'                                     => [ 'LG', 'isai Beat LGV34', 'carrier' => 'au' ],
+        'LGT31'                                     => [ 'LG', 'Qua tab PX LGT31', 'carrier' => 'au', DeviceType::TABLET ],
+        'LGT32'                                     => [ 'LG', 'Qua tab PZ LGT32', 'carrier' => 'au', DeviceType::TABLET ],
+    ],
+
+    'LU2300'                                    => [ 'LG', 'Optimus Q' ],
+    'LS670'                                     => [ 'LG', 'Optimus S' ],
+    'LS740'                                     => [ 'LG', 'F90' ],                         // aka Volt
+    'MS840 4G'                                  => [ 'LG', 'Connect 4G' ],
+    'P940'                                      => [ 'LG', 'PRADA 3.0' ],
+    'P990'                                      => [ 'LG', 'Optimus 2X Speed' ],
+
+    'USCC-(LG)?US!!' => [
+        'USCC-US730'                                => [ 'LG', 'Splendor' ],
+        'USCC-US760'                                => [ 'LG', 'Genesis' ],
+        'USCC-US780'                                => [ 'LG', 'Optimus F7' ],
+        'USCC-US855'                                => [ 'LG', 'Optimus Black' ],
+        'USCC-LGUS990'                              => [ 'LG', 'G3' ],
+    ],
+
+    'VK410'                                     => [ 'LG', 'G Pad 7.0', DeviceType::TABLET ],
+    'VK700'                                     => [ 'LG', 'G Pad 10.1', DeviceType::TABLET ],
+    'VK810 4G'                                  => [ 'LG', 'G Pad 8.3', DeviceType::TABLET ],
+    'VK815'                                     => [ 'LG', 'G Pad X 8.3', DeviceType::TABLET ],
+    'VM670'                                     => [ 'LG', 'Optimus V' ],
+
+    'VS[0-9]{3,3}!!' => [
+        'VS415PP'                                   => [ 'LG', 'Optimus Zone 2' ],
+        'VS425PP'                                   => [ 'LG', 'Optimus Zone 3' ],
+        'VS500PP'                                   => [ 'LG', 'K8 V' ],
+        'VS810PP'                                   => [ 'LG', 'Transpyre' ],
+        'VS820'                                     => [ 'LG', 'Lancet' ],
+        'VS835'                                     => [ 'LG', 'G Stylo 2 V' ],
+        'VS840PP'                                   => [ 'LG', 'Optimus Exceed' ],
+        'VS840 4G'                                  => [ 'LG', 'Lucid' ],
+        'VS870 4G'                                  => [ 'LG', 'Escape' ],
+        'VS876'                                     => [ 'LG', 'Lucid 3' ],                         // aka F90
+        'VS880'                                     => [ 'LG', 'G3 Vista' ],
+        'VS880PP'                                   => [ 'LG', 'G3 Vista' ],
+        'VS890 4G'                                  => [ 'LG', 'Enact' ],
+        'VS900-4G'                                  => [ 'LG', 'Enlighten' ],
+        'VS910 4G'                                  => [ 'LG', 'Revolution 4G' ],
+        'VS920 4G'                                  => [ 'LG', 'Spectrum' ],
+        'VS930 4G'                                  => [ 'LG', 'Spectrum 2' ],
+        'VS950 4G'                                  => [ 'LG', 'Intuition' ],
+        'VS980 4G'                                  => [ 'LG', 'G2' ],
+        'VS985 4G'                                  => [ 'LG', 'G3' ],
+        'VS986'                                     => [ 'LG', 'G4' ],
+        'VS987'                                     => [ 'LG', 'G5' ],
+        'VS990'                                     => [ 'LG', 'V10' ],
+        'VS995'                                     => [ 'LG', 'V20' ],
+    ],
+
+    'L-0[0-9][A-Z]!!' => [
+        'L-01D'                                     => [ 'LG', 'Optimus LTE L-01D', 'carrier' => 'DoCoMo' ],
+        'L-01E'                                     => [ 'LG', 'Optimus G L-01E', 'carrier' => 'DoCoMo' ],
+        'L-01F'                                     => [ 'LG', 'G2 L-01F', 'carrier' => 'DoCoMo' ],
+        'L-02D'                                     => [ 'LG', 'PRADA phone L-02D', 'carrier' => 'DoCoMo' ],
+        'L-02E'                                     => [ 'LG', 'Optimus LIFE L-02E', 'carrier' => 'DoCoMo' ],
+        'L-02F'                                     => [ 'LG', 'WiFi STATION L-02F', 'carrier' => 'DoCoMo' ],
+        'L-04C'                                     => [ 'LG', 'Optimus chat L-04C', 'carrier' => 'DoCoMo' ],
+        'L-04E'                                     => [ 'LG', 'Optimus G Pro L-04E', 'carrier' => 'DoCoMo' ],
+        'L-05D'                                     => [ 'LG', 'Optimus it L-05D', 'carrier' => 'DoCoMo' ],
+        'L-05E'                                     => [ 'LG', 'Optimus it L-05E', 'carrier' => 'DoCoMo' ],
+        'L-06C'                                     => [ 'LG', 'Optimus Pad L-06C', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+        'L-06D'                                     => [ 'LG', 'Optimus Vu L-06D', 'carrier' => 'DoCoMo' ],
+        'L-06DJOJO'                                 => [ 'LG', 'JOJO L-06D', 'carrier' => 'DoCoMo' ],
+        'L-07C'                                     => [ 'LG', 'Optimus bright L-07C', 'carrier' => 'DoCoMo' ],
+    ],
+
+    '[0-9]0[0-9]LG!!' => [
+        '401LG'                                     => [ 'LG', '401LG', 'carrier' => 'Softbank' ],                // Unknown
+        '402LG'                                     => [ 'LG', 'Spray 402LG', 'carrier' => 'Y! Mobile' ],
+    ],
+
+    'DM-01G'                                    => [ 'LG', 'DM-01G', 'carrier' => 'Disney Mobile' ],
+    'DM-02H'                                    => [ 'LG', 'DM-02H', 'carrier' => 'Disney Mobile' ],
+
+    'LG!!' => [
+        'LG-Eve'                                    => [ 'LG', 'Eve' ],
+        'LG-G2'                                     => [ 'LG', 'G2' ],
+        'LG-G3'                                     => [ 'LG', 'G3' ],
+        'LG-G3 D855'                                => [ 'LG', 'G3' ],
+        'LG-Optimus One P500'                       => [ 'LG', 'Optimus One' ],
+        'LG-Optimus 2X'                             => [ 'LG', 'Optimus 2X' ],
+        'LG-GT540 Optimus'                          => [ 'LG', 'Optimus' ],
+        'LG-Optimus'                                => [ 'LG', 'Optimus' ],
+        'LG-Optimus Black'                          => [ 'LG', 'Optimus Black' ],
+        'LG-OptimusG'                               => [ 'LG', 'Optimus G' ],
+        'LG-Optimus G'                              => [ 'LG', 'Optimus G' ],
+        'LG-gee'                                    => [ 'LG', 'Optimus G' ],
+        'LG-Optimus G Pro'                          => [ 'LG', 'Optimus G Pro' ],
+        'LG-G PRO'                                  => [ 'LG', 'Optimus G Pro' ],
+        'LG-Optimus GK'                             => [ 'LG', 'Optimus GK' ],
+        'LG-Optimus L3!'                            => [ 'LG', 'Optimus L3' ],
+        'LG-Optimus LTE2'                           => [ 'LG', 'Optimus LTE2' ],
+        'LG-Optimus Net'                            => [ 'LG', 'Optimus Net' ],
+        'LG-Optimus One'                            => [ 'LG', 'Optimus One' ],
+        'LG-Optimus V'                              => [ 'LG', 'Optimus V' ],
+        'LG-OPTIMUS-L5!'                            => [ 'LG', 'Optimus L7' ],
+        'LG-optimus L7'                             => [ 'LG', 'Optimus L7' ],
+        'LG-Swift L9'                               => [ 'LG', 'Optimus L9' ],
+        'LG-OPTIMUS HD LTE'                         => [ 'LG', 'Optimus HD' ],
+        'LG-OPTIMUS LTE HD'                         => [ 'LG', 'Optimus HD' ],
+        'LG-Optimus Pad L-06C'                      => [ 'LG', 'Optimus Pad', DeviceType::TABLET ],
+        'LG-vortex'                                 => [ 'LG', 'Vortex' ],
+    ],
+
+    'Ally'                                      => [ 'LG', 'Ally' ],
+
+    'Optimus!!' => [
+        'Optimus'                                   => [ 'LG', 'Optimus' ],
+        'OptimusBlack'                              => [ 'LG', 'Optimus Black' ],
+        'Optimus G'                                 => [ 'LG', 'Optimus G' ],
+        'Optimus G Pro'                             => [ 'LG', 'Optimus G Pro' ],
+        'Optimus Me'                                => [ 'LG', 'Optimus Me' ],
+        'optimus me p350'                           => [ 'LG', 'Optimus Me' ],
+        'Optimus Net'                               => [ 'LG', 'Optimus Net' ],
+        'Optimus One'                               => [ 'LG', 'Optimus One' ],
+        'Optimus Pro'                               => [ 'LG', 'Optimus Pro' ],
+        'Optimus 2X'                                => [ 'LG', 'Optimus 2X' ],
+        'Optimus 2x'                                => [ 'LG', 'Optimus 2X' ],
+        'Optimus 4X HD'                             => [ 'LG', 'Optimus 4X HD' ],
+        'OptimusX4HD'                               => [ 'LG', 'Optimus 4X HD' ],
+        'Optimus4XHD'                               => [ 'LG', 'Optimus 4X HD' ],
+        'Optimusx4'                                 => [ 'LG', 'Optimus X4' ],
+    ],
+
+    'IS11LG'                                    => [ 'LG', 'Optimus X IS11LG', 'carrier' => 'au' ],
+    'Vortex'                                    => [ 'LG', 'Vortex' ],
+    'LDK-ICK v1.4'                              => [ 'LG', 'Esteem' ],
+    'Prada 3.0'                                 => [ 'LG', 'PRADA 3.0' ],
+
+    'LG-Google TV!!' => [
+        'LG-Google TV'                              => [ 'LG', 'Android TV', DeviceType::TELEVISION, Flag::GOOGLETV ],
+        'LG-Google TV TV'                           => [ 'LG', 'Android TV', DeviceType::TELEVISION, Flag::GOOGLETV ],
+        'LG-Google TV G3'                           => [ 'LG', 'Android TV', DeviceType::TELEVISION, Flag::GOOGLETV ],
+        'LG-Google TV G3 KR'                        => [ 'LG', 'Android TV', DeviceType::TELEVISION, Flag::GOOGLETV ],
+        'LG-Google TV G3 TV'                        => [ 'LG', 'Android TV', DeviceType::TELEVISION, Flag::GOOGLETV ],
+        'LG-Google TV G3 KR TV'                     => [ 'LG', 'Android TV', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    ],
+
+    'LG-ANDROID MINI BOX'                       => [ 'LG', 'Android Mini-Box', DeviceType::TELEVISION ],
+    'SH940C-LN'                                 => [ 'LG', 'Smartbox HD', DeviceType::TELEVISION ],
+    'SH940C-LN TV'                              => [ 'LG', 'Smartbox HD', DeviceType::TELEVISION ],
+    'SH960C-LN'                                 => [ 'LG', 'Smartbox HD', DeviceType::TELEVISION ],
+    'LAP250U'                                   => [ 'LG', 'U+ tv G', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'LAP255U'                                   => [ 'LG', 'U+ tv G', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'TI320-DU'                                  => [ 'LG', 'U+ tv G', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'TI320-DU TV'                               => [ 'LG', 'U+ tv G', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'ST940I-UP'                                 => [ 'LG', 'U+ tv G 4K', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'WA-U420D'                                  => [ 'LG', 'U+ tvLINK', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'SFR-G8800'                                 => [ 'LG', 'SFR-G8800', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'SFR-G8800 TV'                              => [ 'LG', 'SFR-G8800', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'E731'                                      => [ 'Logicom', 'E731', DeviceType::TABLET ],
+    'E812'                                      => [ 'Logicom', 'E812', DeviceType::TABLET ],
+    'E912'                                      => [ 'Logicom', 'E912', DeviceType::TABLET ],
+    'E1031'                                     => [ 'Logicom', 'E1031', DeviceType::TABLET ],
+    'TAB950'                                    => [ 'Logicom', 'TAB950', DeviceType::TABLET ],
+    'TAB1062'                                   => [ 'Logicom', 'TAB1062', DeviceType::TABLET ],
+    'LS-4001'                                   => [ 'LYF', 'Flame 3' ],
+    'LS-4002'                                   => [ 'LYF', 'Flame 5' ],
+    'LS-4003'                                   => [ 'LYF', 'Flame 4' ],
+    'LS-4004'                                   => [ 'LYF', 'Flame 2' ],
+    'LS-4005'                                   => [ 'LYF', 'Flame 6' ],
+    'LS-4006'                                   => [ 'LYF', 'Flame 7' ],
+    'LYF LS-4006'                               => [ 'LYF', 'Flame 7' ],
+    'LS-4008'                                   => [ 'LYF', 'Flame 7S' ],
+    'LS-4503'                                   => [ 'LYF', 'Flame 1' ],
+    'LS-4505'                                   => [ 'LYF', 'Flame 8' ],
+    'LS-5002'                                   => [ 'LYF', 'Water 1' ],
+    'LS-5004'                                   => [ 'LYF', 'Water 7' ],
+    'LS-5005'                                   => [ 'LYF', 'Water 4' ],
+    'LS-5006'                                   => [ 'LYF', 'Water 6' ],
+    'LS-5007'                                   => [ 'LYF', 'Water 5' ],
+    'LS-5008'                                   => [ 'LYF', 'Water 2' ],
+    'LS-5009'                                   => [ 'LYF', 'Wind 6' ],
+    'LYF LS-5009'                               => [ 'LYF', 'Wind 6' ],
+    'LS-5010'                                   => [ 'LYF', 'Wind 1' ],
+    'LS-5013'                                   => [ 'LYF', 'Wind 5' ],
+    'LS-5014'                                   => [ 'LYF', 'Wind 4' ],
+    'LS-5015'                                   => [ 'LYF', 'Water 8' ],
+    'LS-5016'                                   => [ 'LYF', 'Wind 7' ],
+    'LS-5017'                                   => [ 'LYF', 'Water 11' ],
+    'LS-5018'                                   => [ 'LYF', 'Wind 4S' ],
+    'LS-5020'                                   => [ 'LYF', 'Water 10' ],
+    'LS-5021'                                   => [ 'LYF', 'Earth 2' ],
+    'LS-5201'                                   => [ 'LYF', 'Water F1S' ],
+    'LS-5501'                                   => [ 'LYF', 'Earth 1' ],
+    'LS-5502'                                   => [ 'LYF', 'Wind 3' ],
+    'LS-5503'                                   => [ 'LYF', 'Water 3' ],
+    'LS-5504'                                   => [ 'LYF', 'Water 7' ],
+    'LS-5505'                                   => [ 'LYF', 'Water F1' ],
+    'LS-5506'                                   => [ 'LYF', 'Water 9' ],
+    'LS-5507'                                   => [ 'LYF', 'Water 7S' ],
+    'LS-6001'                                   => [ 'LYF', 'Wind 2' ],
+    'aTab9.7 IPS'                               => [ 'M-Tech', 'aTab 9.7', DeviceType::TABLET ],
+    'CRONO 22'                                  => [ 'Majestic', 'Chrono 22' ],
+    'TAB192'                                    => [ 'Majestic', 'TAB-192', DeviceType::TABLET ],
+
+    'Malata!!' => [
+        'MALATA I5'                                 => [ 'Malata', 'I5' ],
+        'MALATA I8'                                 => [ 'Malata', 'I8' ],
+        'MALATA I10'                                => [ 'Malata', 'I10' ],
+        'MALATA I50'                                => [ 'Malata', 'I50' ],
+        'MALATA I60'                                => [ 'Malata', 'I60' ],
+        'MALATA TD60'                               => [ 'Malata', 'TD60' ],
+        'MALATA TD95'                               => [ 'Malata', 'TD95' ],
+        'MALATA S501'                               => [ 'Malata', 'S501' ],
+        'Malata SMBA1002'                           => [ 'Malata', 'Tablet SMB-A1002', DeviceType::TABLET ],
+        'Malata SMBA9701'                           => [ 'Malata', 'Tablet SMB-A9701', DeviceType::TABLET ],
+    ],
+
+    'T6'                                        => [ 'Malata', 'Zpad T6', DeviceType::TABLET ],
+
+    'MID[0-9]!!' => [
+        'MID05V2'                                   => [ 'Manta', 'Power Tab', DeviceType::TABLET ],
+        'MID06N'                                    => [ 'Manta', 'Power Tab X', DeviceType::TABLET ],
+        'MID701'                                    => [ 'Manta', 'Power Tab Basic', DeviceType::TABLET ],
+        'MID704'                                    => [ 'Manta', 'Power Tab 7', DeviceType::TABLET ],
+        'MID705'                                    => [ 'Manta', 'Power Tab', DeviceType::TABLET ],
+        'MID706A'                                   => [ 'Manta', 'Duo Power 7', DeviceType::TABLET ],
+        'MID801'                                    => [ 'Manta', 'Duo Power 8 HD', DeviceType::TABLET ],
+        'MID802'                                    => [ 'Manta', 'Duo Power 8 HD', DeviceType::TABLET ],
+        'MID9701'                                   => [ 'Manta', 'Duo Power 9.7', DeviceType::TABLET ],
+        'MID9702'                                   => [ 'Manta', 'Duo Power 9.7 HD', DeviceType::TABLET ],
+        'MID1001'                                   => [ 'Manta', 'Power Tab 10.1 HD', DeviceType::TABLET ],
+    ],
+
+    'Masstel!!' => [
+        'Masstel M11'                               => [ 'Masstel', 'M11' ],
+        'Masstel-M11'                               => [ 'Masstel', 'M11' ],
+        'Masstel M15'                               => [ 'Masstel', 'M15' ],
+        'Masstel M25'                               => [ 'Masstel', 'M25' ],
+        'Masstel M120'                              => [ 'Masstel', 'M120' ],
+        'Masstel M250'                              => [ 'Masstel', 'M250' ],
+        'Masstel M320'                              => [ 'Masstel', 'M320' ],
+        'Masstel N405'                              => [ 'Masstel', 'N405' ],
+        'Masstel Tab 700'                           => [ 'Masstel', 'Tab 700', DeviceType::TABLET ],
+        'Masstel Tab 720'                           => [ 'Masstel', 'Tab 720', DeviceType::TABLET ],
+        'Masstel Tab 720i'                          => [ 'Masstel', 'Tab 720i', DeviceType::TABLET ],
+        'Masstel Tab 740'                           => [ 'Masstel', 'Tab 740', DeviceType::TABLET ],
+        'Masstel Tab 750'                           => [ 'Masstel', 'Tab 750', DeviceType::TABLET ],
+        'Masstel Tab 840'                           => [ 'Masstel', 'Tab 840', DeviceType::TABLET ],
+        'Masstel Tab 850'                           => [ 'Masstel', 'Tab 850', DeviceType::TABLET ],
+    ],
+
+    'MASTONE!!' => [
+        'MASTONE G3'                                => [ 'Mastone', 'G3' ],
+        'MASTONE G4'                                => [ 'Mastone', 'G4' ],
+        'MASTONE G9'                                => [ 'Mastone', 'G9' ],
+        'MASTONE G13'                               => [ 'Mastone', 'G13' ],
+        'MASTONE G15'                               => [ 'Mastone', 'G15' ],
+        'MASTONE W16'                               => [ 'Mastone', 'W16' ],
+    ],
+
+    'M-270'                                     => [ 'Maylong', 'M-270', DeviceType::TABLET ],
+    'T-200'                                     => [ 'Maylong', 'T-200', DeviceType::TABLET ],
+    'M70'                                       => [ 'Maxsun', 'M70', DeviceType::TABLET ],
+
+    'Maxtron!!' => [
+        'Maxtron AMOR Ⅱ'                            => [ 'Maxtron', 'Amor 2' ],
+        'Maxtron Diamond'                           => [ 'Maxtron', 'Diamond' ],
+        'Maxtron Venus'                             => [ 'Maxtron', 'Venus' ],
+        'Maxtron T1'                                => [ 'Maxtron', 'T1', DeviceType::TABLET ],
+    ],
+
+    'M785'                                      => [ 'Mecer', 'Xpress Smartlife M785', DeviceType::TABLET ],
+    '800P31C'                                   => [ 'Mecer', 'Xpress Smartlife 800P31C', DeviceType::TABLET ],
+    'X1010'                                     => [ 'Mecer', 'X1010', DeviceType::TABLET ],
+
+    'M\-PP!!' => [
+        'M-PPxG400'                                 => [ 'Mediacom', 'PhonePad Duo G400' ],
+        'M-PPAG500'                                 => [ 'Mediacom', 'PhonePad Duo G500' ],
+        'M-PPBG500'                                 => [ 'Mediacom', 'PhonePad Duo G500' ],
+        'M-PPCG500'                                 => [ 'Mediacom', 'PhonePad Duo G500' ],
+        'M-PPxG501'                                 => [ 'Mediacom', 'PhonePad Duo G501' ],
+        'M-PP2G530'                                 => [ 'Mediacom', 'PhonePad Duo G530' ],
+        'M-PPAG550'                                 => [ 'Mediacom', 'PhonePad Duo G550' ],
+        'M-PPG700'                                  => [ 'Mediacom', 'PhonePad Duo G700' ],
+        'M-PPG702'                                  => [ 'Mediacom', 'PhonePad Duo G702' ],
+        'M-PPxS470'                                 => [ 'Mediacom', 'PhonePad Duo S470' ],
+        'M-PP2S500'                                 => [ 'Mediacom', 'PhonePad Duo S500' ],
+        'M-PP2S500B'                                => [ 'Mediacom', 'PhonePad Duo S500' ],
+        'M-PP2S500C'                                => [ 'Mediacom', 'PhonePad Duo S500' ],
+        'M-PPxS501'                                 => [ 'Mediacom', 'PhonePad Duo S501' ],
+        'M-PPxS531'                                 => [ 'Mediacom', 'PhonePad Duo S531' ],
+        'M-PP2S550'                                 => [ 'Mediacom', 'PhonePad Duo S550' ],
+        'M-PPxS551U'                                => [ 'Mediacom', 'PhonePad Duo S551' ],
+        'M-PP2S650'                                 => [ 'Mediacom', 'PhonePad Duo S650' ],
+        'M-PP2S650C'                                => [ 'Mediacom', 'PhonePad Duo S650' ],
+        'M-PPAX470U'                                => [ 'Mediacom', 'PhonePad Duo X470' ],
+        'M PPAX510U'                                => [ 'Mediacom', 'PhonePad Duo X510' ],
+        'M-PPxX520U'                                => [ 'Mediacom', 'PhonePad Duo X520' ],
+    ],
+
+    'M\-MP!!' => [
+        'M-MP5303G'                                 => [ 'Mediacom', 'SmartPad Mini Mobile', DeviceType::TABLET ],
+        'M-MP705I'                                  => [ 'Mediacom', 'SmartPad 705i', DeviceType::TABLET ],
+        'M-MP706I'                                  => [ 'Mediacom', 'SmartPad 706i', DeviceType::TABLET ],
+        'M-MP707i'                                  => [ 'Mediacom', 'SmartPad 707i', DeviceType::TABLET ],
+        'M-MP711i'                                  => [ 'Mediacom', 'SmartPad 711i', DeviceType::TABLET ],
+        'M-MP715I'                                  => [ 'Mediacom', 'SmartPad 715i', DeviceType::TABLET ],
+        'M-MP720I'                                  => [ 'Mediacom', 'SmartPad 720i', DeviceType::TABLET ],
+        'M-MP722I'                                  => [ 'Mediacom', 'SmartPad 722i', DeviceType::TABLET ],
+        'M-MP815I'                                  => [ 'Mediacom', 'SmartPad 815i', DeviceType::TABLET ],
+        'M-MP855i'                                  => [ 'Mediacom', 'SmartPad 855i', DeviceType::TABLET ],
+        'M-MP860S2'                                 => [ 'Mediacom', 'SmartPad 860 S2', DeviceType::TABLET ],
+        'M-MP85S23G'                                => [ 'Mediacom', 'SmartPad 875 S2', DeviceType::TABLET ],
+        'M-MP875S2'                                 => [ 'Mediacom', 'SmartPad 875 S2', DeviceType::TABLET ],
+        'M-MP917I'                                  => [ 'Mediacom', 'SmartPad 917i', DeviceType::TABLET ],
+        'M-MP927I'                                  => [ 'Mediacom', 'SmartPad 927i', DeviceType::TABLET ],
+        'M-MP940M'                                  => [ 'Mediacom', 'SmartPad 940', DeviceType::TABLET ],
+        'M-MP1010i'                                 => [ 'Mediacom', 'SmartPad 1010i', DeviceType::TABLET ],
+        'M-MP102S2B'                                => [ 'Mediacom', 'SmartPad 102 S2', DeviceType::TABLET ],
+        'M-MP102S2W'                                => [ 'Mediacom', 'SmartPad 102 S2', DeviceType::TABLET ],
+        'M-MP1040S2'                                => [ 'Mediacom', 'SmartPad 10.1 S2', DeviceType::TABLET ],
+        'M-MP10S4'                                  => [ 'Mediacom', 'SmartPad 10.1 S4', DeviceType::TABLET ],
+        'M-MP12S4'                                  => [ 'Mediacom', 'SmartPad 10.1 S4', DeviceType::TABLET ],
+        'M-MP1040M'                                 => [ 'Mediacom', 'SmartPad 10.1 HD S4', DeviceType::TABLET ],
+        'M-MP1040MC'                                => [ 'Mediacom', 'SmartPad 10.1 HD S4', DeviceType::TABLET ],
+        'M-MP710GO'                                 => [ 'Mediacom', 'SmartPad 7.0 Go', DeviceType::TABLET ],
+        'M-MP720GO'                                 => [ 'Mediacom', 'SmartPad 7.0 Go', DeviceType::TABLET ],
+        'M-MP726GOx'                                => [ 'Mediacom', 'SmartPad 7.0 Go', DeviceType::TABLET ],
+        'M-MP740GOx'                                => [ 'Mediacom', 'SmartPad 7.0 Go', DeviceType::TABLET ],
+        'M-MP720M'                                  => [ 'Mediacom', 'SmartPad 7.0 Mobile', DeviceType::TABLET ],
+        'M-MP721M'                                  => [ 'Mediacom', 'SmartPad 7.0 Mobile', DeviceType::TABLET ],
+        'M-MP722M'                                  => [ 'Mediacom', 'SmartPad 7.0 Mobile', DeviceType::TABLET ],
+        'M-MP75S23G'                                => [ 'Mediacom', 'SmartPad 7.0 S2', DeviceType::TABLET ],
+        'M-MP7S2A3G'                                => [ 'Mediacom', 'SmartPad 7.0 S2', DeviceType::TABLET ],
+        'M-MP7S2B3G'                                => [ 'Mediacom', 'SmartPad 7.0 S2', DeviceType::TABLET ],
+        'M-MP7S2D3G'                                => [ 'Mediacom', 'SmartPad 7.0 S2', DeviceType::TABLET ],
+        'M-MP7S2K3G'                                => [ 'Mediacom', 'SmartPad 7.0 S2', DeviceType::TABLET ],
+        'M-MP7S4A3G'                                => [ 'Mediacom', 'SmartPad 7.0 S4', DeviceType::TABLET ],
+        'M-MP840M'                                  => [ 'Mediacom', 'SmartPad 8.0 Mobile', DeviceType::TABLET ],
+        'M-MP842M'                                  => [ 'Mediacom', 'SmartPad 8.0 Mobile', DeviceType::TABLET ],
+        'M-MP876S2'                                 => [ 'Mediacom', 'SmartPad 8.0 S2', DeviceType::TABLET ],
+        'M-MP8S23G'                                 => [ 'Mediacom', 'SmartPad 8.0 S2', DeviceType::TABLET ],
+        'M-MP8S2A3G'                                => [ 'Mediacom', 'SmartPad 8.0 S2', DeviceType::TABLET ],
+        'M-MP8S2B3G'                                => [ 'Mediacom', 'SmartPad 8.0 S2', DeviceType::TABLET ],
+        'M-MP82S4'                                  => [ 'Mediacom', 'SmartPad 8.0 S4', DeviceType::TABLET ],
+        'M-MP84S4'                                  => [ 'Mediacom', 'SmartPad 8.0 S4', DeviceType::TABLET ],
+        'M-MP8S4A3G'                                => [ 'Mediacom', 'SmartPad 8.0 S4', DeviceType::TABLET ],
+        'M-MP8S4B3G'                                => [ 'Mediacom', 'SmartPad 8.0 S4', DeviceType::TABLET ],
+        'M-MP8PA3G'                                 => [ 'Mediacom', 'SmartPad 8.0 HD Pro', DeviceType::TABLET ],
+        'M-MP9S4A3G'                                => [ 'Mediacom', 'SmartPad 9.7 S4', DeviceType::TABLET ],
+        'M-MP980S4'                                 => [ 'Mediacom', 'SmartPad 9.7 HD S4', DeviceType::TABLET ],
+        'M-MP99S4'                                  => [ 'Mediacom', 'SmartPad 9.7 HD S4', DeviceType::TABLET ],
+        'M-MP101S2'                                 => [ 'Mediacom', 'SmartPad 10.1 S2', DeviceType::TABLET ],
+        'M-MP1041S2'                                => [ 'Mediacom', 'SmartPad 10.1 S2', DeviceType::TABLET ],
+        'M-MP1051S2'                                => [ 'Mediacom', 'SmartPad 10.1 S2', DeviceType::TABLET ],
+        'M-MP1S2A3G'                                => [ 'Mediacom', 'SmartPad 10.1 S2', DeviceType::TABLET ],
+        'M-MP1S4A3G'                                => [ 'Mediacom', 'SmartPad 10.1 S4', DeviceType::TABLET ],
+        'M-MP1S4B3G'                                => [ 'Mediacom', 'SmartPad 10.1 S4', DeviceType::TABLET ],
+        'M-MP10PA'                                  => [ 'Mediacom', 'SmartPad 10.1 HD Pro', DeviceType::TABLET ],
+        'M-MP10PA3G'                                => [ 'Mediacom', 'SmartPad 10.1 HD Pro', DeviceType::TABLET ],
+        'M-MPI7A3G'                                 => [ 'Mediacom', 'SmartPad i7', DeviceType::TABLET ],
+    ],
+
+    'M\-IPRO!!' => [
+        'M-IPRO110B'                                => [ 'Mediacom', 'SmartPad 8.0 HD iPro110', DeviceType::TABLET ],
+        'M-IPRO800B'                                => [ 'Mediacom', 'SmartPad 8.0 HD iPro800', DeviceType::TABLET ],
+        'M-IPRO810B'                                => [ 'Mediacom', 'SmartPad 8.0 HD iPro810', DeviceType::TABLET ],
+        'M-IPRO810W'                                => [ 'Mediacom', 'SmartPad 8.0 HD iPro810', DeviceType::TABLET ],
+    ],
+
+    'MP[0-9]{3,3}C!!' => [
+        'MP705C'                                    => [ 'Mediacom', 'SmartPad 705c', DeviceType::TABLET ],
+        'MP810C'                                    => [ 'Mediacom', 'SmartPad 810c', DeviceType::TABLET ],
+        'MP907C'                                    => [ 'Mediacom', 'SmartPad 907c', DeviceType::TABLET ],
+    ],
+
+    'STM[0-9]{3,3}H!!' => [
+        'STM712HCZ'                                 => [ 'Mediacom', 'SmartPad 712c', DeviceType::TABLET ],
+        'STM722HC'                                  => [ 'Mediacom', 'SmartPad 722c', DeviceType::TABLET ],
+        'STM722HCZ'                                 => [ 'Mediacom', 'SmartPad 722c', DeviceType::TABLET ],
+        'STM803HC'                                  => [ 'Mediacom', 'SmartPad 810c', DeviceType::TABLET ],
+    ],
+
+    'SmartPad!!' => [
+        'SmartPad7503G'                             => [ 'Mediacom', 'SmartPad 750', DeviceType::TABLET ],
+        'SmartPad810c'                              => [ 'Mediacom', 'SmartPad 810c', DeviceType::TABLET ],
+        'SmartPad 852i'                             => [ 'Mediacom', 'SmartPad 825i', DeviceType::TABLET ],
+        'SmartPad870'                               => [ 'Mediacom', 'SmartPad 870 S2', DeviceType::TABLET ],
+        'Smartpad 910i aka Teclast A10T'            => [ 'Mediacom', 'SmartPad 910i', DeviceType::TABLET ],
+        'SmartPad 95s23G'                           => [ 'Mediacom', 'SmartPad 950 S2', DeviceType::TABLET ],
+        'SmartPad970s2'                             => [ 'Mediacom', 'SmartPad 970 S2', DeviceType::TABLET ],
+        'SmartPad970s23G'                           => [ 'Mediacom', 'SmartPad 970 S2', DeviceType::TABLET ],
+        'SmartPad1010i'                             => [ 'Mediacom', 'SmartPad 1010i', DeviceType::TABLET ],
+        'SmartPad 85S23G'                           => [ 'Mediacom', 'SmartPad 8.0 S2', DeviceType::TABLET ],
+    ],
+
+    'Mediacom 810C'                             => [ 'Mediacom', 'SmartPad 810c', DeviceType::TABLET ],
+    'Xteam Smartpad 810c'                       => [ 'Mediacom', 'SmartPad 810c', DeviceType::TABLET ],
+    'Xteam 4.8 Smartpad 810c'                   => [ 'Mediacom', 'SmartPad 810c', DeviceType::TABLET ],
+    '932i'                                      => [ 'Mediacom', 'SmartPad 932i', DeviceType::TABLET ],
+
+    'MT70[0-9]{2,2}!!' => [
+        'MT7000'                                    => [ 'Mediadroid', 'MASTER-MID GPS', DeviceType::TABLET ],
+        'MT7001'                                    => [ 'Mediadroid', 'ENGAGE HQ PRO', DeviceType::TELEVISION ],
+        'MT7002'                                    => [ 'Mediadroid', 'ENGAGE HQ', DeviceType::TELEVISION ],
+        'MT7003'                                    => [ 'Mediadroid', 'IMPERIUS' ],
+        'MT7004'                                    => [ 'Mediadroid', 'CASSIUS', DeviceType::TABLET ],
+        'MT7005'                                    => [ 'Mediadroid', 'IMPERIUS AERO' ],
+        'MT7005'                                    => [ 'Mediadroid', 'IMPERIUS 4.3 HQ' ],
+        'MT7007'                                    => [ 'Mediadroid', 'IMPERIUS II' ],
+        'MT7008'                                    => [ 'Mediadroid', 'IMPERIUS N3XT' ],
+        'MT7009'                                    => [ 'Mediadroid', 'IMPERIUS SEVEN 3G', DeviceType::TABLET ],
+        'MT7010'                                    => [ 'Mediadroid', 'IMPERIUS TAB 10 LT', DeviceType::TABLET ],
+        'MT7011'                                    => [ 'Mediadroid', 'IMPERIUS TAB 10', DeviceType::TABLET ],
+        'MT7012'                                    => [ 'Mediadroid', 'IMPERIUS TAB 10 3G', DeviceType::TABLET ],
+        'MT7013'                                    => [ 'Mediadroid', 'IMPERIUS EN3RGY' ],
+        'MT7014'                                    => [ 'Mediadroid', 'IMPERIUS AERO SLIM' ],
+        'MT7015'                                    => [ 'Mediadroid', 'IMPERIUS MINI' ],
+        'MT7017'                                    => [ 'Mediadroid', 'IMPERIUS ALPHA' ],
+    ],
+
+    'MTK6516'                                   => [ 'Mediatek', 'MTK6516' ],
+
+    '(MEDION|(MD )?LIFETAB)!!' => [
+        'MEDION Smartphone LIFE E3501'              => [ 'Medion', 'Life E3501' ],
+        'MEDION E4001'                              => [ 'Medion', 'E4001' ],
+        'MEDION E4002'                              => [ 'Medion', 'E4002' ],
+        'MEDION E4005'                              => [ 'Medion', 'E4005' ],
+        'MEDION E4502'                              => [ 'Medion', 'E4502' ],
+        'MEDION E4503'                              => [ 'Medion', 'E4503' ],
+        'MEDION E4504'                              => [ 'Medion', 'E4504' ],
+        'MEDION E4506'                              => [ 'Medion', 'E4506' ],
+        'LIFETAB E7310'                             => [ 'Medion', 'Lifetab E7310', DeviceType::TABLET ],
+        'LIFETAB E7312'                             => [ 'Medion', 'Lifetab E7312', DeviceType::TABLET ],
+        'LIFETAB E7313'                             => [ 'Medion', 'Lifetab E7313', DeviceType::TABLET ],
+        'LIFETAB E7316'                             => [ 'Medion', 'Lifetab E7316', DeviceType::TABLET ],
+        'LIFETAB E723X'                             => [ 'Medion', 'Lifetab E723X', DeviceType::TABLET ],
+        'LIFETAB E732X'                             => [ 'Medion', 'Lifetab E732X', DeviceType::TABLET ],
+        'LIFETAB E733X'                             => [ 'Medion', 'Lifetab E733X', DeviceType::TABLET ],
+        'LIFETAB E10310'                            => [ 'Medion', 'Lifetab E10310', DeviceType::TABLET ],
+        'LIFETAB E10312'                            => [ 'Medion', 'Lifetab E10312', DeviceType::TABLET ],
+        'LIFETAB E10316'                            => [ 'Medion', 'Lifetab E10316', DeviceType::TABLET ],
+        'LIFETAB E10320'                            => [ 'Medion', 'Lifetab E10320', DeviceType::TABLET ],
+        'LIFETAB P733X'                             => [ 'Medion', 'Lifetab P733X', DeviceType::TABLET ],
+        'LIFETAB P831X'                             => [ 'Medion', 'Lifetab P831X', DeviceType::TABLET ],
+        'LIFETAB P831X.2'                           => [ 'Medion', 'Lifetab P831X', DeviceType::TABLET ],
+        'LIFETAB P891X'                             => [ 'Medion', 'Lifetab P891X', DeviceType::TABLET ],
+        'LIFETAB P1034X'                            => [ 'Medion', 'Lifetab P1034X', DeviceType::TABLET ],
+        'LIFETAB S7316'                             => [ 'Medion', 'Lifetab S7316', DeviceType::TABLET ],
+        'LIFETAB S732X'                             => [ 'Medion', 'Lifetab S732X', DeviceType::TABLET ],
+        'LIFETAB S785X'                             => [ 'Medion', 'Lifetab S785X', DeviceType::TABLET ],
+        'LIFETAB S786X'                             => [ 'Medion', 'Lifetab S786X', DeviceType::TABLET ],
+        'LIFETAB S831X'                             => [ 'Medion', 'Lifetab S831X', DeviceType::TABLET ],
+        'LIFETAB S9512'                             => [ 'Medion', 'Lifetab S9512', DeviceType::TABLET ],
+        'LIFETAB S9714'                             => [ 'Medion', 'Lifetab S9714', DeviceType::TABLET ],
+        'LIFETAB S1033X'                            => [ 'Medion', 'Lifetab S1033X', DeviceType::TABLET ],
+        'LIFETAB S1034X'                            => [ 'Medion', 'Lifetab S1034X', DeviceType::TABLET ],
+        'LIFETAB S1036X'                            => [ 'Medion', 'Lifetab S1036X', DeviceType::TABLET ],
+        'MEDION LIFE P4012'                         => [ 'Medion', 'Life P4012' ],
+        'MEDION P4013'                              => [ 'Medion', 'Life P4013' ],
+        'MEDION-P4013'                              => [ 'Medion', 'Life P4013' ],
+        'MEDION LIFE P4310'                         => [ 'Medion', 'Life P4310' ],
+        'MEDION P5001'                              => [ 'Medion', 'Life P5001' ],
+        'MEDION X4701'                              => [ 'Medion', 'X4701' ],
+        'MEDION X5004'                              => [ 'Medion', 'X5004' ],
+        'MEDION X5020'                              => [ 'Medion', 'X5020' ],
+        'LIFETAB P9514'                             => [ 'Medion', 'Lifetab P9514', DeviceType::TABLET ],
+        'MD LIFETAB P9516'                          => [ 'Medion', 'Lifetab P9516', DeviceType::TABLET ],
+    ],
+
+    'P1050X'                                    => [ 'Medion', 'Lifetab P1050X', DeviceType::TABLET ],
+
+    'MEEG!!' => [
+        'MEEG 101'                                  => [ 'MEEG', '101' ],
+        'MEEG 101M'                                 => [ 'MEEG', '101M' ],
+        'MEEG 105'                                  => [ 'MEEG', '105' ],
+        'MEEG 105S'                                 => [ 'MEEG', '105S' ],
+        'MEEG 106'                                  => [ 'MEEG', '106' ],
+        'MEEG 201'                                  => [ 'MEEG', '201' ],
+        'MEEG 210R'                                 => [ 'MEEG', '210R' ],
+    ],
+
+    'meizu m1note'                              => [ 'Meizu', 'M1 Note' ],
+    'm1 note'                                   => [ 'Meizu', 'M1 Note' ],
+    'm2 note'                                   => [ 'Meizu', 'M2 Note' ],
+    'MZ-m2 note'                                => [ 'Meizu', 'M2 Note' ],
+    'M571C'                                     => [ 'Meizu', 'M2 Note' ],
+    'MZ-M571C'                                  => [ 'Meizu', 'M2 Note' ],
+    'M578C'                                     => [ 'Meizu', 'M2' ],
+    'MEIZU M5'                                  => [ 'Meizu', 'M5' ],
+    'M8'                                        => [ 'Meizu', 'M8' ],
+    'M9'                                        => [ 'Meizu', 'M9' ],
+    'M9-unlocked'                               => [ 'Meizu', 'M9' ],
+    'MEIZU M9'                                  => [ 'Meizu', 'M9' ],
+    'MEIZU MX'                                  => [ 'Meizu', 'MX' ],
+    'M030'                                      => [ 'Meizu', 'MX M030' ],
+    'M031'                                      => [ 'Meizu', 'MX M031' ],
+    'M032'                                      => [ 'Meizu', 'MX M032' ],
+    'MX2'                                       => [ 'Meizu', 'MX2' ],
+    'M040'                                      => [ 'Meizu', 'MX2 M040' ],
+    'M045'                                      => [ 'Meizu', 'MX2 M045' ],
+    'M351'                                      => [ 'Meizu', 'MX3 M351' ],
+    'M353'                                      => [ 'Meizu', 'MX3 M353' ],
+    'M355'                                      => [ 'Meizu', 'MX3 M355' ],
+    'M356'                                      => [ 'Meizu', 'MX3 M356' ],
+    'MX4'                                       => [ 'Meizu', 'MX4' ],
+    'MZ-MX4'                                    => [ 'Meizu', 'MX4' ],
+    'MX4 Pro'                                   => [ 'Meizu', 'MX4 Pro' ],
+
+    '(MEO )?Smart A!!' => [
+        'meo smart a12'                             => [ 'MEO', 'Smart A12' ],
+        'MEO SMART A16'                             => [ 'MEO', 'Smart A16' ],
+        'MEO Smart A40'                             => [ 'MEO', 'Smart A40' ],
+        'Smart A65'                                 => [ 'MEO', 'Smart A65' ],
+        'Smart A66'                                 => [ 'MEO', 'Smart A66' ],
+        'MEO Smart A68'                             => [ 'MEO', 'Smart A68' ],
+        'meo smart a70'                             => [ 'MEO', 'Smart A70' ],
+        'MEO Smart A75'                             => [ 'MEO', 'Smart A75' ],
+        'MEO A75'                                   => [ 'MEO', 'Smart A75' ],
+        'MEO Smart A80'                             => [ 'MEO', 'Smart A80' ],
+    ],
+
+    'MEU AN!!' => [
+        'MEU AN400'                                 => [ 'MEU', 'AN400' ],
+        'MEU AN500'                                 => [ 'MEU', 'AN500' ],
+    ],
+
+    'Slidepad!!' => [
+        'Slidepad'                                  => [ 'Memup', 'Slidepad', DeviceType::TABLET ],
+        'SlidePad 104'                              => [ 'Memup', 'Slidepad 104', DeviceType::TABLET ],
+        'SlidePad 108'                              => [ 'Memup', 'Slidepad 108', DeviceType::TABLET ],
+        'SlidePad704CE'                             => [ 'Memup', 'Slidepad 704CE', DeviceType::TABLET ],
+        '704DC'                                     => [ 'Memup', 'Slidepad 704DC', DeviceType::TABLET ],
+        'SlidePad 816P'                             => [ 'Memup', 'Slidepad 816P', DeviceType::TABLET ],
+        'SlidePad Elite 9708'                       => [ 'Memup', 'Slidepad Elite 9708', DeviceType::TABLET ],
+        'SlidePad Kids'                             => [ 'Memup', 'Slidepad Kids', DeviceType::TABLET ],
+        'SlidePad NG 116DC'                         => [ 'Memup', 'Slidepad NG 116DC', DeviceType::TABLET ],
+        'SlidePad NG 704DC'                         => [ 'Memup', 'Slidepad NG 704DC', DeviceType::TABLET ],
+    ],
+
+    'SPNG9716DC'                                => [ 'Memup', 'Slidepad NG 9716DC', DeviceType::TABLET ],
+    'Mi-A402'                                   => [ 'Mi-fone', 'FAB 4.0' ],
+
+    'Micromax!!' => [
+        'Micromax A24'                              => [ 'Micromax', 'A24 Bolt' ],
+        'Micromax A25'                              => [ 'Micromax', 'A25 Smarty' ],
+        'Micromax A26'                              => [ 'Micromax', 'A26 Bolt' ],
+        'Micromax A27'                              => [ 'Micromax', 'A27 Bolt' ],
+        'Micromax A28'                              => [ 'Micromax', 'A28 Bolt' ],
+        'Micromax A30'                              => [ 'Micromax', 'A30 Smarty' ],
+        'Micromax A34'                              => [ 'Micromax', 'A34' ],
+        'Micromax A35'                              => [ 'Micromax', 'A35 Bolt' ],
+        'Micromax A36'                              => [ 'Micromax', 'A36 Bolt' ],
+        'Micromax A37'                              => [ 'Micromax', 'A37 Bolt' ],
+        'Micromax A37B'                             => [ 'Micromax', 'A37B Bolt' ],
+        'Micromax A40'                              => [ 'Micromax', 'A40 Bolt' ],
+        'Micromax A44'                              => [ 'Micromax', 'A44 Punk' ],
+        'Micromax A46'                              => [ 'Micromax', 'A46 Bolt' ],
+        'Micromax A47'                              => [ 'Micromax', 'A47 Bolt' ],
+        'Micromax A50'                              => [ 'Micromax', 'A50 Ninja' ],
+        'Micromax A51'                              => [ 'Micromax', 'A51 Bolt' ],
+        'Micromax A52'                              => [ 'Micromax', 'A52 Aisha' ],
+        'Micromax-Xzoom A52'                        => [ 'Micromax', 'A52 Aisha' ],
+        'Micromax A54'                              => [ 'Micromax', 'A54 Ninja' ],
+        'Micromax A56'                              => [ 'Micromax', 'A56 Ninja 2' ],
+        'Micromax A57'                              => [ 'Micromax', 'A57 Ninja 3' ],
+        'Micromax A58'                              => [ 'Micromax', 'A58 Bolt' ],
+        'Micromax A59'                              => [ 'Micromax', 'A59 Bolt' ],
+        'Micromax A60'                              => [ 'Micromax', 'A60 Andro' ],
+        'Micromax A61'                              => [ 'Micromax', 'A61 Bolt' ],
+        'Micromax A62'                              => [ 'Micromax', 'A62 Bolt' ],
+        'Micromax A63'                              => [ 'Micromax', 'A63 Canvas Fun' ],
+        'Micromax A65'                              => [ 'Micromax', 'A65 Smarty' ],
+        'Micromax A66'                              => [ 'Micromax', 'A66 Bolt' ],
+        'Micromax A67'                              => [ 'Micromax', 'A67 Bolt' ],
+        'Micromax A68'                              => [ 'Micromax', 'A68 Smarty' ],
+        'Micromax A69'                              => [ 'Micromax', 'A69 Bolt' ],
+        'Micromax A70'                              => [ 'Micromax', 'A70 Andro' ],
+        'Micromax A71'                              => [ 'Micromax', 'A71 Bolt' ],
+        'Micromax A72'                              => [ 'Micromax', 'A72 Canvas Viva' ],
+        'Micromax A73'                              => [ 'Micromax', 'A73 Buzz' ],
+        'Micromax A74'                              => [ 'Micromax', 'A74 Canvas Fun' ],
+        'Micromax A75'                              => [ 'Micromax', 'A75 Lite' ],
+        'Micromax A76'                              => [ 'Micromax', 'A76 Canvas Fun' ],
+        'Micromax A77'                              => [ 'Micromax', 'A77 Canvas Juice' ],
+        'Micromax A78'                              => [ 'Micromax', 'A78 Gossip' ],
+        'Micromax A79'                              => [ 'Micromax', 'A79 Bolt' ],
+        'Micromax A80'                              => [ 'Micromax', 'A80 Infinity' ],
+        'Micromax A82'                              => [ 'Micromax', 'A82 Bolt' ],
+        'Micromax A84'                              => [ 'Micromax', 'A84' ],
+        'Micromax A85'                              => [ 'Micromax', 'A85' ],
+        'Micromax A86'                              => [ 'Micromax', 'A86 Bling 3' ],
+        'Micromax A87!'                             => [ 'Micromax', 'A87 Ninja 4' ],
+        'Micromax A88'                              => [ 'Micromax', 'A88 Canvas Music' ],
+        'Micromax A89'                              => [ 'Micromax', 'A89 Ninja' ],
+        'Micromax A90!'                             => [ 'Micromax', 'A90 Pixel' ],
+        'Micromax A91'                              => [ 'Micromax', 'A91 Ninja' ],
+        'Micromax A92'                              => [ 'Micromax', 'A92 Canvas Lite' ],
+        'Micromax A93'                              => [ 'Micromax', 'A93 Canvas Elanza' ],
+        'Micromax A94'                              => [ 'Micromax', 'A94 Canvas Mad' ],
+        'Micromax A96'                              => [ 'Micromax', 'A96 Canvas Power' ],
+        'Micromax A99'                              => [ 'Micromax', 'A99 Canvas Xpress' ],
+        'Micromax A064'                             => [ 'Micromax', 'A064 Bolt' ],
+        'Micromax A065'                             => [ 'Micromax', 'A065 Bolt' ],
+        'Micromax A066'                             => [ 'Micromax', 'A066 Bolt' ],
+        'Micromax A067'                             => [ 'Micromax', 'A067 Bolt' ],
+        'Micromax A068'                             => [ 'Micromax', 'A068 Bolt' ],
+        'Micromax A069'                             => [ 'Micromax', 'A069 Bolt' ],
+        'Micromax A075'                             => [ 'Micromax', 'A075 Bolt' ],
+        'Micromax A082'                             => [ 'Micromax', 'A082 Bolt' ],
+        'Micromax A089'                             => [ 'Micromax', 'A089 Bolt' ],
+        'Micromax A091'                             => [ 'Micromax', 'A091 Canvas Engage' ],
+        'Micromax A092'                             => [ 'Micromax', 'A092 Canvas Unite' ],
+        'Micromax A093'                             => [ 'Micromax', 'A093 Canvas Fire' ],
+        'Micromax A096'                             => [ 'Micromax', 'A096 Canvas Fire 3' ],
+        'Micromax A100'                             => [ 'Micromax', 'A100 Canvas' ],
+        'Micromax A101'                             => [ 'Micromax', 'A101' ],
+        'Micromax A102'                             => [ 'Micromax', 'A102 Canvas Doodle 3' ],
+        'Micromax A104'                             => [ 'Micromax', 'A104 Canvas Fire' ],
+        'Micromax A105'                             => [ 'Micromax', 'A105 Canvas Entice' ],
+        'Micromax A106'                             => [ 'Micromax', 'A106 Unite 2' ],
+        'Micromax A107'                             => [ 'Micromax', 'A107 Canvas Fire 4' ],
+        'Micromax A108'                             => [ 'Micromax', 'A108 Canvas L' ],
+        'Micromax A109'                             => [ 'Micromax', 'A109 Canvas XL2' ],
+        'Micromax A110'                             => [ 'Micromax', 'A110 Canvas 2' ],
+        'Micromax Canvas 2'                         => [ 'Micromax', 'A110 Canvas 2' ],
+        'Micromax A110 (Canvas 2)'                  => [ 'Micromax', 'A110 Canvas 2' ],
+        'Micromax A110Q'                            => [ 'Micromax', 'A110Q Canvas 2 Plus' ],
+        'Micromax A111!'                            => [ 'Micromax', 'A111 Canvas Doodle' ],
+        'Micromax A114'                             => [ 'Micromax', 'A114 Canvas 2.2' ],
+        'Micromax A114R'                            => [ 'Micromax', 'A114R Canvas Beat' ],
+        'Micromax A115'                             => [ 'Micromax', 'A115 Canvas 3D' ],
+        'Micromax A116'                             => [ 'Micromax', 'A116 Canvas HD' ],
+        'Micromax A116i'                            => [ 'Micromax', 'A116i Canvas HD' ],
+        'Micromax A117'                             => [ 'Micromax', 'A117 Canvas Magnus' ],
+        'Micromax A118R'                            => [ 'Micromax', 'A118 Canvas Tube' ],
+        'Micromax A119'                             => [ 'Micromax', 'A119 Canvas XL' ],
+        'Micromax A120'                             => [ 'Micromax', 'A120 Canvas 2 Colors' ],
+        'Micromax A121'                             => [ 'Micromax', 'A120 Canvas Elanza 2' ],
+        'Micromax A177'                             => [ 'Micromax', 'A177 Canvas Juice' ],
+        'Micromax A190'                             => [ 'Micromax', 'A190 Canvas HD Plus' ],
+        'Micromax A200'                             => [ 'Micromax', 'A200 Canvas Turbo Mini' ],
+        'Micromax A210'                             => [ 'Micromax', 'A210 Canvas 4' ],
+        'Micromax A240'                             => [ 'Micromax', 'A240 Canvas Doodle 2' ],
+        'Micromax A250'                             => [ 'Micromax', 'A250 Canvas Turbo' ],
+        'Micromax A255'                             => [ 'Micromax', 'A255 Canvas Selfie' ],
+        'Micromax A290'                             => [ 'Micromax', 'A290 Canvas Knight Cameo' ],
+        'Micromax A300'                             => [ 'Micromax', 'A300 Canvas Gold' ],
+        'Micromax A310'                             => [ 'Micromax', 'A310 Canvas Nitro' ],
+        'Micromax A311'                             => [ 'Micromax', 'A311 Canvas Nitro' ],
+        'Micromax A315'                             => [ 'Micromax', 'A315 Canvas 4 Plus' ],
+        'Micromax A316'                             => [ 'Micromax', 'A316 Canvas Hue 2' ],
+        'Micromax A350'                             => [ 'Micromax', 'A350 Canvas Knight' ],
+        'Micromax AD3520'                           => [ 'Micromax', 'AD3520 Bolt' ],
+        'Micromax AE90'                             => [ 'Micromax', 'AE90 Canvas Duet' ],
+        'Micromax AD4500'                           => [ 'Micromax', 'AQ4500 Bolt' ],
+        'Micromax AQ4501'                           => [ 'Micromax', 'AQ4501 Canvas A1' ],
+        'Micromax AQ4502'                           => [ 'Micromax', 'AQ4502 Canvas A1' ],
+        'Micromax AQ5000'                           => [ 'Micromax', 'AQ5000 Canvas Hue' ],
+        'Micromax AQ5001'                           => [ 'Micromax', 'AQ5001 Canvas Juice 2' ],
+        'Micromax D200'                             => [ 'Micromax', 'D200 Bolt' ],
+        'Micromax D303'                             => [ 'Micromax', 'D303 Bolt' ],
+        'Micromax D304'                             => [ 'Micromax', 'D304 Bolt' ],
+        'Micromax D321'                             => [ 'Micromax', 'D321 Bolt' ],
+        'Micromax E311'                             => [ 'Micromax', 'E311 Canvas Nitro 2' ],
+        'Micromax E313'                             => [ 'Micromax', 'E313 Canvas Express 2' ],
+        'Micromax E352'                             => [ 'Micromax', 'E352 Canvas Nitro 3' ],
+        'Micromax E353'                             => [ 'Micromax', 'E353 Canvas Mega' ],
+        'Micromax E451'                             => [ 'Micromax', 'E451 Canvas Pulse 4G' ],
+        'Micromax E455'                             => [ 'Micromax', 'E455 Canvas Nitro 4G' ],
+        'Micromax E471'                             => [ 'Micromax', 'E471 Canvas Knight 2' ],
+        'Micromax E481'                             => [ 'Micromax', 'E481 Canvas 5' ],
+        'Micromax E484'                             => [ 'Micromax', 'E484 Canvas 6 Pro' ],
+        'Micromax E485'                             => [ 'Micromax', 'E485 Canvas 6' ],
+        'Micromax EG111'                            => [ 'Micromax', 'EG111 Canvas Duet 2' ],
+        'Micromax F666'                             => [ 'Micromax', 'F666' ],
+        'Micromax P250(Funbook)'                    => [ 'Micromax', 'Funbook Alpha P250', DeviceType::TABLET ],
+        'Micromax P255'                             => [ 'Micromax', 'Funbook P255', DeviceType::TABLET ],
+        'Micromax P275'                             => [ 'Micromax', 'Funbook Infinity P275', DeviceType::TABLET ],
+        'Micromax P280'                             => [ 'Micromax', 'Funbook P280', DeviceType::TABLET ],
+        'Micromax P290'                             => [ 'Micromax', 'Canvas Tab P290', DeviceType::TABLET ],
+        'Micromax P350'                             => [ 'Micromax', 'Funbook P350', DeviceType::TABLET ],
+        'Micromax P360'                             => [ 'Micromax', 'Funbook Talk P360', DeviceType::TABLET ],
+        'Micromax P362'                             => [ 'Micromax', 'Funbook Talk P362', DeviceType::TABLET ],
+        'Micromax P365'                             => [ 'Micromax', 'Funbook P365', DeviceType::TABLET ],
+        'Micromax P410'                             => [ 'Micromax', 'Funbook Mini P410', DeviceType::TABLET ],
+        'Micromax P410i'                            => [ 'Micromax', 'Funbook Mini P410i', DeviceType::TABLET ],
+        'Micromax P470'                             => [ 'Micromax', 'Canvas Tab P470', DeviceType::TABLET ],
+        'MicromaxP480'                              => [ 'Micromax', 'Canvas Tab P480', DeviceType::TABLET ],
+        'Micromax P500(Funbook)'                    => [ 'Micromax', 'Funbook Pro P500', DeviceType::TABLET ],
+        'Micromax P560'                             => [ 'Micromax', 'Funbook 3G P560', DeviceType::TABLET ],
+        'Micromax P580'                             => [ 'Micromax', 'Funbook Ultra HD P580', DeviceType::TABLET ],
+        'Micromax P600'                             => [ 'Micromax', 'Funbook 3G P600', DeviceType::TABLET ],
+        'Micromax P650'                             => [ 'Micromax', 'Canvas Tab P650', DeviceType::TABLET ],
+        'Micromax P666'                             => [ 'Micromax', 'Canvas Tab P666', DeviceType::TABLET ],
+        'MicromaxP680'                              => [ 'Micromax', 'Canvas Tab P680', DeviceType::TABLET ],
+        'Micromax P690'                             => [ 'Micromax', 'Canvas Tab P690', DeviceType::TABLET ],
+        'Micromax Q300'                             => [ 'Micromax', 'Q300 Bolt Supreme' ],
+        'Micromax Q301'                             => [ 'Micromax', 'Q301 Bolt Supreme 2' ],
+        'Micromax Q323'                             => [ 'Micromax', 'Q323 Bolt' ],
+        'Micromax Q324'                             => [ 'Micromax', 'Q324 Bolt' ],
+        'Micromax Q325'                             => [ 'Micromax', 'Q325 Bolt' ],
+        'Micromax Q326'                             => [ 'Micromax', 'Q326 Bolt' ],
+        'Micromax Q327'                             => [ 'Micromax', 'Q327 Bolt' ],
+        'Micromax Q331'                             => [ 'Micromax', 'Q331 Bolt' ],
+        'Micromax Q332'                             => [ 'Micromax', 'Q332 Bolt' ],
+        'Micromax Q333'                             => [ 'Micromax', 'Q333 Bolt' ],
+        'Micromax Q334'                             => [ 'Micromax', 'Q334 Canvas Spark 2' ],
+        'Micromax Q335'                             => [ 'Micromax', 'Q335 Bolt' ],
+        'Micromax Q336'                             => [ 'Micromax', 'Q336 Bolt' ],
+        'Micromax Q338'                             => [ 'Micromax', 'Q338 Bolt' ],
+        'Micromax Q340'                             => [ 'Micromax', 'Q340 Canvas Selfie 2' ],
+        'Micromax Q345'                             => [ 'Micromax', 'Q345 Canvas Selfie Lens' ],
+        'Micromax Q346'                             => [ 'Micromax', 'Q346 Bolt' ],
+        'Micromax Q348'                             => [ 'Micromax', 'Q348 Canvas Selfie 3' ],
+        'Micromax Q352'                             => [ 'Micromax', 'Q355 Bolt Supreme 4' ],
+        'Micromax Q355'                             => [ 'Micromax', 'Q355 Canvas Play' ],
+        'Micromax Q370'                             => [ 'Micromax', 'Q370 Canvas Pep' ],
+        'Micromax Q371'                             => [ 'Micromax', 'Q371 Canvas Pep' ],
+        'Micromax Q372'                             => [ 'Micromax', 'Q372 Unite 3' ],
+        'Micromax Q375'                             => [ 'Micromax', 'Q375 Canvas Pep' ],
+        'Micromax Q379'                             => [ 'Micromax', 'Q379 Unite 3' ],
+        'Micromax Q380'                             => [ 'Micromax', 'Q380 Canvas Spark' ],
+        'Micromax Q380N'                            => [ 'Micromax', 'Q380 Canvas Spark' ],
+        'Micromax Q381'                             => [ 'Micromax', 'Q381 Bolt' ],
+        'Micromax Q382'                             => [ 'Micromax', 'Q382 Canvas Juice 4' ],
+        'Micromax Q383'                             => [ 'Micromax', 'Q383 Bolt' ],
+        'Micromax Q385'                             => [ 'Micromax', 'Q385 Canvas Spark 3' ],
+        'Micromax Q386'                             => [ 'Micromax', 'Q386 Canvas Fire 5' ],
+        'Micromax Q391'                             => [ 'Micromax', 'Q391 Canvas Doodle 4' ],
+        'Micromax Q392'                             => [ 'Micromax', 'Q392 Canvas Juice 3' ],
+        'Micromax Q394'                             => [ 'Micromax', 'Q394 Canvas Juice 3+' ],
+        'Micromax Q395'                             => [ 'Micromax', 'Q395 Canvas Amaze' ],
+        'Micromax Q400'                             => [ 'Micromax', 'Q400 Canvas Blaze' ],
+        'Micromax Q411'                             => [ 'Micromax', 'Q411 Canvas Fire' ],
+        'Micromax Q412'                             => [ 'Micromax', 'Q412 Canvas Play' ],
+        'Micromax Q413'                             => [ 'Micromax', 'Q413 Canvas Xpress' ],
+        'Micromax Q414'                             => [ 'Micromax', 'Q414 Canvas Blaze 4G+' ],
+        'Micromax Q416'                             => [ 'Micromax', 'Q416 Canvas Pace' ],
+        'Micromax Q417'                             => [ 'Micromax', 'Q417 Canvas Mega' ],
+        'Micromax Q424'                             => [ 'Micromax', 'Q424 Bolt Selfie' ],
+        'Micromax Q426'                             => [ 'Micromax', 'Q426 Canvas Mega 2' ],
+        'Micromax Q450'                             => [ 'Micromax', 'Q450 Sliver 5' ],
+        'Micromax Q461'                             => [ 'Micromax', 'Q461 Canvas Juice' ],
+        'Micromax Q465'                             => [ 'Micromax', 'Q465 Canvas Juice 4 Gold' ],
+        'Micromax Q469'                             => [ 'Micromax', 'Q469 Canvas Play' ],
+        'Micromax Q491'                             => [ 'Micromax', 'Q491 Canvas Doodle 4' ],
+        'Micromax Q4251'                            => [ 'Micromax', 'Q4251 Canvas Juice A1' ],
+        'Micromax S300'                             => [ 'Micromax', 'S300 Bolt' ],
+        'Micromax S301'                             => [ 'Micromax', 'S301 Bolt' ],
+        'Micromax S302'                             => [ 'Micromax', 'S302 Bolt' ],
+    ],
+
+    'A13'                                       => [ 'Micromax', 'A13' ],
+    'A45'                                       => [ 'Micromax', 'A45 Punk' ],
+    'A47'                                       => [ 'Micromax', 'A47 Bolt' ],
+    'A52'                                       => [ 'Micromax', 'A52 Aisha' ],
+    'A87'                                       => [ 'Micromax', 'A87 Ninja 4' ],
+    'A90S'                                      => [ 'Micromax', 'A90S Pixel' ],
+    'A110Q'                                     => [ 'Micromax', 'A110Q Canvas 2 Plus' ],
+    'A110Q Canvas 2 Plus'                       => [ 'Micromax', 'A110Q Canvas 2 Plus' ],
+    'A110Q Canvas 2+'                           => [ 'Micromax', 'A110Q Canvas 2 Plus' ],
+    'P300(Funbook)'                             => [ 'Micromax', 'Funbook P300', DeviceType::TABLET ],
+    'P701'                                      => [ 'Micromax', 'Canvas Tab P701', DeviceType::TABLET ],
+
+    'MLLED!!' => [
+        'MLLED M1B'                                 => [ 'MLLED', 'M1B' ],
+        'MLLED M2+'                                 => [ 'MLLED', 'M2+' ],
+        'MLLED M3 MINI'                             => [ 'MLLED', 'M3 MINI' ],
+        'MLLED M7S'                                 => [ 'MLLED', 'M7S' ],
+        'MLLED M8'                                  => [ 'MLLED', 'M8' ],
+        'MLLED M8S'                                 => [ 'MLLED', 'M8S' ],
+        'MLLED X3S'                                 => [ 'MLLED', 'X3S' ],
+    ],
+
+    'Mio!!' => [
+        'MioCARE A105'                              => [ 'Mitac', 'MioCARE A105' ],
+        'MioCare 6119'                              => [ 'Mitac', 'MioCARE 6119' ],
+        'MioPad 6'                                  => [ 'Mitac', 'MioPad 6', DeviceType::TABLET ],
+    ],
+
+    'MITO!!' => [
+        'MITO A10'                                  => [ 'MITO', 'A10' ],
+        'MITO A15'                                  => [ 'MITO', 'A15' ],
+        'MITO A18'                                  => [ 'MITO', 'A18' ],
+        'MITO A30'                                  => [ 'MITO', 'A30' ],
+        'MITO A33'                                  => [ 'MITO', 'A33' ],
+        'MITO A38'                                  => [ 'MITO', 'A38' ],
+        'MITO A50'                                  => [ 'MITO', 'A50' ],
+        'MITO A55'                                  => [ 'MITO', 'A55' ],
+        'MITO A60'                                  => [ 'MITO', 'A60' ],
+        'MITO A68'                                  => [ 'MITO', 'A68' ],
+        'MITO 68'                                   => [ 'MITO', 'A68' ],
+        'MITO A72'                                  => [ 'MITO', 'A72' ],
+        'MITO A73'                                  => [ 'MITO', 'A73' ],
+        'MITO A75'                                  => [ 'MITO', 'A75' ],
+        'MITO A77'                                  => [ 'MITO', 'A77' ],
+        'MITO A78'                                  => [ 'MITO', 'A78' ],
+        'MITO A80'                                  => [ 'MITO', 'A80' ],
+        'MITO A82'                                  => [ 'MITO', 'A82' ],
+        'MITO A95'                                  => [ 'MITO', 'A95' ],
+        'MITO A99'                                  => [ 'MITO', 'A99' ],
+        'MITO A100'                                 => [ 'MITO', 'A100' ],
+        'MITO A120'                                 => [ 'MITO', 'A120' ],
+        'MITO A180'                                 => [ 'MITO', 'A180' ],
+        'MITO A200'                                 => [ 'MITO', 'A200' ],
+        'MITO A210'                                 => [ 'MITO', 'A210' ],
+        'MITO A220'                                 => [ 'MITO', 'A220' ],
+        'MITO A222'                                 => [ 'MITO', 'A222' ],
+        'MITO A250'                                 => [ 'MITO', 'A250' ],
+        'MITO A260'                                 => [ 'MITO', 'A260' ],
+        'MITO A300'                                 => [ 'MITO', 'A300' ],
+        'MITO A310'                                 => [ 'MITO', 'A310' ],
+        'MITO A313'                                 => [ 'MITO', 'A313' ],
+        'MITO A322'                                 => [ 'MITO', 'A322' ],
+        'MITO A330'                                 => [ 'MITO', 'A330' ],
+        'MITO A350'                                 => [ 'MITO', 'A350' ],
+        'MITO A355'                                 => [ 'MITO', 'A355' ],
+        'MITO A360'                                 => [ 'MITO', 'A360' ],
+        'MITO A363'                                 => [ 'MITO', 'A363' ],
+        'MITO A390'                                 => [ 'MITO', 'A390' ],
+        'MITO A550'                                 => [ 'MITO', 'A550' ],
+        'MITO A660'                                 => [ 'MITO', 'A660' ],
+        'MITO A700'                                 => [ 'MITO', 'A700' ],
+        'MITO A750'                                 => [ 'MITO', 'A750' ],
+        'MITO A780'                                 => [ 'MITO', 'A780' ],
+        'MITOA800'                                  => [ 'MITO', 'A800' ],
+        'MITO A810'                                 => [ 'MITO', 'A810' ],
+        'MITO A850'                                 => [ 'MITO', 'A850' ],
+        'MITO T10'                                  => [ 'MITO', 'T10', DeviceType::TABLET ],
+        'MITO T35'                                  => [ 'MITO', 'T35', DeviceType::TABLET ],
+        'MITO T55'                                  => [ 'MITO', 'T55', DeviceType::TABLET ],
+        'MITO T66'                                  => [ 'MITO', 'T66', DeviceType::TABLET ],
+        'MITO T77'                                  => [ 'MITO', 'T77', DeviceType::TABLET ],
+        'MITO T80'                                  => [ 'MITO', 'T80', DeviceType::TABLET ],
+        'MITO T81'                                  => [ 'MITO', 'T81', DeviceType::TABLET ],
+        'MITO T89'                                  => [ 'MITO', 'T89', DeviceType::TABLET ],
+        'MITO T100'                                 => [ 'MITO', 'T100', DeviceType::TABLET ],
+        'MITO t300'                                 => [ 'MITO', 'T300', DeviceType::TABLET ],
+        'MITO T330'                                 => [ 'MITO', 'T330', DeviceType::TABLET ],
+        'MITO t510'                                 => [ 'MITO', 'T510', DeviceType::TABLET ],
+        'MITO t550'                                 => [ 'MITO', 'T550', DeviceType::TABLET ],
+        'MITO T660'                                 => [ 'MITO', 'T660', DeviceType::TABLET ],
+        'MITO T777'                                 => [ 'MITO', 'T777', DeviceType::TABLET ],
+        'MITO T888'                                 => [ 'MITO', 'T888', DeviceType::TABLET ],
+        'MITO T979'                                 => [ 'MITO', 'T979', DeviceType::TABLET ],
+    ],
+
+    'MIZ Z2'                                    => [ 'Miz', 'Z2' ],
+
+    'iQ(Talk|Tab)!!' => [
+        'iQTalk Crystal'                            => [ 'MLS', 'iQTalk Crystal' ],
+        'iQTalk Crystal Max'                        => [ 'MLS', 'iQTalk Crystal Max' ],
+        'iQTalk King'                               => [ 'MLS', 'iQTalk King' ],
+        'iQTab'                                     => [ 'MLS', 'iQTab', DeviceType::TABLET ],
+        'iQTab 3G'                                  => [ 'MLS', 'iQTab 3G', DeviceType::TABLET ],
+        'iQTab Astro 3G'                            => [ 'MLS', 'iQTab Astro 3G', DeviceType::TABLET ],
+    ],
+
+    'Nova!!' => [
+        'Nova A'                                    => [ 'Mobell', 'Nova A' ],
+        'Nova E'                                    => [ 'Mobell', 'Nova E' ],
+        'Nova F'                                    => [ 'Mobell', 'Nova F' ],
+    ],
+
+    'Mobiistar!!' => [
+        'mobiistar PRIME 558'                       => [ 'Mobiistar', 'Prime 558' ],
+        'Mobiistar S01'                             => [ 'Mobiistar', 'Touch S01' ],
+        'Mobiistar Touch S01'                       => [ 'Mobiistar', 'Touch S01' ],
+        'Mobiistar Touch S02i'                      => [ 'Mobiistar', 'Touch S02i' ],
+        'Mobiistar Touch S03'                       => [ 'Mobiistar', 'Touch S03' ],
+        'Mobiistar Touch S05'                       => [ 'Mobiistar', 'Touch S05' ],
+        'Mobiistar Touch S06'                       => [ 'Mobiistar', 'Touch S06' ],
+        'Mobiistar Touch S07'                       => [ 'Mobiistar', 'Touch S07' ],
+        'Mobiistar Touch S08'                       => [ 'Mobiistar', 'Touch S08' ],
+        'Mobiistar Touch S30'                       => [ 'Mobiistar', 'Touch S30' ],
+        'mobiistar touch S31'                       => [ 'Mobiistar', 'Touch S31' ],
+        'mobiistar touch BEAN 402'                  => [ 'Mobiistar', 'Touch Bean 402' ],
+        'mobiistar touch BEAN 402c'                 => [ 'Mobiistar', 'Touch Bean 402C' ],
+        'mobiistar touch Bean 402s'                 => [ 'Mobiistar', 'Touch Bean 402S' ],
+        'mobiistar touch BEAN 402m'                 => [ 'Mobiistar', 'Touch Bean 402M' ],
+        'Mobiistar Touch Bean 452'                  => [ 'Mobiistar', 'Touch Bean 452' ],
+        'Mobiistar Touch JellyBean 452'             => [ 'Mobiistar', 'Touch Bean 452' ],
+        'Mobiistar Touch Jelly Bean 452'            => [ 'Mobiistar', 'Touch Bean 452' ],
+        'mobiistar touch BEAN 452T'                 => [ 'Mobiistar', 'Touch Bean 452T' ],
+        'Mobiistar Bean 452T'                       => [ 'Mobiistar', 'Touch Bean 452T' ],
+        'mobiistar touch BEAN 454'                  => [ 'Mobiistar', 'Touch Bean 454' ],
+        'Mobiistar Touch Kem 350'                   => [ 'Mobiistar', 'Touch Kem 350' ],
+        'Mobiistar Touch Kem 351'                   => [ 'Mobiistar', 'Touch Kem 351' ],
+        'Mobiistar Touch Kem 402'                   => [ 'Mobiistar', 'Touch Kem 402' ],
+        'Mobiistar Touch Kem 432'                   => [ 'Mobiistar', 'Touch Kem 432' ],
+        'Mobiistar Touch Kem 452'                   => [ 'Mobiistar', 'Touch Kem 452' ],
+        'Mobiistar Touch KEM 452 HDMI'              => [ 'Mobiistar', 'Touch Kem 452' ],
+        'Mobiistar touch KEM 462'                   => [ 'Mobiistar', 'Touch Kem 462' ],
+        'Mobiistar Touch Lai 502'                   => [ 'Mobiistar', 'Touch Lai 502' ],
+        'mobiistar touch LAI 504'                   => [ 'Mobiistar', 'Touch Lai 504' ],
+        'mobiistar LAI 504m'                        => [ 'Mobiistar', 'Touch Lai 504M' ],
+        'mobiistar touch LAI 504Q'                  => [ 'Mobiistar', 'Touch Lai 504Q' ],
+        'mobiistar touch LAI 512'                   => [ 'Mobiistar', 'Touch Lai 512' ],
+    ],
+
+    'BEAN 454'                                  => [ 'Mobiistar', 'Touch Bean 454' ],
+    'MBS BEAN 454'                              => [ 'Mobiistar', 'Touch Bean 454' ],
+    'edenTAB ET-701'                            => [ 'Mobile In Style', 'Eden TAB ET-701', DeviceType::TABLET ],
+
+    'Cynus!!' => [
+        'Cynus E1'                                  => [ 'Mobistel', 'Cynus E1' ],
+        'Cynus F3'                                  => [ 'Mobistel', 'Cynus F3' ],
+        'Cynus F4'                                  => [ 'Mobistel', 'Cynus F4' ],
+        'Cynus F5'                                  => [ 'Mobistel', 'Cynus F5' ],
+        'Cynus F6'                                  => [ 'Mobistel', 'Cynus F6' ],
+        'Cynus F8'                                  => [ 'Mobistel', 'Cynus F8' ],
+        'Cynus T1'                                  => [ 'Mobistel', 'Cynus T1' ],
+        'Cynus T2'                                  => [ 'Mobistel', 'Cynus T2' ],
+        'Cynus T5'                                  => [ 'Mobistel', 'Cynus T5' ],
+        'Cynus T6'                                  => [ 'Mobistel', 'Cynus T6' ],
+        'Cynus T7'                                  => [ 'Mobistel', 'Cynus T7' ],
+        'Cynus T8'                                  => [ 'Mobistel', 'Cynus T8' ],
+    ],
+
+    'MOCHE SMART A16'                           => [ 'Moche', 'Smart A16' ],
+
+    '(MODECOM )?FreeTAB!!' => [
+        'FreeTAB 7.5 IPS X4 3G+'                    => [ 'Modecom', 'FreeTAB 7.5 IPS X4', DeviceType::TABLET ],
+        'FreeTAB 10.1 Silver'                       => [ 'Modecom', 'FreeTAB 10.1 Silver', DeviceType::TABLET ],
+        'FreeTAB 1001'                              => [ 'Modecom', 'FreeTAB 1001', DeviceType::TABLET ],
+        'MODECOM FreeTab 1002 IPS X2'               => [ 'Modecom', 'FreeTAB 1002 IPS X2', DeviceType::TABLET ],
+        'FreeTAB 1003'                              => [ 'Modecom', 'FreeTAB 1003', DeviceType::TABLET ],
+        'FreeTAB1003'                               => [ 'Modecom', 'FreeTAB 1003', DeviceType::TABLET ],
+        'FreeTAB 1014 IPS X4+'                      => [ 'Modecom', 'FreeTAB 1014 IPS X4', DeviceType::TABLET ],
+        'FreeTAB 1014 IPS X4 3G+'                   => [ 'Modecom', 'FreeTAB 1014 IPS X4', DeviceType::TABLET ],
+        'MODECOM FreeTAB 2096+ X2 4GB'              => [ 'Modecom', 'FreeTAB 2096 X2', DeviceType::TABLET ],
+        'FreeTAB 7001 HD IC'                        => [ 'Modecom', 'FreeTAB 7001 HD IC', DeviceType::TABLET ],
+        'FreeTAB 7003 HD+ X2 3G+'                   => [ 'Modecom', 'FreeTAB 7003 HD+ X2', DeviceType::TABLET ],
+        'FreeTAB 7800 IPS IC'                       => [ 'Modecom', 'FreeTAB 7800 IPS IC', DeviceType::TABLET ],
+        'FreeTAB 8001 IPS X2 3G+'                   => [ 'Modecom', 'FreeTAB 8001 IPS X2', DeviceType::TABLET ],
+        'MODECOM FreeTAB 8001 IPS X23G'             => [ 'Modecom', 'FreeTAB 8001 IPS X2', DeviceType::TABLET ],
+        'FreeTAB 8014 IPS X4'                       => [ 'Modecom', 'FreeTAB 8014 IPS X4', DeviceType::TABLET ],
+        'FreeTAB 9000 IPS IC'                       => [ 'Modecom', 'FreeTAB 9000 IPS IC', DeviceType::TABLET ],
+        'FreeTAB 9000 IPS ICG'                      => [ 'Modecom', 'FreeTAB 9000 IPS ICG', DeviceType::TABLET ],
+        'FreeTAB 9000 IPS ICG 3G'                   => [ 'Modecom', 'FreeTAB 9000 IPS ICG', DeviceType::TABLET ],
+        'FreeTAB 9701'                              => [ 'Modecom', 'FreeTAB 9701', DeviceType::TABLET ],
+        'FreeTAB 9701 HD X1'                        => [ 'Modecom', 'FreeTAB 9701 HD X1', DeviceType::TABLET ],
+        'FreeTAB 9701 IPS'                          => [ 'Modecom', 'FreeTAB 9701 IPS', DeviceType::TABLET ],
+        'FreeTAB 9702 HD X2'                        => [ 'Modecom', 'FreeTAB 9702 HD X2', DeviceType::TABLET ],
+        'FreeTAB 9702 HD X4'                        => [ 'Modecom', 'FreeTAB 9702 HD X4', DeviceType::TABLET ],
+        'MODECOM FreeTAB 9702 IPS X2'               => [ 'Modecom', 'FreeTAB 9702 IPS X2', DeviceType::TABLET ],
+        'FreeTAB 9704 IPS2 X4'                      => [ 'Modecom', 'FreeTAB 9704 IPS2 X4', DeviceType::TABLET ],
+    ],
+
+    'MOGU!!' => [
+        'MOGU-M0'                                   => [ 'Mogu', 'M0' ],
+        'MOGU M2'                                   => [ 'Mogu', 'M2' ],
+        'MOGU M2 ROM'                               => [ 'Mogu', 'M2' ],
+        'MOGU-M2'                                   => [ 'Mogu', 'M2' ],
+    ],
+
+    'moii!!' => [
+        'moii-E502'                                 => [ 'moii', 'E502' ],
+        'moii E505'                                 => [ 'moii', 'E505' ],
+        'moii E598'                                 => [ 'moii', 'E598' ],
+        'Moii E801'                                 => [ 'moii', 'E801' ],
+        'moii E893'                                 => [ 'moii', 'E893' ],
+        'Moii E990'                                 => [ 'moii', 'E990' ],
+        'moii E996'                                 => [ 'moii', 'E996' ],
+    ],
+
+    'AT735'                                     => [ 'Moinstone', 'AT735', DeviceType::TABLET ],
+    'MORAL N01'                                 => [ 'Moral', 'N01' ],
+    'i1'                                        => [ 'Motorola', 'i1' ],
+    'A853'                                      => [ 'Motorola', 'Milestone' ],
+    'A953'                                      => [ 'Motorola', 'Milestone 2' ],
+    'A955'                                      => [ 'Motorola', 'Droid 2' ],
+    'A1680'                                     => [ 'Motorola', 'MOTO A1680' ],
+    'F100'                                      => [ 'Motorola', 'MOTOACTV', DeviceType::WATCH ],
+
+    'MB[0-9]{3,3}!!' => [
+        'MB200'                                     => [ 'Motorola', 'CLIQ' ],
+        'MB300'                                     => [ 'Motorola', 'BACKFLIP' ],
+        'MB501'                                     => [ 'Motorola', 'CLIQ XT' ],
+        'MB502'                                     => [ 'Motorola', 'CHARM' ],
+        'MB508'                                     => [ 'Motorola', 'FLIPSIDE' ],
+        'MB511'                                     => [ 'Motorola', 'FLIPOUT' ],
+        'MB520'                                     => [ 'Motorola', 'BRAVO' ],
+        'MB525!'                                    => [ 'Motorola', 'DEFY' ],
+        'MB526!'                                    => [ 'Motorola', 'DEFY+' ],
+        'MB610'                                     => [ 'Motorola', 'CLIQ 2' ],
+        'MB611'                                     => [ 'Motorola', 'CLIQ 2' ],
+        'MB612'                                     => [ 'Motorola', 'XPRT' ],
+        'MB626'                                     => [ 'Motorola', 'MB632' ],
+        'MB632'                                     => [ 'Motorola', 'PRO+' ],
+        'MB810'                                     => [ 'Motorola', 'Droid X' ],
+        'MB853'                                     => [ 'Motorola', 'Electrify' ],
+        'MB855'                                     => [ 'Motorola', 'PHOTON 4G' ],
+        'MB8(60|61)!'                               => [ 'Motorola', 'ATRIX' ],
+        'MB865'                                     => [ 'Motorola', 'ATRIX 2' ],
+        'MB870'                                     => [ 'Motorola', 'Droid X2' ],
+        'MB886'                                     => [ 'Motorola', 'DINARA' ],
+    ],
+
+    'ME[0-9]{3,3}!!' => [
+        'ME501'                                     => [ 'Motorola', 'CLIQ XT' ],
+        'ME502'                                     => [ 'Motorola', 'CHARM' ],
+        'ME511'                                     => [ 'Motorola', 'FLIPOUT' ],
+        'ME525!'                                    => [ 'Motorola', 'MOTO ME525' ],
+        'ME526!'                                    => [ 'Motorola', 'DEFY+' ],
+        'ME600'                                     => [ 'Motorola', 'BACKFLIP' ],
+        'ME611'                                     => [ 'Motorola', 'CLIQ 2' ],
+        'ME632'                                     => [ 'Motorola', 'PRO+' ],
+        'ME722'                                     => [ 'Motorola', 'Milestone 2' ],
+        'ME811'                                     => [ 'Motorola', 'Droid X' ],
+        'ME860'                                     => [ 'Motorola', 'ATRIX' ],
+        'ME863'                                     => [ 'Motorola', 'Milestone 3' ],
+        'ME865'                                     => [ 'Motorola', 'ATRIX 2' ],
+    ],
+
+    'MT[0-9]{3,3}!!' => [
+        'MT620!'                                    => [ 'Motorola', 'MOTO MT620' ],
+        'MT680'                                     => [ 'Motorola', 'MOTOLUXE MT680' ],
+        'MT716'                                     => [ 'Motorola', 'MOTO MT716' ],
+        'MT788'                                     => [ 'Motorola', 'RAZR i' ],
+        'MT810'                                     => [ 'Motorola', 'MOTO MT810' ],
+        'MT870'                                     => [ 'Motorola', 'MOTO MT870' ],
+        'MT887'                                     => [ 'Motorola', 'RAZR V' ],
+        'MT917'                                     => [ 'Motorola', 'MT917' ],
+    ],
+
+    'MZ[0-9]{3,3}!!' => [
+        'MZ505'                                     => [ 'Motorola', 'XOOM Family Edition', DeviceType::TABLET ],
+        'MZ600'                                     => [ 'Motorola', 'XOOM 4G LTE', DeviceType::TABLET ],
+        'MZ601'                                     => [ 'Motorola', 'XOOM 3G', DeviceType::TABLET ],
+        'MZ602'                                     => [ 'Motorola', 'XOOM 4G LTE', DeviceType::TABLET ],
+        'MZ603'                                     => [ 'Motorola', 'XOOM 3G', DeviceType::TABLET ],
+        'MZ604'                                     => [ 'Motorola', 'XOOM WiFi', DeviceType::TABLET ],
+        'MZ605'                                     => [ 'Motorola', 'XOOM 3G', DeviceType::TABLET ],
+        'MZ606'                                     => [ 'Motorola', 'XOOM WiFi', DeviceType::TABLET ],
+        'MZ607'                                     => [ 'Motorola', 'XOOM 2 WiFi Media Edition', DeviceType::TABLET ],
+        'MZ608'                                     => [ 'Motorola', 'XOOM 2 3G Media Edition', DeviceType::TABLET ],
+        'MZ609!'                                    => [ 'Motorola', 'Droid XYBOARD 8.2', DeviceType::TABLET ],
+        'MZ615'                                     => [ 'Motorola', 'XOOM 2 WiFi', DeviceType::TABLET ],
+        'MZ616'                                     => [ 'Motorola', 'XOOM 2 3G', DeviceType::TABLET ],
+        'MZ617!'                                    => [ 'Motorola', 'Droid XYBOARD 10.1', DeviceType::TABLET ],
+    ],
+
+    'WX[0-9]{3,3}!!' => [
+        'WX435'                                     => [ 'Motorola', 'TRIUMPH WX435' ],
+        'WX442'                                     => [ 'Motorola', 'CITRUS WX442' ],
+        'WX445'                                     => [ 'Motorola', 'CITRUS WX445' ],
+    ],
+
+    'XT[0-9]{3,4}!!' => [
+        'XT300'                                     => [ 'Motorola', 'SPICE' ],
+        'XT301'                                     => [ 'Motorola', 'MOTO XT301' ],
+        'XT303'                                     => [ 'Motorola', 'MOTOSMART XT303' ],
+        'XT305'                                     => [ 'Motorola', 'MOTOSMART XT305' ],
+        'XT311'                                     => [ 'Motorola', 'FIRE' ],
+        'XT316'                                     => [ 'Motorola', 'MOTO XT316' ],
+        'XT317'                                     => [ 'Motorola', 'SPICE Key' ],
+        'XT319'                                     => [ 'Motorola', 'MOTO XT319' ],
+        'XT3(20|21)!'                               => [ 'Motorola', 'DEFY Mini' ],
+        'XT389'                                     => [ 'Motorola', 'MOTOSMART XT389' ],
+        'XT390'                                     => [ 'Motorola', 'MOTOSMART XT390' ],
+        'XT500'                                     => [ 'Motorola', 'MOTO XT500' ],
+        'xt-500'                                    => [ 'Motorola', 'MOTO XT500' ],
+        'XT502'                                     => [ 'Motorola', 'QUENCH XT5' ],
+        'XT5(30|31)!'                               => [ 'Motorola', 'FIRE XT' ],
+        'XT532'                                     => [ 'Motorola', 'MOTO XT532' ],
+        'XT535'                                     => [ 'Motorola', 'DEFY' ],
+        'XT536'                                     => [ 'Motorola', 'DEFY Diana' ],
+        'XT5(50|53)!'                               => [ 'Motorola', 'MOTOSMART MIX' ],
+        'XT5(55|56|57)!'                            => [ 'Motorola', 'DEFY XT' ],
+        'XT560'                                     => [ 'Motorola', 'DEFY Pro' ],
+        'XT603'                                     => [ 'Motorola', 'ADMIRAL' ],
+        'XT605'                                     => [ 'Motorola', 'Master XT605' ],
+        'XT610'                                     => [ 'Motorola', 'Droid Pro' ],
+        'Pro XT610'                                 => [ 'Motorola', 'Droid Pro' ],
+        'XT611'                                     => [ 'Motorola', 'MOTOSMART Flip' ],
+        'XT615'                                     => [ 'Motorola', 'MOTO XT615' ],
+        'XT621'                                     => [ 'Motorola', 'Primus XT621' ],
+        'XT623'                                     => [ 'Motorola', 'Kairos XT623' ],
+        'XT626'                                     => [ 'Motorola', 'MOTO XT626' ],
+        'XT627'                                     => [ 'Motorola', 'Kairos XT627' ],
+        'XT681'                                     => [ 'Motorola', 'MOTO XT681' ],
+        'XT682'                                     => [ 'Motorola', 'ATRIX TV' ],
+        'XT685'                                     => [ 'Motorola', 'MOTO XT685' ],
+        'XT687'                                     => [ 'Motorola', 'ATRIX TV' ],
+        'XT701'                                     => [ 'Motorola', 'XT701' ],
+        'XT702!'                                    => [ 'Motorola', 'MOTO XT702' ],
+        'XT711'                                     => [ 'Motorola', 'MOTO XT711' ],
+        'XT720'                                     => [ 'Motorola', 'Milestone' ],
+        'XT760'                                     => [ 'Motorola', 'MOTO XT760' ],
+        'XT788'                                     => [ 'Motorola', 'XT788' ],
+        'XT875'                                     => [ 'Motorola', 'Droid Bionic' ],
+        'XT800W'                                    => [ 'Motorola', 'MOTO Glam' ],
+        'XT800!'                                    => [ 'Motorola', 'MOTO XT800' ],
+        'XT806'                                     => [ 'Motorola', 'MOTO XT806' ],
+        'XT830C'                                    => [ 'Motorola', 'Moto E' ],
+        'XT8(60|83)!'                               => [ 'Motorola', 'Milestone 3' ],
+        'XT862'                                     => [ 'Motorola', 'Droid 3' ],
+        'XT865'                                     => [ 'Motorola', 'Droid Bionic' ],
+        'XT881'                                     => [ 'Motorola', 'Electrify 2' ],
+        'XT882'                                     => [ 'Motorola', 'MOTO XT882' ],
+        'XT8(85|86|89)!'                            => [ 'Motorola', 'RAZR V' ],
+        'XT890'                                     => [ 'Motorola', 'RAZR i' ],
+        'XT894!'                                    => [ 'Motorola', 'Droid 4' ],
+        'XT897!'                                    => [ 'Motorola', 'PHOTON Q' ],
+        'XT901'                                     => [ 'Motorola', 'Electrify M' ],
+        'XT905'                                     => [ 'Motorola', 'RAZR M' ],
+        'XT907!'                                    => [ 'Motorola', 'Droid RAZR M' ],
+        'XT908'                                     => [ 'Motorola', 'RAZR MAXX' ],
+        'XT910!'                                    => [ 'Motorola', 'RAZR' ],
+        'XT912!'                                    => [ 'Motorola', 'Droid RAZR' ],
+        'XT9(14|15|16|18)!'                         => [ 'Motorola', 'Droid RAZR D1' ],
+        'XT9(19|20)!'                               => [ 'Motorola', 'Droid RAZR D3' ],
+        'XT9(23|25|26)!'                            => [ 'Motorola', 'Droid RAZR HD' ],
+        'XT928'                                     => [ 'Motorola', 'XT928' ],
+        'XT939G'                                    => [ 'Motorola', 'Moto G' ],
+        'XT10(19|21|22|23|25)!'                     => [ 'Motorola', 'Moto E' ],
+        'XT1030!'                                   => [ 'Motorola', 'Droid Mini' ],
+        'XT10(08|28|31|32|33|34|35|39|40|42|45)!'   => [ 'Motorola', 'Moto G' ],
+        'XT10(02|03)!'                              => [ 'Motorola', 'Moto G Ferrari' ],
+        'XT10(49|50|52|53|55|56|58|60)!'            => [ 'Motorola', 'Moto X' ],
+        'XT10(63|64|68|69|72|77|78|79)!'            => [ 'Motorola', 'Moto G (2014)' ],
+        'XT1080!'                                   => [ 'Motorola', 'Droid Ultra' ],
+        'XT10(85|92|93|94|95|96|97|98)!'            => [ 'Motorola', 'Moto X (2014)' ],
+        'XT11(00|03)!'                              => [ 'Motorola', 'Nexus 6' ],
+        'XT1115!'                                   => [ 'Motorola', 'Moto X Pro' ],
+        'XT1225'                                    => [ 'Motorola', 'Moto Maxx' ],
+        'XT12(50|54)!'                              => [ 'Motorola', 'Droid Turbo' ],
+        'XT15(14|21|23|24|26|27|28)!'               => [ 'Motorola', 'Moto E (2015)' ],
+        'XT15(40|41|42|43|44|48|50)!'               => [ 'Motorola', 'Moto G (2015)' ],
+        'XT1557'                                    => [ 'Motorola', 'Moto G Turbo' ],
+        'XT15(62|63|64)!'                           => [ 'Motorola', 'Moto X Play' ],
+        'XT1565'                                    => [ 'Motorola', 'Droid MAXX 2' ],
+        'XT15(70|72|73)!'                           => [ 'Motorola', 'Moto X Style' ],
+        'XT1575'                                    => [ 'Motorola', 'Moto X Pure Edition' ],
+        'XT1578'                                    => [ 'Motorola', '"Clark"' ],
+        'XT15(80|81)!'                              => [ 'Motorola', 'Moto X Force' ],
+        'XT1585'                                    => [ 'Motorola', 'Droid Turbo 2' ],
+        'XT16(06|09)!'                              => [ 'Motorola', 'Moto G4 Play' ],
+        'XT1625'                                    => [ 'Motorola', 'Moto G4' ],
+        'XT16(35)!'                                 => [ 'Motorola', 'Moto Z Play' ],
+        'XT1644'                                    => [ 'Motorola', 'Moto G4 Plus' ],
+        'XT16(50)!'                                 => [ 'Motorola', 'Moto X4' ],
+        'XT16(62|63)!'                              => [ 'Motorola', 'Moto M' ],
+        'XT17(00|06)!'                              => [ 'Motorola', 'Moto E (2016)' ],
+        'XT17(10)!'                                 => [ 'Motorola', 'Moto Z (2017)' ],
+        'XT17(55|56|57|58)!'                        => [ 'Motorola', 'Moto E4' ],
+    ],
+
+    'Atrix 2'                                   => [ 'Motorola', 'ATRIX 2' ],
+    'Atrix 2 WeifanZ'                           => [ 'Motorola', 'ATRIX 2' ],
+    'Atrix 4G'                                  => [ 'Motorola', 'ATRIX 4G' ],
+    'Atrix 4G ME860'                            => [ 'Motorola', 'ATRIX 4G' ],
+    'Atrix 4G MB860'                            => [ 'Motorola', 'ATRIX 4G' ],
+    'Atrix HD'                                  => [ 'Motorola', 'ATRIX HD' ],
+    'AtrixHD'                                   => [ 'Motorola', 'ATRIX HD' ],
+    'Backflip'                                  => [ 'Motorola', 'BACKFLIP' ],
+    'CLIQ'                                      => [ 'Motorola', 'CLIQ' ],
+    'CLIQ XT'                                   => [ 'Motorola', 'CLIQ XT' ],
+    'CLIQ2'                                     => [ 'Motorola', 'CLIQ 2' ],
+    'Corvair'                                   => [ 'Motorola', 'Corvair', DeviceType::TABLET ],
+    'DEFY'                                      => [ 'Motorola', 'DEFY' ],
+    'Defy(\\+| Plus)!'                          => [ 'Motorola', 'DEFY+' ],
+    'DEDY+'                                     => [ 'Motorola', 'DEFY+' ],
+    'Dext'                                      => [ 'Motorola', 'Dext' ],
+    'Droid'                                     => [ 'Motorola', 'Droid' ],
+    'Moto Droid'                                => [ 'Motorola', 'Droid' ],
+    'Sholes'                                    => [ 'Motorola', 'Droid' ],
+    'DROID'                                     => [ 'Motorola', 'Droid' ],
+    'DROID ?2!'                                 => [ 'Motorola', 'Droid 2' ],
+    'DROID ?3!'                                 => [ 'Motorola', 'Droid 3' ],
+    'DROID ?4!'                                 => [ 'Motorola', 'Droid 4' ],
+    'DroidPro'                                  => [ 'Motorola', 'Droid Pro' ],
+    'DROID Pro'                                 => [ 'Motorola', 'Droid Pro' ],
+    'Motorola Pro XT610'                        => [ 'Motorola', 'Droid Pro' ],
+    'DROID HD'                                  => [ 'Motorola', 'Droid HD' ],
+    'DROID BIONIC!'                             => [ 'Motorola', 'Droid Bionic' ],
+    'DROID RAZR HD!'                            => [ 'Motorola', 'Droid RAZR HD' ],
+    'DROID ?RAZR!'                              => [ 'Motorola', 'Droid RAZR' ],
+    'DROID SPYDER'                              => [ 'Motorola', 'Droid RAZR' ],
+    'DROID ?X2!'                                => [ 'Motorola', 'Droid X2' ],
+    'DROID ?X!'                                 => [ 'Motorola', 'Droid X' ],
+    'Devour'                                    => [ 'Motorola', 'Droid Devour' ],
+    'calgary'                                   => [ 'Motorola', 'Droid Devour' ],
+    'Electrify'                                 => [ 'Motorola', 'Electrify' ],
+    'Milestone XT711'                           => [ 'Motorola', 'Milestone' ],
+    'Milestone XT720'                           => [ 'Motorola', 'Milestone' ],
+    'Milestone'                                 => [ 'Motorola', 'Milestone' ],
+    'A853 Milestone'                            => [ 'Motorola', 'Milestone' ],
+    'Milestone X'                               => [ 'Motorola', 'Milestone X' ],
+    'Milestone X2'                              => [ 'Motorola', 'Milestone X2' ],
+    'Milestone MAXX'                            => [ 'Motorola', 'Milestone MAXX' ],
+    'Motorola Milestone MAXX'                   => [ 'Motorola', 'Milestone MAXX' ],
+    'MILESTONE3'                                => [ 'Motorola', 'Milestone 3' ],
+    'Backflip Me600'                            => [ 'Motorola', 'BACKFLIP' ],
+    'Motorola Backflip Me600'                   => [ 'Motorola', 'BACKFLIP' ],
+    'Moto ME860'                                => [ 'Motorola', 'ATRIX' ],
+    '(Moto)?E2$!'                               => [ 'Motorola', 'Moto E (2015)' ],
+    '(Moto)?E2\(4G-LTE\)$!'                     => [ 'Motorola', 'Moto E (2015)' ],
+    'surnia'                                    => [ 'Motorola', 'Moto E (2015)' ],
+    'Moto E (4) Plus'                           => [ 'Motorola', 'Moto E4 Plus' ],
+    '(Moto)?G3$!'                               => [ 'Motorola', 'Moto G (2015)' ],
+    '(Moto)?G3-TE$!'                            => [ 'Motorola', 'Moto G (2015)' ],
+    'MOTOROLA MOTOG'                            => [ 'Motorola', 'Moto G' ],
+    'Moto G Play'                               => [ 'Motorola', 'Moto G Play' ],
+    'Moto G4'                                   => [ 'Motorola', 'Moto G4' ],
+    'Moto G (4)'                                => [ 'Motorola', 'Moto G4' ],
+    'Moto G4 Plus'                              => [ 'Motorola', 'Moto G4 Plus' ],
+    'Moto G (5)'                                => [ 'Motorola', 'Moto G5' ],
+    'Moto G (5) Plus'                           => [ 'Motorola', 'Moto G5 Plus' ],
+    'roiX'                                      => [ 'Motorola', 'Droid X' ],
+    'Moto Backflip'                             => [ 'Motorola', 'BACKFLIP' ],
+    'RAZR'                                      => [ 'Motorola', 'RAZR' ],
+    'RAZR HD'                                   => [ 'Motorola', 'RAZR HD' ],
+    'RAZR M'                                    => [ 'Motorola', 'RAZR M' ],
+    'RAZR MAXX'                                 => [ 'Motorola', 'RAZR MAXX' ],
+    'Triumph'                                   => [ 'Motorola', 'TRIUMPH' ],
+    'Opus One'                                  => [ 'Motorola', 'i1' ],
+    'Photon'                                    => [ 'Motorola', 'PHOTON' ],
+    'Photon 4G'                                 => [ 'Motorola', 'PHOTON 4G' ],
+    'Photon Q'                                  => [ 'Motorola', 'PHOTON Q' ],
+    'Photon Q LTE'                              => [ 'Motorola', 'PHOTON Q' ],
+    'XOOM'                                      => [ 'Motorola', 'XOOM', DeviceType::TABLET ],
+    'MOTOROLA XOOM MZ606'                       => [ 'Motorola', 'XOOM', DeviceType::TABLET ],
+    'XOOM 2!'                                   => [ 'Motorola', 'XOOM 2', DeviceType::TABLET ],
+    'XOOM MZ606'                                => [ 'Motorola', 'XOOM WiFi', DeviceType::TABLET ],
+    'Xoom Wifi'                                 => [ 'Motorola', 'XOOM WiFi', DeviceType::TABLET ],
+    'Xoom LTE'                                  => [ 'Motorola', 'XOOM 4G LTE', DeviceType::TABLET ],
+    'Xoom 3G'                                   => [ 'Motorola', 'XOOM 3G', DeviceType::TABLET ],
+    '201M'                                      => [ 'Motorola', 'RAZR M 201M', 'carrier' => 'Softbank' ],
+    'ISW11M'                                    => [ 'Motorola', 'PHOTON ISW11M', 'carrier' => 'au' ],
+    'IS12M'                                     => [ 'Motorola', 'RAZR IS12M', 'carrier' => 'au' ],
+    'MOTOROLA RAZR'                             => [ 'Motorola', 'RAZR' ],
+    'MOTWX435KT'                                => [ 'Motorola', 'TRIUMPH' ],
+    'X3-Ice MIUI XT720 Memorila Classics'       => [ 'Motorola', 'Milestone' ],
+    'ET1'                                       => [ 'Motorola', 'ET1 Enterprise Tablet', DeviceType::TABLET ],     /* Products of Motorola Solutions */
+    'MC32N0'                                    => [ 'Motorola', 'MC32 Mobile Computer', DeviceType::POS ],
+    'MC40N0'                                    => [ 'Motorola', 'MC40 Mobile Computer', DeviceType::POS ],
+    'MC67NA'                                    => [ 'Motorola', 'MC67 Mobile Computer', DeviceType::POS ],
+    'TC55'                                      => [ 'Motorola', 'TC55 Touch Computer' ],
+    'TC55CH'                                    => [ 'Motorola', 'TC55 Touch Computer' ],
+    'TC70'                                      => [ 'Motorola', 'TC70 Touch Computer' ],
+    'TC75'                                      => [ 'Motorola', 'TC75 Touch Computer' ],
+    'PH350'                                     => [ 'Mpman', 'PH350' ],
+    'PH520'                                     => [ 'Mpman', 'PH520' ],
+    'MID7C'                                     => [ 'Mpman', 'MID7C', DeviceType::TABLET ],
+    'MID43C'                                    => [ 'Mpman', 'MID43C', DeviceType::TABLET ],
+    'MID74C'                                    => [ 'Mpman', 'MID74C', DeviceType::TABLET ],
+    'MID77C'                                    => [ 'Mpman', 'MID77C', DeviceType::TABLET ],
+    'MID82C'                                    => [ 'Mpman', 'MID82C', DeviceType::TABLET ],
+    'MID84C'                                    => [ 'Mpman', 'MID84C', DeviceType::TABLET ],
+    'MID102C'                                   => [ 'Mpman', 'MID102C', DeviceType::TABLET ],
+    'MID103C'                                   => [ 'Mpman', 'MID103C', DeviceType::TABLET ],
+    'MID104C'                                   => [ 'Mpman', 'MID104C', DeviceType::TABLET ],
+    'MID114C'                                   => [ 'Mpman', 'MID114C', DeviceType::TABLET ],
+    'MP717'                                     => [ 'Mpman', 'MP717', DeviceType::TABLET ],
+    'MP843'                                     => [ 'Mpman', 'MP843', DeviceType::TABLET ],
+    'MP888'                                     => [ 'Mpman', 'MP888', DeviceType::TABLET ],
+    'MP959'                                     => [ 'Mpman', 'MP959', DeviceType::TABLET ],
+    'MP969'                                     => [ 'Mpman', 'MP969', DeviceType::TABLET ],
+    'MP1010'                                    => [ 'Mpman', 'MP1010', DeviceType::TABLET ],
+    'MP7007'                                    => [ 'Mpman', 'MP7007', DeviceType::TABLET ],
+    'MPDC100 BT'                                => [ 'Mpman', 'MPDC100 BT', DeviceType::TABLET ],
+    'MPDC110 BT IPS'                            => [ 'Mpman', 'MPDC110 BT', DeviceType::TABLET ],
+    'MPDC112 BT IPS'                            => [ 'Mpman', 'MPDC112 BT', DeviceType::TABLET ],
+    'MPDC8 BT'                                  => [ 'Mpman', 'MPDC8 BT', DeviceType::TABLET ],
+    'MPDC88 BT IPS'                             => [ 'Mpman', 'MPDC88 BT', DeviceType::TABLET ],
+    'MPDC706'                                   => [ 'Mpman', 'MPDC706', DeviceType::TABLET ],
+    'MPDC903'                                   => [ 'Mpman', 'MPDC903', DeviceType::TABLET ],
+    'MPQC704 HD'                                => [ 'Mpman', 'MPQC704 HD', DeviceType::TABLET ],
+    'MPQC784 IPS'                               => [ 'Mpman', 'MPQC784', DeviceType::TABLET ],
+    'MPQC804HD'                                 => [ 'Mpman', 'MPQC804 HD', DeviceType::TABLET ],
+    'MPQC1010'                                  => [ 'Mpman', 'MPQC1010', DeviceType::TABLET ],
+    'Primo76'                                   => [ 'MSI', 'Primo 76', DeviceType::TABLET ],
+    'Primo 91'                                  => [ 'MSI', 'Primo 91', DeviceType::TABLET ],
+    'Enjoy 71'                                  => [ 'MSI', 'Enjoy 71', DeviceType::TABLET ],
+    'Enjoy 7 Plus'                              => [ 'MSI', 'WindPad Enjoy 7 Plus', DeviceType::TABLET ],
+    'MTS-SP100'                                 => [ 'MTS', 'Lifewire SP 100' ],
+    'MTS-SP101'                                 => [ 'MTS', 'Mtag 3.1 SP 101' ],
+    'Multilaser Diamond'                        => [ 'Multilaser', 'Diamond', DeviceType::TABLET ],
+    'Multilaser Orion'                          => [ 'Multilaser', 'Orion' ],
+    'Multilaser Oxy'                            => [ 'Multilaser', 'Oxy', DeviceType::TABLET ],
+    'Multilaser Titanium'                       => [ 'Multilaser', 'Titanium' ],
+    'NB036'                                     => [ 'Multilaser', 'Vibe NB036', DeviceType::TABLET ],
+
+    'M4(TEL)? SS[0-9]{3,4}!!' => [
+        'M4TEL SS550'                               => [ 'M4Tel', 'Genius' ],
+        'M4TEL SS880'                               => [ 'M4Tel', 'Mirage' ],
+        'M4TEL SS990'                               => [ 'M4Tel', 'E-Motion' ],
+        'M4 SS1050'                                 => [ 'M4Tel', 'SS1050' ],
+        'M4 SS1060'                                 => [ 'M4Tel', 'M4Live' ],
+        'M4 SS1070'                                 => [ 'M4Tel', 'Sense' ],
+        'M4 SS1080'                                 => [ 'M4Tel', 'Max One' ],
+        'M4 SS1090'                                 => [ 'M4Tel', 'Max Ultra' ],
+        'M4 SS4040'                                 => [ 'M4Tel', 'SS4040' ],
+        'M4 SS4041'                                 => [ 'M4Tel', 'SS4041' ],
+        'M4 SS4045'                                 => [ 'M4Tel', 'SS4045' ],
+    ],
+
+    'MyPhone A818g Duo'                         => [ 'MyPhone', 'A818g Duo' ],
+    'MyPhone A818 Slim Duo'                     => [ 'MyPhone', 'A818 Slim Duo' ],
+    'MyPhone A848 Duo'                          => [ 'MyPhone', 'A848 Duo' ],
+    'MyPhone A848i Duo'                         => [ 'MyPhone', 'A848i Duo' ],
+    'MyPhone A848g Duo'                         => [ 'MyPhone', 'A848g Duo' ],
+    'A878 Duo'                                  => [ 'MyPhone', 'A878 Duo' ],
+    'MyPhone A888'                              => [ 'MyPhone', 'A888 Duo' ],
+    'MyPhone A888 Duo'                          => [ 'MyPhone', 'A888 Duo' ],
+    'My|Phone A888 Duo'                         => [ 'MyPhone', 'A888 Duo' ],
+    'A898 Duo'                                  => [ 'MyPhone', 'A898 Duo' ],
+    'MyPhone A919 Duo'                          => [ 'MyPhone', 'A919 Duo' ],
+    'MyPhone A919 3D Duo'                       => [ 'MyPhone', 'A919 3D Duo' ],
+    'MyPhone A919i'                             => [ 'MyPhone', 'A919i' ],
+    'MyPhone A919i Duo'                         => [ 'MyPhone', 'A919i Duo' ],
+    'MyPhone Agua Cyclone'                      => [ 'MyPhone', 'Agua Cyclone' ],
+    'MyPhone Agua Hail'                         => [ 'MyPhone', 'Agua Hail' ],
+    'MyPhone Agua Iceberg'                      => [ 'MyPhone', 'Agua Iceberg' ],
+    'MyPhone Agua Iceberg Mini'                 => [ 'MyPhone', 'Agua Iceberg Mini' ],
+    'MyPhone Agua Iceberg Slim'                 => [ 'MyPhone', 'Agua Iceberg Slim' ],
+    'MyPhone Agua Infinity'                     => [ 'MyPhone', 'Agua Infinity' ],
+    'MyPhone Agua Ocean Lite'                   => [ 'MyPhone', 'Agua Ocean Lite' ],
+    'MyPhone Agua Ocean Mini'                   => [ 'MyPhone', 'Agua Ocean Mini' ],
+    'MyPhone Agua Ocean Pro'                    => [ 'MyPhone', 'Agua Ocean Pro' ],
+    'MyPhone Agua Rain 2G'                      => [ 'MyPhone', 'Agua Rain' ],
+    'MyPhone Agua Rain 3G'                      => [ 'MyPhone', 'Agua Rain' ],
+    'MyPhone Agua Rio'                          => [ 'MyPhone', 'Agua Rio' ],
+    'MyPhone Agua Rio Fun'                      => [ 'MyPhone', 'Agua Rio Fun' ],
+    'MyPhone Agua Rio Lite'                     => [ 'MyPhone', 'Agua Rio Lite' ],
+    'MyPhone Agua Storm'                        => [ 'MyPhone', 'Agua Storm' ],
+    'MyPhone Agua Vortex'                       => [ 'MyPhone', 'Agua Vortex' ],
+    'myPhone C Smart'                           => [ 'MyPhone', 'C Smart' ],
+    'myPhone Cube'                              => [ 'MyPhone', 'Cube' ],
+    'myPhone Cube 16GB'                         => [ 'MyPhone', 'Cube' ],
+    'myPhone Duosmart'                          => [ 'MyPhone', 'Duosmart' ],
+    'myPhone FUN 2'                             => [ 'MyPhone', 'Fun 2' ],
+    'myPhone Funky'                             => [ 'MyPhone', 'Funky' ],
+    'myPhone Hammer'                            => [ 'MyPhone', 'Hammer' ],
+    'myPhone INFINITY 3G'                       => [ 'MyPhone', 'Infinity' ],
+    'myPhone NEXT'                              => [ 'MyPhone', 'NEXT' ],
+    'myPhone NEXTS'                             => [ 'MyPhone', 'NEXT S' ],
+    'myPhone NEXT S'                            => [ 'MyPhone', 'NEXT S' ],
+    'myPhone Smart'                             => [ 'MyPhone', 'Smart' ],
+    'myPhone S-line'                            => [ 'MyPhone', 'S-line' ],
+    'MyPhone Rio Craze'                         => [ 'MyPhone', 'Rio Craze' ],
+    'MyPhone Rio Grande'                        => [ 'MyPhone', 'Rio Grande' ],
+    'MyPhone Rio Junior TV'                     => [ 'MyPhone', 'Rio Junior TV' ],
+    'MyPhone Rio 2'                             => [ 'MyPhone', 'Rio 2' ],
+    'MyPhone Rio 2 Fun'                         => [ 'MyPhone', 'Rio 2 Fun' ],
+    'MyPhone UNO'                               => [ 'MyPhone', 'Uno' ],
+    'MyPhone Xperia Rain 3G'                    => [ 'MyPhone', 'Xperia Rain' ],
+    'Myphone MY25'                              => [ 'MyPhone', 'My25' ],
+    'MyPhone MY26'                              => [ 'MyPhone', 'My26' ],
+    'MyPhone MY28S'                             => [ 'MyPhone', 'My28S' ],
+    'MyPad 2'                                   => [ 'MyPhone', 'MyPad 2', DeviceType::TABLET ],
+    'MyPad 750HD'                               => [ 'MyPhone', 'MyPad 750 HD', DeviceType::TABLET ],
+    'MyPad 1000 HD'                             => [ 'MyPhone', 'MyPad 1000 HD', DeviceType::TABLET ],
+
+    'MY ?SAGA!!' => [
+        'MySAGA C1'                                 => [ 'Mysaga', 'C1' ],
+        'MY SAGA C2'                                => [ 'Mysaga', 'C2' ],
+        'MY SAGA C3'                                => [ 'Mysaga', 'C3' ],
+        'MYSAGA M1'                                 => [ 'Mysaga', 'M1' ],
+    ],
+
+    'M\.T\.T\.!!' => [
+        'M.T.T. SmartFun'                           => [ 'M.T.T.', 'Smart Fun' ],
+        'M.T.T.SmartMax'                            => [ 'M.T.T.', 'Smart Max' ],
+        'M.T.T. Smart Multimedia'                   => [ 'M.T.T.', 'Smart Multimedia' ],
+        'M.T.T. Tablet'                             => [ 'M.T.T.', 'Tablet', DeviceType::TABLET ],
+    ],
+
+    'iQ7 8GB'                                   => [ 'Navon', 'IQ7', DeviceType::TABLET ],
+    'Newman K1'                                 => [ 'Newman', 'K1' ],
+    'NewmanK1'                                  => [ 'Newman', 'K1' ],
+    'Newman K2'                                 => [ 'Newman', 'K2' ],
+    'N1'                                        => [ 'Newman', 'N1' ],
+    'Newman N1'                                 => [ 'Newman', 'N1' ],
+    'Newman N2!'                                => [ 'Newman', 'N2' ],
+    'Newman-N2!'                                => [ 'Newman', 'N2' ],
+    'Newpad'                                    => [ 'Newsmy', 'Newpad', DeviceType::TABLET ],
+    'Newpad-K97'                                => [ 'Newsmy', 'Newpad K97', DeviceType::TABLET ],
+    'Newpad-NP900'                              => [ 'Newsmy', 'Newpad NP900', DeviceType::TABLET ],
+    'P7'                                        => [ 'Newsmy', 'Newpad P7', DeviceType::TABLET ],
+    'Newpad P9'                                 => [ 'Newsmy', 'Newpad P9', DeviceType::TABLET ],
+    'Newpad P72'                                => [ 'Newsmy', 'Newpad P72', DeviceType::TABLET ],
+    'Newsmy P72'                                => [ 'Newsmy', 'Newpad P72', DeviceType::TABLET ],
+    'Newsmy P72-C'                              => [ 'Newsmy', 'Newpad P72', DeviceType::TABLET ],
+    'Newsmy T3'                                 => [ 'Newsmy', 'Newpad T3', DeviceType::TABLET ],
+    'Newsmy T7II'                               => [ 'Newsmy', 'Newpad T7 II', DeviceType::TABLET ],
+    'M-PAD N8'                                  => [ 'Newsmy', 'M-pad N8', DeviceType::TABLET ],
+
+    'LTB-HS'                                    => [ 'NEC', 'LifeTouch B' ],
+    'LT-TLA'                                    => [ 'NEC', 'LifeTouch L' ],
+    'NEC-STR'                                   => [ 'NEC', 'LifeTouch L' ],
+    'LT-NA7'                                    => [ 'NEC', 'LifeTouch Note' ],
+    'LT-NA7F'                                   => [ 'NEC', 'LifeTouch Note' ],
+
+    'D000-0000(13|18|19)-[0-9]{3,3}!'           => [ 'NEC', 'LifeTouch B' ],
+    'D000-0000(01|07)-[A-Z][0-9]{2,2}!'         => [ 'NEC', 'LifeTouch S' ],
+    'D000-000002-[W0][0-9]{2,2}!'               => [ 'NEC', 'LifeTouch W' ],
+    'D000-0000(10|11)-N!'                       => [ 'NEC', 'LifeTouch Note' ],
+
+    'D000 000043'                               => [ 'NEC', 'NS8368', DeviceType::TELEVISION ],
+
+    'N-0[0-9][A-Z]!!' => [
+        'N-01D'                                     => [ 'NEC', 'MEDIAS PP N-01D', 'carrier' => 'DoCoMo' ],
+        'N-02E'                                     => [ 'NEC', 'MEDIAS U N-02E', 'carrier' => 'DoCoMo' ],
+        'N-03E'                                     => [ 'NEC', 'N-03E', 'carrier' => 'Disney Mobile' ],
+        'N-04C'                                     => [ 'NEC', 'MEDIAS N-04C', 'carrier' => 'DoCoMo' ],
+        'N-04D'                                     => [ 'NEC', 'MEDIAS LTE N-04D', 'carrier' => 'DoCoMo' ],
+        'N-04E'                                     => [ 'NEC', 'MEDIAS X N-04E', 'carrier' => 'DoCoMo' ],
+        'N-05D'                                     => [ 'NEC', 'MEDIAS ES N-05D', 'carrier' => 'DoCoMo' ],
+        'N-05E'                                     => [ 'NEC', 'MEDIAS W N-05E', 'carrier' => 'DoCoMo' ],
+        'N-06C'                                     => [ 'NEC', 'MEDIAS WP N-06C', 'carrier' => 'DoCoMo' ],
+        'N-06D'                                     => [ 'NEC', 'MEDIAS Tab N-06D', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+        'N-06E'                                     => [ 'NEC', 'MEDIAS X N-06E', 'carrier' => 'DoCoMo' ],
+        'N-07D'                                     => [ 'NEC', 'MEDIAS X N-07D', 'carrier' => 'DoCoMo' ],
+        'N-08D'                                     => [ 'NEC', 'MEDIAS Tab UL N-08D', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+    ],
+
+    'NEC-0912'                                  => [ 'NEC', 'MEDIAS U N-02E', 'carrier' => 'DoCoMo' ],
+    'IS11N'                                     => [ 'NEC', 'MEDIAS BR IS11N', 'carrier' => 'au' ],
+    '101N'                                      => [ 'NEC', 'MEDIAS CH 101N', 'carrier' => 'Softbank' ],
+    'NEC-101S'                                  => [ 'NEC', 'MEDIAS 101S' ],
+    'NECTEL-101S'                               => [ 'NEC', 'MEDIAS 101S' ],
+    'NEC-101T'                                  => [ 'NEC', 'MEDIAS 101T' ],
+    '101T'                                      => [ 'NEC', 'MEDIAS 101T' ],
+    'NEC-101TH'                                 => [ 'NEC', 'MEDIAS 101TH' ],
+    'NEC-102'                                   => [ 'NEC', 'MEDIAS 102' ],
+    'NE-103T'                                   => [ 'NEC', 'MEDIAS U 103T' ],
+    'NEC909e'                                   => [ 'NEC', 'MEDIAS 909e' ],
+    'NE-202'                                    => [ 'NEC', 'MEDIAS', 'carrier' => 'Biglobe' ],
+    'NE-201A1A'                                 => [ 'NEC', 'Terrain' ],
+    'NEC-NE-201A1A'                             => [ 'NEC', 'Terrain' ],
+    'NEC-NEC-NE-201A1A'                         => [ 'NEC', 'Terrain' ],
+
+    'LaVieTab!!' => [
+        'LaVieTab PC-TE508S1'                       => [ 'NEC', 'LaVie Tab E TE508', DeviceType::TABLET ],
+        'LaVieTab PC-TE510N1B'                      => [ 'NEC', 'LaVie Tab E TE510', DeviceType::TABLET ],
+        'LaVieTab PC-TE510S1'                       => [ 'NEC', 'LaVie Tab E TE510', DeviceType::TABLET ],
+        'LaVieTab TE510S1'                          => [ 'NEC', 'LaVie Tab E TE510', DeviceType::TABLET ],
+        'LaVieTab PC-TS507N1S'                      => [ 'NEC', 'LaVie Tab S TS507', DeviceType::TABLET ],
+    ],
+
+    'PC-TE307N1W'                               => [ 'NEC', 'LaVie Tab E TE307', DeviceType::TABLET ],
+    'NEC PC-TE508S1'                            => [ 'NEC', 'LaVie Tab E TE508', DeviceType::TABLET ],
+    'PC-TE508BAW'                               => [ 'NEC', 'LaVie Tab E TE508', DeviceType::TABLET ],
+    'PC-TS508T1W'                               => [ 'NEC', 'LaVie Tab S TS508', DeviceType::TABLET ],
+    'PC-TS708T1W'                               => [ 'NEC', 'LaVie Tab S TS708', DeviceType::TABLET ],
+
+    'N8730-411'                                 => [ 'NEC', 'AGT10', DeviceType::TABLET ],
+    'N8730-41101'                               => [ 'NEC', 'AGT10', DeviceType::TABLET ],
+    'N8730-41102'                               => [ 'NEC', 'AGT10', DeviceType::TABLET ],
+
+    'OPS-DRD Digital Signage Player'            => [ 'NEC', 'OPS-DRD Digital Signage Player', DeviceType::SIGNAGE ],
+
+    'neken!!' => [
+        'neken N5'                                  => [ 'Neken', 'N5' ],
+        'neken N6'                                  => [ 'Neken', 'N6' ],
+        'neken NX'                                  => [ 'Neken', 'NX' ],
+    ],
+
+    'GTV100'                                    => [ 'NETGEAR', 'NeoTV Prime', DeviceType::TELEVISION, Flag::GOOGLETV ],
+
+    'NEO!!' => [
+        'NEO N01'                                   => [ 'NEO', 'N01' ],
+        'NEO N002'                                  => [ 'NEO', 'N002' ],
+        'NEO N002i'                                 => [ 'NEO', 'N002i' ],
+    ],
+
+    'ARA YS608'                                 => [ 'NESO', 'ARA YS608' ],
+
+    '(Nexian )?NX-A[0-9]{3,3}!!' => [
+        'NX-A712'                                   => [ 'Nexian', 'Explorer' ],
+        'Nexian NX-A890'                            => [ 'Nexian', 'Journey' ],
+        'NX-A890'                                   => [ 'Nexian', 'Journey' ],
+        'NX-A891'                                   => [ 'Nexian', 'Ultra Journey' ],
+        'NX-A895'                                   => [ 'Nexian', 'Cosmo Journey' ],
+        'NX-A899'                                   => [ 'Nexian', 'Xtreme' ],
+    ],
+
+    'Nextbook Premium 7'                        => [ 'Nextbook', 'Premium 7', DeviceType::EREADER ],
+    'M726HC'                                    => [ 'Nextbook', 'Premium 7', DeviceType::EREADER ],
+    'Next7C12!'                                 => [ 'Nextbook', 'Premium 7', DeviceType::EREADER ],
+    'Next7D12!'                                 => [ 'Nextbook', 'Premium 7', DeviceType::EREADER ],
+    'Next7P12!'                                 => [ 'Nextbook', 'Premium 7', DeviceType::EREADER ],
+    'Next7Q12!'                                 => [ 'Nextbook', 'Premium 7', DeviceType::EREADER ],
+    'Next7P'                                    => [ 'Nextbook', 'Premium 7', DeviceType::EREADER ],
+    'Next7S'                                    => [ 'Nextbook', 'Premium 7', DeviceType::EREADER ],
+    'NXM726'                                    => [ 'Nextbook', 'Premium 7', DeviceType::EREADER ],
+    'NXM726HN'                                  => [ 'Nextbook', 'Premium 7', DeviceType::EREADER ],
+    'NXM726HN C030'                             => [ 'Nextbook', 'Premium 7', DeviceType::EREADER ],
+    'NXM726HN HASTINGS'                         => [ 'Nextbook', 'Premium 7', DeviceType::EREADER ],
+    'NXM727KC!'                                 => [ 'Nextbook', 'Premium 7', DeviceType::EREADER ],
+    'Nextbook Premium 7 SE'                     => [ 'Nextbook', 'Premium 7 SE', DeviceType::EREADER ],
+    'NEXT8P'                                    => [ 'Nextbook', 'Premium 8', DeviceType::EREADER ],
+    'Next8P11'                                  => [ 'Nextbook', 'Premium 8', DeviceType::EREADER ],
+    'Next8P12'                                  => [ 'Nextbook', 'Premium 8', DeviceType::EREADER ],
+    'NXM803HC'                                  => [ 'Nextbook', 'Premium 8', DeviceType::EREADER ],
+    'NXM803HD'                                  => [ 'Nextbook', 'Premium 8', DeviceType::EREADER ],
+    'NX868QW8G'                                 => [ 'Nextbook', 'Premium 8', DeviceType::EREADER ],
+    'DATAM803HC'                                => [ 'Nextbook', 'Premium 8', DeviceType::EREADER ],
+    'DATAM805HC'                                => [ 'Nextbook', 'Premium 8 SE', DeviceType::EREADER ],
+    'NXM805ND'                                  => [ 'Nextbook', 'Premium 8 SE', DeviceType::EREADER ],
+    'NXM805ND EN'                               => [ 'Nextbook', 'Premium 8 SE', DeviceType::EREADER ],
+    'DATAM819HD!'                               => [ 'Nextbook', 'Premium 8', DeviceType::EREADER ],
+    'Next9P'                                    => [ 'Nextbook', 'Premium 9', DeviceType::EREADER ],
+    'NXM908HC'                                  => [ 'Nextbook', 'Premium 9', DeviceType::EREADER ],
+    'Next10P12'                                 => [ 'Nextbook', 'Premium 10', DeviceType::EREADER ],
+    'NEXT'                                      => [ 'Nextbook', 'Next', DeviceType::EREADER ],
+    'NXM703U'                                   => [ 'Nextbook', 'Next 2', DeviceType::EREADER ],
+    'NXM901'                                    => [ 'Nextbook', 'Next 3', DeviceType::EREADER],
+    'NXM736'                                    => [ 'Nextbook', 'Next 6', DeviceType::EREADER],
+    'NX700QC'                                   => [ 'Nextbook', '7', DeviceType::TABLET],
+    'NX785QC8G'                                 => [ 'Nextbook', '8', DeviceType::TABLET],
+    'NXM900MC'                                  => [ 'Nextbook', '8 HD', DeviceType::TABLET],
+    'ATLANTIS'                                  => [ 'NGM', 'Atlantis' ],
+    'NGM Black Hole'                            => [ 'NGM', 'Black Hole' ],
+    'Dynamic Fun'                               => [ 'NGM', 'Dynamic Fun' ],
+    'Dynamic Jump'                              => [ 'NGM', 'Dynamic Jump' ],
+    'Dynamic Maxi'                              => [ 'NGM', 'Dynamic Maxi' ],
+    'Dynamic Milo'                              => [ 'NGM', 'Dynamic Milo' ],
+    'Dynamic Racing 2'                          => [ 'NGM', 'Dynamic Racing 2' ],
+    'NGM Dynamic Racing 2'                      => [ 'NGM', 'Dynamic Racing 2' ],
+    'NGM Dynamic Racing 3'                      => [ 'NGM', 'Dynamic Racing 3' ],
+    'Dynamic Raging Go'                         => [ 'NGM', 'Dynamic Racing Go' ],
+    'Dynamic Shake'                             => [ 'NGM', 'Dynamic Shake' ],
+    'NGM Dynamic Star'                          => [ 'NGM', 'Dynamic Star' ],
+    'Stylo'                                     => [ 'NGM', 'Dynamic Stylo' ],
+    'NGM Dynamic Stylo'                         => [ 'NGM', 'Dynamic Stylo' ],
+    'Dynamic Wide'                              => [ 'NGM', 'Dynamic Wide' ],
+    'Dynamic Wing'                              => [ 'NGM', 'Dynamic Wing' ],
+    'Forward Active'                            => [ 'NGM', 'Forward Active' ],
+    'Forward Art'                               => [ 'NGM', 'Forward Art' ],
+    'Forward Escape'                            => [ 'NGM', 'Forward Escape' ],
+    'Forward Endurance'                         => [ 'NGM', 'Forward Endurance' ],
+    'ForwardEndurance'                          => [ 'NGM', 'Forward Endurance' ],
+    'FORWARD EVOLVE'                            => [ 'NGM', 'Forward Evolve' ],
+    'Forward Infinity'                          => [ 'NGM', 'Forward Infinity' ],
+    'NGM Forward Infinity'                      => [ 'NGM', 'Forward Infinity' ],
+    'Forward Next'                              => [ 'NGM', 'Forward Next' ],
+    'Now'                                       => [ 'NGM', 'Forward Now' ],
+    'Forward Prime'                             => [ 'NGM', 'Forward Prime' ],
+    'Forward Racing 3'                          => [ 'NGM', 'Forward Racing 3' ],
+    'Dynamic Racing 3'                          => [ 'NGM', 'Forward Racing 3' ],
+    'NGM Forward Racing HD'                     => [ 'NGM', 'Forward Racing HD' ],
+    'Forward Ruby'                              => [ 'NGM', 'Forward Ruby' ],
+    'ForwardRuby'                               => [ 'NGM', 'Forward Ruby' ],
+    'Forward Shake'                             => [ 'NGM', 'Forward Shake' ],
+    'ForwardXtreme'                             => [ 'NGM', 'Forward Xtreme' ],
+    'Forward Young'                             => [ 'NGM', 'Forward Young' ],
+    'NGM Forward Young'                         => [ 'NGM', 'Forward Young' ],
+    'ForwardZero'                               => [ 'NGM', 'Forward Zero' ],
+    'Forward 5 5'                               => [ 'NGM', 'Forward 5.5' ],
+    'Forward 5.5'                               => [ 'NGM', 'Forward 5.5' ],
+    'NGM Harley'                                => [ 'NGM', 'Harley Davidson' ],
+    'Infinity'                                  => [ 'NGM', 'Infinity' ],
+    'Life'                                      => [ 'NGM', 'Life' ],
+    'NGM Orion'                                 => [ 'NGM', 'Orion' ],
+    'NGM Spirit'                                => [ 'NGM', 'Spirit' ],
+    'NGM Time'                                  => [ 'NGM', 'Time' ],
+    'NGM Vanity Smart'                          => [ 'NGM', 'Vanity Smart' ],
+    'NGM Action'                                => [ 'NGM', 'WeMove Action' ],
+    'NGM Legend'                                => [ 'NGM', 'WeMove Legend' ],
+    'NGM-Legend/Legend'                         => [ 'NGM', 'WeMove Legend' ],
+    'NGM Legend2'                               => [ 'NGM', 'WeMove Legend 2' ],
+    'NGM LegendXL'                              => [ 'NGM', 'WeMove Legend XL' ],
+    'NGM Miracle'                               => [ 'NGM', 'WeMove Miracle' ],
+    'NGM P0laris'                               => [ 'NGM', 'WeMove Polaris' ],
+    'NGM Wilco'                                 => [ 'NGM', 'WeMove Wilco' ],
+    'NGM WINN'                                  => [ 'NGM', 'Winn' ],
+    'COOLPIX S800c'                             => [ 'Nikon', 'Coolpix S800c', DeviceType::CAMERA ],
+    'COOLPIX S810c'                             => [ 'Nikon', 'Coolpix S810c', DeviceType::CAMERA ],
+    'i5300'                                     => [ 'Ninetology', 'Palette' ],
+    'i5350'                                     => [ 'Ninetology', 'Pearl Mini' ],
+    'nine i7400'                                => [ 'Ninetology', 'Black Pearl' ],
+    'I 7520'                                    => [ 'Ninetology', 'Stealth' ],
+    'i8400'                                     => [ 'Ninetology', 'U9 P1' ],
+    'i8450'                                     => [ 'Ninetology', 'U9 Q1' ],
+    'i9400'                                     => [ 'Ninetology', 'Black Pearl II' ],
+    'i9430'                                     => [ 'Ninetology', 'Insight' ],
+    'i9480'                                     => [ 'Ninetology', 'U9 X1' ],
+    'i9500'                                     => [ 'Ninetology', 'Stealth II' ],
+    'i9570'                                     => [ 'Ninetology', 'U9 Z1' ],
+    'NO1 S6'                                    => [ 'No.1', 'S6' ],
+
+    'NOAIN!!' => [
+        'NOAIN A700'                                => [ 'Noain', 'A700' ],
+        'NOAIN A900'                                => [ 'Noain', 'A900' ],
+        'NOAIN A900S'                               => [ 'Noain', 'A900S' ],
+        'NOAIN A903'                                => [ 'Noain', 'A903' ],
+        'NOAIN A918'                                => [ 'Noain', 'A918' ],
+    ],
+
+    'NBX-T7013N'                                => [ 'Noblex', 'T7013N', DeviceType::TABLET ],
+    'NBX-T7023N'                                => [ 'Noblex', 'T7023N', DeviceType::TABLET ],
+    'Nokia N9'                                  => [ 'Nokia', 'N9' ],
+    'Nokia N900'                                => [ 'Nokia', 'N900' ],
+    'Nokia X'                                   => [ 'Nokia', 'X', DeviceType::MOBILE, Flag::NOKIAX ],
+    'Nokia X Dual SIM'                          => [ 'Nokia', 'X', DeviceType::MOBILE, Flag::NOKIAX ],
+    'RM-980'                                    => [ 'Nokia', 'X', DeviceType::MOBILE, Flag::NOKIAX ],
+    'Nokia X+'                                  => [ 'Nokia', 'X+', DeviceType::MOBILE, Flag::NOKIAX ],
+    'Nokia Xplus'                               => [ 'Nokia', 'X+', DeviceType::MOBILE, Flag::NOKIAX ],
+    'Nokia XL 4G'                               => [ 'Nokia', 'XL', DeviceType::MOBILE, Flag::NOKIAX ],
+    'Nokia XL'                                  => [ 'Nokia', 'XL', DeviceType::MOBILE, Flag::NOKIAX ],
+    'Nokia XL Dual SIM'                         => [ 'Nokia', 'XL', DeviceType::MOBILE, Flag::NOKIAX ],
+    'RM-1061'                                   => [ 'Nokia', 'XL', DeviceType::MOBILE, Flag::NOKIAX ],
+    'Nokia X2'                                  => [ 'Nokia', 'X2', DeviceType::MOBILE, Flag::NOKIAX ],
+    'NokiaX2DS'                                 => [ 'Nokia', 'X2', DeviceType::MOBILE, Flag::NOKIAX ],
+    'Lumia800'                                  => [ 'Nokia', 'Lumia 800' ],
+    'Lumia 900'                                 => [ 'Nokia', 'Lumia 900' ],
+    'Notion Ink ADAM'                           => [ 'Notion Ink', 'ADAM', DeviceType::TABLET ],
+    'Adam'                                      => [ 'Notion Ink', 'ADAM', DeviceType::TABLET ],
+    'AND1'                                      => [ 'NUgen', 'AND1' ],
+    'Zaffire 785'                               => [ 'Nuqleo', 'Zaffire 785', DeviceType::TABLET ],
+    'Zaffire 970'                               => [ 'Nuqleo', 'Zaffire 970', DeviceType::TABLET ],
+    'P4D Sirius'                                => [ 'Nvsbl', 'P4D SIRIUS', DeviceType::TABLET ],
+
+    'Tegra!!' => [
+        'Tegra Note 7'                              => [ 'Nvidia', 'Tegra Note 7', DeviceType::TABLET ],
+        'Tegra Note 8'                              => [ 'Nvidia', 'Tegra Note 8', DeviceType::TABLET ],
+        'TegraNote-Premium'                         => [ 'Nvidia', 'Tegra Note Premium', DeviceType::TABLET ],
+        'TegraNote-P1640'                           => [ 'Nvidia', 'Tegra Note P1640', DeviceType::TABLET ],
+    ],
+
+    'NYX!!' => [
+        'NYX FLY'                                   => [ 'NYX Mobile', 'Fly' ],
+        'NYX FLY II'                                => [ 'NYX Mobile', 'Fly II' ],
+        'NYX NOBA II'                               => [ 'NYX Mobile', 'Noba II' ],
+        'NYX ZEUZ HD'                               => [ 'NYX Mobile', 'Zeuz HD' ],
+    ],
+
+    'O\+!!' => [
+        'O+8.1Android'                              => [ 'O+', '8.1' ],
+        'O+ 8.12 Android'                           => [ 'O+', '8.12' ],
+        'O+ 8.15 Android'                           => [ 'O+', '8.15' ],
+        'O+ 8.16 Android'                           => [ 'O+', '8.16' ],
+        'O+ 8.31z Android'                          => [ 'O+', '8.31' ],
+        'O+ 8.33 Android'                           => [ 'O+', '8.33' ],
+        'O+ 8.36z Android'                          => [ 'O+', '8.36' ],
+        'O+ 8.37'                                   => [ 'O+', '8.37' ],
+        'O+ 8.37 Android'                           => [ 'O+', '8.37' ],
+        'O+ 8.38 Android'                           => [ 'O+', '8.38' ],
+        'O+ 8.5 Android'                            => [ 'O+', '8.5' ],
+        'O+ 8.52 Android'                           => [ 'O+', '8.52' ],
+        'O+ 8.6 Android'                            => [ 'O+', '8.6' ],
+        'O+ 8.7 Android'                            => [ 'O+', '8.7' ],
+        'O+ 8.75 Android'                           => [ 'O+', '8.75' ],
+        'O+ 8.9 Android'                            => [ 'O+', '8.9' ],
+        'O+ 8.91 Android'                           => [ 'O+', '8.91' ],
+        'O+ 8.92 Android'                           => [ 'O+', '8.92' ],
+        'O+ 8.93 Android'                           => [ 'O+', '8.93' ],
+        'O+ 9.76'                                   => [ 'O+', '9.76' ],
+        'O+ 360'                                    => [ 'O+', '360' ],
+        'O+ 360 HD'                                 => [ 'O+', '360 HD' ],
+        'O+ 360 HD 2.0'                             => [ 'O+', '360 HD' ],
+        'O+ 360 ALPHA PLUS'                         => [ 'O+', '360 Alpha Plus' ],
+        'O+ 360 Alpha Plus 2.0'                     => [ 'O+', '360 Alpha Plus' ],
+        'O+ AIR'                                    => [ 'O+', 'Air' ],
+        'O+ FAB 3G'                                 => [ 'O+', 'Fab' ],
+        'O+FAB COLOR'                               => [ 'O+', 'Fab Color' ],
+        'O+ FAB ELITE'                              => [ 'O+', 'Fab Elite' ],
+        'O+ Grande'                                 => [ 'O+', 'Grande' ],
+        'O+ Ultra'                                  => [ 'O+', 'Ultra' ],
+        'O+ TABLET'                                 => [ 'O+', 'Tablet', DeviceType::TABLET ],
+    ],
+
+    'EFM710A'                                   => [ 'Oblio', 'Mint 7x', DeviceType::TABLET ],
+    'ODYS-Chrono'                               => [ 'Odys', 'Chrono', DeviceType::TABLET ],
+    'ODYS-EVO'                                  => [ 'Odys', 'Evo', DeviceType::TABLET ],
+    'Loox'                                      => [ 'Odys', 'Loox', DeviceType::TABLET ],
+    'Odys-Loox'                                 => [ 'Odys', 'Loox', DeviceType::TABLET ],
+    'ADM816KC'                                  => [ 'Odys', 'Neo S8 Plus', DeviceType::TABLET ],
+    'ADM816HC'                                  => [ 'Odys', 'Neo X', DeviceType::TABLET ],
+    'ADM712HC'                                  => [ 'Odys', 'Neo X7', DeviceType::TABLET ],
+    'ODYS-NOON'                                 => [ 'Odys', 'Noon', DeviceType::TABLET ],
+    'PEDI'                                      => [ 'Odys', 'Pedi', DeviceType::TABLET ],
+    'PRIME PLUS 3G'                             => [ 'Odys', 'Prime Plus', DeviceType::TABLET ],
+    'ODYS-Q'                                    => [ 'Odys', 'Q', DeviceType::TABLET ],
+    'ODYS Space'                                => [ 'Odys', 'Space', DeviceType::TABLET ],
+    'ODYS Space TKI BRR233v7'                   => [ 'Odys', 'Space', DeviceType::TABLET ],
+    'ODYS Space TKI BRR233v9'                   => [ 'Odys', 'Space', DeviceType::TABLET ],
+    'ADM8000KP A'                               => [ 'Odys', 'Titan', DeviceType::TABLET ],
+    'ADM8000KP B'                               => [ 'Odys', 'Titan', DeviceType::TABLET ],
+    'UNO X8'                                    => [ 'Odys', 'Uno X8', DeviceType::TABLET ],
+    'UNO X10'                                   => [ 'Odys', 'Uno X10', DeviceType::TABLET ],
+    'XELIO'                                     => [ 'Odys', 'Xelio', DeviceType::TABLET ],
+    'XELIO7PHONETAB'                            => [ 'Odys', 'Xelio 7 Phone Tab', DeviceType::TABLET ],
+    'Xelio 7 pro'                               => [ 'Odys', 'Xelio 7 Pro', DeviceType::TABLET ],
+    'XELIO7PRO'                                 => [ 'Odys', 'Xelio 7 Pro', DeviceType::TABLET ],
+    'XELIO10 QUAD'                              => [ 'Odys', 'Xelio 10', DeviceType::TABLET ],
+    'XELIO10 PLUS 3G'                           => [ 'Odys', 'Xelio 10 Plus', DeviceType::TABLET ],
+    'XELIO10EXTREME'                            => [ 'Odys', 'Xelio 10 Extreme', DeviceType::TABLET ],
+    'Xelio 10 Pro'                              => [ 'Odys', 'Xelio 10 Pro', DeviceType::TABLET ],
+    'Xelio10Pro'                                => [ 'Odys', 'Xelio 10 Pro', DeviceType::TABLET ],
+    'XELIOPT2'                                  => [ 'Odys', 'Xelio PT2', DeviceType::TABLET ],
+    'XelioPT2Pro'                               => [ 'Odys', 'Xelio PT2 Pro', DeviceType::TABLET ],
+    'Xelio PT4 Pro'                             => [ 'Odys', 'Xelio PT4 Pro', DeviceType::TABLET ],
+    'ODYS-Xpress'                               => [ 'Odys', 'Xpress', DeviceType::TABLET ],
+    'XPRESS PRO'                                => [ 'Odys', 'Xpress Pro', DeviceType::TABLET ],
+    'ODYS Xtreme'                               => [ 'Odys', 'Xtreme', DeviceType::TABLET ],
+    'Olivetti Olipad 100'                       => [ 'Olivetti', 'Olipad 100', DeviceType::TABLET ],
+    'OP110'                                     => [ 'Olivetti', 'Olipad 110', DeviceType::TABLET ],
+    'Graphos A10'                               => [ 'Olivetti', 'Olipad Graphos A10', DeviceType::TABLET ],
+    'A0001'                                     => [ 'OnePlus', 'One' ],
+    'One A0001'                                 => [ 'OnePlus', 'One' ],
+    'OnePlus One'                               => [ 'OnePlus', 'One' ],
+    'OnePlus One A0001'                         => [ 'OnePlus', 'One' ],
+    'A1001'                                     => [ 'OnePlus', 'One' ],
+    'A0002'                                     => [ 'OnePlus', '2' ],
+    'ONE A2001'                                 => [ 'OnePlus', '2' ],
+    'ONE A2003'                                 => [ 'OnePlus', '2' ],
+    'ONE A2005'                                 => [ 'OnePlus', '2' ],
+    'OnePlus2'                                  => [ 'OnePlus', '2' ],
+    'ONE A3000'                                 => [ 'OnePlus', '3' ],
+    'ONE A3003'                                 => [ 'OnePlus', '3' ],
+    'ONEPLUS A3000'                             => [ 'OnePlus', '3' ],
+    'ONEPLUS A3003'                             => [ 'OnePlus', '3' ],
+    'OnePlus3'                                  => [ 'OnePlus', '3' ],
+    'ONEPLUS A3010'                             => [ 'OnePlus', '3T' ],
+    'ONE E1000'                                 => [ 'OnePlus', 'X' ],
+    'ONE E1001'                                 => [ 'OnePlus', 'X' ],
+    'ONE E1003'                                 => [ 'OnePlus', 'X' ],
+    'ONE E1005'                                 => [ 'OnePlus', 'X' ],
+    'ONDA MID'                                  => [ 'Onda', 'MID', DeviceType::TABLET ],
+    'ONDA A9 Core4'                             => [ 'Onda', 'A9 Quad Core', DeviceType::TABLET ],
+    'ONDA VI10'                                 => [ 'Onda', 'VI10', DeviceType::TABLET ],
+    'V701s Core4'                               => [ 'Onda', 'V701s Quad Core', DeviceType::TABLET ],
+    'V711s Core4'                               => [ 'Onda', 'V711s Quad Core', DeviceType::TABLET ],
+    'V712 Core4'                                => [ 'Onda', 'V712 Quad Core', DeviceType::TABLET ],
+    'V719 3G'                                   => [ 'Onda', 'V719 3G', DeviceType::TABLET ],
+    'V801 Core4'                                => [ 'Onda', 'V801 Quad Core', DeviceType::TABLET ],
+    'V801s Core4'                               => [ 'Onda', 'V801s Quad Core', DeviceType::TABLET ],
+    'V811 Core4'                                => [ 'Onda', 'V811 Quad Core', DeviceType::TABLET ],
+    'Onda V812'                                 => [ 'Onda', 'V812', DeviceType::TABLET ],
+    'V812 Core4'                                => [ 'Onda', 'V812 Quad Core', DeviceType::TABLET ],
+    'V813 Core4'                                => [ 'Onda', 'V813 Quad Core', DeviceType::TABLET ],
+    'V813s Core4'                               => [ 'Onda', 'V813s Quad Core', DeviceType::TABLET ],
+    'V818'                                      => [ 'Onda', 'V818', DeviceType::TABLET ],
+    'V818mini'                                  => [ 'Onda', 'V818 Mini', DeviceType::TABLET ],
+    'V819mini'                                  => [ 'Onda', 'V819 Mini', DeviceType::TABLET ],
+    'V819 3G'                                   => [ 'Onda', 'V819 3G', DeviceType::TABLET ],
+    'V819i'                                     => [ 'Onda', 'V819i', DeviceType::TABLET ],
+    'V971 Core4'                                => [ 'Onda', 'V971 Quad Core', DeviceType::TABLET ],
+    'V971s Core4'                               => [ 'Onda', 'V971s Quad Core', DeviceType::TABLET ],
+    'V972 Core4'                                => [ 'Onda', 'V972 Quad Core', DeviceType::TABLET ],
+    'V973 Core4'                                => [ 'Onda', 'V973 Quad Core', DeviceType::TABLET ],
+    'V975 Core4'                                => [ 'Onda', 'V975 Quad Core', DeviceType::TABLET ],
+    'V975i'                                     => [ 'Onda', 'V975i Quad Core', DeviceType::TABLET ],
+    'V975m'                                     => [ 'Onda', 'V975m', DeviceType::TABLET ],
+    'V975m Core4'                               => [ 'Onda', 'V975m Quad Core', DeviceType::TABLET ],
+    'ONDA v975m'                                => [ 'Onda', 'V975m Quad Core', DeviceType::TABLET ],
+    'V975s Core4'                               => [ 'Onda', 'V975s Quad Core', DeviceType::TABLET ],
+    'ONDA V989'                                 => [ 'Onda', 'V989', DeviceType::TABLET ],
+    'ONDA V989 Core8'                           => [ 'Onda', 'V989 Octo Core', DeviceType::TABLET ],
+    'VX580A'                                    => [ 'Onda', 'VX580A', DeviceType::TABLET ],
+    'VX580W'                                    => [ 'Onda', 'VX580W', DeviceType::TABLET ],
+    'VX610A'                                    => [ 'Onda', 'VX610A', DeviceType::TABLET ],
+    'TQ150'                                     => [ 'Onda', 'TQ150' ],
+    'TT101'                                     => [ 'Onda', 'TT101', DeviceType::TABLET ],
+    'DP-X1'                                     => [ 'Onkyo', 'DP-X1', DeviceType::MEDIA ],
+    'N2T'                                       => [ 'ONN', 'N2T', DeviceType::TABLET ],
+    'Renesas!'                                  => [ 'Opad', 'Renesas', DeviceType::TABLET ],
+    'A31'                                       => [ 'Oppo', 'A31' ],
+    'OB-OPPO A31c'                              => [ 'Oppo', 'A31c' ],
+    'A31c'                                      => [ 'Oppo', 'A31c' ],
+    'A31t'                                      => [ 'Oppo', 'A31t' ],
+    'OPPO A33'                                  => [ 'Oppo', 'A33' ],
+    'A33f'                                      => [ 'Oppo', 'A33f' ],
+    'A37f'                                      => [ 'Oppo', 'A37f' ],
+    'OPPO A53m'                                 => [ 'Oppo', 'A53m' ],
+    'CPH1701'                                   => [ 'Oppo', 'A57' ],
+    'OPPO A57'                                  => [ 'Oppo', 'A57' ],
+    'OPPO A59m'                                 => [ 'Oppo', 'A59m' ],
+    'OPPO A59s'                                 => [ 'Oppo', 'A59s' ],
+    'OPPO A800'                                 => [ 'Oppo', 'A800' ],
+    'F1f'                                       => [ 'Oppo', 'F1f' ],
+    'A1601'                                     => [ 'Oppo', 'F1s' ],
+    'CPH1613'                                   => [ 'Oppo', 'F3 Plus' ],
+    'Find 5'                                    => [ 'Oppo', 'Find 5' ],
+    'X903'                                      => [ 'Oppo', 'Find Me X903' ],
+    'X903S'                                     => [ 'Oppo', 'Find X903S' ],
+    'X905'                                      => [ 'Oppo', 'Find 3 X905' ],
+    'OPPOX905'                                  => [ 'Oppo', 'Find 3 X905' ],
+    'X906'                                      => [ 'Oppo', 'Finder X906' ],
+    'X907'                                      => [ 'Oppo', 'Finder X907' ],
+    'OPPOX907'                                  => [ 'Oppo', 'Finder X907' ],
+    'OPPO Find5'                                => [ 'Oppo', 'Find 5 X909' ],
+    'OPPOX909'                                  => [ 'Oppo', 'Find 5 X909' ],
+    'OPPO X909'                                 => [ 'Oppo', 'Find 5 X909' ],
+    'X909'                                      => [ 'Oppo', 'Find 5 X909' ],
+    'X909T'                                     => [ 'Oppo', 'Find 5 X909T' ],
+    'X9000'                                     => [ 'Oppo', 'Find 7a X9000' ],
+    'X9006'                                     => [ 'Oppo', 'Find 7a X9006' ],
+    'X9007'                                     => [ 'Oppo', 'Find 7a X9007' ],
+    'X9009'                                     => [ 'Oppo', 'F1 Plus X9009' ],
+    'X9015'                                     => [ 'Oppo', 'Find X9015' ],
+    'OPPOX9015'                                 => [ 'Oppo', 'Find X9015' ],
+    'X9017'                                     => [ 'Oppo', 'Finder X9017' ],
+    'OPPOX9017'                                 => [ 'Oppo', 'Finder X9017' ],
+    'FIND7'                                     => [ 'Oppo', 'Find 7 X9070' ],
+    'OPPO find7'                                => [ 'Oppo', 'Find 7 X9070' ],
+    'X9070'                                     => [ 'Oppo', 'Find 7 X9070' ],
+    'X9076'                                     => [ 'Oppo', 'Find 7 X9076' ],
+    'X9077'                                     => [ 'Oppo', 'Find 7 X9077' ],
+    'X9079'                                     => [ 'Oppo', 'R9 Plus X9079' ],
+    'OPPOR601'                                  => [ 'Oppo', 'Real R601' ],
+    'R801'                                      => [ 'Oppo', 'Real R801' ],
+    'OPPOR801'                                  => [ 'Oppo', 'Real R801' ],
+    'R801T'                                     => [ 'Oppo', 'Real R801T' ],
+    'OPPOR803'                                  => [ 'Oppo', 'Real R803' ],
+    'R803'                                      => [ 'Oppo', 'Real R803' ],
+    'R805'                                      => [ 'Oppo', 'Real R805' ],
+    'OPPOR805'                                  => [ 'Oppo', 'Real R805' ],
+    'R807'                                      => [ 'Oppo', 'Real R807' ],
+    'OPPOR807'                                  => [ 'Oppo', 'Real R807' ],
+    'R809T'                                     => [ 'Oppo', 'R809T' ],
+    'R811'                                      => [ 'Oppo', 'R811' ],
+    'OPPO R811'                                 => [ 'Oppo', 'R811' ],
+    'R813T'                                     => [ 'Oppo', 'R813T' ],
+    'OPPO R813T'                                => [ 'Oppo', 'R813T' ],
+    'OPPO R815'                                 => [ 'Oppo', 'Find Clover R815' ],
+    'R815'                                      => [ 'Oppo', 'Find Clover R815' ],
+    'R815T'                                     => [ 'Oppo', 'Find Clover R815T' ],
+    'R815W'                                     => [ 'Oppo', 'Real R815W' ],
+    'OPPOR817'                                  => [ 'Oppo', 'Real R817' ],
+    'R817'                                      => [ 'Oppo', 'Real R817' ],
+    'R817T'                                     => [ 'Oppo', 'Real R817T' ],
+    'R819'                                      => [ 'Oppo', 'R819' ],
+    'Oppo R819'                                 => [ 'Oppo', 'R819' ],
+    'R819T!'                                    => [ 'Oppo', 'Real R819T' ],
+    'OPPO R821'                                 => [ 'Oppo', 'Find Muse R821' ],
+    'R821'                                      => [ 'Oppo', 'Find Muse R821' ],
+    'R821T'                                     => [ 'Oppo', 'Find Muse R821T' ],
+    'R823T'                                     => [ 'Oppo', 'R823T' ],
+    'R827'                                      => [ 'Oppo', 'Find 5 mini R827' ],
+    'R827T'                                     => [ 'Oppo', 'Find 5 mini R827T' ],
+    'R829'                                      => [ 'Oppo', 'R1 R829' ],
+    'R829T'                                     => [ 'Oppo', 'R1 R829T' ],
+    'R830'                                      => [ 'Oppo', 'Neo R830' ],
+    'R830S'                                     => [ 'Oppo', 'Neo R830S' ],
+    'OPPO R831'                                 => [ 'Oppo', 'Neo R831' ],
+    'Oppo R831 Limited Edition'                 => [ 'Oppo', 'Neo R831' ],
+    'R831K'                                     => [ 'Oppo', 'Real 20 R831K' ],
+    'R831L'                                     => [ 'Oppo', 'Neo 5 R831L' ],
+    'R831T'                                     => [ 'Oppo', 'Neo R831T' ],
+    'R831S'                                     => [ 'Oppo', 'R831S' ],
+    'R831'                                      => [ 'Oppo', 'Neo R831' ],
+    'R833T'                                     => [ 'Oppo', 'R833T' ],
+    'R850'                                      => [ 'Oppo', 'R850' ],
+    'R883T'                                     => [ 'Oppo', 'R883T' ],
+    'R1001'                                     => [ 'Oppo', 'Joy R1001' ],
+    'OPPO R1001'                                => [ 'Oppo', 'Joy R1001' ],
+    'R1011'                                     => [ 'Oppo', 'Joy Plus R1011' ],
+    'R2001'                                     => [ 'Oppo', 'Yoyo R2001' ],
+    'R2010'                                     => [ 'Oppo', 'R2010' ],
+    'R2017'                                     => [ 'Oppo', 'R2017' ],
+    'R6006'                                     => [ 'Oppo', 'Find 7 mini R6006' ],
+    'R6007'                                     => [ 'Oppo', 'R6007' ],
+    'R7005'                                     => [ 'Oppo', 'R3 R7005' ],
+    'R7007'                                     => [ 'Oppo', 'R3 R7007' ],
+    'R8000'                                     => [ 'Oppo', 'R1S R8000' ],
+    'R8001'                                     => [ 'Oppo', 'R1K R8001' ],
+    'R8006'                                     => [ 'Oppo', 'R1L R8006' ],
+    'R8007'                                     => [ 'Oppo', 'R1S R8007' ],
+    'OPPOR8015'                                 => [ 'Oppo', 'Find Guitar R8015' ],
+    'R8015'                                     => [ 'Oppo', 'Find Guitar R8015' ],
+    'R8106'                                     => [ 'Oppo', 'R5 R8106' ],
+    'R8107'                                     => [ 'Oppo', 'R5 R8107' ],
+    'R8109'                                     => [ 'Oppo', 'R8109' ],
+    'R8111'                                     => [ 'Oppo', 'Find Melody R8111' ],
+    'OPPOR8111'                                 => [ 'Oppo', 'Find Melody R8111' ],
+    'R8113'                                     => [ 'Oppo', 'Find Piano R8113' ],
+    'R8200'                                     => [ 'Oppo', 'R1c R8200' ],
+    'R8201'                                     => [ 'Oppo', 'R1x R8201' ],
+    'R8205'                                     => [ 'Oppo', 'R1c R8205' ],
+    'R8206'                                     => [ 'Oppo', 'R1x R8206' ],
+    'R8207'                                     => [ 'Oppo', 'R1c R8207' ],
+    'OPPOT29'                                   => [ 'Oppo', 'T29' ],
+    '(OPPO-?)?T703!'                            => [ 'Oppo', 'T703' ],
+    'OPPOU701'                                  => [ 'Oppo', 'Ulike U701' ],
+    'U701'                                      => [ 'Oppo', 'Ulike U701' ],
+    'U701T'                                     => [ 'Oppo', 'U701T' ],
+    'U702'                                      => [ 'Oppo', 'U702' ],
+    'U705'                                      => [ 'Oppo', 'U705' ],
+    'U705T'                                     => [ 'Oppo', 'Ulike 2 U705T' ],
+    'U705W'                                     => [ 'Oppo', 'Ulike 2 U705W' ],
+    'U707'                                      => [ 'Oppo', 'Find Way S U707' ],
+    'U707T'                                     => [ 'Oppo', 'Find Way S U707T' ],
+    'U708'                                      => [ 'Oppo', 'U2S U708' ],
+    'U7011'                                     => [ 'Oppo', 'Find Gemini U7011' ],
+    'OPPOU7011'                                 => [ 'Oppo', 'Find Gemini U7011' ],
+    'OPPOU7015'                                 => [ 'Oppo', 'Find Way U7015' ],
+    'U7015'                                     => [ 'Oppo', 'Find Way U7015' ],
+    'OPPO N1'                                   => [ 'Oppo', 'N1' ],
+    'N51(10|11|16|17)!'                         => [ 'Oppo', 'N1 mini' ],
+    'N52(06|07|09)!'                            => [ 'Oppo', 'N3' ],
+    'OPPO R7'                                   => [ 'Oppo', 'R7' ],
+    'R7f'                                       => [ 'Oppo', 'R7f' ],
+    'R7i'                                       => [ 'Oppo', 'R7i' ],
+    'OPPO R7s'                                  => [ 'Oppo', 'R7s' ],
+    'OPPO R7st'                                 => [ 'Oppo', 'R7st' ],
+    'OPPO R9tm'                                 => [ 'Oppo', 'R9' ],
+    'OPPO R7 Plus'                              => [ 'Oppo', 'R7 Plus' ],
+    'R7plusf'                                   => [ 'Oppo', 'R7 Plus' ],
+    'R7Plusm'                                   => [ 'Oppo', 'R7 Plus' ],
+    'OPPO R9 Plusm A'                           => [ 'Oppo', 'R9 Plus' ],
+    'CPH1611'                                   => [ 'Oppo', 'R9s Plus' ],
+    'OPPO R9s Plus'                             => [ 'Oppo', 'R9s Plus' ],
+    'W8'                                        => [ 'Oppo', 'W8' ],
+    '1105'                                      => [ 'Oppo', '1105' ],
+    '1107'                                      => [ 'Oppo', '1107' ],
+    'OB-OPPO 3005'                              => [ 'Oppo', '3005' ],
+
+    'OPSSON!!' => [
+        'OPSSON D1'                                 => [ 'Opsson', 'D1' ],
+        'OPSSON D1s'                                => [ 'Opsson', 'D1s' ],
+        'OPSSON S1'                                 => [ 'Opsson', 'S1' ],
+        'OPSSON S7'                                 => [ 'Opsson', 'S7' ],
+        'OPSSON X5'                                 => [ 'Opsson', 'X5' ],
+        'OPSSON IDO 5000'                           => [ 'Opsson', 'IDO 5000' ],
+        'OPSSON IDO5300'                            => [ 'Opsson', 'IDO 5300' ],
+        'OPSSON IDO 5311'                           => [ 'Opsson', 'IDO 5311' ],
+        'OPSSON IDO 5322'                           => [ 'Opsson', 'IDO 5322' ],
+        'OPSSON IDO5355'                            => [ 'Opsson', 'IDO 5355' ],
+        'OPSSON iMO850'                             => [ 'Opsson', 'IMO 850' ],
+        'OPSSON iMO1000'                            => [ 'Opsson', 'IMO 1000' ],
+        'OPSSON IVO6600'                            => [ 'Opsson', 'IVO 6600' ],
+        'OPSSON IVO6622'                            => [ 'Opsson', 'IVO 6622' ],
+        'OPSSON IVO6633'                            => [ 'Opsson', 'IVO 6633' ],
+        'OPSSON IVO6655'                            => [ 'Opsson', 'IVO 6655' ],
+        'OPSSON IVO6666'                            => [ 'Opsson', 'IVO 6666' ],
+        'OPSSON IVO 6677'                           => [ 'Opsson', 'IVO 6677' ],
+        'OPSSON IVO 8800'                           => [ 'Opsson', 'IVO 8800' ],
+    ],
+
+    'OP0118-12'                                 => [ 'Oregon Scientific', 'Meep!', DeviceType::TABLET ],
+
+    '(OV-|Overmax|Vertis)!!' => [
+        'OV-TB-07B'                                 => [ 'Overmax', 'TB-07B', DeviceType::TABLET ],
+        'OV-TB-08 II'                               => [ 'Overmax', 'TB-08 II', DeviceType::TABLET ],
+        'OV-TB-O9C'                                 => [ 'Overmax', 'TB-09C', DeviceType::TABLET ],
+        'OV-BaseCore10'                             => [ 'Overmax', 'BaseCore 10', DeviceType::TABLET ],
+        'OV-BaseoneII'                              => [ 'Overmax', 'BaseOne II', DeviceType::TABLET ],
+        'OV-BasicTab'                               => [ 'Overmax', 'BasicTab', DeviceType::TABLET ],
+        'OV-DualDriveMax2'                          => [ 'Overmax', 'DualDrive Max II', DeviceType::TABLET ],
+        'OV-Newbase2'                               => [ 'Overmax', 'NewBase 2', DeviceType::TABLET ],
+        'OV-Quattor10'                              => [ 'Overmax', 'Quatttor 10', DeviceType::TABLET ],
+        'OV-Quattor 10+'                            => [ 'Overmax', 'Quatttor 10+', DeviceType::TABLET ],
+        'OV-Solution 7II'                           => [ 'Overmax', 'Solution 7 II', DeviceType::TABLET ],
+        'OV-Solution 10II'                          => [ 'Overmax', 'Solution 10 II', DeviceType::TABLET ],
+        'OV-SteelCore7'                             => [ 'Overmax', 'SteelCore 7', DeviceType::TABLET ],
+        'OV-STEELCORE 10+ (Z)'                      => [ 'Overmax', 'SteelCore 10+', DeviceType::TABLET ],
+        'OV-SteelCore10+II'                         => [ 'Overmax', 'SteelCore 10+ II', DeviceType::TABLET ],
+        'OV-Steelcore10III'                         => [ 'Overmax', 'SteelCore 10 III', DeviceType::TABLET ],
+        'OV-Steelcore 10III(Z)'                     => [ 'Overmax', 'SteelCore 10 III', DeviceType::TABLET ],
+        'Overmax Vertis'                            => [ 'Overmax', 'Vertis 01' ],
+        'Overmax Vertis 01'                         => [ 'Overmax', 'Vertis 01' ],
+        'OV-Vertis-01'                              => [ 'Overmax', 'Vertis 01' ],
+        'OV-Vertis-02'                              => [ 'Overmax', 'Vertis 02' ],
+        'Vertis Expi'                               => [ 'Overmax', 'Vertis Expi' ],
+        'Vertis Famy'                               => [ 'Overmax', 'Vertis Famy' ],
+    ],
+
+    'Oysters Pacific 800'                       => [ 'Oysters', 'Pacific 800' ],
+    'Oysters T3 3G'                             => [ 'Oysters', 'T3' ],
+    'Oysters T7B 3G'                            => [ 'Oysters', 'T7B' ],
+    'Oysters T7X 3G'                            => [ 'Oysters', 'T7X' ],
+    'OYSTERS T14N 3G'                           => [ 'Oysters', 'T14N' ],
+    'Oysters T37'                               => [ 'Oysters', 'T37' ],
+    'Oysters T72H 3G'                           => [ 'Oysters', 'T72' ],
+    'Oysters T72HRi 3G'                         => [ 'Oysters', 'T72' ],
+    'OYSTERS T80 3G'                            => [ 'Oysters', 'T80' ],
+    'Liberty Tab G100'                          => [ 'Packard Bell', 'Liberty Tab G100', DeviceType::TABLET ],
+    'G100W'                                     => [ 'Packard Bell', 'Liberty Tab G100', DeviceType::TABLET ],
+
+    'P-0[0-9][A-Z]!!' => [
+        'P-01D'                                     => [ 'Panasonic', 'P-01D', 'carrier' => 'DoCoMo' ],
+        'P-02D'                                     => [ 'Panasonic', 'LUMIX Phone P-02D', 'carrier' => 'DoCoMo' ],
+        'P-02E'                                     => [ 'Panasonic', 'ELUGA X P-02E', 'carrier' => 'DoCoMo' ],
+        'P-03E'                                     => [ 'Panasonic', 'ELUGA P P-03E', 'carrier' => 'DoCoMo' ],
+        'P-04D'                                     => [ 'Panasonic', 'P-04D', 'carrier' => 'DoCoMo' ],
+        'P-05D'                                     => [ 'Panasonic', 'P-05D', 'carrier' => 'Disney Mobile' ],
+        'P-06D'                                     => [ 'Panasonic', 'ELUGA V P-06D', 'carrier' => 'DoCoMo' ],
+        'P-07C'                                     => [ 'Panasonic', 'P-07C', 'carrier' => 'DoCoMo' ],
+        'P-07D'                                     => [ 'Panasonic', 'ELUGA power P-07D', 'carrier' => 'DoCoMo' ],
+        'P-08D'                                     => [ 'Panasonic', 'ELUGA Live P-08D', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+    ],
+
+    '003P'                                      => [ 'Panasonic', 'Sweety 003P', 'carrier' => 'Softbank' ],
+    '101P'                                      => [ 'Panasonic', 'LUMIX Phone 101P', 'carrier' => 'Softbank' ],
+    '102P'                                      => [ 'Panasonic', 'ELUGA dL1 102P', 'carrier' => 'Softbank' ],
+
+    'DMC-CM1'                                   => [ 'Panasonic', 'Lumix DMC-CM1', DeviceType::CAMERA ],
+    'dL1'                                       => [ 'Panasonic', 'Eluga dL1' ],
+    'EB-4063-X'                                 => [ 'Panasonic', 'Eluga X' ],
+
+    'Panasonic!!' => [
+        'Panasonic dL1'                             => [ 'Panasonic', 'Eluga dL1' ],
+        'Panasonic ELUGA A'                         => [ 'Panasonic', 'Eluga A' ],
+        'Panasonic ELUGA A2'                        => [ 'Panasonic', 'Eluga A2' ],
+        'Panasonic ELUGA I'                         => [ 'Panasonic', 'Eluga I' ],
+        'Panasonic Eluga I3'                        => [ 'Panasonic', 'Eluga I3' ],
+        'Panasonic ELUGA L 4G'                      => [ 'Panasonic', 'Eluga L' ],
+        'Panasonic ELUGA L2'                        => [ 'Panasonic', 'Eluga L2' ],
+        'Panasonic ELUGA S'                         => [ 'Panasonic', 'Eluga S' ],
+        'Panasonic ELUGA S Mini'                    => [ 'Panasonic', 'Eluga S Mini' ],
+        'Panasonic ELUGA U'                         => [ 'Panasonic', 'Eluga U' ],
+        'Panasonic ELUGA U2'                        => [ 'Panasonic', 'Eluga U2' ],
+        'Panasonic ELUGA Arc'                       => [ 'Panasonic', 'Eluga Arc' ],
+        'Panasonic ELUGA Icon'                      => [ 'Panasonic', 'Eluga Icon' ],
+        'Panasonic ELUGA Icon 2'                    => [ 'Panasonic', 'Eluga Icon 2' ],
+        'Panasonic ELUGA Mark'                      => [ 'Panasonic', 'Eluga Mark' ],
+        'Panasonic ELUGA Switch'                    => [ 'Panasonic', 'Eluga Switch' ],
+        'Panasonic ELUGA Tapp'                      => [ 'Panasonic', 'Eluga Tapp' ],
+        'Panasonic ELUGA Z'                         => [ 'Panasonic', 'Eluga Z' ],
+        'Panasonic P01 Novo'                        => [ 'Panasonic', 'P01 Novo' ],
+        'Panasonic P02 Novo'                        => [ 'Panasonic', 'P02 Novo' ],
+        'Panasonic P11'                             => [ 'Panasonic', 'P11' ],
+        'Panasonic P31'                             => [ 'Panasonic', 'P31' ],
+        'Panasonic P41'                             => [ 'Panasonic', 'P41' ],
+        'Panasonic P41HD'                           => [ 'Panasonic', 'P41 HD' ],
+        'Panasonic P51'                             => [ 'Panasonic', 'P51' ],
+        'Panasonic P50'                             => [ 'Panasonic', 'P50' ],
+        'Panasonic P55'                             => [ 'Panasonic', 'P55' ],
+        'Panasonic P55 Novo'                        => [ 'Panasonic', 'P55 Novo' ],
+        'Panasonic P61'                             => [ 'Panasonic', 'P61' ],
+        'Panasonic P75'                             => [ 'Panasonic', 'P75' ],
+        'Panasonic P77'                             => [ 'Panasonic', 'P77' ],
+        'PanasonicP81'                              => [ 'Panasonic', 'P81' ],
+        'Panasonic P81'                             => [ 'Panasonic', 'P81' ],
+        'Panasonic T9'                              => [ 'Panasonic', 'T9' ],
+        'Panasonic T11'                             => [ 'Panasonic', 'T11' ],
+        'Panasonic T21'                             => [ 'Panasonic', 'T21' ],
+        'Panasonic T30'                             => [ 'Panasonic', 'T30' ],
+        'Panasonic T31'                             => [ 'Panasonic', 'T31' ],
+        'Panasonic T33'                             => [ 'Panasonic', 'T33' ],
+        'Panasonic T35'                             => [ 'Panasonic', 'T35' ],
+        'Panasonic T40'                             => [ 'Panasonic', 'T40' ],
+        'Panasonic T41'                             => [ 'Panasonic', 'T41' ],
+        'Panasonic T44'                             => [ 'Panasonic', 'T44' ],
+        'Panasonic T45 4G'                          => [ 'Panasonic', 'T45' ],
+        'Panasonic T50'                             => [ 'Panasonic', 'T50' ],
+        'Panasonic KX-PRXA10'                       => [ 'Panasonic', 'KX-PRXA10', DeviceType::DECT ],
+        'Panasonic KX-PRXA15'                       => [ 'Panasonic', 'KX-PRXA15', DeviceType::DECT ],
+        'Panasonic SV-ME970'                        => [ 'Panasonic', 'Viera SV-ME970', DeviceType::TABLET ],
+        'Panasonic SV-ME1000'                       => [ 'Panasonic', 'Viera SV-ME1000', DeviceType::TABLET ],
+        'Panasonic SV-MV100'                        => [ 'Panasonic', 'SV-MV100', DeviceType::MEDIA ],
+        'Panasonic UN-MT300'                        => [ 'Panasonic', 'UN-MT300', DeviceType::MEDIA ],
+        'Panasonic UN-W700'                         => [ 'Panasonic', 'Multimedia System UN-W700', DeviceType::MEDIA ],
+        'Panasonic UT-PB1'                          => [ 'Panasonic', 'Raboo UT-PB1', DeviceType::EREADER ],
+    ],
+
+    'Eluga A2'                                  => [ 'Panasonic', 'Eluga A2' ],
+    'ELUGA I2'                                  => [ 'Panasonic', 'Eluga I2' ],
+    'ELUGA Note'                                => [ 'Panasonic', 'Eluga Note' ],
+    'ELUGA Turbo'                               => [ 'Panasonic', 'Eluga Turbo' ],
+
+    'JT-H580VT'                                 => [ 'Panasonic', 'BizPad 7', DeviceType::TABLET ],
+    'JT-H581VT'                                 => [ 'Panasonic', 'BizPad 10', DeviceType::TABLET ],
+    'JT-B1'                                     => [ 'Panasonic', 'Toughpad JT-B1', DeviceType::TABLET ],
+    'FZ-A1(A|B)!'                               => [ 'Panasonic', 'Toughpad FZ-A1', DeviceType::TABLET ],
+    'FZ-B2(B|D)!'                               => [ 'Panasonic', 'Toughpad FZ-B1', DeviceType::TABLET ],
+    'FZ-N1'                                     => [ 'Panasonic', 'Toughpad FZ-N1' ],
+    'FZ-X1'                                     => [ 'Panasonic', 'Toughpad FZ-X1' ],
+
+    'Altus 18'                                  => [ 'Panasonic', 'Altus 18', DeviceType::INFLIGHT ],
+    'Altus 24'                                  => [ 'Panasonic', 'Altus 24', DeviceType::INFLIGHT ],
+    'Elite'                                     => [ 'Panasonic', 'Elite', DeviceType::INFLIGHT ],
+    'Elite 11'                                  => [ 'Panasonic', 'Elite', DeviceType::INFLIGHT ],
+    'Eco9 v1'                                   => [ 'Panasonic', 'Eco 9', DeviceType::INFLIGHT ],
+    'Eco9 v2'                                   => [ 'Panasonic', 'Eco 9', DeviceType::INFLIGHT ],
+    'Eco11 v2'                                  => [ 'Panasonic', 'Eco 11', DeviceType::INFLIGHT ],
+    'Smart Monitor 17'                          => [ 'Panasonic', 'Smart Monitor 17', DeviceType::INFLIGHT ],
+
+    '(48|50|55)AX600C!'                         => [ 'Panasonic', 'Viera AX600C', DeviceType::TELEVISION ],
+    'AX600C'                                    => [ 'Panasonic', 'Viera AX600C', DeviceType::TELEVISION ],
+    'AS650C'                                    => [ 'Panasonic', 'Viera AS650C', DeviceType::TELEVISION ],
+
+    'VW RCBKK1'                                 => [ 'Panasonic', 'Boukenkun Reciever VW-RCBKK1', DeviceType::TELEVISION ],
+    'SMARTTVBOX'                                => [ 'Panasonic', 'SmartTVBox', DeviceType::TELEVISION ],
+
+    'pandigital9hr'                             => [ 'Pandigital', '9HR', DeviceType::TABLET ],
+    'pandigital9hr2'                            => [ 'Pandigital', '9HR2', DeviceType::TABLET ],
+    'pandigitalopc1'                            => [ 'Pandigital', 'OPC1', DeviceType::TABLET ],
+    'pandigitalopp1'                            => [ 'Pandigital', 'OPP1', DeviceType::TABLET ],
+    'pandigitalp1hr'                            => [ 'Pandigital', 'p1hr', DeviceType::TABLET ],
+
+    '(SKY )?IM[- ][A-Z][0-9]{3,3}!!' => [
+        'SKY IM-A600S'                              => [ 'Pantech', 'SIRIUS α' ],
+        'IM-A600!'                                  => [ 'Pantech', 'SIRIUS α' ],
+        'SKY IM-A630K'                              => [ 'Pantech', 'Izar' ],
+        'IM-A630!'                                  => [ 'Pantech', 'Izar' ],
+        'SKY IM-A650S'                              => [ 'Pantech', 'Vega' ],
+        'IM-A650!'                                  => [ 'Pantech', 'Vega' ],
+        'IM-A690!'                                  => [ 'Pantech', 'Mirach' ],
+        'IM[- ]A7(10|20)!'                          => [ 'Pantech', 'VegaXpress' ],
+        'IM-A725!'                                  => [ 'Pantech', 'Vega X+' ],
+        'IM-A730!'                                  => [ 'Pantech', 'Vega S' ],
+        'IM-A7(40|50)!'                             => [ 'Pantech', 'Mirach A' ],
+        'IM-A7(60|70|75|80)!'                       => [ 'Pantech', 'Vega Racer' ],
+        'IM-A800!'                                  => [ 'Pantech', 'Vega LTE' ],
+        'IM-A810!'                                  => [ 'Pantech', 'Vega LTE M' ],
+        'IM-A820!'                                  => [ 'Pantech', 'Vega LTE EX' ],
+        'IM-A830!'                                  => [ 'Pantech', 'Vega Racer 2' ],
+        'IM-A840!'                                  => [ 'Pantech', 'Vega S5' ],
+        'IM-A850!'                                  => [ 'Pantech', 'Vega R3' ],
+        'IM-A860!'                                  => [ 'Pantech', 'Vega N˚ 6' ],
+        'IM-A870!'                                  => [ 'Pantech', 'Vega Iron' ],
+        'IM-A880!'                                  => [ 'Pantech', 'Vega LTE-A' ],
+        'IM-A890!'                                  => [ 'Pantech', 'Vega Secret Note' ],
+        'IM-A900!'                                  => [ 'Pantech', 'Vega Secret Up' ],
+        'IM-A910!'                                  => [ 'Pantech', 'Vega Iron 2' ],
+        'IM-A920!'                                  => [ 'Pantech', 'IM-A920' ],
+        'IM-A930!'                                  => [ 'Pantech', 'IM-A930' ],
+        'IM-T100K'                                  => [ 'Pantech', 'Vega N˚ 5', DeviceType::TABLET ],
+    ],
+
+    'VEGA NO.6'                                 => [ 'Pantech', 'Vega N˚ 6' ],
+    'PLANET'                                    => [ 'Pantech', 'Pocket' ],
+    'ADR8995!'                                  => [ 'Pantech', 'Breakout' ],
+    'ADR910L'                                   => [ 'Pantech', 'Marauder' ],
+    'ADR910L 4G'                                => [ 'Pantech', 'Marauder' ],
+    'ADR930L'                                   => [ 'Pantech', 'Perception' ],
+    'ADR930L 4G'                                => [ 'Pantech', 'Perception' ],
+
+    'PantechP!!' => [
+        'PantechP4100!'                             => [ 'Pantech', 'Element', DeviceType::TABLET ],
+        'PantechP7050!'                             => [ 'Pantech', 'P7050' ],
+        'PantechP8000!'                             => [ 'Pantech', 'Crossover' ],
+        'PantechP8010!'                             => [ 'Pantech', 'Flex' ],
+        'PantechP9060!'                             => [ 'Pantech', 'Pocket' ],
+        'PantechP9070!'                             => [ 'Pantech', 'Burst' ],
+        'PantechP9090!'                             => [ 'Pantech', 'Magnus' ],
+    ],
+
+    'IS06'                                      => [ 'Pantech', 'SIRIUS α IS06', 'carrier' => 'au' ],
+    'PTL21'                                     => [ 'Pantech', 'Vega PTL21', 'carrier' => 'au' ],
+    'IS11PT'                                    => [ 'Pantech', 'Mirach IS11PT', 'carrier' => 'au' ],
+    'EIS01PT'                                   => [ 'Pantech', 'EIS01PT', 'carrier' => 'au' ],
+
+    'FC6100'                                    => [ 'Parrot', 'FC6100', DeviceType::CAR ],
+    'chagall'                                   => [ 'Pegatron', 'Chagall', DeviceType::TABLET ],
+    'PAT712W'                                   => [ 'Perfeo', '712 W', DeviceType::TABLET ],
+    '7500IPS'                                   => [ 'Perfeo', '7500 IPS', DeviceType::TABLET ],
+    'PATG7506HD'                                => [ 'Perfeo', '7506 HD', DeviceType::TABLET ],
+    'X7G'                                       => [ 'Pearl', 'Touchlet X7G', DeviceType::TABLET ],
+    'Touchlet X10.dual'                         => [ 'Pearl', 'Touchlet X10.dual', DeviceType::TABLET ],
+    'PP4MT-7'                                   => [ 'Pendo', 'Pendopad 4', DeviceType::TABLET ],
+    'PP4MT-9'                                   => [ 'Pendo', 'Pendopad 4', DeviceType::TABLET ],
+    'PNDPP4MT9G2'                               => [ 'Pendo', 'Pendopad 4', DeviceType::TABLET ],
+    'PNDPP44QC7'                                => [ 'Pendo', 'Pendopad 7', DeviceType::TABLET ],
+    'PNDPP48GP'                                 => [ 'Pendo', 'Pendopad 8', DeviceType::TABLET ],
+    'PNDPP4MT9G3'                               => [ 'Pendo', 'Pendopad 9.7', DeviceType::TABLET ],
+    'PNDPP410GP'                                => [ 'Pendo', 'Pendopad 10.1', DeviceType::TABLET ],
+
+    'Penta!!' => [
+        'Penta IS701C'                              => [ 'Penta', 'T-Pad IS701C', DeviceType::TABLET ],
+        'Penta IS703C'                              => [ 'Penta', 'T-Pad IS703C', DeviceType::TABLET ],
+        'Penta WS702C'                              => [ 'Penta', 'T-Pad WS702C', DeviceType::TABLET ],
+        'Penta WS704X'                              => [ 'Penta', 'T-Pad WS704X', DeviceType::TABLET ],
+        'Penta WS707C'                              => [ 'Penta', 'T-Pad WS707C', DeviceType::TABLET ],
+        'Penta WS802C'                              => [ 'Penta', 'T-Pad WS802C', DeviceType::TABLET ],
+        'Penta WS907Q'                              => [ 'Penta', 'T-Pad WS907Q', DeviceType::TABLET ],
+        'Penta PS650'                               => [ 'Penta', 'PS650', DeviceType::TABLET ],
+    ],
+
+    'IS703C'                                    => [ 'Penta', 'T-Pad IS703C', DeviceType::TABLET ],
+    'IS801C'                                    => [ 'Penta', 'T-Pad IS801C', DeviceType::TABLET ],
+
+    'Pentagram!!' => [
+        'Pentagram Ego'                             => [ 'Pentagram', 'Ego' ],
+        'PENTAGRAM EON PRIX'                        => [ 'Pentagram', 'Eon PRIX', DeviceType::TABLET ],
+        'Pentagram Monster'                         => [ 'Pentagram', 'Monster' ],
+        'PENTAGRAM TAB 7.3'                         => [ 'Pentagram', 'Tab 7.3', DeviceType::TABLET ],
+        'PENTAGRAM TAB 7.5'                         => [ 'Pentagram', 'Tab 7.5', DeviceType::TABLET ],
+        'PentagramTAB7.6'                           => [ 'Pentagram', 'Tab 7.6', DeviceType::TABLET ],
+        'PENTAGRAM TAB Quadra 9.7'                  => [ 'Pentagram', 'Quadra 9.7', DeviceType::TABLET ],
+    ],
+
+    'PHICOMM!!' => [
+        'PHICOMM CLUE L'                            => [ 'Phicomm', 'Clue L' ],
+        'PHICOMM ENERGY M'                          => [ 'Phicomm', 'Energy M' ],
+        'PHICOMM Energy M+'                         => [ 'Phicomm', 'Energy M+' ],
+        'PHICOMM CLUE C230'                         => [ 'Phicomm', 'C230' ],
+        'PHICOMM C230v'                             => [ 'Phicomm', 'C230v' ],
+        'Phicomm C230w'                             => [ 'Phicomm', 'C230w' ],
+        'PHICOMM C630'                              => [ 'Phicomm', 'C630' ],
+        'PHICOMM-E561Lv'                            => [ 'Phicomm', 'E561Lv' ],
+        'PHICOMM E653'                              => [ 'Phicomm', 'E653' ],
+        'PHICOMM i360'                              => [ 'Phicomm', 'i360' ],
+        'PHICOMM i370'                              => [ 'Phicomm', 'i370' ],
+        'PHICOMM i508'                              => [ 'Phicomm', 'i508' ],
+        'PHICOMM i600'                              => [ 'Phicomm', 'i600' ],
+        'PHICOMM-i700v'                             => [ 'Phicomm', 'i700v' ],
+        'PHICOMM i800'                              => [ 'Phicomm', 'i800' ],
+        'PHICOMM i803'                              => [ 'Phicomm', 'i803' ],
+        'PHICOMM i803wa'                            => [ 'Phicomm', 'i803wa' ],
+        'PHICOMM i813'                              => [ 'Phicomm', 'i813' ],
+        'PHICOMM X100w'                             => [ 'Phicomm', 'X100w' ],
+        'PHICOMM X100wEU'                           => [ 'Phicomm', 'X100w' ],
+        'PHICOMM X130v'                             => [ 'Phicomm', 'X130v' ],
+        'PHICOMM X130va'                            => [ 'Phicomm', 'X130va' ],
+        'PHICOMM X130wEU'                           => [ 'Phicomm', 'X130W' ],
+    ],
+
+    'FWS[0-9]{3,3}!!' => [
+        'FWS610'                                    => [ 'Phicomm', 'FWS610' ],
+        'FWS610 EU'                                 => [ 'Phicomm', 'FWS610' ],
+        'FWS710'                                    => [ 'Phicomm', 'FWS710' ],
+        'FWS710EU'                                  => [ 'Phicomm', 'FWS710' ],
+        'FWS710a'                                   => [ 'Phicomm', 'FWS710' ],
+        'FWS810'                                    => [ 'Phicomm', 'FWS810' ],
+    ],
+
+    'i803w'                                     => [ 'Phicomm', 'i803w' ],
+    'Philips I908'                              => [ 'Philips', 'I908' ],
+    'Philips I928'                              => [ 'Philips', 'I928' ],
+    'Philips S301'                              => [ 'Philips', 'S301' ],
+    'Philips S307'                              => [ 'Philips', 'S307' ],
+    'Philips S308'                              => [ 'Philips', 'S308' ],
+    'Philips S309'                              => [ 'Philips', 'S309' ],
+    'Philips S316T'                             => [ 'Philips', 'S316T' ],
+    'Philips S326'                              => [ 'Philips', 'S326' ],
+    'Philips S337'                              => [ 'Philips', 'S337' ],
+    'Philips S358'                              => [ 'Philips', 'S358' ],
+    'Philips S388!'                             => [ 'Philips', 'S388' ],
+    'Philips S396'                              => [ 'Philips', 'S396' ],
+    'Philips S398'                              => [ 'Philips', 'S398' ],
+    'Philips S616'                              => [ 'Philips', 'S616' ],
+    'Philips T3500'                             => [ 'Philips', 'T3500' ],
+    'Philips T3566'                             => [ 'Philips', 'T3566' ],
+
+    'Philips V377'                              => [ 'Philips', 'Xenium V377' ],
+    'Philips V387'                              => [ 'Philips', 'Xenium V387' ],
+    'Philips V526'                              => [ 'Philips', 'Xenium V526' ],
+    'Philips V787'                              => [ 'Philips', 'Xenium V787' ],
+    'Philips Xenium V787'                       => [ 'Philips', 'Xenium V787' ],
+    'Philips X588'                              => [ 'Philips', 'Xenium X588' ],
+
+
+    'Philips W336'                              => [ 'Philips', 'W336' ],
+    'W337'                                      => [ 'Philips', 'W337' ],
+    'Philips W536'                              => [ 'Philips', 'W536' ],
+    'Philips W626'                              => [ 'Philips', 'W626' ],
+    'W626'                                      => [ 'Philips', 'W626' ],
+    'Philips W632'                              => [ 'Philips', 'W632' ],
+    'Philips W635'                              => [ 'Philips', 'W635' ],
+    'PhilipsW635'                               => [ 'Philips', 'W635' ],
+    'Philips W737'                              => [ 'Philips', 'W737' ],
+    'Philips W832'                              => [ 'Philips', 'W832' ],
+    'Philips W3500'                             => [ 'Philips', 'W3500' ],
+    'Philips W3509'                             => [ 'Philips', 'W3509' ],
+    'Philips W3550'                             => [ 'Philips', 'W3550' ],
+    'Philips W3568'                             => [ 'Philips', 'W3568' ],
+    'W3620'                                     => [ 'Philips', 'W3620' ],
+    'W5510'                                     => [ 'Philips', 'W5510' ],
+    'W6350'                                     => [ 'Philips', 'W6350' ],
+    'Philips W6350'                             => [ 'Philips', 'W6350' ],
+    'PhilipsW6350'                              => [ 'Philips', 'W6350' ],
+    'W6360'                                     => [ 'Philips', 'W6360' ],
+    'W6500'                                     => [ 'Philips', 'W6500' ],
+    'Philips W6610'                             => [ 'Philips', 'W6610' ],
+    'W6620'                                     => [ 'Philips', 'W6620' ],
+    'Philips W6618'                             => [ 'Philips', 'W6618' ],
+    'Philips W7555'                             => [ 'Philips', 'W7555' ],
+    'Philips-W7555'                             => [ 'Philips', 'W7555' ],
+    'Philips-W8500'                             => [ 'Philips', 'W8500' ],
+    'Philips W8510'                             => [ 'Philips', 'W8510' ],
+    'Philips W8555'                             => [ 'Philips', 'W8555' ],
+    'Philips W8560'                             => [ 'Philips', 'W8560' ],
+
+    'SA3CNT'                                    => [ 'Philips', 'GoGear', DeviceType::MEDIA ],
+    'Philips GoGear Connect'                    => [ 'Philips', 'GoGear Connect', DeviceType::MEDIA ],
+
+    'PI2000'                                    => [ 'Philips', 'PI2000', DeviceType::TABLET ],
+    'PI2010'                                    => [ 'Philips', 'PI2010', DeviceType::TABLET ],
+    'PI2011'                                    => [ 'Philips', 'PI2011', DeviceType::TABLET ],
+    'PI3100'                                    => [ 'Philips', 'PI3100', DeviceType::TABLET ],
+    'PI3100-93'                                 => [ 'Philips', 'PI3100', DeviceType::TABLET ],
+    'PI3100Z3 93'                               => [ 'Philips', 'PI3100', DeviceType::TABLET ],
+    'PI3105'                                    => [ 'Philips', 'PI3105', DeviceType::TABLET ],
+    'PI3106'                                    => [ 'Philips', 'PI3106', DeviceType::TABLET ],
+    'PI3110'                                    => [ 'Philips', 'PI3110', DeviceType::TABLET ],
+    'PI3205G'                                   => [ 'Philips', 'PI3205', DeviceType::TABLET ],
+    'PI3210G'                                   => [ 'Philips', 'PI3210', DeviceType::TABLET ],
+    'PI3900'                                    => [ 'Philips', 'PI3900', DeviceType::TABLET ],
+    'PI3900-93'                                 => [ 'Philips', 'PI3900', DeviceType::TABLET ],
+    'PI3910'                                    => [ 'Philips', 'PI3910', DeviceType::TABLET ],
+    'PI4010G'                                   => [ 'Philips', 'PI4010', DeviceType::TABLET ],
+    'Philips PI5000'                            => [ 'Philips', 'PI5000', DeviceType::TABLET ],
+    'PI7000'                                    => [ 'Philips', 'PI7000', DeviceType::TABLET ],
+    'PI7100 93'                                 => [ 'Philips', 'PI7100', DeviceType::TABLET ],
+
+    '[0-9]{2,2}PFH6[0-9]{3,3}!'                 => [ 'Philips', '6000 Series', DeviceType::TELEVISION ],
+    'AND1E'                                     => [ 'Philips', 'Android TV (2014)', DeviceType::TELEVISION ],
+    'AND1E TV'                                  => [ 'Philips', 'Android TV (2014)', DeviceType::TELEVISION ],
+    'HMP8100 ATV 93'                            => [ 'Philips', 'Smart TV Box', DeviceType::TELEVISION ],
+    'HMP8100 ATV INT'                           => [ 'Philips', 'Smart TV Box', DeviceType::TELEVISION ],
+
+    'G2SMNT'                                    => [ 'Philips', 'Smart All-in-One', DeviceType::MONITOR ],
+    'G3SMNTS22'                                 => [ 'Philips', 'Smart All-in-One', DeviceType::MONITOR ],
+    'G3SMNTS23'                                 => [ 'Philips', 'Smart All-in-One', DeviceType::MONITOR ],
+
+    'BIP-6000'                                  => [ 'Pidion', 'BIP-6000' ],
+
+    'XDP-100R'                                  => [ 'Pioneer', 'XDP-100R', DeviceType::MEDIA ],
+
+    '(PNR-)?Pioneer!!' => [
+        'Pioneer E71t'                              => [ 'Pioneer', 'E71t' ],
+        'Pioneer E80w'                              => [ 'Pioneer', 'E80w' ],
+        'Pioneer E81c'                              => [ 'Pioneer', 'E81c' ],
+        'PNR-Pioneer E81c'                          => [ 'Pioneer', 'E81c' ],
+        'Pioneer E90w'                              => [ 'Pioneer', 'E90w' ],
+        'Pioneer P81'                               => [ 'Pioneer', 'P81' ],
+        'Pioneer S90w'                              => [ 'Pioneer', 'S90w' ],
+    ],
+
+    'E60w'                                      => [ 'Pioneer', 'E60w' ],
+
+    'M6'                                        => [ 'PiPO', 'M6', DeviceType::TABLET ],
+    'M8 pro'                                    => [ 'PiPO', 'M8 Pro', DeviceType::TABLET ],
+    'M9 pro'                                    => [ 'PiPO', 'M9 Pro', DeviceType::TABLET ],
+
+    'PIRANHA!!' => [
+        'PIRANHA BUSINESS TAB 7"'                   => [ 'Piranha', 'Business Tab 7.0', DeviceType::TABLET ],
+        'PIRANHA BUSINESS TAB 10.1'                 => [ 'Piranha', 'Business Tab 10.1', DeviceType::TABLET ],
+        'PIRANHA BUSINESS TAB 10.1 ZEUS WHITE'      => [ 'Piranha', 'Business Tab 10.1', DeviceType::TABLET ],
+        'PIRANHA BUSINESS II TAB 9.0'               => [ 'Piranha', 'Business II Tab 9.0', DeviceType::TABLET ],
+        'PIRANHA BUSINESS II TAB 9"'                => [ 'Piranha', 'Business II Tab 9.0', DeviceType::TABLET ],
+        'PIRANHA BUSINESS III TAB 10.1 ZEUS WHITE'  => [ 'Piranha', 'Business III Tab 10.1', DeviceType::TABLET ],
+        'PIRANHA BUSINESS III TAB 10.1'             => [ 'Piranha', 'Business III Tab 10.1', DeviceType::TABLET ],
+        'PIRANHA Pro II Tab 7.0'                    => [ 'Piranha', 'Pro II Tab 7.0', DeviceType::TABLET ],
+        'PIRANHA Ultra Tab 7.0'                     => [ 'Piranha', 'Ultra Tab 7.0', DeviceType::TABLET ],
+        'PIRANHA Ultra Tab Zeus White 10.1'         => [ 'Piranha', 'Ultra Tab 10.1', DeviceType::TABLET ],
+        'PIRANHA ULTRA TAB 10.1"'                   => [ 'Piranha', 'Ultra Tab 10.1', DeviceType::TABLET ],
+        'PIRANHA ULTRA II TAB 7'                    => [ 'Piranha', 'Ultra II Tab 7.0', DeviceType::TABLET ],
+        'PIRANHA Ultra II TAB 9.0'                  => [ 'Piranha', 'Ultra II Tab 9.0', DeviceType::TABLET ],
+    ],
+
+    'PGM 398'                                   => [ 'Pixcom', 'PGM 398' ],
+    'Playboy PB-S3'                             => [ 'Playboy', 'Note 5' ],
+
+    '(PLOYER-)?MOMO!!' => [
+        'PLOYER-MOMO'                               => [ 'Ployer', 'MOMO', DeviceType::TABLET ],
+        'MOMO'                                      => [ 'Ployer', 'MOMO', DeviceType::TABLET ],
+        'momo-mini'                                 => [ 'Ployer', 'MOMO Mini', DeviceType::TABLET ],
+        'MOMO7'                                     => [ 'Ployer', 'MOMO7', DeviceType::TABLET ],
+        'MOMO7star'                                 => [ 'Ployer', 'MOMO7 Star', DeviceType::TABLET ],
+        'MOMO7 Talent'                              => [ 'Ployer', 'MOMO7 Talent', DeviceType::TABLET ],
+        'MOMO8'                                     => [ 'Ployer', 'MOMO8', DeviceType::TABLET ],
+        'MOMO8A'                                    => [ 'Ployer', 'MOMO8 A', DeviceType::TABLET ],
+        'MOMO8 bird'                                => [ 'Ployer', 'MOMO8 Bird', DeviceType::TABLET ],
+        'MOMO8 Star!'                               => [ 'Ployer', 'MOMO8 Star', DeviceType::TABLET ],
+        'MOMO8 Xing!'                               => [ 'Ployer', 'MOMO8 Xing', DeviceType::TABLET ],
+        'MOMO9'                                     => [ 'Ployer', 'MOMO9', DeviceType::TABLET ],
+        'MOMO93G'                                   => [ 'Ployer', 'MOMO9 3G', DeviceType::TABLET ],
+        'MOMO9 3G'                                  => [ 'Ployer', 'MOMO9 3G', DeviceType::TABLET ],
+        'MOMO9-V P706'                              => [ 'Ployer', 'MOMO9 V', DeviceType::TABLET ],
+        'MOMO9 STAR'                                => [ 'Ployer', 'MOMO9 Star', DeviceType::TABLET ],
+        'MOMO9star'                                 => [ 'Ployer', 'MOMO9 Star', DeviceType::TABLET ],
+        'MOMO9 plus III'                            => [ 'Ployer', 'MOMO9 Plus III', DeviceType::TABLET ],
+        'MOMO9-3'                                   => [ 'Ployer', 'MOMO9 III', DeviceType::TABLET ],
+        'MOMO9-3S'                                  => [ 'Ployer', 'MOMO9 III', DeviceType::TABLET ],
+        'MOMO9 Plus-3'                              => [ 'Ployer', 'MOMO9 III', DeviceType::TABLET ],
+        'MOMO9 3GQ'                                 => [ 'Ployer', 'MOMO9 3GQ', DeviceType::TABLET ],
+        'MOMO11'                                    => [ 'Ployer', 'MOMO11', DeviceType::TABLET ],
+        'MOMO11 III'                                => [ 'Ployer', 'MOMO11 III', DeviceType::TABLET ],
+        'MOMO11-3'                                  => [ 'Ployer', 'MOMO11 III', DeviceType::TABLET ],
+        'MOMO11 bird'                               => [ 'Ployer', 'MOMO11 Bird', DeviceType::TABLET ],
+        'MOMO11bird3'                               => [ 'Ployer', 'MOMO11 Bird 3', DeviceType::TABLET ],
+        'MOMO11 bird3'                              => [ 'Ployer', 'MOMO11 Bird 3', DeviceType::TABLET ],
+        'MOMO11Master'                              => [ 'Ployer', 'MOMO11 Master', DeviceType::TABLET ],
+        'MOMO11Speed'                               => [ 'Ployer', 'MOMO11 Speed', DeviceType::TABLET ],
+        'MOMO11speed3'                              => [ 'Ployer', 'MOMO11 Speed 3', DeviceType::TABLET ],
+        'MOMO12'                                    => [ 'Ployer', 'MOMO12', DeviceType::TABLET ],
+        'MOMO15'                                    => [ 'Ployer', 'MOMO15', DeviceType::TABLET ],
+        'MOMO19'                                    => [ 'Ployer', 'MOMO19', DeviceType::TABLET ],
+        'MOMO19HD'                                  => [ 'Ployer', 'MOMO19 HD', DeviceType::TABLET ],
+        'MOMO20'                                    => [ 'Ployer', 'MOMO20', DeviceType::TABLET ],
+        'MOMO20-AU'                                 => [ 'Ployer', 'MOMO20', DeviceType::TABLET ],
+        'MOMO20S'                                   => [ 'Ployer', 'MOMO20', DeviceType::TABLET ],
+    ],
+
+    'PocketBook A7'                             => [ 'PocketBook', 'A7', DeviceType::TABLET ],
+    'PocketBook A10'                            => [ 'PocketBook', 'A10', DeviceType::TABLET ],
+    'PocketBook A10 3G'                         => [ 'PocketBook', 'A10 3G', DeviceType::TABLET ],
+    'Obreey SURFpad'                            => [ 'PocketBook', 'SURFpad', DeviceType::TABLET ],
+    'PocketBook SURFpad2'                       => [ 'PocketBook', 'SURFpad 2', DeviceType::TABLET ],
+    'PocketBook SURFpad 3 (7,85")'              => [ 'PocketBook', 'SURFpad 3', DeviceType::TABLET ],
+    'PocketBook SURFpad 4 S'                    => [ 'PocketBook', 'SURFpad 4 S', DeviceType::TABLET ],
+    'PocketBook SURFpad 4 M'                    => [ 'PocketBook', 'SURFpad 4 M', DeviceType::TABLET ],
+    'PocketBook SURFpad 4 L'                    => [ 'PocketBook', 'SURFpad 4 L', DeviceType::TABLET ],
+    'MOB-5045'                                  => [ 'Point Of View', 'Mobii Phone 5045' ],
+    'Mobii 7'                                   => [ 'Point Of View', 'Mobii 7', DeviceType::TABLET ],
+    'POV-Mobii-7'                               => [ 'Point Of View', 'Mobii 7', DeviceType::TABLET ],
+    'POV Mobii 7'                               => [ 'Point Of View', 'Mobii 7', DeviceType::TABLET ],
+    'POV TAB-P506!'                             => [ 'Point Of View', 'Mobii 506', DeviceType::TABLET ],
+    'POV TAB-P517!'                             => [ 'Point Of View', 'Mobii 517', DeviceType::TABLET ],
+    'POV TAB-P527!'                             => [ 'Point Of View', 'Mobii 527', DeviceType::TABLET ],
+    'POV TAB-P629!'                             => [ 'Point Of View', 'Mobii 629', DeviceType::TABLET ],
+    'POV TAB-P701!'                             => [ 'Point Of View', 'Mobii 701', DeviceType::TABLET ],
+    'POV TAB-P703!'                             => [ 'Point Of View', 'Mobii 703', DeviceType::TABLET ],
+    'POV TAB-P720!'                             => [ 'Point Of View', 'Mobii 720', DeviceType::TABLET ],
+    'POV TAB-P721A!'                            => [ 'Point Of View', 'Mobii 721A', DeviceType::TABLET ],
+    'POV TAB-P721!'                             => [ 'Point Of View', 'Mobii 721', DeviceType::TABLET ],
+    'POV TAB-P722C!'                            => [ 'Point Of View', 'Mobii 722C', DeviceType::TABLET ],
+    'POV TAB-P731N!'                            => [ 'Point Of View', 'Mobii 731N', DeviceType::TABLET ],
+    'POV TAB-P825!'                             => [ 'Point Of View', 'Mobii 825', DeviceType::TABLET ],
+    'POV TAB-P925!'                             => [ 'Point Of View', 'Mobii 925', DeviceType::TABLET ],
+    'POV TAB-PR945!'                            => [ 'Point Of View', 'Mobii 945 HD+', DeviceType::TABLET ],
+    'POV TAB-P1025!'                            => [ 'Point Of View', 'Mobii 1025', DeviceType::TABLET ],
+    'POV TAB-P1030!'                            => [ 'Point Of View', 'Mobii 1030', DeviceType::TABLET ],
+    'POV TAB-PI1045!'                           => [ 'Point Of View', 'Mobii 1045', DeviceType::TABLET ],
+    'POV TAB-P1325!'                            => [ 'Point Of View', 'Mobii 1325', DeviceType::TABLET ],
+    'PlayTabPro'                                => [ 'Point Of View', 'PlayTabPro', DeviceType::TABLET ],
+    '(POV )?TAB-PLAYTABPRO!'                    => [ 'Point Of View', 'PlayTabPro', DeviceType::TABLET ],
+    '(POV )?TAB-PROTAB25!'                      => [ 'Point Of View', 'ProTab 25', DeviceType::TABLET ],
+    '(POV )?TAB-PROTAB26!'                      => [ 'Point Of View', 'ProTab 26', DeviceType::TABLET ],
+    'POV TAB-PROTAB27'                          => [ 'Point Of View', 'ProTab 27', DeviceType::TABLET ],
+    '(POV )?TAB-PROTAB30!'                      => [ 'Point Of View', 'ProTab 30', DeviceType::TABLET ],
+    'TAB-PROTAB2-IPS9'                          => [ 'Point Of View', 'ProTab2', DeviceType::TABLET ],
+    'TAB-PROTAB2-IPS-3G'                        => [ 'Point Of View', 'ProTab2', DeviceType::TABLET ],
+    'TAB-PROTAB2-IPS-16'                        => [ 'Point Of View', 'ProTab2', DeviceType::TABLET ],
+    'TAB-PROTAB2.4'                             => [ 'Point Of View', 'ProTab2 4', DeviceType::TABLET ],
+    'TAB-PROTAB2XL'                             => [ 'Point Of View', 'ProTab2 XL', DeviceType::TABLET ],
+    'TAB-PROTAB2.4XL'                           => [ 'Point Of View', 'ProTab2 XL 4', DeviceType::TABLET ],
+    'PROTAB2XXL'                                => [ 'Point Of View', 'ProTab2 XXL', DeviceType::TABLET ],
+    'TAB-PROTAB2XXL'                            => [ 'Point Of View', 'ProTab2 XXL', DeviceType::TABLET ],
+    'TAB-PROTAB2XXL(4)'                         => [ 'Point Of View', 'ProTab2 XXL', DeviceType::TABLET ],
+    '(POV )?TAB-PROTAB2XXL(4)!'                 => [ 'Point Of View', 'ProTab2 XXL', DeviceType::TABLET ],
+    '(POV )?TAB NAVI7 3G M!'                    => [ 'Point Of View', 'Onyx 507', DeviceType::TABLET ],
+    'POV_TAB-NAVI7-3G-M'                        => [ 'Point Of View', 'Onyx 507', DeviceType::TABLET ],
+    'POV TAB-P547(v1.0)'                        => [ 'Point Of View', 'Onyx 547', DeviceType::TABLET ],
+    'POV TV-HDMI-200BT'                         => [ 'Point Of View', 'Smart TV', DeviceType::TELEVISION ],
+    'POV TV-HDMI-200BT(V2.0)'                   => [ 'Point Of View', 'Smart TV', DeviceType::TELEVISION ],
+    'POV TV-HDMI-210'                           => [ 'Point Of View', 'Smart TV', DeviceType::TELEVISION ],
+    'POV TV-HDMI-KB-01'                         => [ 'Point Of View', 'Smart TV', DeviceType::TELEVISION ],
+    'POV TV-SMARTTV-500'                        => [ 'Point Of View', 'Smart TV', DeviceType::TELEVISION ],
+
+    'MID[C012]!!' => [
+        'MIDC409'                                   => [ 'Polaroid', 'Diamond III 9', DeviceType::TABLET ],
+        'MIDC410'                                   => [ 'Polaroid', 'Diamond 10.1', DeviceType::TABLET ],
+        'MID2407'                                   => [ 'Polaroid', 'Infinite 7', DeviceType::TABLET ],
+        'MID1014'                                   => [ 'Polaroid', 'Pearl 10.1', DeviceType::TABLET ],
+        'MID1047'                                   => [ 'Polaroid', 'Platinum 10.1', DeviceType::TABLET ],
+        'MIDC407'                                   => [ 'Polaroid', 'Rainbow 7', DeviceType::TABLET ],
+        'MID0714'                                   => [ 'Polaroid', 'MID0714', DeviceType::TABLET ],
+        'MID0714PCE01'                              => [ 'Polaroid', 'MID0714', DeviceType::TABLET ],
+        'MID0714PGE02.133'                          => [ 'Polaroid', 'MID0714', DeviceType::TABLET ],
+        'MIDC010PR001'                              => [ 'Polaroid', 'MIDC010', DeviceType::TABLET ],
+        'MIDC110'                                   => [ 'Polaroid', 'MIDC110', DeviceType::TABLET ],
+        'MIDC124'                                   => [ 'Polaroid', 'MIDC124', DeviceType::TABLET ],
+        'MIDC127'                                   => [ 'Polaroid', 'MIDC127', DeviceType::TABLET ],
+        'MIDC128'                                   => [ 'Polaroid', 'MIDC128', DeviceType::TABLET ],
+        'MIDC408'                                   => [ 'Polaroid', 'MIDC408', DeviceType::TABLET ],
+        'MIDC408PR002'                              => [ 'Polaroid', 'MIDC408', DeviceType::TABLET ],
+        'MIDC410PR'                                 => [ 'Polaroid', 'MIDC410', DeviceType::TABLET ],
+        'MIDC430'                                   => [ 'Polaroid', 'MIDC430', DeviceType::TABLET ],
+        'MIDC497'                                   => [ 'Polaroid', 'MIDC497', DeviceType::TABLET ],
+        'MIDC700PR001'                              => [ 'Polaroid', 'MIDC700', DeviceType::TABLET ],
+        'MIDC800PR001'                              => [ 'Polaroid', 'MIDC800', DeviceType::TABLET ],
+        'MIDC801'                                   => [ 'Polaroid', 'MIDC801', DeviceType::TABLET ],
+        'MIDC802'                                   => [ 'Polaroid', 'MIDC802', DeviceType::TABLET ],
+        'MIDC901'                                   => [ 'Polaroid', 'MIDC901', DeviceType::TABLET ],
+        'MIDC970'                                   => [ 'Polaroid', 'MIDC970', DeviceType::TABLET ],
+        'MIDCD10'                                   => [ 'Polaroid', 'MIDCD10', DeviceType::TABLET ],
+        'MIDCD97'                                   => [ 'Polaroid', 'MIDCD97', DeviceType::TABLET ],
+    ],
+
+    'PMID!!' => [
+        'PMID70C'                                   => [ 'Polaroid', 'PMID 70c', DeviceType::TABLET ],
+        'PMID70DC'                                  => [ 'Polaroid', 'PMID 70dc', DeviceType::TABLET ],
+        'PMID71C'                                   => [ 'Polaroid', 'PMID 71c', DeviceType::TABLET ],
+        'PMID80C'                                   => [ 'Polaroid', 'PMID 80c', DeviceType::TABLET ],
+        'PMID700'                                   => [ 'Polaroid', 'PMID 700', DeviceType::TABLET ],
+        'PMID700BF'                                 => [ 'Polaroid', 'PMID 700bf', DeviceType::TABLET ],
+        'PMID701C'                                  => [ 'Polaroid', 'PMID 701c', DeviceType::TABLET ],
+        'PMID701DC'                                 => [ 'Polaroid', 'PMID 701dc', DeviceType::TABLET ],
+        'PMID702DC'                                 => [ 'Polaroid', 'PMID 702dc', DeviceType::TABLET ],
+        'PMID703C'                                  => [ 'Polaroid', 'PMID 703c', DeviceType::TABLET ],
+        'PMID703DC'                                 => [ 'Polaroid', 'PMID 703dc', DeviceType::TABLET ],
+        'PMID703GK'                                 => [ 'Polaroid', 'PMID 703gk', DeviceType::TABLET ],
+        'PMID704G'                                  => [ 'Polaroid', 'PMID 704g', DeviceType::TABLET ],
+        'PMID704GK'                                 => [ 'Polaroid', 'PMID 704gk', DeviceType::TABLET ],
+        'PMID705'                                   => [ 'Polaroid', 'PMID 705', DeviceType::TABLET ],
+        'PMID705X'                                  => [ 'Polaroid', 'PMID 705x', DeviceType::TABLET ],
+        'PMID706'                                   => [ 'Polaroid', 'PMID 706', DeviceType::TABLET ],
+        'PMID720'                                   => [ 'Polaroid', 'PMID 720', DeviceType::TABLET ],
+        'PMID800'                                   => [ 'Polaroid', 'PMID 800', DeviceType::TABLET ],
+        'PMID901'                                   => [ 'Polaroid', 'PMID 901', DeviceType::TABLET ],
+        'PMID920'                                   => [ 'Polaroid', 'PMID 920', DeviceType::TABLET ],
+        'PMID-973G'                                 => [ 'Polaroid', 'PMID 973g', DeviceType::TABLET ],
+        'PMID1000B'                                 => [ 'Polaroid', 'PMID 1000b', DeviceType::TABLET ],
+        'PMID1000B V2'                              => [ 'Polaroid', 'PMID 1000b', DeviceType::TABLET ],
+        'PMID-1000DC'                               => [ 'Polaroid', 'PMID 1000dc', DeviceType::TABLET ],
+        'PMID1000!'                                 => [ 'Polaroid', 'PMID 1000', DeviceType::TABLET ],
+        'PMID4311'                                  => [ 'Polaroid', 'PMID 4311', DeviceType::TABLET ],
+        'PMID4312'                                  => [ 'Polaroid', 'PMID 4312', DeviceType::TABLET ],
+    ],
+
+    'PSPT350'                                   => [ 'Polaroid', 'PSPT350' ],
+    'Polaroid PSPT401'                          => [ 'Polaroid', 'Turbo 401' ],
+    'Polaroid PSPC505'                          => [ 'Polaroid', 'Cosmo 505' ],
+    'Polaroid P4005A'                           => [ 'Polaroid', 'P4005A' ],
+
+    'PROV!!' => [
+        'PROV350'                                   => [ 'Polaroid', 'PROV350' ],
+        'PROV400'                                   => [ 'Polaroid', 'PROV400' ],
+    ],
+
+    'PRO!!' => [
+        'PRO400B'                                   => [ 'Polaroid', 'PRO400B' ],
+        'PRO450B'                                   => [ 'Polaroid', 'PRO450B' ],
+        'PRO4006'                                   => [ 'Polaroid', 'PRO4006' ],
+        'PRO4611PR201'                              => [ 'Polaroid', 'PRO4611' ],
+        'PRO5701'                                   => [ 'Polaroid', 'PRO5701' ],
+        'PRO7111'                                   => [ 'Polaroid', 'PRO7111' ],
+        ],
+
+    'POLY ?PAD!!' => [
+        'POLY PAD 8208HD'                           => [ 'Polypad', '8208 HD', DeviceType::TABLET ],
+        'POLY PAD 8216HD'                           => [ 'Polypad', '8216 HD', DeviceType::TABLET ],
+        'POLY PAD 9708HD'                           => [ 'Polypad', '9708 HD', DeviceType::TABLET ],
+        'POLY PAD 9716HD'                           => [ 'Polypad', '9716 HD', DeviceType::TABLET ],
+        'Polypad C508'                              => [ 'Polypad', 'C508', DeviceType::TABLET ],
+    ],
+
+    'POLYTRON!!' => [
+        'POLYTRON L501'                             => [ 'Polytron', 'L501 Rocket 4G C1' ],
+        'POLYTRON P520'                             => [ 'Polytron', 'P520 Prime 7s' ],
+        'POLYTRON R1500'                            => [ 'Polytron', 'R1500 Rocket Q-Five' ],
+        'POLYTRON R2403'                            => [ 'Polytron', 'R2403 Rocket R1' ],
+        'POLYTRON R2406'                            => [ 'Polytron', 'R2406 Rocket R2' ],
+        'POLYTRON R2407'                            => [ 'Polytron', 'R2407 Rocket R3' ],
+        'POLYTRON R2452'                            => [ 'Polytron', 'R2452 Rocket S1' ],
+        'POLYTRON-R2457'                            => [ 'Polytron', 'R2457 Rocket S2' ],
+        'POLYTRON R2501'                            => [ 'Polytron', 'R2501 Rocket T1' ],
+        'POLYTRON-R2507'                            => [ 'Polytron', 'R2507 Rocket T3' ],
+        'POLYTRON R2506'                            => [ 'Polytron', 'R2506 Rocket T4' ],
+        'POLYTRON R3450'                            => [ 'Polytron', 'R3450 Rocket Jetz' ],
+        'POLYTRON R3500'                            => [ 'Polytron', 'R3500 Jetz 5.0' ],
+        'POLYTRON S2350'                            => [ 'Polytron', 'S2350 Rocket' ],
+        'POLYTRON T7800'                            => [ 'Polytron', 'T7800 Cosmica' ],
+        'Polytron W1320'                            => [ 'Polytron', 'W1320' ],
+        'POLYTRON W1400'                            => [ 'Polytron', 'W1400 Rocket Jetz 4.0' ],
+        'POLYTRON W2430'                            => [ 'Polytron', 'W2430 Wizard Twins' ],
+        'POLYTRON W2500'                            => [ 'Polytron', 'W2500 Wizard Twins' ],
+        'POLYTRON W3430'                            => [ 'Polytron', 'W3430 Wizard Crystal' ],
+        'POLYTRON W6450'                            => [ 'Polytron', 'W6450 Rocket Star' ],
+        'POLYTRON W7430'                            => [ 'Polytron', 'W7430 Wizard Quadra Mini' ],
+        'POLYTRON W7450'                            => [ 'Polytron', 'W7450 Wizard Quadra' ],
+        'POLYTRON W7451'                            => [ 'Polytron', 'W7451 Quadra S' ],
+        'POLYTRON W7452'                            => [ 'Polytron', 'W7452 Quadra S2' ],
+        'POLYTRON W7531'                            => [ 'Polytron', 'W7531 Wizard Quadra V' ],
+        'POLYTRON W7550 LITE'                       => [ 'Polytron', 'W7550 Rocket Quadra Lite' ],
+        'POLYTRON W8470'                            => [ 'Polytron', 'W8470 Wizard Quadra HD' ],
+        'POLYTRON 4G551'                            => [ 'Polytron', '4G551 Zap 6 Posh Note' ],
+    ],
+
+    'POMP!!' => [
+        'POMP C6'                                   => [ 'POMP', 'C6' ],
+        'POMP P8'                                   => [ 'POMP', 'P8' ],
+        'POMP W88'                                  => [ 'POMP', 'W88' ],
+        'POMP-W88A'                                 => [ 'POMP', 'W88A' ],
+        'POMP-W88S'                                 => [ 'POMP', 'W88S' ],
+        'POMP W89'                                  => [ 'POMP', 'W89' ],
+        'POMP-W89'                                  => [ 'POMP', 'W89' ],
+        'POMP W99'                                  => [ 'POMP', 'W99' ],
+        'POMP W99A'                                 => [ 'POMP', 'W99A' ],
+    ],
+
+    'ACT2000'                                   => [ 'Poptronix', 'ACT2000', DeviceType::TABLET ],
+
+    'Air!!' => [
+        'Air 7.85 3G'                               => [ 'Roverpad', 'Air 7.85 3G', DeviceType::TABLET ],
+        'Air 10.1 3G'                               => [ 'Roverpad', 'Air 10.1 3G', DeviceType::TABLET ],
+        'Air S70'                                   => [ 'Roverpad', 'Air S70', DeviceType::TABLET ],
+    ],
+
+    'PMP[0-9]{4,4}!!' => [
+        'PMP3007C'                                  => [ 'Prestigio', 'Multipad Rider 7.0', DeviceType::TABLET ],
+        'PMP3007C3G'                                => [ 'Prestigio', 'Multipad Rider 7.0 3G', DeviceType::TABLET ],
+        'PMP3074B'                                  => [ 'Prestigio', 'Multipad 3074', DeviceType::TABLET ],
+        'PMP3074BRU'                                => [ 'Prestigio', 'Multipad 3074', DeviceType::TABLET ],
+        'PMP3084B'                                  => [ 'Prestigio', 'Multipad 3084', DeviceType::TABLET ],
+        'PMP3084BA'                                 => [ 'Prestigio', 'Multipad 3084', DeviceType::TABLET ],
+        'PMP3084BPL'                                => [ 'Prestigio', 'Multipad 3084', DeviceType::TABLET ],
+        'PMP3084BRU'                                => [ 'Prestigio', 'Multipad 3084', DeviceType::TABLET ],
+        'PMP3170B'                                  => [ 'Prestigio', 'Multipad 3170 Pro', DeviceType::TABLET ],
+        'PMP3170BEN'                                => [ 'Prestigio', 'Multipad 3170 Pro', DeviceType::TABLET ],
+        'PMP3270B'                                  => [ 'Prestigio', 'Multipad 3270 Prime', DeviceType::TABLET ],
+        'PMP3370B'                                  => [ 'Prestigio', 'Multipad 3370', DeviceType::TABLET ],
+        'PMP3384B'                                  => [ 'Prestigio', 'Multipad 3384', DeviceType::TABLET ],
+        'PMP3384BRU'                                => [ 'Prestigio', 'Multipad 3384', DeviceType::TABLET ],
+        'PMP3470B'                                  => [ 'Prestigio', 'Multipad 3470 Prime+', DeviceType::TABLET ],
+        'PMP3570C'                                  => [ 'Prestigio', 'Multipad 7.0 Ultra+', DeviceType::TABLET ],
+        'PMP3670B'                                  => [ 'Prestigio', 'Multipad 3670 Ultra+', DeviceType::TABLET ],
+        'PMP3670B-WH'                               => [ 'Prestigio', 'Multipad 3670 Ultra+', DeviceType::TABLET ],
+        'PMP3770B'                                  => [ 'Prestigio', 'Multipad 3770', DeviceType::TABLET ],
+        'PMP3970B'                                  => [ 'Prestigio', 'Multipad 3970 Duo', DeviceType::TABLET ],
+        'PMP5080B'                                  => [ 'Prestigio', 'Multipad 5080', DeviceType::TABLET ],
+        'PMP5080BRU'                                => [ 'Prestigio', 'Multipad 5080', DeviceType::TABLET ],
+        'PMP5080CPRO'                               => [ 'Prestigio', 'Multipad 5080 Pro', DeviceType::TABLET ],
+        'PMP5097CPRO'                               => [ 'Prestigio', 'Multipad 5097 Pro', DeviceType::TABLET ],
+        'PMP5101C QUAD'                             => [ 'Prestigio', 'Multipad 4 Quantum 10.1', DeviceType::TABLET ],
+        'PMP5101C3G QUAD'                           => [ 'Prestigio', 'Multipad 4 Quantum 10.1 3G', DeviceType::TABLET ],
+        'PMP5101D QUAD'                             => [ 'Prestigio', 'Multipad 4 Quantum 10.1', DeviceType::TABLET ],
+        'PMP5101D3G QUAD'                           => [ 'Prestigio', 'Multipad 4 Quantum 10.1 3G', DeviceType::TABLET ],
+        'PMP5197DULTRA'                             => [ 'Prestigio', 'Multipad 5197 Ultra', DeviceType::TABLET ],
+        'PMP5297C QUAD'                             => [ 'Prestigio', 'Multipad 4 Quantum 9.7', DeviceType::TABLET ],
+        'PMP5570C'                                  => [ 'Prestigio', 'Multipad 5570 Pro', DeviceType::TABLET ],
+        'PMP5580C'                                  => [ 'Prestigio', 'Multipad 5580 Prime', DeviceType::TABLET ],
+        'PMP5588C'                                  => [ 'Prestigio', 'Multipad 8.0 HD', DeviceType::TABLET ],
+        'PMP5597D'                                  => [ 'Prestigio', 'Multipad 5597 Ultra Duo', DeviceType::TABLET ],
+        'PMP5670C DUO'                              => [ 'Prestigio', 'Multipad 2 Pro Duo 7.0', DeviceType::TABLET ],
+        'PMP5770D'                                  => [ 'Prestigio', 'Multipad 5770 Pro', DeviceType::TABLET ],
+        'PMP5785C3G QUAD'                           => [ 'Prestigio', 'Multipad 4 Quantum 7.85 3G', DeviceType::TABLET ],
+        'PMP7100D3G QUAD'                           => [ 'Prestigio', 'Multipad 7100', DeviceType::TABLET ],
+        'PMP7280D3G QUAD'                           => [ 'Prestigio', 'Multipad 7280', DeviceType::TABLET ],
+        'PMP7480D3G QUAD'                           => [ 'Prestigio', 'Multipad 7480', DeviceType::TABLET ],
+        'PMP7880D3G'                                => [ 'Prestigio', 'Multipad 7880', DeviceType::TABLET ],
+        'PMP5780D'                                  => [ 'Prestigio', 'Multipad 2 Prime Duo 8.0', DeviceType::TABLET ],
+        'PMP5785C QUAD'                             => [ 'Prestigio', 'Multipad 4 Quantum 7.85', DeviceType::TABLET ],
+        'PMP5870C'                                  => [ 'Prestigio', 'Multipad 7.0 Ultra Duo', DeviceType::TABLET ],
+        'PMP5880D'                                  => [ 'Prestigio', 'Multipad 8.0 Ultra Duo', DeviceType::TABLET ],
+        'PMP7070C3G'                                => [ 'Prestigio', 'Multipad 4 Diamond 7.0 3G', DeviceType::TABLET ],
+        'PMP7074B3G'                                => [ 'Prestigio', 'Multipad 7074', DeviceType::TABLET ],
+        'PMP7074B3GRU'                              => [ 'Prestigio', 'Multipad 7074', DeviceType::TABLET ],
+        'PMP7079D QUAD'                             => [ 'Prestigio', 'Multipad 4 Diamond 7.85', DeviceType::TABLET ],
+        'PMP7079D3G QUAD'                           => [ 'Prestigio', 'Multipad 4 Diamond 7.85 3G', DeviceType::TABLET ],
+        'PMP7079E3G QUAD'                           => [ 'Prestigio', 'Multipad 4 Diamond 7.85 3G', DeviceType::TABLET ],
+        'PMP7100D'                                  => [ 'Prestigio', 'Multipad 4 10.1 Ultimate', DeviceType::TABLET ],
+        'PMP7100D3G'                                => [ 'Prestigio', 'Multipad 4 10.1 Ultimate 3G', DeviceType::TABLET ],
+        'PMP7100D3G QUAD'                           => [ 'Prestigio', 'Multipad 4 10.1 Ultimate 3G', DeviceType::TABLET ],
+        'PMP7110D3G'                                => [ 'Prestigio', 'Multipad 4 Diamond 10.1 3G', DeviceType::TABLET ],
+        'PMP7170B3G'                                => [ 'Prestigio', 'Multipad 7.0 Prime 3G', DeviceType::TABLET ],
+        'PMP7170B3GCE'                              => [ 'Prestigio', 'Multipad 7.0 Prime 3G', DeviceType::TABLET ],
+        'PMP7170B3G DUO'                            => [ 'Prestigio', 'Multipad 7.0 Prime Duo 3G', DeviceType::TABLET ],
+        'PMP7280C'                                  => [ 'Prestigio', 'Multipad 2 Ultra Duo 8.0', DeviceType::TABLET ],
+        'PMP7280C3G'                                => [ 'Prestigio', 'Multipad 2 Ultra Duo 8.0 3G', DeviceType::TABLET ],
+        'PMP7280C3G DUO'                            => [ 'Prestigio', 'Multipad 2 Ultra Duo 8.0 3G', DeviceType::TABLET ],
+        'PMP7280C3G QUAD'                           => [ 'Prestigio', 'Multipad 4 Ultra Quad 8.0 3G', DeviceType::TABLET ],
+        'PMP7380D3G'                                => [ 'Prestigio', 'Multipad 2 Pro Duo 8.0 3G', DeviceType::TABLET ],
+        'PMP7380D3G QUAD'                           => [ 'Prestigio', 'Multipad 2 Pro Quad 8.0 3G', DeviceType::TABLET ],
+    ],
+
+    'PMT[0-9]{4,4}!!' => [
+        'PMT3008 WI C'                              => [ 'Prestigio', 'Multipad Wize 3008', DeviceType::TABLET ],
+        'PMT3009 Wi C'                              => [ 'Prestigio', 'Multipad Wize 3009', DeviceType::TABLET ],
+        'PMT3011 3G'                                => [ 'Prestigio', 'Multipad Wize 3011', DeviceType::TABLET ],
+        'PMT3017 WI'                                => [ 'Prestigio', 'Multipad Wize 3017', DeviceType::TABLET ],
+        'PMT3018 WI'                                => [ 'Prestigio', 'Multipad Wize 3018', DeviceType::TABLET ],
+        'PMT3021 3G'                                => [ 'Prestigio', 'Multipad Wize 3021', DeviceType::TABLET ],
+        'PMT3031 3G'                                => [ 'Prestigio', 'Multipad Wize 3031', DeviceType::TABLET ],
+        'PMT3037 3G'                                => [ 'Prestigio', 'Multipad Wize 3037', DeviceType::TABLET ],
+        'PMT3038 3G'                                => [ 'Prestigio', 'Multipad Wize 3038', DeviceType::TABLET ],
+        'PMT3047 3G'                                => [ 'Prestigio', 'Multipad 3047', DeviceType::TABLET ],
+        'PMT3077 3G'                                => [ 'Prestigio', 'Multipad Rider 7.0 3G', DeviceType::TABLET ],
+        'PMT3108 3G'                                => [ 'Prestigio', 'Multipad Wize 3108', DeviceType::TABLET ],
+        'PMT3111 Wi'                                => [ 'Prestigio', 'Multipad Wize 3111', DeviceType::TABLET ],
+        'PMT3177 3G'                                => [ 'Prestigio', 'Multipad Journey 7.0 3G', DeviceType::TABLET ],
+        'PMT3277 3G'                                => [ 'Prestigio', 'Multipad Ranger 7.0 3G', DeviceType::TABLET ],
+        'PMT3287 3G'                                => [ 'Prestigio', 'Multipad Ranger 8.0 3G', DeviceType::TABLET ],
+        'PMT3308 3G'                                => [ 'Prestigio', 'Multipad Wize 3308', DeviceType::TABLET ],
+        'PMT3331 3G'                                => [ 'Prestigio', 'Multipad Wize 3331', DeviceType::TABLET ],
+        'PMT3341 3G'                                => [ 'Prestigio', 'Multipad Wize 3341', DeviceType::TABLET ],
+        'PMT3377 Wi'                                => [ 'Prestigio', 'Multipad Thunder 7.0i', DeviceType::TABLET ],
+        'PMT3677 Wi'                                => [ 'Prestigio', 'Multipad Ultra+ 7.0', DeviceType::TABLET ],
+        'PMT3757 3G'                                => [ 'Prestigio', 'Multipad Wize 3757', DeviceType::TABLET ],
+        'PMT3777 3G'                                => [ 'Prestigio', 'Multipad Color 2 3G', DeviceType::TABLET ],
+        'PMT3787 3G'                                => [ 'Prestigio', 'Multipad Wize 3787', DeviceType::TABLET ],
+        'PMT5001 3G'                                => [ 'Prestigio', 'Multipad Muze 5001 3G', DeviceType::TABLET ],
+        'PMT5002 Wi'                                => [ 'Prestigio', 'Multipad Wize 5002', DeviceType::TABLET ],
+        'PMT5008 3G'                                => [ 'Prestigio', 'Multipad Muze 5008 3G', DeviceType::TABLET ],
+        'PMT5287 4G'                                => [ 'Prestigio', 'Multipad Ranger 8.0 4G', DeviceType::TABLET ],
+        'PMT5487 3G'                                => [ 'Prestigio', 'Multipad Quantum 8.0 3G', DeviceType::TABLET ],
+        'PMT5587 Wi'                                => [ 'Prestigio', 'Multipad 8.0 HD', DeviceType::TABLET ],
+        'PMT5777 3G'                                => [ 'Prestigio', 'Multipad Color 7.0 3G', DeviceType::TABLET ],
+        'PMT5887 3G'                                => [ 'Prestigio', 'Multipad Color 8.0 3G', DeviceType::TABLET ],
+        'PMT7008 4G'                                => [ 'Prestigio', 'Multipad Consul 7008 4G', DeviceType::TABLET ],
+        'PMT7077 3G'                                => [ 'Prestigio', 'Multipad 4 Diamond 7.85 3G', DeviceType::TABLET ],
+        'PMT7177 3G'                                => [ 'Prestigio', 'Multipad 4 Diamond 10.1 3G', DeviceType::TABLET ],
+        'PMT7287 3G'                                => [ 'Prestigio', 'Multipad 4 Ultra Quad 8.0 3G', DeviceType::TABLET ],
+    ],
+
+    'PAP[0-9]{4,4}!!' => [
+        'PAP3350DUO'                                => [ 'Prestigio', 'Multiphone 3350 Duo' ],
+        'PAP3400DUO'                                => [ 'Prestigio', 'Multiphone 3400 Duo' ],
+        'PAP3500 DUO'                               => [ 'Prestigio', 'Multiphone 3500 Duo' ],
+        'PAP3501DUO'                                => [ 'Prestigio', 'Multiphone 3501 Duo' ],
+        'PAP3540DUO'                                => [ 'Prestigio', 'Multiphone 3540 Duo' ],
+        'PAP4020DUO'                                => [ 'Prestigio', 'Multiphone 4020 Duo' ],
+        'PAP4040 DUO'                               => [ 'Prestigio', 'Multiphone 4040 Duo' ],
+        'PAP4044DUO'                                => [ 'Prestigio', 'Multiphone 4044 Duo' ],
+        'PAP4055DUO'                                => [ 'Prestigio', 'Multiphone 4055 Duo' ],
+        'PAP4300'                                   => [ 'Prestigio', 'Multiphone 4300' ],
+        'PAP4300 DUO'                               => [ 'Prestigio', 'Multiphone 4300 Duo' ],
+        'PAP4322DUO'                                => [ 'Prestigio', 'Multiphone 4322 Duo' ],
+        'PAP4500DUO'                                => [ 'Prestigio', 'Multiphone 4500 Duo' ],
+        'PAP4500TDUO'                               => [ 'Prestigio', 'Multiphone 4500 Duo' ],
+        'PAP4505DUO'                                => [ 'Prestigio', 'Multiphone 4505 Duo' ],
+        'PAP5000DUO'                                => [ 'Prestigio', 'Multiphone 5000 Duo' ],
+        'PAP5000TDUO'                               => [ 'Prestigio', 'Multiphone 5000 Duo' ],
+        'PAP5044DUO'                                => [ 'Prestigio', 'Multiphone 5044 Duo' ],
+        'PAP5300DUO'                                => [ 'Prestigio', 'Multiphone 5300 Duo' ],
+        'PAP5400DUO'                                => [ 'Prestigio', 'Multiphone 5400 Duo' ],
+        'PAP5430'                                   => [ 'Prestigio', 'Multiphone 5430' ],
+        'PAP5450'                                   => [ 'Prestigio', 'Multiphone 5450' ],
+        'PAP5450DUO'                                => [ 'Prestigio', 'Multiphone 5450 Duo' ],
+        'PAP5451DUO'                                => [ 'Prestigio', 'Multiphone 5451 Duo' ],
+        'PAP5500DUO'                                => [ 'Prestigio', 'Multiphone 5500 Duo' ],
+        'PAP5501'                                   => [ 'Prestigio', 'Multiphone 5501' ],
+        'PAP5503'                                   => [ 'Prestigio', 'Multiphone 5503' ],
+        'PAP5503DUO'                                => [ 'Prestigio', 'Multiphone 5503 Duo' ],
+        'PAP7500'                                   => [ 'Prestigio', 'Multiphone 7500' ],
+        'PAP7600DUO'                                => [ 'Prestigio', 'Multiphone 7600 Duo' ],
+    ],
+
+    'PSP[0-9]{4,4}!!' => [
+        'PSP3404DUO'                                => [ 'Prestigio', 'Multiphone 3404 Duo' ],
+        'PSP3405DUO'                                => [ 'Prestigio', 'Multiphone 3405 Duo' ],
+        'PSP3450'                                   => [ 'Prestigio', 'Multiphone 3450' ],
+        'PSP3450DUO'                                => [ 'Prestigio', 'Multiphone 3450 Duo' ],
+        'PSP3452DUO'                                => [ 'Prestigio', 'Multiphone Muze A3' ],
+        'PSP3453DUO'                                => [ 'Prestigio', 'Multiphone Wize A3' ],
+        'PSP3455DUO'                                => [ 'Prestigio', 'Multiphone Grace X3' ],
+        'PSP3456DUO'                                => [ 'Prestigio', 'Multiphone 3456 Duo' ],
+        'PSP3502DUO'                                => [ 'Prestigio', 'Multiphone 3502 Duo' ],
+        'PSP3503DUO'                                => [ 'Prestigio', 'Multiphone 3503 Duo' ],
+        'PSP3504DUO'                                => [ 'Prestigio', 'Multiphone 3504 Duo' ],
+        'PSP3505DUO'                                => [ 'Prestigio', 'Multiphone 3505 Duo' ],
+        'PSP3530DUO'                                => [ 'Prestigio', 'Multiphone 3530 Duo' ],
+        'PSP3531DUO'                                => [ 'Prestigio', 'Multiphone 3531 Duo' ],
+        'PSP5047DUO'                                => [ 'Prestigio', 'Multiphone 5048 Duo' ],
+        'PSP5307DUO'                                => [ 'Prestigio', 'Multiphone 5307 Duo' ],
+        'PSP5453DUO'                                => [ 'Prestigio', 'Multiphone 5453 Duo' ],
+        'PSP5454DUO'                                => [ 'Prestigio', 'Multiphone 5454 Duo' ],
+        'PSP5455DUO'                                => [ 'Prestigio', 'Multiphone 5455 Duo' ],
+        'PSP5457DUO'                                => [ 'Prestigio', 'Multiphone 5457 Duo' ],
+        'PSP5470DUO'                                => [ 'Prestigio', 'Multiphone Grace X5' ],
+        'PSP5504DUO'                                => [ 'Prestigio', 'Multiphone 5504 Duo' ],
+        'PSP5505DUO'                                => [ 'Prestigio', 'Multiphone 5505 Duo' ],
+        'PSP5507DUO'                                => [ 'Prestigio', 'Multiphone 5507 Duo' ],
+        'PSP5508DUO'                                => [ 'Prestigio', 'Multiphone 5508 Duo' ],
+        'PSP5517DUO'                                => [ 'Prestigio', 'Multiphone 5517 Duo' ],
+        'PSP5550DUO'                                => [ 'Prestigio', 'Multiphone 5550 Duo' ],
+        'PSP7505DUO'                                => [ 'Prestigio', 'Multiphone Grace X7' ],
+        'PSP7557'                                   => [ 'Prestigio', 'Multiphone 7557 Grace' ],
+    ],
+
+    'Prestigio PAP5000TDUO'                     => [ 'Prestigio', 'Multiphone 5000 Duo' ],
+    '5080C Pro'                                 => [ 'Prestigio', 'Multipad 5080 Pro', DeviceType::TABLET ],
+    'PRBT 100'                                  => [ 'Probook', 'PRBT 100', DeviceType::TABLET ],
+
+    'MD-[0-9]{4,4}!!' => [
+        'MD-0651'                                   => [ 'Prolink', 'MD-0651', DeviceType::TABLET ],
+        'MD-0696B'                                  => [ 'Prolink', 'MD-0696B', DeviceType::TABLET ],
+        'MD-0697'                                   => [ 'Prolink', 'MD-0697', DeviceType::TABLET ],
+    ],
+
+    'PLT!!' => [
+        'PLT1044'                                   => [ 'Proscan', 'PLT1044', DeviceType::TABLET ],
+        'PLT1066'                                   => [ 'Proscan', 'PLT1066', DeviceType::TABLET ],
+        'PLT1077G'                                  => [ 'Proscan', 'PLT1077G', DeviceType::TABLET ],
+        'PLT4311'                                   => [ 'Proscan', 'PLT4311', DeviceType::TABLET ],
+        'PLT7035'                                   => [ 'Proscan', 'PLT7035', DeviceType::TABLET ],
+        'PLT7035-B'                                 => [ 'Proscan', 'PLT7035', DeviceType::TABLET ],
+        'PLT7035-C'                                 => [ 'Proscan', 'PLT7035', DeviceType::TABLET ],
+        'PLT7035-PL'                                => [ 'Proscan', 'PLT7035', DeviceType::TABLET ],
+        'PLT7044K'                                  => [ 'Proscan', 'PLT7044K', DeviceType::TABLET ],
+        'PLT7044K-B'                                => [ 'Proscan', 'PLT7044K', DeviceType::TABLET ],
+        'PLT7050'                                   => [ 'Proscan', 'PLT7050', DeviceType::TABLET ],
+        'PLT7100G'                                  => [ 'Proscan', 'PLT7100G', DeviceType::TABLET ],
+        'PLT7223G'                                  => [ 'Proscan', 'PLT7223G', DeviceType::TABLET ],
+        'PLT7602G'                                  => [ 'Proscan', 'PLT7602G', DeviceType::TABLET ],
+        'PLT7777'                                   => [ 'Proscan', 'PLT7777', DeviceType::TABLET ],
+        'PLT7802'                                   => [ 'Proscan', 'PLT7802', DeviceType::TABLET ],
+        'PLT7803G'                                  => [ 'Proscan', 'PLT7803G', DeviceType::TABLET ],
+        'PLT7804G'                                  => [ 'Proscan', 'PLT7804G', DeviceType::TABLET ],
+        'PLT7810K'                                  => [ 'Proscan', 'PLT7810K', DeviceType::TABLET ],
+        'PLT8088'                                   => [ 'Proscan', 'PLT8088', DeviceType::TABLET ],
+        'PLT8223G'                                  => [ 'Proscan', 'PLT8223G', DeviceType::TABLET ],
+        'PLT8235G'                                  => [ 'Proscan', 'PLT8235G', DeviceType::TABLET ],
+        'PLT8802G'                                  => [ 'Proscan', 'PLT8802G', DeviceType::TABLET ],
+        'PLT8816K'                                  => [ 'Proscan', 'PLT8816K', DeviceType::TABLET ],
+        'PLT9045K'                                  => [ 'Proscan', 'PLT9045K', DeviceType::TABLET ],
+        'PLT9045K-BLACK'                            => [ 'Proscan', 'PLT9045K', DeviceType::TABLET ],
+        'PLT9602G'                                  => [ 'Proscan', 'PLT9602G', DeviceType::TABLET ],
+        'PLT9606G'                                  => [ 'Proscan', 'PLT9606G', DeviceType::TABLET ],
+    ],
+
+    'Positivo Mini'                             => [ 'Positivo', 'Mini', DeviceType::TABLET ],
+    'YPY-72SIM'                                 => [ 'Positivo', 'YPY 72SIM', DeviceType::TABLET ],
+    'YPY-73G'                                   => [ 'Positivo', 'YPY 73G', DeviceType::TABLET ],
+    'TB07FTA'                                   => [ 'Positivo', 'YPY 07FTA', DeviceType::TABLET ],
+    'Ypy 7 - TB07FTA'                           => [ 'Positivo', 'YPY 07FTA', DeviceType::TABLET ],
+    'YPY 07FTA'                                 => [ 'Positivo', 'YPY 07FTA', DeviceType::TABLET ],
+    'YPY 07FTAB'                                => [ 'Positivo', 'YPY 07FTAB', DeviceType::TABLET ],
+    'YPY 07FTAB PA'                             => [ 'Positivo', 'YPY 07FTAB', DeviceType::TABLET ],
+    'YPY 07FTB'                                 => [ 'Positivo', 'YPY 07FTB', DeviceType::TABLET ],
+    'POSITIVO YPY 07FTB'                        => [ 'Positivo', 'YPY 07FTB', DeviceType::TABLET ],
+    'YPY 07FTBF'                                => [ 'Positivo', 'YPY 07FTBF', DeviceType::TABLET ],
+    'Ypy 7 - TB07STA'                           => [ 'Positivo', 'YPY 07STA', DeviceType::TABLET ],
+    'YPY 07STB'                                 => [ 'Positivo', 'YPY 07STB', DeviceType::TABLET ],
+    'YPY 07STBF'                                => [ 'Positivo', 'YPY 07STBF', DeviceType::TABLET ],
+    'YPY 10FTA'                                 => [ 'Positivo', 'YPY 10FTA', DeviceType::TABLET ],
+    'YPY10FTA'                                  => [ 'Positivo', 'YPY 10FTA', DeviceType::TABLET ],
+    'YPY 10FTB'                                 => [ 'Positivo', 'YPY 10FTB', DeviceType::TABLET ],
+    'YPY 10FTBF'                                => [ 'Positivo', 'YPY 10FTBF', DeviceType::TABLET ],
+    'YPY 10STB'                                 => [ 'Positivo', 'YPY 10STB', DeviceType::TABLET ],
+    'YPY 10STBF'                                => [ 'Positivo', 'YPY 10STBF', DeviceType::TABLET ],
+    'YPY AB7D'                                  => [ 'Positivo', 'YPY AB7D', DeviceType::TABLET ],
+    'YPY AB7DC'                                 => [ 'Positivo', 'YPY AB7DC', DeviceType::TABLET ],
+    'Positivo Ypy AB7E'                         => [ 'Positivo', 'YPY AB7E', DeviceType::TABLET ],
+    'Positivo Ypy AB7EC'                        => [ 'Positivo', 'YPY AB7EC', DeviceType::TABLET ],
+    'Positivo Ypy AB7F'                         => [ 'Positivo', 'YPY AB7F', DeviceType::TABLET ],
+    'Positivo AB7F'                             => [ 'Positivo', 'YPY AB7F', DeviceType::TABLET ],
+    'Positivo Ypy AB7H'                         => [ 'Positivo', 'YPY AB7H', DeviceType::TABLET ],
+    'YPY AB10D'                                 => [ 'Positivo', 'YPY AB10D', DeviceType::TABLET ],
+    'YPY AB10DC'                                => [ 'Positivo', 'YPY AB10DC', DeviceType::TABLET ],
+    'Positivo Ypy AB10E'                        => [ 'Positivo', 'YPY AB10E', DeviceType::TABLET ],
+    'Positivo Ypy AB10EC'                       => [ 'Positivo', 'YPY AB10EC', DeviceType::TABLET ],
+    'Positivo Ypy AB10H'                        => [ 'Positivo', 'YPY AB10H', DeviceType::TABLET ],
+    'YPY ABXD'                                  => [ 'Positivo', 'YPY ABXD', DeviceType::TABLET ],
+    'YPY J213'                                  => [ 'Positivo', 'YPY J213' ],
+    'Positivo BGH Ypy L700'                     => [ 'Positivo', 'YPY L700', DeviceType::TABLET ],
+    'Positivo Ypy L700'                         => [ 'Positivo', 'YPY L700', DeviceType::TABLET ],
+    'Positivo Ypy L700 Ed. Especial'            => [ 'Positivo', 'YPY L700 Edição Especial', DeviceType::TABLET ],
+    'Positivo Ypy L700+'                        => [ 'Positivo', 'YPY L700+', DeviceType::TABLET ],
+    'Positivo Ypy L700 Kids'                    => [ 'Positivo', 'YPY L700 Kids', DeviceType::TABLET ],
+    'Positivo BGH Ypy L700 Kids'                => [ 'Positivo', 'YPY L700 Kids', DeviceType::TABLET ],
+    'Positivo Ypy L700+ Kids'                   => [ 'Positivo', 'YPY L700+ Kids', DeviceType::TABLET ],
+    'Positivo Ypy L1000'                        => [ 'Positivo', 'YPY L1000', DeviceType::TABLET ],
+    'Positivo Ypy L1000AB'                      => [ 'Positivo', 'YPY L1000AB', DeviceType::TABLET ],
+    'Positivo Ypy L1000F'                       => [ 'Positivo', 'YPY L1000F', DeviceType::TABLET ],
+    'Positivo Ypy L1050'                        => [ 'Positivo', 'YPY L1050', DeviceType::TABLET ],
+    'Positivo Ypy L1050E'                       => [ 'Positivo', 'YPY L1050E', DeviceType::TABLET ],
+    'Positivo Ypy L1050F'                       => [ 'Positivo', 'YPY L1050F', DeviceType::TABLET ],
+    'YPY S350'                                  => [ 'Positivo', 'YPY S350' ],
+    'YPY S350 PLUS'                             => [ 'Positivo', 'YPY S350 Plus' ],
+    'Positivo S380'                             => [ 'Positivo', 'YPY S380' ],
+    'YPY S400'                                  => [ 'Positivo', 'YPY S400' ],
+    'YPY S405'                                  => [ 'Positivo', 'YPY S405' ],
+    'Positivo S440'                             => [ 'Positivo', 'YPY S440' ],
+    'YPY S450'                                  => [ 'Positivo', 'YPY S450' ],
+    'YPY S460'                                  => [ 'Positivo', 'YPY S460' ],
+    'Positivo S480'                             => [ 'Positivo', 'YPY S480' ],
+    'YPY S500'                                  => [ 'Positivo', 'YPY S500' ],
+    'Positivo S550'                             => [ 'Positivo', 'YPY S550' ],
+    'Positivo X400'                             => [ 'Positivo', 'YPY X400' ],
+    'Positivo X800'                             => [ 'Positivo', 'YPY X800' ],
+    'YPY TQ7'                                   => [ 'Positivo', 'YPY TQ7', DeviceType::TABLET ],
+    'PULID F6'                                  => [ 'PULID', 'F6' ],
+    'PULID F7'                                  => [ 'PULID', 'F7' ],
+    'PULID F11'                                 => [ 'PULID', 'F11' ],
+    'F13'                                       => [ 'PULID', 'F13' ],
+    'F15'                                       => [ 'PULID', 'F15' ],
+    'PULID T3'                                  => [ 'PULID', 'T3' ],
+
+    'Q-Wave!!' => [
+        'Q-Wave70M'                                 => [ 'Quantum', 'Q-Wave 70M', DeviceType::TABLET ],
+        'Q-Wave70M2'                                => [ 'Quantum', 'Q-Wave 70M2', DeviceType::TABLET ],
+        'Q-Wave71'                                  => [ 'Quantum', 'Q-Wave 71', DeviceType::TABLET ],
+        'Q-Wave71M'                                 => [ 'Quantum', 'Q-Wave 71M', DeviceType::TABLET ],
+        'Q-Wave71N'                                 => [ 'Quantum', 'Q-Wave 71N', DeviceType::TABLET ],
+        'Q-Wave781N'                                => [ 'Quantum', 'Q-Wave 781N', DeviceType::TABLET ],
+        'Q-WaveA101'                                => [ 'Quantum', 'Q-Wave A101', DeviceType::TABLET ],
+        'Q-Wave L70N'                               => [ 'Quantum', 'Q-Wave L70N', DeviceType::TABLET ],
+    ],
+
+    'Quechua Phone 5'                           => [ 'Quechua', 'Phone 5' ],
+
+    'QUBE[ -](B[0-9]S?\+?)!'                    => [ 'Qube', '$1' ],
+    'QUBE[ -](T[0-9])!'                         => [ 'Qube', '$1', DeviceType::TABLET ],
+    'QUMO[ -]QUEST[ -]?([0-9]+i?)!'             => [ 'QUMO', 'Quest $1' ],
+    'QUMO Altair ([0-9]+i?)!'                   => [ 'QUMO', 'Altair $1', DeviceType::TABLET ],
+    'QUMO Vega ([0-9]+i?)!'                     => [ 'QUMO', 'Vega $1', DeviceType::TABLET ],
+
+
+    'QW ?TB-[0-9]{4,4}!!' => [
+        'QW TB-1007'                                => [ 'Qware', 'Pro3 (7.0 inch, 1st gen)', DeviceType::TABLET ],
+        'QW TB-1207'                                => [ 'Qware', 'Pro3 (7.0 inch, 2nd gen)', DeviceType::TABLET ],
+        'QW TB-1217'                                => [ 'Qware', 'Pro3 (7.0 inch, 3nd gen)', DeviceType::TABLET ],
+        'QW TB-1210'                                => [ 'Qware', 'Pro3 (10.0 inch)', DeviceType::TABLET ],
+        'QW TB-9718'                                => [ 'Qware', 'Pro4 Slim 9.7', DeviceType::TABLET ],
+        'QWTB-9718HD'                               => [ 'Qware', 'Pro4 Slim HD 9.7', DeviceType::TABLET ],
+        'QW TB-1317Q'                               => [ 'Qware', 'Pro5 HD 7.0', DeviceType::TABLET ],
+        'QW TB-1380QHD'                             => [ 'Qware', 'Pro5 QHD 8.0', DeviceType::TABLET ],
+        'QW TB-9718QHD'                             => [ 'Qware', 'Pro5 QHD 9.7', DeviceType::TABLET ],
+        'QW TB-1517'                                => [ 'Qware', 'Tabby', DeviceType::TABLET ],
+        'QW TB-1517D'                               => [ 'Qware', 'Tabby2', DeviceType::TABLET ],
+    ],
+
+    'ramos i7s  '                               => [ 'Ramos', 'I7s', DeviceType::TABLET ],
+    'Ramos i7s Series'                          => [ 'Ramos', 'I7s', DeviceType::TABLET ],
+    'Ramosi8'                                   => [ 'Ramos', 'I8', DeviceType::TABLET ],
+    'Ramosi8c'                                  => [ 'Ramos', 'I8c', DeviceType::TABLET ],
+    'Ramosi9'                                   => [ 'Ramos', 'I9', DeviceType::TABLET ],
+    'Ramosi9-3G'                                => [ 'Ramos', 'I9 3G', DeviceType::TABLET ],
+    'Ramos i9s'                                 => [ 'Ramos', 'I9s', DeviceType::TABLET ],
+    'Ramos i9s Series'                          => [ 'Ramos', 'I9s', DeviceType::TABLET ],
+    'Ramos i9s pro'                             => [ 'Ramos', 'I9s Pro', DeviceType::TABLET ],
+    'Ramosi10'                                  => [ 'Ramos', 'I10', DeviceType::TABLET ],
+    'Ramos i11 pro'                             => [ 'Ramos', 'I11 Pro', DeviceType::TABLET ],
+    'Ramosi12c'                                 => [ 'Ramos', 'I12c', DeviceType::TABLET ],
+    'Ramos i100 pro'                            => [ 'Ramos', 'I100 Pro', DeviceType::TABLET ],
+    'Ramos K100'                                => [ 'Ramos', 'K100', DeviceType::TABLET ],
+    'Ramos K300'                                => [ 'Ramos', 'K300', DeviceType::TABLET ],
+    'Ramos M7'                                  => [ 'Ramos', 'M7' ],
+    'ramos R9'                                  => [ 'Ramos', 'R9' ],
+    'W6'                                        => [ 'Ramos', 'W6', DeviceType::TABLET ],
+    'W6HD ICS'                                  => [ 'Ramos', 'W6HD', DeviceType::TABLET ],
+    'W6HD ICS FULL'                             => [ 'Ramos', 'W6HD', DeviceType::TABLET ],
+    'Ramos W6HD'                                => [ 'Ramos', 'W6HD', DeviceType::TABLET ],
+    'W10'                                       => [ 'Ramos', 'W10', DeviceType::TABLET ],
+    'W10 V2.0'                                  => [ 'Ramos', 'W10 v2.0', DeviceType::TABLET ],
+    'Ramos W12'                                 => [ 'Ramos', 'W12', DeviceType::TABLET ],
+    'Ramos W12HD'                               => [ 'Ramos', 'W12HD', DeviceType::TABLET ],
+    'w13pro'                                    => [ 'Ramos', 'W13 Pro', DeviceType::TABLET ],
+    'W13PRO V2.0'                               => [ 'Ramos', 'W13 Pro', DeviceType::TABLET ],
+    'Ramos W17Pro V3.0'                         => [ 'Ramos', 'W17 Pro', DeviceType::TABLET ],
+    'W17PRO(Dualcore)'                          => [ 'Ramos', 'W17 Pro', DeviceType::TABLET ],
+    'W17PRO JB Dualcore'                        => [ 'Ramos', 'W17 Pro', DeviceType::TABLET ],
+    'Ramos W21'                                 => [ 'Ramos', 'W21', DeviceType::TABLET ],
+    'W22PRO'                                    => [ 'Ramos', 'W22 Pro', DeviceType::TABLET ],
+    'W22PRO 3G'                                 => [ 'Ramos', 'W22 Pro 3G', DeviceType::TABLET ],
+    'Ramos W25HD'                               => [ 'Ramos', 'W25HD', DeviceType::TABLET ],
+    'Ramos W27Pro'                              => [ 'Ramos', 'W27 Pro', DeviceType::TABLET ],
+    'W27(Dualcore)'                             => [ 'Ramos', 'W27 Dual Core', DeviceType::TABLET ],
+    'W28(Dualcore)'                             => [ 'Ramos', 'W28 Dual Core', DeviceType::TABLET ],
+    'W30(QuadCore)'                             => [ 'Ramos', 'W30 Quad Core', DeviceType::TABLET ],
+    'w30hd(QuadCore)'                           => [ 'Ramos', 'W30HD Quad Core', DeviceType::TABLET ],
+    'W30HDPRO'                                  => [ 'Ramos', 'W30HD Pro', DeviceType::TABLET ],
+    'Ramos W31'                                 => [ 'Ramos', 'W31', DeviceType::TABLET ],
+    'Ramos w36'                                 => [ 'Ramos', 'W36', DeviceType::TABLET ],
+    'Ramos W41'                                 => [ 'Ramos', 'W41', DeviceType::TABLET ],
+    'Ramos W41 QuadCore'                        => [ 'Ramos', 'W41 Quad Core', DeviceType::TABLET ],
+    'w42(QuadCore)'                             => [ 'Ramos', 'W42 Quad Core', DeviceType::TABLET ],
+    'Ramos X10 PRO!'                            => [ 'Ramos', 'X10 Pro', DeviceType::TABLET ],
+    'T11AD!'                                    => [ 'Ramos', 'T11AD', DeviceType::TABLET ],
+
+    'Rayhov!!' => [
+        'Rayhov X3'                                 => [ 'Rayhov', 'X3' ],
+        'Rayhov X6'                                 => [ 'Rayhov', 'X6' ],
+        'Rayhov X9'                                 => [ 'Rayhov', 'X9' ],
+    ],
+
+    'Readboy!!' => [
+        'Readboy G12'                               => [ 'Readboy', 'G12', DeviceType::TABLET ],
+        'Readboy G18'                               => [ 'Readboy', 'G18', DeviceType::TABLET ],
+        'Readboy G50'                               => [ 'Readboy', 'G50', DeviceType::TABLET ],
+        'Readboy G100'                              => [ 'Readboy', 'G100', DeviceType::TABLET ],
+    ],
+
+    'ReederA8R'                                 => [ 'Reeder', 'A8R', DeviceType::TABLET ],
+    'reeder A8i Quad 2'                         => [ 'Reeder', 'A8i Quad 2', DeviceType::TABLET ],
+    'RCT6973W43'                                => [ 'RCA', 'Voyager III', DeviceType::TABLET ],
+    'PlayBook'                                  => [ 'RIM', 'BlackBerry PlayBook', DeviceType::TABLET ],
+    'RBK-490'                                   => [ 'Ritmix', 'RBK-490', DeviceType::TABLET ],
+
+    '(Ritmix )?RM[DP]-?[0-9]{3,3}!!' => [
+        'RMD-720'                                   => [ 'Ritmix', 'RMD-720', DeviceType::TABLET ],
+        'RMD-721'                                   => [ 'Ritmix', 'RMD-721', DeviceType::TABLET ],
+        'RMD-722'                                   => [ 'Ritmix', 'RMD-722', DeviceType::TABLET ],
+        'RITMIX RMD-740'                            => [ 'Ritmix', 'RMD-740', DeviceType::TABLET ],
+        'Ritmix RMD745'                             => [ 'Ritmix', 'RMD-745', DeviceType::TABLET ],
+        'RMD-755'                                   => [ 'Ritmix', 'RMD-755', DeviceType::TABLET ],
+        'RMD-757'                                   => [ 'Ritmix', 'RMD-757', DeviceType::TABLET ],
+        'RMD-770'                                   => [ 'Ritmix', 'RMD-770', DeviceType::TABLET ],
+        'RMD-785'                                   => [ 'Ritmix', 'RMD-785', DeviceType::TABLET ],
+        'RMD-787'                                   => [ 'Ritmix', 'RMD-787', DeviceType::TABLET ],
+        'Ritmix RMD840'                             => [ 'Ritmix', 'RMD-840', DeviceType::TABLET ],
+        'RMD-855'                                   => [ 'Ritmix', 'RMD-855', DeviceType::TABLET ],
+        'RMD-900'                                   => [ 'Ritmix', 'RMD-900', DeviceType::TABLET ],
+        'RMD-1026'                                  => [ 'Ritmix', 'RMD-1026', DeviceType::TABLET ],
+        'RMD-1027'                                  => [ 'Ritmix', 'RMD-1027', DeviceType::TABLET ],
+        'RMD-1030'                                  => [ 'Ritmix', 'RMD-1030', DeviceType::TABLET ],
+        'RMD-1035'                                  => [ 'Ritmix', 'RMD-1035', DeviceType::TABLET ],
+        'RMD-1040'                                  => [ 'Ritmix', 'RMD-1040', DeviceType::TABLET ],
+        'RMD-1050'                                  => [ 'Ritmix', 'RMD-1050', DeviceType::TABLET ],
+        'RMD-1055'                                  => [ 'Ritmix', 'RMD-1055', DeviceType::TABLET ],
+        'RMD-1058'                                  => [ 'Ritmix', 'RMD-1058', DeviceType::TABLET ],
+        'RMD-1070'                                  => [ 'Ritmix', 'RMD-1070', DeviceType::TABLET ],
+        'RMP400'                                    => [ 'Ritmix', 'RMP-400', DeviceType::TABLET ],
+        'RMP-450'                                   => [ 'Ritmix', 'RMP-450', DeviceType::TABLET ],
+        'RMP-530'                                   => [ 'Ritmix', 'RMP-530', DeviceType::TABLET ],
+        'RMP-600'                                   => [ 'Ritmix', 'RMP-600', DeviceType::TABLET ],
+    ],
+
+    '(?:RIVO )?RHYTHM RX ?([0-9]+)!'              => [ 'Rivo', 'Rhythm RX$1' ],
+
+    'RMD-[0-9]{2,3}G!!' => [
+        'RMD-73G'                                   => [ 'Ross&Moor', 'RMD-73G', DeviceType::TABLET ],
+        'RMD-917G'                                  => [ 'Ross&Moor', 'RMD-917G', DeviceType::TABLET ],
+        'RMD-973G'                                  => [ 'Ross&Moor', 'RMD-973G', DeviceType::TABLET ],
+    ],
+
+    'RoverPad 3W T71D'                          => [ 'RoverPad', '3W T71D', DeviceType::TABLET ],
+
+    'Snexian!!' => [
+        'Snexian Mi320'                             => [ 'S Nexian', 'Chronos Mi320' ],
+        'Snexian Mi430'                             => [ 'S Nexian', 'Xtreme2 Mi430' ],
+    ],
+
+    'Mi438S'                                    => [ 'S Nexian', 'Journey One Mi438' ],
+    'A8HD'                                      => [ 'Saayi', 'Dropad A8HD', DeviceType::TABLET ],
+    'Salora E1'                                 => [ 'Salora', 'ValuMaxx E1' ],
+
+    'Sansui[ -]([A-Z]{1,2}[0-9]+[A-Z]?\+?)!'    => [ 'Sansui', '$1' ],
+    'Sansui Cosmic SP ([0-9]+)!'                => [ 'Sansui', 'Cosmic SP$1' ],
+    'SANSUI ETAB ([0-9]+) ?VP!'                 => [ 'Sansui', 'Etab $1VP', DeviceType::TABLET ],
+
+    'DPH-D710'                                  => [ 'Samsung', 'Galaxy S II' ],
+
+    'EK-[GK][CN][0-9]{3,3}!!' => [
+        'EK-GC100!'                             => [ 'Samsung', 'Galaxy Camera', DeviceType::CAMERA ],
+        'EK-GC110!'                             => [ 'Samsung', 'Galaxy Camera', DeviceType::CAMERA ],
+        'EK-GC120!'                             => [ 'Samsung', 'Galaxy Camera LTE', DeviceType::CAMERA ],
+        'EK-GC200!'                             => [ 'Samsung', 'Galaxy Camera 2', DeviceType::CAMERA ],
+        'EK-GN100!'                             => [ 'Samsung', 'Galaxy NX', DeviceType::CAMERA ],
+        'EK-GN120!'                             => [ 'Samsung', 'Galaxy NX', DeviceType::CAMERA ],
+        'EK-KC100!'                             => [ 'Samsung', 'Galaxy Camera', DeviceType::CAMERA ],
+        'EK-KC120!'                             => [ 'Samsung', 'Galaxy Camera LTE', DeviceType::CAMERA ],
+    ],
+
+    'GT-B[0-9]{4,4}!!' => [
+        'GT-B5330!'                             => [ 'Samsung', 'Galaxy Chat' ],
+        'GT-B5510!'                             => [ 'Samsung', 'Galaxy Y Pro' ],
+        'GT-B5512!'                             => [ 'Samsung', 'Galaxy Y Pro Duos' ],
+        'GT-B7510!'                             => [ 'Samsung', 'Galaxy Pro' ],
+        'GT-B7810!'                             => [ 'Samsung', 'Galaxy M Pro 2' ],
+        'GT-B9062!'                             => [ 'Samsung', 'GT-B9062' ],
+        'GT-B9120!'                             => [ 'Samsung', 'GT-B9120' ],
+        'GT-B9150!'                             => [ 'Samsung', 'Galaxy HomeSync', DeviceType::TELEVISION ],
+        'GT-B9388!'                             => [ 'Samsung', 'GT-B9388' ],
+    ],
+
+    'GT-I[0-9]{3,4}!!' => [
+        'GT-I55(00|03|08)!'                     => [ 'Samsung', 'Galaxy Europa' ],
+        'GT-I5510!'                             => [ 'Samsung', 'Galaxy 551' ],
+        'GT-I5700!'                             => [ 'Samsung', 'Galaxy Spica' ],
+        'GT-I58(00|01)!'                        => [ 'Samsung', 'Galaxy Apollo' ],
+        'GT-I6500!'                             => [ 'Samsung', 'Saturn' ],
+        'GT-I7500!'                             => [ 'Samsung', 'Galaxy' ],
+        'GT-I777!'                              => [ 'Samsung', 'Singa' ],
+        'GT-I8000!'                             => [ 'Samsung', 'Omnia 2' ],
+        'GT-I8150!'                             => [ 'Samsung', 'Galaxy W' ],
+        'GT-I8160!'                             => [ 'Samsung', 'Galaxy Ace 2' ],
+        'GT-I81(90|91)!'                        => [ 'Samsung', 'Galaxy S III Mini' ],
+        'GT-I8200!'                             => [ 'Samsung', 'Galaxy S III Mini Value Edition' ],
+        'GT-I8240!'                             => [ 'Samsung', 'GT-I8240' ],
+        'GT-I8245!'                             => [ 'Samsung', 'GT-I8245' ],
+        'GT-I8250!'                             => [ 'Samsung', 'Galaxy Beam' ],
+        'GT-I8258!'                             => [ 'Samsung', 'Galaxy M Style' ],
+        'GT-I82(60|62)!'                        => [ 'Samsung', 'Galaxy Core' ],
+        'GT-I8268!'                             => [ 'Samsung', 'GT-I8268' ],
+        'GT-I85(20|30)!'                        => [ 'Samsung', 'Galaxy Beam' ],
+        'GT-I85(50|52|58)!'                     => [ 'Samsung', 'Galaxy Win' ],
+        'GT-I8580'                              => [ 'Samsung', 'Galaxy Core Advance' ],
+        'GT-I8730!'                             => [ 'Samsung', 'Galaxy Express' ],
+        'GT-I90(00|08|18|88)!'                  => [ 'Samsung', 'Galaxy S' ],
+        'GT-I9001!'                             => [ 'Samsung', 'Galaxy S Plus' ],
+        'GT-I9003!'                             => [ 'Samsung', 'Galaxy SL' ],
+        'GT-I9010!'                             => [ 'Samsung', 'Galaxy S Giorgio Armani' ],
+        'GT-I9050!'                             => [ 'Samsung', 'GT-I9050' ],
+        'GT-I9060!'                             => [ 'Samsung', 'Galaxy Grand Neo' ],
+        'GT-I9063!'                             => [ 'Samsung', 'Galaxy Grand Neo Duos' ],
+        'GT-I9070!'                             => [ 'Samsung', 'Galaxy S Advance' ],
+        'GT-I9080!'                             => [ 'Samsung', 'Galaxy Grand' ],
+        'GT-I9082!'                             => [ 'Samsung', 'Galaxy Grand Duos' ],
+        'GT-I91(00|08)!'                        => [ 'Samsung', 'Galaxy S II' ],
+        'GT-I9103!'                             => [ 'Samsung', 'Galaxy R' ],
+        'GT-I9105!'                             => [ 'Samsung', 'Galaxy S II Plus' ],
+        'GT-I91(18|28)!'                        => [ 'Samsung', 'Galaxy Grand' ],
+        'GT-I91(50|58)!'                        => [ 'Samsung', 'Galaxy Mega 5.8' ],
+        'GT-I9152!'                             => [ 'Samsung', 'Galaxy Mega 5.8 Plus' ],
+        'GT-I9168!'                             => [ 'Samsung', 'Galaxy Grand Neo+' ],
+        'GT-I9188!'                             => [ 'Samsung', 'GT-I9188' ],
+        'GT-I91(90|95|97)!'                     => [ 'Samsung', 'Galaxy S4 Mini' ],
+        'GT-I9192!'                             => [ 'Samsung', 'Galaxy S4 Mini Duos' ],
+        'GT-I92(00|05|08)!'                     => [ 'Samsung', 'Galaxy Mega 6.3' ],
+        'GT-I9210!'                             => [ 'Samsung', 'Galaxy S II LTE' ],
+        'GT-I92(20|28)!'                        => [ 'Samsung', 'Galaxy Note' ],
+        'GT-I92(30|35)!'                        => [ 'Samsung', 'Galaxy Golden' ],
+        'GT-I9250!'                             => [ 'Samsung', 'Galaxy Nexus' ],
+        'GT-I92(60|68)!'                        => [ 'Samsung', 'Galaxy Premier' ],
+        'GT-I9295!'                             => [ 'Samsung', 'Galaxy S4 Active' ],
+        'GT-I93(00|03|05|08)!'                  => [ 'Samsung', 'Galaxy S III' ],
+        'GT-I93(01)!'                           => [ 'Samsung', 'Galaxy S3 Neo' ],
+        'GT-I9400'                              => [ 'Samsung', 'GT-I9400' ],                               // Unknown
+        'GT-I9405!'                             => [ 'Samsung', 'GT-I9405' ],                               // Unknown
+        'GT-I9406!'                             => [ 'Samsung', 'GT-I9406' ],                               // Unknown
+        'GT-I95(00|05|07)!'                     => [ 'Samsung', 'Galaxy S4' ],
+        'GT-I95(02|08)!'                        => [ 'Samsung', 'Galaxy S4 Duos' ],
+        'GT-I95(06)!'                           => [ 'Samsung', 'Galaxy S4 Advance' ],
+        'GT-I9515!'                             => [ 'Samsung', 'Galaxy S4 Neo' ],                          // Maybe
+        'GT-I9600!'                             => [ 'Samsung', 'GT-I9600' ],                               // Unknown
+        'GT-I9800!'                             => [ 'Samsung', 'GT-I9800' ],                               // Unknown
+    ],
+
+    'GT-N[0-9]{4,4}!!' => [
+        'GT-N51(00|05|10|20)!'                  => [ 'Samsung', 'Galaxy Note 8.0', DeviceType::TABLET ],
+        'GT-N70(00|05)!'                        => [ 'Samsung', 'Galaxy Note' ],
+        'GT-N71(00|02|05|08)!'                  => [ 'Samsung', 'Galaxy Note II' ],
+        'GT-N7200!'                             => [ 'Samsung', 'Galaxy Note 3' ],                          // Fake?
+        'GT-N80(00|05|10|13|20)!'               => [ 'Samsung', 'Galaxy Note 10.1', DeviceType::TABLET ],
+        'GT-N90(00|02||05|06|08)!'              => [ 'Samsung', 'Galaxy Note 3' ],
+    ],
+
+    'GT-P[0-9]{4,4}!!' => [
+        'GT-P10(00|10|13)!'                     => [ 'Samsung', 'Galaxy Tab 7.0', DeviceType::TABLET ],
+        'GT-P31(00|05|08|10|13)!'               => [ 'Samsung', 'Galaxy Tab 2 7.0', DeviceType::TABLET ],
+        'GT-P32(00|10)!'                        => [ 'Samsung', 'Galaxy Tab 3 7.0', DeviceType::TABLET ],
+        'GT-P51(00|10|13)!'                     => [ 'Samsung', 'Galaxy Tab 2 10.1', DeviceType::TABLET ],
+        'GT-P52(00|10|20)!'                     => [ 'Samsung', 'Galaxy Tab 3 10.1', DeviceType::TABLET ],
+        'GT-P62(00|10)!'                        => [ 'Samsung', 'Galaxy Tab 7.0 Plus', DeviceType::TABLET ],
+        'GT-P62(01|11)!'                        => [ 'Samsung', 'Galaxy Tab 7.0 Plus N', DeviceType::TABLET ],
+        'GT-P68(00|10|13)!'                     => [ 'Samsung', 'Galaxy Tab 7.7', DeviceType::TABLET ],
+        'GT-P7100!'                             => [ 'Samsung', 'Galaxy Tab 10.1V', DeviceType::TABLET ],
+        'GT-P73(00|10|20)!'                     => [ 'Samsung', 'Galaxy Tab 8.9', DeviceType::TABLET ],
+        'GT-P75(00|03|10)!'                     => [ 'Samsung', 'Galaxy Tab 10.1', DeviceType::TABLET ],
+        'GT-P75(01|11)!'                        => [ 'Samsung', 'Galaxy Tab 10.1N', DeviceType::TABLET ],
+        'GT-P7580!'                             => [ 'Samsung', 'Galaxy Tab 10.1', DeviceType::TABLET ],
+        'GT-P8110!'                             => [ 'Samsung', 'Nexus 10', DeviceType::TABLET ],
+        'GT-P8200!'                             => [ 'Samsung', 'Galaxy Tab 3 Plus (10.1)', DeviceType::TABLET ],
+    ],
+
+    'GT-S[0-9]{4,4}!!' => [
+        'GT-S52(80|82)!'                        => [ 'Samsung', 'Galaxy Star' ],
+        'GT-S5283!'                             => [ 'Samsung', 'Galaxy Star Trios' ],
+        'GT-S5300!'                             => [ 'Samsung', 'Galaxy Pocket' ],
+        'GT-S5301!'                             => [ 'Samsung', 'Galaxy Pocket Plus' ],
+        'GT-S5302!'                             => [ 'Samsung', 'Galaxy Pocket Duos' ],
+        'GT-S5303!'                             => [ 'Samsung', 'Galaxy Y Plus' ],
+        'GT-S5310!'                             => [ 'Samsung', 'Galaxy Pocket Neo' ],
+        'GT-S5312!'                             => [ 'Samsung', 'Galaxy Pocket Neo Duos' ],
+        'GT-S53(60|63|68|69)!'                  => [ 'Samsung', 'Galaxy Y' ],
+        'GT-S5367!'                             => [ 'Samsung', 'Galaxy Y TV' ],
+        'GT-S55(70|78)!'                        => [ 'Samsung', 'Galaxy Mini' ],
+        'GT-S5660!'                             => [ 'Samsung', 'Galaxy Gio' ],
+        'GT-S5670!'                             => [ 'Samsung', 'Galaxy Fit' ],
+        'GT-S56(90|98)!'                        => [ 'Samsung', 'Galaxy Xcover' ],
+        'GT-S58(20|30|31|38|39)!'               => [ 'Samsung', 'Galaxy Ace' ],
+        'GT-S6010!'                             => [ 'Samsung', 'Galaxy Music' ],
+        'GT-S6012!'                             => [ 'Samsung', 'Galaxy Music Duos' ],
+        'GT-S6102!'                             => [ 'Samsung', 'Galaxy Y Duos' ],
+        'GT-S6108!'                             => [ 'Samsung', 'Galaxy Y Pop' ],
+        'GT-S6293!'                             => [ 'Samsung', 'Galaxy Young Plus' ],
+        'GT-S6310!'                             => [ 'Samsung', 'Galaxy Young' ],
+        'GT-S6312!'                             => [ 'Samsung', 'Galaxy Young Duos' ],
+        'GT-S6313!'                             => [ 'Samsung', 'Galaxy Y Duos TV' ],
+        'GT-S6352!'                             => [ 'Samsung', 'Galaxy Ace Duos' ],
+        'GT-S6358!'                             => [ 'Samsung', 'Galaxy Ace' ],
+        'GT-S6500!'                             => [ 'Samsung', 'Galaxy Mini 2' ],
+        'GT-S6702!'                             => [ 'Samsung', 'Galaxy Y Duos' ],
+        'GT-S6790!'                             => [ 'Samsung', 'Galaxy Fame Lite' ],
+        'GT-S6792!'                             => [ 'Samsung', 'Galaxy Fame Lite Duos' ],
+        'GT-S6800!'                             => [ 'Samsung', 'Galaxy Ace Advance' ],
+        'GT-S6802!'                             => [ 'Samsung', 'Galaxy Ace Duos' ],
+        'GT-S68(10|12|18)!'                     => [ 'Samsung', 'Galaxy Fame' ],
+        'GT-S72(60|62)!'                        => [ 'Samsung', 'Galaxy Star Pro' ],
+        'GT-S72(70|75|78)!'                     => [ 'Samsung', 'Galaxy Ace 3' ],
+        'GT-S7273T'                             => [ 'Samsung', 'Galaxy S II TV' ],
+        'GT-S72(72|73)!'                        => [ 'Samsung', 'Galaxy Ace 3 Duos' ],
+        'GT-S7390!'                             => [ 'Samsung', 'Galaxy Trend Lite' ],                      // Aka Galaxy Fresh
+        'GT-S7392!'                             => [ 'Samsung', 'Galaxy Trend' ],
+        'GT-S75(00|08)!'                        => [ 'Samsung', 'Galaxy Ace Plus' ],
+        'GT-S7560!'                             => [ 'Samsung', 'Galaxy Ace II x' ],
+        'GT-S75(62|66|68)!'                     => [ 'Samsung', 'Galaxy S Duos' ],
+        'GT-S7570!'                             => [ 'Samsung', 'Galaxy Trend II' ],
+        'GT-S7572!'                             => [ 'Samsung', 'Galaxy Trend II Duos' ],
+        'GT-S75(80|83)!'                        => [ 'Samsung', 'Galaxy Trend Plus' ],
+        'GT-S75(82)!'                           => [ 'Samsung', 'Galaxy S Duos 2' ],
+        'GT-S7710!'                             => [ 'Samsung', 'Galaxy Xcover 2' ],
+        'GT-S7898!'                             => [ 'Samsung', 'Galaxy Trend 2' ],
+        'GT-S8500'                              => [ 'Samsung', 'Wave' ],
+        'GT-S8530'                              => [ 'Samsung', 'Wave II' ],
+        'GT-S9081'                              => [ 'Samsung', 'GT-S9081' ],                               // Unknown
+    ],
+
+    'GT-T959!'                                  => [ 'Samsung', 'Galaxy S Vibrant' ],
+
+    'SCH-[iI][0-9]{3,3}!!' => [
+        'SCH-i509!'                                 => [ 'Samsung', 'Galaxy Y' ],
+        'SCH-i559'                                  => [ 'Samsung', 'Galaxy Pop' ],
+        'SCH-i569'                                  => [ 'Samsung', 'Galaxy Gio' ],
+        'SCH-i579'                                  => [ 'Samsung', 'Galaxy Ace' ],
+        'SCH-i589'                                  => [ 'Samsung', 'Galaxy Ace Duos' ],
+        'SCH-i705!'                                 => [ 'Samsung', 'Galaxy Tab 2 7.0', DeviceType::TABLET ],
+        'SCH-i809'                                  => [ 'Samsung', 'Galaxy S' ],
+        'SCH-i889'                                  => [ 'Samsung', 'Galaxy Note' ],
+        'SCH-i899'                                  => [ 'Samsung', 'Galaxy' ],
+        'SCH-i909'                                  => [ 'Samsung', 'Galaxy S' ],
+        'SCH-i919'                                  => [ 'Samsung', 'Galaxy S Duos' ],
+        'SCH-i929'                                  => [ 'Samsung', 'Galaxy S II Duos' ],
+        'SCH-I100'                                  => [ 'Samsung', 'Gem' ],
+        'SCH-I110'                                  => [ 'Samsung', 'Illusion' ],
+        'SCH-I200PP'                                => [ 'Samsung', 'Galaxy Legend' ],
+        'SCH-I200( 4G)?$!'                          => [ 'Samsung', 'Galaxy Stellar' ],
+        'SCH-I339'                                  => [ 'Samsung', 'SCH-I339' ],
+        'SCH-I400'                                  => [ 'Samsung', 'Continuum' ],
+        'SCH-I405( 4G)?$!'                          => [ 'Samsung', 'Stratosphere' ],
+        'SCH-I405U'                                 => [ 'Samsung', 'Galaxy Metrix' ],
+        'SCH-I415( 4G)?$!'                          => [ 'Samsung', 'Stratosphere II' ],
+        'SCH-I425'                                  => [ 'Samsung', 'Stratosphere 3' ],
+        'SCH-I435!'                                 => [ 'Samsung', 'Galaxy S4 Mini' ],
+        'SCH-I500'                                  => [ 'Samsung', 'Fascinate' ],
+        'SCH-I510'                                  => [ 'Samsung', 'Stealth V' ],
+        'SCH-I510 4G'                               => [ 'Samsung', 'Droid Charge' ],
+        'SCH-I515'                                  => [ 'Samsung', 'Galaxy Nexus' ],
+        'SCH-I519'                                  => [ 'Samsung', 'SCH-I519' ],
+        'SCH-I535!'                                 => [ 'Samsung', 'Galaxy S III' ],
+        'SCH-I545!'                                 => [ 'Samsung', 'Galaxy S4' ],
+        'SCH-I605!'                                 => [ 'Samsung', 'Galaxy Note II' ],
+        'SCH-I619'                                  => [ 'Samsung', 'Galaxy Ace A+' ],
+        'SCH-I629'                                  => [ 'Samsung', 'Galaxy Fame' ],
+        'SCH-I639'                                  => [ 'Samsung', 'SCH-I639' ],
+        'SCH-I659'                                  => [ 'Samsung', 'Galaxy Ace Plus' ],
+        'SCH-I665'                                  => [ 'Samsung', 'SCH-I665' ],                               // Unknown
+        'SCH-I679'                                  => [ 'Samsung', 'SCH-I679' ],
+        'SCH-I699!'                                 => [ 'Samsung', 'Galaxy Trend' ],
+        'SCH-I739'                                  => [ 'Samsung', 'Galaxy Trend 2' ],
+        'SCH-I747'                                  => [ 'Samsung', 'Galaxy S III' ],
+        'SCH-I759'                                  => [ 'Samsung', 'Galaxy Infinite' ],
+        'SCH-I779'                                  => [ 'Samsung', 'Saga' ],
+        'SCH-I800'                                  => [ 'Samsung', 'Galaxy Tab 7.0', DeviceType::TABLET ],
+        'SCH-I815!'                                 => [ 'Samsung', 'Galaxy Tab 7.7', DeviceType::TABLET ],
+        'SCH-I829'                                  => [ 'Samsung', 'Galaxy Style Duos' ],
+        'SCH-I869'                                  => [ 'Samsung', 'Galaxy Win' ],
+        'SCH-I879!'                                 => [ 'Samsung', 'Galaxy Grand' ],
+        'SCH-I905!'                                 => [ 'Samsung', 'Galaxy Tab 10.1', DeviceType::TABLET ],
+        'SCH-I909'                                  => [ 'Samsung', 'Galaxy S' ],
+        'SCH-I915!'                                 => [ 'Samsung', 'Galaxy Tab 2 10.1', DeviceType::TABLET ],
+        'SCH-I919!'                                 => [ 'Samsung', 'Galaxy S Duos' ],
+        'SCH-I925!'                                 => [ 'Samsung', 'Galaxy Note 10.1', DeviceType::TABLET ],
+        'SCH-I939!'                                 => [ 'Samsung', 'Galaxy S III' ],
+        'SCH-I959'                                  => [ 'Samsung', 'Galaxy S4' ],
+    ],
+
+    'SCH-L710!'                                 => [ 'Samsung', 'Galaxy S III' ],
+    'SCH-M828!'                                 => [ 'Samsung', 'Galaxy Precedent' ],
+    'SCH-N719'                                  => [ 'Samsung', 'Galaxy Note II' ],
+
+    'SCH-P[0-9]{3,3}!!' => [
+        'SCH-P709!'                                 => [ 'Samsung', 'Galaxy Mega 5.8' ],
+        'SCH-P729'                                  => [ 'Samsung', 'Galaxy Mega 6.3' ],
+        'SCH-P739'                                  => [ 'Samsung', 'Galaxy Tab 8.9', DeviceType::TABLET ],
+    ],
+
+    'SCH-R[0-9]{3,3}!!' => [
+        'SCH-R530!'                                 => [ 'Samsung', 'Galaxy S III' ],
+        'SCH-R680!'                                 => [ 'Samsung', 'Repp' ],
+        'SCH-R710!'                                 => [ 'Samsung', 'Suede' ],
+        'SCH-R720!'                                 => [ 'Samsung', 'Admire' ],
+        'SCH-R730!'                                 => [ 'Samsung', 'Transfix' ],
+        'SCH-R740!'                                 => [ 'Samsung', 'Galaxy Discover' ],
+        'SCH-R760!'                                 => [ 'Samsung', 'Galaxy S II' ],
+        'SCH-R820!'                                 => [ 'Samsung', 'Admire' ],
+        'SCH-R830!'                                 => [ 'Samsung', 'Galaxy Axiom' ],
+        'SCH-R880!'                                 => [ 'Samsung', 'Acclaim' ],
+        'SCH-R890!'                                 => [ 'Samsung', 'SCH-R890' ],
+        'SCH-R910!'                                 => [ 'Samsung', 'Galaxy Indulge 4G' ],
+        'SCH-R915!'                                 => [ 'Samsung', 'Galaxy Indulge' ],
+        'SCH-R920!'                                 => [ 'Samsung', 'Galaxy Attain 4G' ],
+        'SCH-R930!'                                 => [ 'Samsung', 'Galaxy S Aviator' ],
+        'SCH-R940!'                                 => [ 'Samsung', 'Galaxy S Lightray' ],
+        'SCH-R950!'                                 => [ 'Samsung', 'Galaxy Note II' ],
+        'SCH-R960!'                                 => [ 'Samsung', 'Galaxy Mega 6.3' ],
+        'SCH-R970!'                                 => [ 'Samsung', 'Galaxy S4' ],
+    ],
+
+    'SCH-S[0-9]{3,3}!!' => [
+        'SCH-S720!'                                 => [ 'Samsung', 'Galaxy Proclaim' ],
+        'SCH-S735!'                                 => [ 'Samsung', 'Galaxy Discover' ],
+        'SCH-S738!'                                 => [ 'Samsung', 'Galaxy Centura' ],
+        'SCH-S950!'                                 => [ 'Samsung', 'Galaxy S Showcase' ],
+        'SCH-S9(60|68)!'                            => [ 'Samsung', 'Galaxy S III' ],
+    ],
+
+    'SCH-V727'                                  => [ 'Samsung', 'Galaxy S4' ],
+
+    'SCH-W[0-9]{3,4}!!' => [
+        'SCH-W789!'                                 => [ 'Samsung', 'SCH-W789' ],
+        'SCH-W799!'                                 => [ 'Samsung', 'SCH-W799' ],
+        'SCH-W899'                                  => [ 'Samsung', 'SCH-W899' ],
+        'SCH-W999'                                  => [ 'Samsung', 'SCH-W999' ],
+        'SCH-W2013'                                 => [ 'Samsung', 'SCH-W2013' ],
+        'SCH-W9913'                                 => [ 'Samsung', 'SCH-W9913' ],
+    ],
+
+    'SGH-[EILNMS][0-9]{3,4}!!' => [
+        'SGH-E258'                                  => [ 'Samsung', 'SGH-E258' ],
+        'SGH-I317!'                                 => [ 'Samsung', 'Galaxy Note II' ],
+        'SGH-I237!'                                 => [ 'Samsung', 'SGH-I237' ],                               // Developer device
+        'SGH-I257!'                                 => [ 'Samsung', 'Galaxy S4 Mini' ],
+        'SGH-I317!'                                 => [ 'Samsung', 'Galaxy Note II' ],
+        'SGH-I337!'                                 => [ 'Samsung', 'Galaxy S4' ],
+        'SGH-I407!'                                 => [ 'Samsung', 'Galaxy Amp' ],
+        'SGH-I437!'                                 => [ 'Samsung', 'Galaxy Express' ],
+        'SGH-I467!'                                 => [ 'Samsung', 'Galaxy Note 8.0', DeviceType::TABLET ],
+        'SGH-I497'                                  => [ 'Samsung', 'Galaxy Tab 2 10.1', DeviceType::TABLET ],
+        'SGH-I527!'                                 => [ 'Samsung', 'Galaxy Mega 6.3' ],
+        'SGH-I535!'                                 => [ 'Samsung', 'Galaxy S III' ],
+        'SGH-I537!'                                 => [ 'Samsung', 'Galaxy S4 Active' ],
+        'SGH-I545!'                                 => [ 'Samsung', 'Galaxy S4' ],
+        'SGH-I547!'                                 => [ 'Samsung', 'Galaxy Rugby Pro' ],
+        'SGH-I577!'                                 => [ 'Samsung', 'Galaxy Exhilarate' ],
+        'SGH-I717!'                                 => [ 'Samsung', 'Galaxy Note' ],
+        'SGH-I727R'                                 => [ 'Samsung', 'Galaxy S II' ],
+        'SGH-I727!'                                 => [ 'Samsung', 'Galaxy S II Skyrocket' ],
+        'SGH-I7(47|48)!'                            => [ 'Samsung', 'Galaxy S III' ],
+        'SGH-I757!'                                 => [ 'Samsung', 'Galaxy S II Skyrocket HD' ],
+        'SGH-I9?777!'                               => [ 'Samsung', 'Galaxy S II' ],
+        'SGH-I807'                                  => [ 'Samsung', 'SGH-I807' ],
+        'SGH-I827!'                                 => [ 'Samsung', 'Galaxy Appeal' ],
+        'SGH-I847'                                  => [ 'Samsung', 'Rugby Smart' ],
+        'SGH-I857'                                  => [ 'Samsung', 'DoubleTime' ],
+        'SGH-I8(96|97)!'                            => [ 'Samsung', 'Captivate' ],
+        'SGH-I927!'                                 => [ 'Samsung', 'Captivate Glide' ],
+        'SGH-I957!'                                 => [ 'Samsung', 'Galaxy Tab 8.9', DeviceType::TABLET ],
+        'SGH-I987'                                  => [ 'Samsung', 'Galaxy Tab 7.0', DeviceType::TABLET ],
+        'SGH-I997!'                                 => [ 'Samsung', 'Infuse 4G' ],
+        'SGH-I9000'                                 => [ 'Samsung', 'Galaxy S' ],
+        'SGH-I9300'                                 => [ 'Samsung', 'Galaxy S III' ],
+        'SGH-L710'                                  => [ 'Samsung', 'Galaxy S III' ],
+        'SGH-N014!'                                 => [ 'Samsung', 'GALAXY Tab 10.1 LTE SC-01D', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+        'SGH-N075!'                                 => [ 'Samsung', 'GALAXY J SC-02F', 'carrier' => 'DoCoMo' ],
+        'SGH-M819!'                                 => [ 'Samsung', 'Galaxy Mega 6.3' ],
+        'SGH-M909!'                                 => [ 'Samsung', 'Galaxy S III' ],
+        'SGH-M919!'                                 => [ 'Samsung', 'Galaxy S4' ],
+        'SGH-S730!'                                 => [ 'Samsung', 'Galaxy Discover' ],
+        'SGH-S959!'                                 => [ 'Samsung', 'Galaxy S II' ],
+        'SGH-S970G'                                 => [ 'Samsung', 'Galaxy S4' ],
+    ],
+
+    'SGH-T[0-9]{3,3}!!' => [
+        'SGH-T289!'                                 => [ 'Samsung', 'Gravity Q' ],
+        'SGH-T399!'                                 => [ 'Samsung', 'Galaxy Light' ],                           // Codename Garda
+        'SGH-T499!'                                 => [ 'Samsung', 'Dart' ],
+        'SGH-T499[VY]!'                             => [ 'Samsung', 'Galaxy Mini' ],
+        'SGH-T589!'                                 => [ 'Samsung', 'Gravity Smart' ],
+        'SGH-T599!'                                 => [ 'Samsung', 'Galaxy Exhibit' ],
+        'SGH-T679!'                                 => [ 'Samsung', 'Galaxy Exhibit II' ],
+        'SGH-T699'                                  => [ 'Samsung', 'Galaxy S Relay' ],
+        'SGH-T727'                                  => [ 'Samsung', 'Galaxy S II Skyrocket' ],
+        'SGH-T759'                                  => [ 'Samsung', 'Exhibit 4G' ],
+        'SGH-T769'                                  => [ 'Samsung', 'Galaxy S Blaze' ],
+        'SGH-T779'                                  => [ 'Samsung', 'Galaxy Tab 2 10.1', DeviceType::TABLET ],
+        'SGH-T839!'                                 => [ 'Samsung', 'T-Mobile Sidekick' ],
+        'SGH-T849'                                  => [ 'Samsung', 'Galaxy Tab 7.0', DeviceType::TABLET ],
+        'SGH-T859'                                  => [ 'Samsung', 'Galaxy Tab 10.1', DeviceType::TABLET ],
+        'SGH-T869'                                  => [ 'Samsung', 'Galaxy Tab 7.0 Plus', DeviceType::TABLET ],
+        'SGH-T879'                                  => [ 'Samsung', 'Galaxy Note' ],
+        'SGH-T889!'                                 => [ 'Samsung', 'Galaxy Note II' ],
+        'SGH-T959'                                  => [ 'Samsung', 'Vibrant' ],
+        'SGH-T959D'                                 => [ 'Samsung', 'Galaxy S Fascinate 3G+' ],
+        'SGH-T959P'                                 => [ 'Samsung', 'Galaxy S Fascinate 4G' ],
+        'SGH-T959V'                                 => [ 'Samsung', 'Galaxy S 4G' ],
+        'SGH-T959W'                                 => [ 'Samsung', 'Galaxy S 4G' ],
+        'SGH-T989'                                  => [ 'Samsung', 'Galaxy S II' ],
+        'SGH-T989D'                                 => [ 'Samsung', 'Galaxy S II X' ],
+        'SGH-T999!'                                 => [ 'Samsung', 'Galaxy S III' ],
+    ],
+
+    'SGH-U468!'                                 => [ 'Samsung', 'Galaxy S4' ],
+    'SGH-W2013!'                                => [ 'Samsung', 'SGH-W2013' ],
+
+    'SHV-E[0-9]{3,3}!!' => [
+        'SHV-E120!'                                 => [ 'Samsung', 'Galaxy S II HD LTE' ],
+        'SHV-E110!'                                 => [ 'Samsung', 'Galaxy S II LTE' ],
+        'SHV-E140!'                                 => [ 'Samsung', 'Galaxy Tab 8.9', DeviceType::TABLET ],
+        'SHV-E150!'                                 => [ 'Samsung', 'Galaxy Tab 7.7', DeviceType::TABLET ],
+        'SHV-E160!'                                 => [ 'Samsung', 'Galaxy Note' ],
+        'SHV-E170!'                                 => [ 'Samsung', 'Galaxy R' ],
+        'SHV-E210!'                                 => [ 'Samsung', 'Galaxy S III' ],
+        'SHV-E220!'                                 => [ 'Samsung', 'Galaxy Pop' ],
+        'SHV-E230!'                                 => [ 'Samsung', 'Galaxy Note 10.1', DeviceType::TABLET ],
+        'SHV-E250!'                                 => [ 'Samsung', 'Galaxy Note II' ],
+        'SHV-E2(70|75)!'                            => [ 'Samsung', 'Galaxy Grand' ],
+        'SHV-E300!'                                 => [ 'Samsung', 'Galaxy S4' ],
+        'SHV-E310!'                                 => [ 'Samsung', 'Galaxy Mega 6.3' ],
+        'SHV-E330!'                                 => [ 'Samsung', 'Galaxy S4' ],
+        'SHV-E370!'                                 => [ 'Samsung', 'Galaxy S4 Mini' ],
+        'SHV-E400!'                                 => [ 'Samsung', 'Galaxy Folder' ],
+        'SHV-E470!'                                 => [ 'Samsung', 'Galaxy S4 Active' ],
+        'SHV-E500!'                                 => [ 'Samsung', 'Galaxy Win' ],
+        'SHV-E510!'                                 => [ 'Samsung', 'SHV-E510' ],
+    ],
+
+    'SHW-M[0-9]{3,3}!!' => [
+        'SHW-M100!'                                 => [ 'Samsung', 'Galaxy A' ],
+        'SHW-M110!'                                 => [ 'Samsung', 'Galaxy S' ],
+        'SHW-M115!'                                 => [ 'Samsung', 'SHW-M115' ],
+        'SHW-M130L!'                                => [ 'Samsung', 'Galaxy U' ],
+        'SHW-M130K!'                                => [ 'Samsung', 'Galaxy K' ],
+        'SHW-M135!'                                 => [ 'Samsung', 'Galaxy W' ],
+        'SHW-M1(80|85)!'                            => [ 'Samsung', 'Galaxy Tab 7.0', DeviceType::TABLET ],
+        'SHW-M190!'                                 => [ 'Samsung', 'Galaxy S Hoppin' ],
+        'SHW-M220!'                                 => [ 'Samsung', 'Galaxy Neo' ],
+        'SHW-M240!'                                 => [ 'Samsung', 'Galaxy Ace' ],
+        'SHW ?-M250!'                               => [ 'Samsung', 'Galaxy S II' ],
+        'SHW-M280!'                                 => [ 'Samsung', 'SHW-M280' ],
+        'SHW-M290!'                                 => [ 'Samsung', 'Galaxy Gio' ],
+        'SHW-M300!'                                 => [ 'Samsung', 'Galaxy Tab 10.1', DeviceType::TABLET ],
+        'SHW-M305!'                                 => [ 'Samsung', 'Galaxy Tab 8.9', DeviceType::TABLET ],
+        'SHW-M340!'                                 => [ 'Samsung', 'Galaxy M Style' ],
+        'SHW-M380!'                                 => [ 'Samsung', 'Galaxy Tab 10.1', DeviceType::TABLET ],
+        'SHW-M420!'                                 => [ 'Samsung', 'Galaxy Nexus' ],
+        'SHW-M430!'                                 => [ 'Samsung', 'Galaxy Tab 7.0 Plus', DeviceType::TABLET ],
+        'SHW-M440!'                                 => [ 'Samsung', 'Galaxy S III' ],
+        'SHW-M460!'                                 => [ 'Samsung', 'Galaxy Ace Plus' ],
+        'SHW-M4(80|85|86)!'                         => [ 'Samsung', 'Galaxy Note 10.1', DeviceType::TABLET ],
+        'SHW-M500!'                                 => [ 'Samsung', 'Galaxy Note 8.0', DeviceType::TABLET ],
+        'SHW-M550!'                                 => [ 'Samsung', 'SHW-M550' ],                               // Unknown
+        'SHW-M570!'                                 => [ 'Samsung', 'Galaxy Core Advance' ],
+        'SHW-M5(80|85)!'                            => [ 'Samsung', 'Galaxy Core Safe' ],
+    ],
+
+    'SMT-E5015'                                 => [ 'Samsung', 'Olleh SkyLife Smart Settopbox', DeviceType::TELEVISION ],
+    'SMT-i9100'                                 => [ 'Samsung', 'Galaxy Tab 7.0', DeviceType::TABLET ],
+
+    'SM-A[0-9]{3,3}!!' => [
+        'SM-A300!'                                  => [ 'Samsung', 'Galaxy A3' ],
+        'SM-A310!'                                  => [ 'Samsung', 'Galaxy A3 (2016)' ],
+        'SM-A320!'                                  => [ 'Samsung', 'Galaxy A3 (2017)' ],
+        'SM-A430!'                                  => [ 'Samsung', 'Galaxy A4' ],
+        'SM-A500!'                                  => [ 'Samsung', 'Galaxy A5' ],
+        'SM-A510!'                                  => [ 'Samsung', 'Galaxy A5 (2016)' ],
+        'SM-A520!'                                  => [ 'Samsung', 'Galaxy A5 (2017)' ],
+        'SM-A700!'                                  => [ 'Samsung', 'Galaxy A7' ],
+        'SM-A710!'                                  => [ 'Samsung', 'Galaxy A7 (2016)' ],
+        'SM-A720!'                                  => [ 'Samsung', 'Galaxy A7 (2017)' ],
+        'SM-A800!'                                  => [ 'Samsung', 'Galaxy A8' ],
+        'SM-A810!'                                  => [ 'Samsung', 'Galaxy A8 (2016)' ],
+        'SM-A900!'                                  => [ 'Samsung', 'Galaxy A9 (2016)' ],
+        'SM-A910!'                                  => [ 'Samsung', 'Galaxy A9 Pro' ],
+    ],
+
+    'SM-C[0-9]{3,3}!!' => [
+        'SM-C10[15]!'                               => [ 'Samsung', 'Galaxy S4 Zoom' ],
+        'SM-C11[15]!'                               => [ 'Samsung', 'Galaxy K Zoom' ],
+        'SM-C500!'                                  => [ 'Samsung', 'Galaxy C5' ],
+        'SM-C501!'                                  => [ 'Samsung', 'Galaxy C5 Pro' ],
+        'SM-C700!'                                  => [ 'Samsung', 'Galaxy C7' ],
+        'SM-C701!'                                  => [ 'Samsung', 'Galaxy C7 Pro' ],
+        'SM-C900!'                                  => [ 'Samsung', 'Galaxy C9' ],
+    ],
+
+    'SM-E[0-9]{3,3}!!' => [
+        'SM-E500!'                                  => [ 'Samsung', 'Galaxy E5' ],
+        'SM-E700!'                                  => [ 'Samsung', 'Galaxy E7' ],
+    ],
+
+    'SM-G[0-9]{3,3}!!' => [
+        'SM-G110!'                                  => [ 'Samsung', 'Galaxy Pocket 2' ],
+        'SM-G130BT'                                 => [ 'Samsung', 'Galaxy Young 2' ],
+        'SM-G130BU'                                 => [ 'Samsung', 'Galaxy Young 2' ],
+        'SM-G130E'                                  => [ 'Samsung', 'Galaxy Star 2' ],
+        'SM-G130H'                                  => [ 'Samsung', 'Galaxy Young 2' ],
+        'SM-G130U'                                  => [ 'Samsung', 'Galaxy Young 2' ],
+        'SM-G130HN'                                 => [ 'Samsung', 'Galaxy Young 2 Duos' ],
+        'SM-G130M'                                  => [ 'Samsung', 'Galaxy Young 2 Duos' ],
+        'SM-G1(50|55)!'                             => [ 'Samsung', 'Galaxy Folder' ],
+        'SM-G160!'                                  => [ 'Samsung', 'Galaxy Folder 2' ],
+        'SM-G310H'                                  => [ 'Samsung', 'Galaxy Ace 4' ],
+        'SM-G310HN'                                 => [ 'Samsung', 'Galaxy Ace Style' ],
+        'SM-G310R5'                                 => [ 'Samsung', 'GreatCall Touch 3' ],
+        'SM-G313HU!'                                => [ 'Samsung', 'Galaxy S Duos 3' ],
+        'SM-G313!'                                  => [ 'Samsung', 'Galaxy Ace 4' ],
+        'SM-G316HU!'                                => [ 'Samsung', 'Galaxy S Duos 3-VE' ],
+        'SM-G316!'                                  => [ 'Samsung', 'Galaxy Ace 4' ],
+        'SM-G318!'                                  => [ 'Samsung', 'Galaxy Ace 4 Neo' ],
+        'SM-G350[289]!'                             => [ 'Samsung', 'Galaxy Trend 3' ],
+        'SM-G350!'                                  => [ 'Samsung', 'Galaxy Core Plus' ],
+        'SM-G3518!'                                 => [ 'Samsung', 'Galaxy Core' ],
+        'SM-G355!'                                  => [ 'Samsung', 'Galaxy Core 2' ],
+        'SM-G3568!'                                 => [ 'Samsung', 'Galaxy Core Mini' ],
+        'SM-G357!'                                  => [ 'Samsung', 'Galaxy Ace Style' ],
+        'SM-G358[689]!'                             => [ 'Samsung', 'Galaxy Core Lite' ],
+        'SM-G360BT'                                 => [ 'Samsung', 'Galaxy Win 2 Duos TV' ],
+        'SM-G360AZ'                                 => [ 'Samsung', 'Galaxy Core Prime' ],
+        'SM-G360R6!'                                => [ 'Samsung', 'Galaxy Core Prime' ],
+        'SM-G360[FGHMPTV689]!'                      => [ 'Samsung', 'Galaxy Core Prime' ],
+        'SM-G361!'                                  => [ 'Samsung', 'Galaxy Core Prime VE' ],
+        'SM-G3812B!'                                => [ 'Samsung', 'Galaxy S III Slim' ],
+        'SM-G3812'                                  => [ 'Samsung', 'Galaxy Win Pro' ],
+        'SM-G3815'                                  => [ 'Samsung', 'Galaxy Express 2' ],
+        'SM-G381[89]!'                              => [ 'Samsung', 'Galaxy Win Pro' ],
+        'SM-G3858!'                                 => [ 'Samsung', 'Galaxy Beam 2' ],
+        'SM-G386!'                                  => [ 'Samsung', 'Galaxy Core' ],                            // LTE variant
+        'SM-G388!'                                  => [ 'Samsung', 'Galaxy Xcover 3' ],
+        'SM-G389!'                                  => [ 'Samsung', 'Galaxy Xcover 3 VE' ],
+        'SM-G390!'                                  => [ 'Samsung', 'Galaxy Xcover 4' ],
+        'SM-G420!'                                  => [ 'Samsung', 'SM-G420' ],                                // Unknown
+        'SM-G430!'                                  => [ 'Samsung', 'SM-G430' ],                                // Unknown
+        'SM-G480!'                                  => [ 'Samsung', 'Galaxy S8' ],
+        'SM-G485!'                                  => [ 'Samsung', 'Galaxy S8+' ],
+        'SM-G510!'                                  => [ 'Samsung', 'Galaxy Core Max' ],
+        'SM-G530!'                                  => [ 'Samsung', 'Galaxy Grand Prime' ],
+        'SM-G531!'                                  => [ 'Samsung', 'Galaxy Grand Prime VE' ],
+        'SM-G532!'                                  => [ 'Samsung', 'Galaxy Grand Prime+' ],
+        'SM-G550!'                                  => [ 'Samsung', 'Galaxy On5' ],
+        'SM-G55[12]!'                               => [ 'Samsung', 'Galaxy On5 (2016)' ],
+        'SM-G570!'                                  => [ 'Samsung', 'Galaxy J5 Prime' ],
+        'SM-G600!'                                  => [ 'Samsung', 'Galaxy On7' ],
+        'SM-G610!'                                  => [ 'Samsung', 'Galaxy J7 Prime' ],
+        'SM-G710!'                                  => [ 'Samsung', 'Galaxy Grand 2' ],
+        'SM-G720!'                                  => [ 'Samsung', 'Galaxy Grand 3' ],
+        'SM-G730!'                                  => [ 'Samsung', 'Galaxy S III Mini' ],
+        'SM-G750!'                                  => [ 'Samsung', 'Galaxy Mega 2 ' ],
+        'SM-G770!'                                  => [ 'Samsung', 'Galaxy On7' ],
+        'SM-G800!'                                  => [ 'Samsung', 'Galaxy S5 Mini' ],
+        'SM-G850!'                                  => [ 'Samsung', 'Galaxy Alpha' ],
+        'SM-G860!'                                  => [ 'Samsung', 'Galaxy S5 Sport' ],
+        'SM-G870!'                                  => [ 'Samsung', 'Galaxy S5 Active' ],
+        'SM-G880!'                                  => [ 'Samsung', 'Galaxy S7 mini' ],
+        'SM-G890!'                                  => [ 'Samsung', 'Galaxy S6 Active' ],
+        'SM-G891!'                                  => [ 'Samsung', 'Galaxy S7 Active' ],
+        'SM-G90[016]!'                              => [ 'Samsung', 'Galaxy S5' ],
+        'SM-G903!'                                  => [ 'Samsung', 'Galaxy S5 Neo' ],
+        'SM-G9092!'                                 => [ 'Samsung', 'Galaxy G9092' ],
+        'SM-G9098!'                                 => [ 'Samsung', 'Galaxy G9098' ],
+        'SM-G909D'                                  => [ 'Samsung', 'Galaxy S5' ],                              // Chinese dual sim variant
+        'SM-G910!'                                  => [ 'Samsung', 'Galaxy Round' ],
+        'SM-G919!'                                  => [ 'Samsung', 'SM-G9198' ],
+        'SM-G920!'                                  => [ 'Samsung', 'Galaxy S6' ],
+        'SM-G925!'                                  => [ 'Samsung', 'Galaxy S6 Edge' ],
+        'SM-G928!'                                  => [ 'Samsung', 'Galaxy S6 Edge+' ],
+        'SM-G930!'                                  => [ 'Samsung', 'Galaxy S7' ],
+        'SM-G935!'                                  => [ 'Samsung', 'Galaxy S7 Edge' ],
+        'SM-G950!'                                  => [ 'Samsung', 'Galaxy S8' ],
+        'SM-G955!'                                  => [ 'Samsung', 'Galaxy S8+' ],
+    ],
+
+    'SM-I9500'                                      => [ 'Samsung', 'Galaxy S4' ],
+
+    'SM-J[0-9]{3,3}!!' => [
+        'SM-J100!'                                  => [ 'Samsung', 'Galaxy J1' ],
+        'SM-J105!'                                  => [ 'Samsung', 'Galaxy J1 Mini' ],
+        'SM-J106!'                                  => [ 'Samsung', 'Galaxy J1 Mini Prime' ],
+        'SM-J11[01]!'                               => [ 'Samsung', 'Galaxy J1 Ace' ],
+        'SM-J120!'                                  => [ 'Samsung', 'Galaxy J1 (2016)' ],
+        'SM-J200!'                                  => [ 'Samsung', 'Galaxy J2' ],
+        'SM-J210!'                                  => [ 'Samsung', 'Galaxy J2 (2106)' ],
+        'SM-J3(10|20)!'                             => [ 'Samsung', 'Galaxy J3' ],
+        'SM-J311!'                                  => [ 'Samsung', 'Galaxy J3 (2016)' ],
+        'SM-J321!'                                  => [ 'Samsung', 'Galaxy Sol' ],
+        'SM-J327!'                                  => [ 'Samsung', 'Galaxy J3 Emerge' ],
+        'SM-J500!'                                  => [ 'Samsung', 'Galaxy J5' ],
+        'SM-J510!'                                  => [ 'Samsung', 'Galaxy J5 (2016)' ],
+        'SM-J530!'                                  => [ 'Samsung', 'Galaxy J5 (2017)' ],
+        'SM-J700!'                                  => [ 'Samsung', 'Galaxy J7' ],
+        'SM-J710!'                                  => [ 'Samsung', 'Galaxy J7 (2016)' ],
+    ],
+
+    'SM-N[0-9]{3,4}!!' => [
+        'SM-N750[025789][QV]?!'                     => [ 'Samsung', 'Galaxy Note 3 Neo' ],
+        'SM-N750[LS]?!'                             => [ 'Samsung', 'Galaxy Note 3 Neo' ],
+        'SM-N8000'                                  => [ 'Samsung', 'Galaxy Note 800', DeviceType::TABLET ],
+        'SM-N900[0256789]?!'                        => [ 'Samsung', 'Galaxy Note 3' ],
+        'SM-N900!'                                  => [ 'Samsung', 'Galaxy Note 3' ],
+        'SM-N910[06]'                               => [ 'Samsung', 'Galaxy Note 4' ],
+        'SM-N91[06]!'                               => [ 'Samsung', 'Galaxy Note 4' ],
+        'SM-N915!'                                  => [ 'Samsung', 'Galaxy Note Edge' ],
+        'SM-N920!'                                  => [ 'Samsung', 'Galaxy Note 5' ],
+        'SM-N930!'                                  => [ 'Samsung', 'Galaxy Note 7' ],
+    ],
+
+    'SM-P[0-9]{3,3}!!' => [
+        'SM-P35[015]!'                              => [ 'Samsung', 'Galaxy Tab A Plus 8.0', DeviceType::TABLET ],
+        'SM-P55[015]!'                              => [ 'Samsung', 'Galaxy Tab A Plus 9.7', DeviceType::TABLET ],
+        'SM-P58[058]!'                              => [ 'Samsung', 'Galaxy Tab A 10.1 with S Pen (2016)', DeviceType::TABLET ],
+        'SM-P60[01257]!'                            => [ 'Samsung', 'Galaxy Note 10.1 (2014)', DeviceType::TABLET ],
+        'SM-P90[01257]!'                            => [ 'Samsung', 'Galaxy Note Pro', DeviceType::TABLET ],
+    ],
+
+    'SM-S[0-9]{3,3}!!' => [
+        'SM-S120VL'                                 => [ 'Samsung', 'Galaxy Luna' ],
+        'SM-S320VL'                                 => [ 'Samsung', 'Galaxy Sky' ],
+        'SM-S550TL'                                 => [ 'Samsung', 'Galaxy On5' ],
+        'SM-S765C'                                  => [ 'Samsung', 'Galaxy Ace Style' ],
+        'SM-S766C'                                  => [ 'Samsung', 'Galaxy Stardust' ],
+        'SM-S777C'                                  => [ 'Samsung', 'Galaxy J1' ],
+        'SM-S780L'                                  => [ 'Samsung', 'Galaxy Mega 6.3' ],
+        'SM-S820L'                                  => [ 'Samsung', 'Galaxy Core Prime' ],
+        'SM-S890L'                                  => [ 'Samsung', 'Galaxy S4 Mini' ],
+        'SM-S902L'                                  => [ 'Samsung', 'Galaxy S5' ],
+        'SM-S903VL'                                 => [ 'Samsung', 'Galaxy S5' ],
+        'SM-S906L'                                  => [ 'Samsung', 'Galaxy S6' ],
+        'SM-S907VL'                                 => [ 'Samsung', 'Galaxy S6' ],
+        'SM-S920L'                                  => [ 'Samsung', 'Galaxy Grand Prime' ],
+        'SM-S975L'                                  => [ 'Samsung', 'Galaxy S4' ],
+        'SM-S978L'                                  => [ 'Samsung', 'Galaxy E5' ],
+    ],
+
+    'SM-T[0-9]{3,3}!!' => [
+        'SM-T11[01]!'                               => [ 'Samsung', 'Galaxy Tab 3 Lite', DeviceType::TABLET ],
+        'SM-T11[36]!'                               => [ 'Samsung', 'Galaxy Tab 3V 7.0', DeviceType::TABLET ],
+        'SM-T2105'                                  => [ 'Samsung', 'Galaxy Tab 3 Kids', DeviceType::TABLET ],
+        'SM-T21[01257]!'                            => [ 'Samsung', 'Galaxy Tab 3 7.0', DeviceType::TABLET ],
+        'SM-T2519'                                  => [ 'Samsung', 'Galaxy Tab Q' ],
+        'SM-T255[68S]!'                             => [ 'Samsung', 'Galaxy Tab Q' ],
+        'SM-T23[012579]!'                           => [ 'Samsung', 'Galaxy Tab 4 7.0', DeviceType::TABLET ],
+        'SM-T28[057]!'                              => [ 'Samsung', 'Galaxy Tab A 7.0', DeviceType::TABLET ],
+        'SM-T31[0125]!'                             => [ 'Samsung', 'Galaxy Tab 3 8.0', DeviceType::TABLET ],
+        'SM-T32[0125]!'                             => [ 'Samsung', 'Galaxy Tab Pro 8.4', DeviceType::TABLET ],
+        'SM-T33[01257]!'                            => [ 'Samsung', 'Galaxy Tab 4 8.0', DeviceType::TABLET ],
+        'SM-T33[3]!'                                => [ 'Samsung', 'Galaxy Tab 4 8.0 (2015)', DeviceType::TABLET ],
+        'SM-T35[0157]!'                             => [ 'Samsung', 'Galaxy Tab A 8.0', DeviceType::TABLET ],
+        'SM-T36[05]!'                               => [ 'Samsung', 'Galaxy Tab Active 8.0', DeviceType::TABLET ],
+        'SM-T37[57]!'                               => [ 'Samsung', 'Galaxy Tab E 8.0', DeviceType::TABLET ],
+        'SM-T520CC'                                 => [ 'Samsung', 'Galaxy Tab Pro 10.1 Chef Collection', DeviceType::TABLET ],
+        'SM-T52[057]!'                              => [ 'Samsung', 'Galaxy Tab Pro 10.1', DeviceType::TABLET ],
+        'SM-T530NU'                                 => [ 'Samsung', 'Galaxy Tab 4 Nook 10.1', DeviceType::TABLET ],
+        'SM-T53[023]!'                              => [ 'Samsung', 'Galaxy Tab 4 10.1', DeviceType::TABLET ],
+        'SM-T53[6]!'                                => [ 'Samsung', 'Galaxy Tab 4 10.1 Advanced', DeviceType::TABLET ],
+        'SM-T53[157]!'                              => [ 'Samsung', 'Galaxy Tab 4 10.0', DeviceType::TABLET ],
+        'SM-T55[015]!'                              => [ 'Samsung', 'Galaxy Tab A 9.7', DeviceType::TABLET ],
+        'SM-T58[057]!'                              => [ 'Samsung', 'Galaxy Tab A 10.1 (2016)', DeviceType::TABLET ],
+        'SM-T56[0127]!'                             => [ 'Samsung', 'Galaxy Tab E 9.6', DeviceType::TABLET ],
+        'SM-T67[07]!'                               => [ 'Samsung', 'Galaxy View', DeviceType::TABLET ],
+        'SM-T70[057]!'                              => [ 'Samsung', 'Galaxy Tab S 8.4', DeviceType::TABLET ],
+        'SM-T71[05]!'                               => [ 'Samsung', 'Galaxy Tab S2 8.0', DeviceType::TABLET ],
+        'SM-T71[39]!'                               => [ 'Samsung', 'Galaxy Tab S2 8.0 (2016)', DeviceType::TABLET ],
+        'SM-T80[0157]!'                             => [ 'Samsung', 'Galaxy Tab S 10.5', DeviceType::TABLET ],
+        'SM-T81[057]!'                              => [ 'Samsung', 'Galaxy Tab S2 9.7', DeviceType::TABLET ],
+        'SM-T81[39]!'                               => [ 'Samsung', 'Galaxy Tab S2 9.7 (2016)', DeviceType::TABLET ],
+        'SM-T81[8]!'                                => [ 'Samsung', 'Galaxy Tab S2 Plus 9.7', DeviceType::TABLET ],
+        'SM-T82[05]!'                               => [ 'Samsung', 'Galaxy Tab S3 9.7', DeviceType::TABLET ],
+        'SM-T90[05]!'                               => [ 'Samsung', 'Galaxy Tab Pro 12.2', DeviceType::TABLET ],
+    ],
+
+    'SM-V700'                                   => [ 'Samsung', 'Galaxy Gear', DeviceType::WATCH ],
+
+    'SM-W[0-9]{4,4}!!' => [
+        'SM-W2014'                                  => [ 'Samsung', 'Galaxy W2014' ],
+        'SM-W2015'                                  => [ 'Samsung', 'Galaxy Golden 2' ],
+        'SM-W2016'                                  => [ 'Samsung', 'Galaxy Golden 3' ],
+        'SM-W2017'                                  => [ 'Samsung', 'Veyron' ],
+    ],
+
+    'SPH-D[0-9]{3,3}!!' => [
+        'SPH-D600'                                  => [ 'Samsung', 'Conquer 4G' ],
+        'SPH-D700'                                  => [ 'Samsung', 'Epic 4G' ],
+        'SPH-D705'                                  => [ 'Samsung', 'Epic 4G 2' ],
+        'SPH-D710!'                                 => [ 'Samsung', 'Galaxy S II' ],
+        'SPH-D720!'                                 => [ 'Samsung', 'Nexus S' ],
+    ],
+
+    'SPH-L[0-9]{3,3}!!' => [
+        'SPH-L300'                                  => [ 'Samsung', 'Galaxy Victory' ],
+        'SPH-L500'                                  => [ 'Samsung', 'SPH-L500' ],
+        'SPH-L520'                                  => [ 'Samsung', 'Galaxy S4 Mini' ],
+        'SPH-L600'                                  => [ 'Samsung', 'Galaxy Mega 6.3' ],
+        'SPH-L700'                                  => [ 'Samsung', 'Galaxy Nexus' ],
+        'SPH-L710!'                                 => [ 'Samsung', 'Galaxy S III' ],
+        'SPH-L72A!'                                 => [ 'Samsung', 'Galaxy S4' ],
+        'SPH-L720!'                                 => [ 'Samsung', 'Galaxy S4' ],
+        'SPH-L900!'                                 => [ 'Samsung', 'Galaxy Note II' ],
+    ],
+
+    'SPH-M[0-9]{3,3}!!' => [
+        'SPH-M820!'                                 => [ 'Samsung', 'Galaxy Prevail' ],
+        'SPH-M828!'                                 => [ 'Samsung', 'Galaxy Precedent' ],
+        'SPH-M830!'                                 => [ 'Samsung', 'Galaxy Rush' ],
+        'SPH-M840'                                  => [ 'Samsung', 'Galaxy Ring' ],
+        'SPH-M580!'                                 => [ 'Samsung', 'Replenish' ],
+        'SPH-M900'                                  => [ 'Samsung', 'Moment' ],
+        'SPH-M910'                                  => [ 'Samsung', 'Intercept' ],
+        'SPH-M920'                                  => [ 'Samsung', 'Transform' ],
+        'SPH-M930!'                                 => [ 'Samsung', 'Transform Ultra' ],
+        'SPH-M950'                                  => [ 'Samsung', 'Galaxy Reverb' ],
+    ],
+
+    'SPH-P[0-9]{3,3}!!' => [
+        'SPH-P100!'                                 => [ 'Samsung', 'Galaxy Tab 7.0', DeviceType::TABLET ],
+        'SPH-P500'                                  => [ 'Samsung', 'Galaxy Tab 2 10.1', DeviceType::TABLET ],
+        'SPH-P600'                                  => [ 'Samsung', 'Galaxy Note 10.1', DeviceType::TABLET ],
+    ],
+
+    'YP-G!!' => [
+        'YP-GB1'                                    => [ 'Samsung', 'Galaxy Player', 'media' ],
+        'YP-GB70'                                   => [ 'Samsung', 'Galaxy Player 70', 'media' ],
+        'YP-GB70D'                                  => [ 'Samsung', 'Galaxy Player 70 Plus', 'media' ],
+        'YP-GH1'                                    => [ 'Samsung', 'IceTouch', 'media' ],
+        'YP-GP1'                                    => [ 'Samsung', 'Galaxy Player 5.8', 'media' ],
+        'YP-GS1'                                    => [ 'Samsung', 'Galaxy S WiFi 3.6', 'media' ],
+        'YP-G1'                                     => [ 'Samsung', 'Galaxy S WiFi 4.0', 'media' ],
+        'YP-GI1'                                    => [ 'Samsung', 'Galaxy S WiFi 4.2', 'media' ],
+        'YP-GI2'                                    => [ 'Samsung', 'Galaxy 070', 'media' ],
+        'YP-G50'                                    => [ 'Samsung', 'Galaxy Player', 'media' ],
+        'YP-G70'                                    => [ 'Samsung', 'Galaxy S WiFi 5.0', 'media' ],
+    ],
+
+    'GT9100'                                    => [ 'Samsung', 'Galaxy S II' ],
+    'I897'                                      => [ 'Samsung', 'Captivate' ],
+    'I7500'                                     => [ 'Samsung', 'Galaxy' ],
+    'I9000'                                     => [ 'Samsung', 'Galaxy S' ],
+    'T959'                                      => [ 'Samsung', 'Galaxy S Vibrant' ],
+
+    'Galaxy!!' => [
+        'Galaxy'                                    => [ 'Samsung', 'Galaxy' ],
+        'Galaxy with MCR 1.2'                       => [ 'Samsung', 'Galaxy' ],
+        'Galaxy ACE'                                => [ 'Samsung', 'Galaxy Ace' ],
+        'Galaxy Ace 8'                              => [ 'Samsung', 'Galaxy Ace' ],
+        'Galaxy Express'                            => [ 'Samsung', 'Galaxy Express' ],
+        'Galaxy Mini'                               => [ 'Samsung', 'Galaxy Mini' ],
+        'Galaxy Mini Plus 4G'                       => [ 'Samsung', 'Galaxy Mini Plus' ],
+        'Galaxy Note'                               => [ 'Samsung', 'Galaxy Note' ],
+        'Galaxy Note I'                             => [ 'Samsung', 'Galaxy Note' ],
+        'Galaxy Note II'                            => [ 'Samsung', 'Galaxy Note II' ],
+        'Galaxy Note 2'                             => [ 'Samsung', 'Galaxy Note II' ],
+        'GALAXY Note III'                           => [ 'Samsung', 'Galaxy Note 3' ],
+        'GALAXY Note 3'                             => [ 'Samsung', 'Galaxy Note 3' ],
+        'Galaxy Note 3 N9000'                       => [ 'Samsung', 'Galaxy Note 3' ],
+        'Galaxy NoteIII'                            => [ 'Samsung', 'Galaxy Note 3' ],
+        'Galaxy N3'                                 => [ 'Samsung', 'Galaxy Note 3' ],
+        'GalaxyNote3'                               => [ 'Samsung', 'Galaxy Note 3' ],
+        'Galaxy Note 4'                             => [ 'Samsung', 'Galaxy Note 4' ],
+        'GALAXY Note4'                              => [ 'Samsung', 'Galaxy Note 4' ],
+        'GalaxyS'                                   => [ 'Samsung', 'Galaxy S' ],
+        'Galaxy S'                                  => [ 'Samsung', 'Galaxy S' ],
+        'Galaxy S II'                               => [ 'Samsung', 'Galaxy S II' ],
+        'Galaxy S2'                                 => [ 'Samsung', 'Galaxy S II' ],
+        'GalaxyS2'                                  => [ 'Samsung', 'Galaxy S II' ],
+        'Galaxy S2!'                                => [ 'Samsung', 'Galaxy S II' ],
+        'Galaxy S III'                              => [ 'Samsung', 'Galaxy S III' ],
+        'GALAXY SIII'                               => [ 'Samsung', 'Galaxy S III' ],
+        'Galaxy S3'                                 => [ 'Samsung', 'Galaxy S III' ],
+        'GalaxyS4'                                  => [ 'Samsung', 'Galaxy S4' ],
+        'Galaxy S4'                                 => [ 'Samsung', 'Galaxy S4' ],
+        'Galaxy-S4'                                 => [ 'Samsung', 'Galaxy S4' ],
+        'Galaxy SIV'                                => [ 'Samsung', 'Galaxy S4' ],
+        'Galaxy S IV(I950X)'                        => [ 'Samsung', 'Galaxy S4' ],
+        'Galaxy S4 Mini GT-I9505'                   => [ 'Samsung', 'Galaxy S4 Mini' ],
+        'Galaxy S4 Zoom'                            => [ 'Samsung', 'Galaxy S4 Zoom' ],
+        'GALAXY S5'                                 => [ 'Samsung', 'Galaxy S5' ],
+        'Galaxy S5 Sprint'                          => [ 'Samsung', 'Galaxy S5' ],
+        'Galaxy S5 spezial'                         => [ 'Samsung', 'Galaxy S5' ],
+        'Galaxy S6'                                 => [ 'Samsung', 'Galaxy S6' ],
+        'Galaxy S6 Edge'                            => [ 'Samsung', 'Galaxy S6 Edge' ],
+        'Galaxy X'                                  => [ 'Samsung', 'Galaxy X' ],
+        'Galaxy Spica'                              => [ 'Samsung', 'Galaxy Spica' ],
+        'Galaxy pop plus 4G'                        => [ 'Samsung', 'Galaxy Pop Plus' ],
+        'Galaxy Precedent'                          => [ 'Samsung', 'Galaxy Precedent' ],
+        'GALAXY Tab'                                => [ 'Samsung', 'Galaxy Tab', DeviceType::TABLET ],
+        'Galaxy Tab3'                               => [ 'Samsung', 'Galaxy Tab 3', DeviceType::TABLET ],
+    ],
+
+    'S2'                                        => [ 'Samsung', 'Galaxy S II' ],
+    'S3'                                        => [ 'Samsung', 'Galaxy S III' ],
+    'I9300 Galaxy SIII '                        => [ 'Samsung', 'Galaxy S III' ],
+    'S4'                                        => [ 'Samsung', 'Galaxy S4' ],
+    'S5'                                        => [ 'Samsung', 'Galaxy S5' ],
+    'S5 Mini!'                                  => [ 'Samsung', 'Galaxy S5 Mini' ],
+    'S6 Edge+!'                                 => [ 'Samsung', 'Galaxy S6 Edge+' ],
+    'Note III'                                  => [ 'Samsung', 'Galaxy Note 3' ],
+    'Captivate-I897'                            => [ 'Samsung', 'Captivate' ],
+    'Aegis2'                                    => [ 'Samsung', 'Stratosphere II' ],
+    'Vibrantmtd'                                => [ 'Samsung', 'Vibrant' ],
+    'Vibrant T959'                              => [ 'Samsung', 'Vibrant' ],
+    'HOMESYNCT2WIFI'                            => [ 'Samsung', 'Galaxy HomeSync', DeviceType::TELEVISION ],
+
+    'SC-?0[0-9][A-Z]!!' => [
+        'SC-01C'                                    => [ 'Samsung', 'GALAXY Tab SC-01C', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+        'SC-01D'                                    => [ 'Samsung', 'GALAXY Tab 10.1 LTE SC-01D', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+        'SC-01E'                                    => [ 'Samsung', 'GALAXY Tab 7.7 Plus SC-01E', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+        'SC-01F'                                    => [ 'Samsung', 'GALAXY Note 3 SC-01F', 'carrier' => 'DoCoMo' ],
+        'SC-01G'                                    => [ 'Samsung', 'GALAXY Note Edge SC-01G', 'carrier' => 'DoCoMo' ],
+        'SC-01H'                                    => [ 'Samsung', 'GALAXY Active neo SC-01H', 'carrier' => 'DoCoMo' ],
+        'SC-02B'                                    => [ 'Samsung', 'GALAXY S SC-02B', 'carrier' => 'DoCoMo' ],
+        'SC-02C'                                    => [ 'Samsung', 'GALAXY S II SC-02C', 'carrier' => 'DoCoMo' ],
+        'SC-02D'                                    => [ 'Samsung', 'GALAXY Tab 7.0 Plus SC-02D', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+        'SC-02E'                                    => [ 'Samsung', 'GALAXY Note II SC-02E', 'carrier' => 'DoCoMo' ],
+        'SC-02F'                                    => [ 'Samsung', 'GALAXY J SC-02F', 'carrier' => 'DoCoMo' ],
+        'SC-02G'                                    => [ 'Samsung', 'GALAXY S5 Active SC-02G', 'carrier' => 'DoCoMo' ],
+        'SC-02H'                                    => [ 'Samsung', 'Galaxy S7 Edge SC-02H', 'carrier' => 'DoCoMo' ],
+        'SC-03D'                                    => [ 'Samsung', 'GALAXY S II LTE SC-03D', 'carrier' => 'DoCoMo' ],
+        'SC-03E'                                    => [ 'Samsung', 'GALAXY S III α SC-03E', 'carrier' => 'DoCoMo' ],
+        'SC03E'                                     => [ 'Samsung', 'GALAXY S III α SC-03E', 'carrier' => 'DoCoMo' ],
+        'SC-03G'                                    => [ 'Samsung', 'GALAXY Tab S 8.4 SC-03G', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+        'SC-04D'                                    => [ 'Samsung', 'GALAXY NEXUS SC-04D', 'carrier' => 'DoCoMo' ],
+        'SC-04E'                                    => [ 'Samsung', 'GALAXY S4 SC-04E', 'carrier' => 'DoCoMo' ],
+        'SC-04F'                                    => [ 'Samsung', 'GALAXY S5 SC-04F', 'carrier' => 'DoCoMo' ],
+        'SC-04G'                                    => [ 'Samsung', 'GALAXY S6 Edge SC-04G', 'carrier' => 'DoCoMo' ],
+        'SC-05D'                                    => [ 'Samsung', 'GALAXY Note SC-05D', 'carrier' => 'DoCoMo' ],
+        'SC-05G'                                    => [ 'Samsung', 'GALAXY S6 SC-05G', 'carrier' => 'DoCoMo' ],
+        'SC-06D'                                    => [ 'Samsung', 'GALAXY S III SC-06D', 'carrier' => 'DoCoMo' ],
+    ],
+
+    'SC[LTV][23][0-9]!!' => [
+        'SCL21'                                     => [ 'Samsung', 'GALAXY S III Progre SCL21', 'carrier' => 'au' ],
+        'SCL22'                                     => [ 'Samsung', 'GALAXY Note 3 SCL22', 'carrier' => 'au' ],
+        'SCL23'                                     => [ 'Samsung', 'GALAXY S5 SCL23', 'carrier' => 'au' ],
+        'SCL24'                                     => [ 'Samsung', 'GALAXY Note Edge SCL24', 'carrier' => 'au' ],
+        'SCT21'                                     => [ 'Samsung', 'GALAXY Tab S SCT21', DeviceType::TABLET, 'carrier' => 'au' ],
+        'SCV31'                                     => [ 'Samsung', 'GALAXY S6 Edge SCV31', 'carrier' => 'au' ],
+        'SCV32'                                     => [ 'Samsung', 'GALAXY A8 SCV32', 'carrier' => 'au' ],
+        'SCV33'                                     => [ 'Samsung', 'GALAXY S7 edge Injustice Edition SCV33', 'carrier' => 'au' ],
+    ],
+
+    'ISW11SC'                                   => [ 'Samsung', 'GALAXY S II WiMAX ISW11SC', 'carrier' => 'au' ],
+
+    '40[0-9]SC!!' => [
+        '403SC'                                     => [ 'Samsung', 'GALAXY Tab 4 7.0 403SC', DeviceType::TABLET, 'carrier' => 'Softbank' ],
+        '404SC'                                     => [ 'Samsung', 'GALAXY S6 Edge 404SC', 'carrier' => 'Softbank' ],
+    ],
+
+    'printer-tablet'                            => [ 'Samsung', 'ProXpress', DeviceType::PRINTER ],
+
+    '(SENCOR )?ELEMENT!!' => [
+        'ELEMENT7V2'                                => [ 'Sencor', 'Element 7 V2', DeviceType::TABLET ],
+        'ELEMENT 7 V2 BASIC'                        => [ 'Sencor', 'Element 7 V2 Basic', DeviceType::TABLET ],
+        'ELEMENT 7V3'                               => [ 'Sencor', 'Element 7 V3', DeviceType::TABLET ],
+        'ELEMENT8'                                  => [ 'Sencor', 'Element 8', DeviceType::TABLET ],
+        'SENCOR ELEMENT 8V2'                        => [ 'Sencor', 'Element 8 V2', DeviceType::TABLET ],
+        'ELEMENT 8V3'                               => [ 'Sencor', 'Element 8 V3', DeviceType::TABLET ],
+        'SENCOR ELEMENT 9.7V3'                      => [ 'Sencor', 'Element 9.7 V3', DeviceType::TABLET ],
+        'ELEMENT10 1'                               => [ 'Sencor', 'Element 10.1', DeviceType::TABLET ],
+        'ELEMENT P501'                              => [ 'Sencor', 'Element P501' ],
+    ],
+
+    'SENSEIT R390'                              => [ 'Senseit', 'R390' ],
+    'QuickFone Mini'                            => [ 'Sensonic', 'QuickFone Mini' ],
+    'QuickFone-Mini'                            => [ 'Sensonic', 'QuickFone Mini' ],
+    'QuickFone ([NXZ][0-9]\+?)!'                => [ 'Sensonic', 'QuickFone $1' ],
+    'SENWA S970'                                => [ 'Senwa', 'S970' ],
+    'S1005KTAB'                                 => [ 'Serioux', 'GoTab S1005KTAB', DeviceType::TABLET ],
+    'STARACTIVE'                                => [ 'SFR', 'STARACTIVE' ],
+    'STARACTIVE 2'                              => [ 'SFR', 'STARACTIVE 2' ],
+    'Android edition by sfr STARADDICT'         => [ 'SFR', 'STARADDICT' ],
+    'V961'                                      => [ 'SFR', 'STARADDICT II' ],
+    'Smartphone Android by SFR STARADDICT II'   => [ 'SFR', 'STARADDICT II' ],
+    'STARADDICT II'                             => [ 'SFR', 'STARADDICT II' ],
+    'STARADDICT II Plus'                        => [ 'SFR', 'STARADDICT II Plus' ],
+    'STARADDICT III'                            => [ 'SFR', 'STARADDICT III' ],
+    'STARADDICT 4'                              => [ 'SFR', 'STARADDICT 4' ],
+    'STARADDICT 5'                              => [ 'SFR', 'STARADDICT 5' ],
+    'Android Edition Starnaute'                 => [ 'SFR', 'STARNAUTE' ],
+    'STARNAUTE II'                              => [ 'SFR', 'STARNAUTE II' ],
+    'STARNAUTE3'                                => [ 'SFR', 'STARNAUTE 3' ],
+    'STARNAUTE4'                                => [ 'SFR', 'STARNAUTE 4' ],
+    'Starshine'                                 => [ 'SFR', 'STARSHINE' ],
+    'STARSHINE II'                              => [ 'SFR', 'STARSHINE II' ],
+    'STARSHINE III'                             => [ 'SFR', 'STARSHINE III' ],
+    'STARSHINE 4'                               => [ 'SFR', 'STARSHINE 4' ],
+    'STARSHINE5'                                => [ 'SFR', 'STARSHINE 5' ],
+    'Android Edition StarText'                  => [ 'SFR', 'STARTEXT' ],
+    'STARTEXT II'                               => [ 'SFR', 'STARTEXT II' ],
+    'Android Edition StarTrail'                 => [ 'SFR', 'STARTRAIL' ],
+    'STARTRAIL II'                              => [ 'SFR', 'STARTRAIL II' ],
+    'StarTrail III'                             => [ 'SFR', 'STARTRAIL III' ],
+    'STARTRAIL4'                                => [ 'SFR', 'STARTRAIL 4' ],
+    'STARTRAIL 4'                               => [ 'SFR', 'STARTRAIL 4' ],
+    'STARTRAIL5'                                => [ 'SFR', 'STARTRAIL 5' ],
+    'STARTRAIL 6 4G'                            => [ 'SFR', 'STARTRAIL 6' ],
+    'STARTRAIL6'                                => [ 'SFR', 'STARTRAIL 6' ],
+    'STARTRAIL7'                                => [ 'SFR', 'STARTRAIL 7' ],
+    'STARTRAIL 8'                               => [ 'SFR', 'STARTRAIL 8' ],
+    'STARTRAIL 9'                               => [ 'SFR', 'STARTRAIL 9' ],
+    'STARXTREM'                                 => [ 'SFR', 'STARXTREM' ],
+    'STARXTREM II'                              => [ 'SFR', 'STARXTREM II' ],
+    'STARXTREM3'                                => [ 'SFR', 'STARXTREM 3' ],
+    'STARXTREM 4'                               => [ 'SFR', 'STARXTREM 4' ],
+    'STARXTREM5'                                => [ 'SFR', 'STARXTREM 5' ],
+    'STARXTREM 6'                               => [ 'SFR', 'STARXTREM 6' ],
+    'STARTAB'                                   => [ 'SFR', 'STARTAB', DeviceType::TABLET ],
+    'SFR StarTab'                               => [ 'SFR', 'STARTAB', DeviceType::TABLET ],
+    'Bambook S1'                                => [ 'Shanda', 'Bambook S1', DeviceType::TABLET ],
+
+    '[456A]0[0-9]SH!!' => [
+        '401SH'                                     => [ 'Sharp', '401SH', 'carrier' => 'Softbank' ],
+        '402SH'                                     => [ 'Sharp', 'AQUOS CRYSTAL X 402SH', 'carrier' => 'Softbank' ],
+        '403SH'                                     => [ 'Sharp', 'AQUOS CRYSTAL 2 403SH', 'carrier' => 'Softbank' ],
+        '404SH'                                     => [ 'Sharp', 'AQUOS Xx 404SH', 'carrier' => 'Softbank' ],
+        '502SH'                                     => [ 'Sharp', 'AQUOS Xx2 502SH', 'carrier' => 'Softbank' ],
+        '503SH'                                     => [ 'Sharp', 'AQUOS Xx2 mini 503SH', 'carrier' => 'Softbank' ],
+        '603SH'                                     => [ 'Sharp', 'AQUOS Xx3 mini 603SH', 'carrier' => 'Softbank' ],
+        'A01SH'                                     => [ 'Sharp', 'GALAPAGOS A01SH', 'carrier' => 'Y! Mobile' ],
+    ],
+
+    'IS0[0-9]!!' => [
+        'IS01'                                      => [ 'Sharp', 'IS01', 'carrier' => 'au' ],
+        'IS03'                                      => [ 'Sharp', 'IS03', 'carrier' => 'au' ],
+        'IS05'                                      => [ 'Sharp', 'IS05', 'carrier' => 'au' ],
+    ],
+
+    'ISW?1[0-9]SH!!' => [
+        'IS11SH'                                    => [ 'Sharp', 'AQUOS PHONE IS11SH', 'carrier' => 'au' ],
+        'IS12SH'                                    => [ 'Sharp', 'AQUOS PHONE IS12SH', 'carrier' => 'au' ],
+        'IS13SH'                                    => [ 'Sharp', 'AQUOS PHONE IS13SH', 'carrier' => 'au' ],
+        'IS14SH'                                    => [ 'Sharp', 'AQUOS PHONE IS14SH', 'carrier' => 'au' ],
+        'IS15SH'                                    => [ 'Sharp', 'AQUOS PHONE SL IS15SH', 'carrier' => 'au' ],
+        'ISW16SH'                                   => [ 'Sharp', 'AQUOS PHONE SERIE ISW16SH', 'carrier' => 'au' ],
+        'IS17SH'                                    => [ 'Sharp', 'AQUOS PHONE CL IS17SH', 'carrier' => 'au' ],
+    ],
+
+    'EB-A71GJ'                                  => [ 'Sharp', 'EB-A71GJ', DeviceType::TABLET ],
+    'EB-W51GJ'                                  => [ 'Sharp', 'EB-W51GJ', DeviceType::TABLET ],
+    'EB-WX1GJ'                                  => [ 'Sharp', 'EB-WX1GJ', DeviceType::TABLET ],
+    'EB-L76G-B'                                 => [ 'Sharp', 'EB-L76G-B', DeviceType::TABLET ],
+    'RW107'                                     => [ 'Sharp', 'RW-T107', DeviceType::TABLET ],
+
+    'SBM[0-9]0[0-9]SH!!' => [
+        'SBM003SH'                                  => [ 'Sharp', 'GALAPAGOS 003SH', 'carrier' => 'Softbank' ],
+        'SBM005SH'                                  => [ 'Sharp', 'GALAPAGOS 005SH', 'carrier' => 'Softbank' ],
+        'SBM006SH'                                  => [ 'Sharp', 'AQUOS PHONE 006SH', 'carrier' => 'Softbank' ],
+        'SBM007SH'                                  => [ 'Sharp', 'AQUOS PHONE THE HYBRID 007SH', 'carrier' => 'Softbank' ],
+        'SBM007SHJ'                                 => [ 'Sharp', 'AQUOS PHONE THE HYBRID 007SH J', 'carrier' => 'Softbank' ],
+        'SBM007SHK'                                 => [ 'Sharp', '007SH KT', 'carrier' => 'Softbank' ],
+        'SBM009SH'                                  => [ 'Sharp', 'AQUOS PHONE THE PREMIUM 009SH', 'carrier' => 'Softbank' ],
+        'SBM009SHY'                                 => [ 'Sharp', 'Yahoo! Phone 009SH Y', 'carrier' => 'Softbank' ],
+        'SBM101SH'                                  => [ 'Sharp', 'AQUOS PHONE THE HYBRID 101SH', 'carrier' => 'Softbank' ],
+        'SBM102SH'                                  => [ 'Sharp', 'AQUOS PHONE 102SH', 'carrier' => 'Softbank' ],
+        'SBM102SH2'                                 => [ 'Sharp', 'AQUOS PHONE 102SH II', 'carrier' => 'Softbank' ],
+        'SBM103SH'                                  => [ 'Sharp', 'AQUOS PHONE 103SH', 'carrier' => 'Softbank' ],
+        'SBM104SH'                                  => [ 'Sharp', 'AQUOS PHONE 104SH', 'carrier' => 'Softbank' ],
+        'SBM106SH'                                  => [ 'Sharp', 'AQUOS PHONE Xx 106SH', 'carrier' => 'Softbank' ],
+        'SBM107SH'                                  => [ 'Sharp', 'PANTONE 5 107SH', 'carrier' => 'Softbank' ],
+        'SBM107SHB'                                 => [ 'Sharp', 'AQUOS PHONE 107SH B', 'carrier' => 'Softbank' ],
+        'SBM200SH'                                  => [ 'Sharp', 'PANTONE 6 200SH', 'carrier' => 'Softbank' ],
+        'SBM203SH'                                  => [ 'Sharp', 'AQUOS PHONE Xx 203SH', 'carrier' => 'Softbank' ],
+        'SBM204SH'                                  => [ 'Sharp', 'シンプルスマホ 204SH', 'carrier' => 'Softbank' ],
+        'SBM205SH'                                  => [ 'Sharp', 'AQUOS PHONE ss 205SH', 'carrier' => 'Softbank' ],
+        'SBM206SH'                                  => [ 'Sharp', 'AQUOS PHONE Xx 206SH', 'carrier' => 'Softbank' ],
+        'SBM302SH'                                  => [ 'Sharp', 'AQUOS PHONE Xx 302SH', 'carrier' => 'Softbank' ],
+        'SBM303SH'                                  => [ 'Sharp', 'AQUOS PHONE Xx mini 303SH', 'carrier' => 'Softbank' ],
+        'SBM305SH'                                  => [ 'Sharp', 'AQUOS CRYSTAL 305SH', 'carrier' => 'Softbank' ],
+        'SBM306SH'                                  => [ 'Sharp', 'AQUOS CRYSTAL 306SH' ],                                          // The U.S. Sprint version (now part of Softbank)
+    ],
+
+    '(3|5)0[0-9]SH!!' => [
+        '304SH'                                     => [ 'Sharp', 'AQUOS Xx 304SH', 'carrier' => 'Softbank' ],
+        '305SH'                                     => [ 'Sharp', 'AQUOS CRYSTAL 305SH', 'carrier' => 'Softbank' ],
+        '306SH'                                     => [ 'Sharp', 'AQUOS CRYSTAL 306SH' ],                                          // The U.S. Sprint version (now part of Softbank)
+        '506SH'                                     => [ 'Sharp', 'AQUOS Xx3 506SH', 'carrier' => 'Softbank' ],
+        '507SH'                                     => [ 'Sharp', 'Android One 507SH', 'carrier' => 'Y! Mobile' ],
+        '509SH'                                     => [ 'Sharp', 'シンプルスマホ3 509SH', 'carrier' => 'Softbank' ],
+    ],
+
+    'SH01D'                                     => [ 'Sharp', 'AQUOS PHONE SH-01D', 'carrier' => 'DoCoMo' ],
+    'DM-01H'                                    => [ 'Sharp', 'DM-01H', 'carrier' => 'Disney Mobile' ],
+
+    'SH-M01'                                    => [ 'Sharp', 'AQUOS SH-M01' ],
+    'SH-M02'                                    => [ 'Sharp', 'AQUOS SH-M02' ],
+    'SH-M02-EVA20'                              => [ 'Sharp', 'AQUOS SH-M02' ],
+    'SH-M03'                                    => [ 'Sharp', 'AQUOS mini SH-M03' ],
+    'SH-RM02'                                   => [ 'Sharp', 'AQUOS SH-RM02' ],
+
+    'SH-[01][0-9][A-Z]!!' => [
+        'SH-01D'                                    => [ 'Sharp', 'AQUOS PHONE SH-01D', 'carrier' => 'DoCoMo' ],
+        'SH-01E'                                    => [ 'Sharp', 'AQUOS PHONE si SH-01E', 'carrier' => 'DoCoMo' ],
+        'SH-01EVW'                                  => [ 'Sharp', 'Vivienne Westwood SH-01EVW', 'carrier' => 'DoCoMo' ],
+        'SH-01F'                                    => [ 'Sharp', 'AQUOS PHONE ZETA SH-01F', 'carrier' => 'DoCoMo' ],
+        'SH-01FDQ'                                  => [ 'Sharp', 'SH-01F DRAGON QUEST', 'carrier' => 'DoCoMo' ],
+        'SH-01G'                                    => [ 'Sharp', 'AQUOS PHONE ZETA SH-01G', 'carrier' => 'DoCoMo' ],
+        'SH-01H'                                    => [ 'Sharp', 'AQUOS PHONE ZETA SH-01H', 'carrier' => 'DoCoMo' ],
+        'SH-02D'                                    => [ 'Sharp', 'AQUOS PHONE slider SH-02D', 'carrier' => 'DoCoMo' ],
+        'SH-02E'                                    => [ 'Sharp', 'AQUOS PHONE ZETA SH-02E', 'carrier' => 'DoCoMo' ],
+        'SH-02F'                                    => [ 'Sharp', 'AQUOS PHONE EX SH-02F', 'carrier' => 'DoCoMo' ],
+        'SH-02G'                                    => [ 'Sharp', 'SH-02G', 'carrier' => 'Disney Mobile' ],
+        'SH-02H'                                    => [ 'Sharp', 'AQUOS Compact SH-02H', 'carrier' => 'DoCoMo' ],
+        'SH-02J'                                    => [ 'Sharp', 'AQUOS EVER SH-02J', 'carrier' => 'DoCoMo' ],
+        'SH-03C'                                    => [ 'Sharp', 'LYNX 3D SH-03C', 'carrier' => 'DoCoMo' ],
+        'SH-03F'                                    => [ 'Sharp', 'スマートフォン for ジュニア2 SH-03F', 'carrier' => 'DoCoMo' ],
+        'SH-03G'                                    => [ 'Sharp', 'AQUOS ZETA SH-03G', 'carrier' => 'DoCoMo' ],
+        'SH-03H'                                    => [ 'Sharp', 'SH-03H', 'carrier' => 'DoCoMo' ],
+        'SH-04D'                                    => [ 'Sharp', 'Q-pot.Phone SH-04D', 'carrier' => 'DoCoMo' ],
+        'SH-04E'                                    => [ 'Sharp', 'AQUOS PHONE EX SH-04E', 'carrier' => 'DoCoMo' ],
+        'SH-04F'                                    => [ 'Sharp', 'AQUOS ZETA SH-04F', 'carrier' => 'DoCoMo' ],
+        'SH-04G'                                    => [ 'Sharp', 'AQUOS EVER SH-04G', 'carrier' => 'DoCoMo' ],
+        'SH-04H'                                    => [ 'Sharp', 'AQUOS ZETA SH-04H', 'carrier' => 'DoCoMo' ],
+        'SH-05E'                                    => [ 'Sharp', 'スマートフォン for ジュニア SH-05E', 'carrier' => 'DoCoMo' ],
+        'SH-05F'                                    => [ 'Sharp', 'SH-05F', 'carrier' => 'Disney Mobile' ],
+        'SH-05G'                                    => [ 'Sharp', 'AQUOS PAD SH-05G', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+        'SH-06D'                                    => [ 'Sharp', 'AQUOS PHONE SH-06D', 'carrier' => 'DoCoMo' ],
+        'SH-06DNERV'                                => [ 'Sharp', 'SH-06D NERV', 'carrier' => 'DoCoMo' ],
+        'SH-06E'                                    => [ 'Sharp', 'AQUOS PHONE ZETA SH-06E', 'carrier' => 'DoCoMo' ],
+        'SH-06F'                                    => [ 'Sharp', 'AQUOS PAD SH-06F', 'carrier' => 'DoCoMo' ],
+        'SH-06G'                                    => [ 'Sharp', 'AQUOS SH-06G', 'carrier' => 'DoCoMo' ],
+        'SH-07C'                                    => [ 'Sharp', 'GALAPAGOS SH-07C', 'carrier' => 'DoCoMo' ],
+        'SH-07D'                                    => [ 'Sharp', 'AQUOS PHONE st SH-07D', 'carrier' => 'DoCoMo' ],
+        'SH-07E'                                    => [ 'Sharp', 'AQUOS PHONE si SH-07E', 'carrier' => 'DoCoMo' ],
+        'SH-08E'                                    => [ 'Sharp', 'AQUOS PAD SH-08E', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],
+        'SH-09D'                                    => [ 'Sharp', 'AQUOS PHONE ZETA SH-09D', 'carrier' => 'DoCoMo' ],
+        'SH-10B'                                    => [ 'Sharp', 'LYNX SH-10B', 'carrier' => 'DoCoMo' ],
+        'SH-10D'                                    => [ 'Sharp', 'AQUOS PHONE sv SH-10D', 'carrier' => 'DoCoMo' ],
+        'SH-12C'                                    => [ 'Sharp', 'AQUOS PHONE SH-12C', 'carrier' => 'DoCoMo' ],
+        'SH-13C'                                    => [ 'Sharp', 'AQUOS PHONE f SH-13C', 'carrier' => 'DoCoMo' ],
+    ],
+
+    '(SHP-)?(SHARP )?SH[0-9]{2,3}!!' => [
+        'SH80F'                                     => [ 'Sharp', 'Aquos SH80F' ],
+        'SH90B'                                     => [ 'Sharp', 'Aquos SH90B', 'carrier' => 'Biglobe' ],
+        'SH330U'                                    => [ 'Sharp', 'SH330U' ],
+        'SHP-SH330T'                                => [ 'Sharp', 'SH330T' ],
+        'SH330T(Yiliao)'                            => [ 'Sharp', 'SH330T' ],
+        'SH530U'                                    => [ 'Sharp', 'SH530U' ],
+        'SH630E'                                    => [ 'Sharp', 'SH630E' ],
+        'SHP-SH630E'                                => [ 'Sharp', 'SH630E' ],
+        'SH-631M'                                   => [ 'Sharp', 'SH631M' ],
+        'SH631W'                                    => [ 'Sharp', 'SH631W' ],
+        'SH825Wi'                                   => [ 'Sharp', 'Aquos Crystal SH825Wi' ],
+        'SH831T'                                    => [ 'Sharp', 'SH831T' ],
+        'SHP-SH831T'                                => [ 'Sharp', 'SH831T' ],
+        'SH837M'                                    => [ 'Sharp', 'SH837M' ],
+        'SH837W'                                    => [ 'Sharp', 'SH837W' ],
+        'SH930W'                                    => [ 'Sharp', 'SH930W' ],
+        'SH931W'                                    => [ 'Sharp', 'SH931W' ],
+        'SH72x8U'                                   => [ 'Sharp', 'SH72x8U' ],
+        'SH7218U'                                   => [ 'Sharp', 'SH7218U' ],
+        'SH7218T'                                   => [ 'Sharp', 'SH7218T' ],
+        'SHP-SH7218T'                               => [ 'Sharp', 'SH7218T' ],
+        'SH8118U'                                   => [ 'Sharp', 'SH8118U' ],
+        'SHARP SH8118U'                             => [ 'Sharp', 'SH8118U' ],
+        'SH8128U'                                   => [ 'Sharp', 'SH8128U' ],
+        'SH8158U'                                   => [ 'Sharp', 'SH8158U' ],
+        'SH8168U'                                   => [ 'Sharp', 'SH8168U' ],
+        'SH8188U'                                   => [ 'Sharp', 'SH8188U' ],
+        'SHARP SH8188U'                             => [ 'Sharp', 'SH8188U' ],
+        'SH8288U'                                   => [ 'Sharp', 'SH8288U' ],
+        'SH8268U'                                   => [ 'Sharp', 'SH8268U' ],
+        'SH8298U'                                   => [ 'Sharp', 'SH8298U' ],
+    ],
+
+    'SH[FLTV][0-9]{2,2}!!' => [
+        'SHF31'                                     => [ 'Sharp', 'AQUOS K SHF31', 'carrier' => 'au' ],
+        'SHF32'                                     => [ 'Sharp', 'AQUOS K SHF32', 'carrier' => 'au' ],
+        'SHF33'                                     => [ 'Sharp', 'AQUOS K SHF33', 'carrier' => 'au' ],
+        'SHL21'                                     => [ 'Sharp', 'AQUOS PHONE SERIE SHL21', 'carrier' => 'au' ],
+        'SHL22'                                     => [ 'Sharp', 'AQUOS PHONE SERIE SHL22', 'carrier' => 'au' ],
+        'SHL23'                                     => [ 'Sharp', 'AQUOS PHONE SERIE SHL23', 'carrier' => 'au' ],
+        'SHL24'                                     => [ 'Sharp', 'AQUOS PHONE SERIE mini SHL24', 'carrier' => 'au' ],
+        'SHL25'                                     => [ 'Sharp', 'AQUOS SERIE SHL25', 'carrier' => 'au' ],
+        'SHT21'                                     => [ 'Sharp', 'AQUOS PAD SHT21', DeviceType::TABLET, 'carrier' => 'au' ],
+        'SHT22'                                     => [ 'Sharp', 'AQUOS PAD SHT22', DeviceType::TABLET, 'carrier' => 'au' ],
+        'SHV31'                                     => [ 'Sharp', 'AQUOS SERIE mini SHV31', 'carrier' => 'au' ],
+        'SHV32'                                     => [ 'Sharp', 'AQUOS SERIE SHV32', 'carrier' => 'au' ],
+        'SHV33'                                     => [ 'Sharp', 'AQUOS SERIE mini SHV33', 'carrier' => 'au' ],
+        'SHV34'                                     => [ 'Sharp', 'AQUOS SERIE SHV34', 'carrier' => 'au' ],
+        'SHV35'                                     => [ 'Sharp', 'AQUOS U SHV35', 'carrier' => 'au' ],
+        'SHV36'                                     => [ 'Sharp', 'BASIO2 SHV36', 'carrier' => 'au' ],
+        'SHV37'                                     => [ 'Sharp', 'AQUOS U SHV37', 'carrier' => 'au' ],
+    ],
+    'WX04SH'                                    => [ 'Sharp', 'AQUOS PHONE es WX04SH', 'carrier' => 'Willcom' ],
+    'WX05SH'                                    => [ 'Sharp', 'AQUOS PHONE ef WX05SH', 'carrier' => 'Willcom' ],
+    'SHARP-ADS1'                                => [ 'Sharp', 'FX Plus' ],
+
+    'AQUOS!!' => [
+        'AQUOS 50S1'                                => [ 'Sharp', 'Aquos S1', DeviceType::TELEVISION ],
+        'AQUOS 50U1'                                => [ 'Sharp', 'Aquos U1', DeviceType::TELEVISION ],
+        'AQUOS 58U1'                                => [ 'Sharp', 'Aquos U1', DeviceType::TELEVISION ],
+        'AQUOS 50U3A'                               => [ 'Sharp', 'Aquos U3A', DeviceType::TELEVISION ],
+        'AQUOS 58U3A'                               => [ 'Sharp', 'Aquos U3A', DeviceType::TELEVISION ],
+        'AQUOS 52UE20A'                             => [ 'Sharp', 'Aquos UE20A', DeviceType::TELEVISION ],
+        'AQUOS 60UE20A'                             => [ 'Sharp', 'Aquos UE20A', DeviceType::TELEVISION ],
+        'AQUOS 70LX765A'                            => [ 'Sharp', 'Aquos LX765A', DeviceType::TELEVISION ],
+    ],
+
+    'LC-Ux30US'                                 => [ 'Sharp', 'Aquos UH30U', DeviceType::TELEVISION ],
+    'LC-[0-9]{2,2}((LE|UE)[0-9]{1,3}[A-Z])!'    => [ 'Sharp', 'Aquos $1', DeviceType::TELEVISION ],
+    'LC-((A|S|LX)[0-9]{1,3}[A-Z])!'             => [ 'Sharp', 'Aquos $1', DeviceType::TELEVISION ],
+    'LCD-((S|V|LX|UF)[0-9]{1,3}[A-Z])!'         => [ 'Sharp', 'Aquos $1', DeviceType::TELEVISION ],
+
+    'X-treme PQ11'                              => [ 'Sigma Mobile', 'X-treme PQ11' ],
+    'X-treme PQ15'                              => [ 'Sigma Mobile', 'X-treme PQ15' ],
+    'X-tremePQ22'                               => [ 'Sigma Mobile', 'X-treme PQ22' ],
+    'X-treme-PQ30'                              => [ 'Sigma Mobile', 'X-treme PQ30' ],
+    'Blackphone 2'                              => [ 'Silent Circle', 'Blackphone 2' ],
+    'SP-120'                                    => [ 'Simvalley', 'SP-120' ],
+    'simvalley SP-142'                          => [ 'Simvalley', 'SP-142' ],
+    'V5U-simvalley SP-142'                      => [ 'Simvalley', 'SP-142' ],
+    'SPX-5'                                     => [ 'Simvalley', 'SPX-5' ],
+    'SPX-5 3G'                                  => [ 'Simvalley', 'SPX-5 3G' ],
+    'SPX-6'                                     => [ 'Simvalley', 'SPX-6' ],
+    'SPX-12'                                    => [ 'Simvalley', 'SPX-12' ],
+    'X720'                                      => [ 'Simmtronics', 'XPAD X-720', DeviceType::TABLET ],
+    'HYPER X BLADE'                             => [ 'SKK Mobile', 'Hyper X Blade' ],
+
+    'Skyworth!!' => [
+        'Skyworth PE90'                             => [ 'Skyworth', 'PE90' ],
+        'Skyworth 8S51 E510'                        => [ 'Skyworth', 'E510', DeviceType::TELEVISION ],
+        'Skyworth 8S50 E510E'                       => [ 'Skyworth', 'E510', DeviceType::TELEVISION ],
+        'Skyworth 8S53 E660C'                       => [ 'Skyworth', 'E660', DeviceType::TELEVISION ],
+        'Skyworth 8K55 E680'                        => [ 'Skyworth', 'E680', DeviceType::TELEVISION ],
+        'Skyworth 9R10 E690U'                       => [ 'Skyworth', 'E690', DeviceType::TELEVISION ],
+        'Skyworth 9R15 E710U'                       => [ 'Skyworth', 'E710', DeviceType::TELEVISION ],
+        'Skyworth 8K93 E780U'                       => [ 'Skyworth', 'E780', DeviceType::TELEVISION ],
+        'Skyworth 8R98 E790U'                       => [ 'Skyworth', 'E790', DeviceType::TELEVISION ],
+        'Skyworth A55 Coocaa'                       => [ 'Skyworth', 'Coocaa Honor A55', DeviceType::TELEVISION ],
+    ],
+
+    'WF7C'                                      => [ 'Smartbitt', 'WF7C', DeviceType::TABLET ],
+
+    '(Smartfren|Andromax)!!' => [
+        'Smartfren A16C3H'                          => [ 'Smartfren', 'Andromax A' ],
+        'Andromax A16C3H'                           => [ 'Smartfren', 'Andromax A' ],
+        'Andromax-c'                                => [ 'Smartfren', 'Andromax C' ],
+        'Andromax C'                                => [ 'Smartfren', 'Andromax C' ],
+        'Andromax-C.purwanto'                       => [ 'Smartfren', 'Andromax C' ],
+        'Andromax C Sulthan Rafi XPERIA Mod'        => [ 'Smartfren', 'Andromax C' ],
+        'Andromax C+'                               => [ 'Smartfren', 'Andromax C+' ],
+        'Smartfren Andromax AD688G'                 => [ 'Smartfren', 'Andromax C2' ],
+        'Andromax C2'                               => [ 'Smartfren', 'Andromax C2' ],
+        'Smartfren Andromax NEWAD688G'              => [ 'Smartfren', 'Andromax C2' ],
+        'AD688G'                                    => [ 'Smartfren', 'Andromax C2' ],
+        'Smartfren Andromax AD6B1H'                 => [ 'Smartfren', 'Andromax C3' ],
+        'AD6B1H'                                    => [ 'Smartfren', 'Andromax C3' ],
+        'Andromax NC36B1H'                          => [ 'Smartfren', 'Andromax C3s' ],
+        'Smartfren Andromax NC36B1G'                => [ 'Smartfren', 'Andromax C3s' ],
+        'Andromaxx-D_E1000'                         => [ 'Smartfren', 'Andromax D' ],
+        'Andromax C46B2G'                           => [ 'Smartfren', 'Andromax Ec' ],
+        'Andromax C46B2H'                           => [ 'Smartfren', 'Andromax Ec' ],
+        'Andromax B16C2G'                           => [ 'Smartfren', 'Andromax E2+' ],
+        'Andromax B16C2H'                           => [ 'Smartfren', 'Andromax E3' ],
+        'Andromax AD687G'                           => [ 'Smartfren', 'Andromax G' ],
+        'Andromax G'                                => [ 'Smartfren', 'Andromax G' ],
+        'Andromax-G'                                => [ 'Smartfren', 'Andromax G' ],
+        'Smartfren Andromax AD681H'                 => [ 'Smartfren', 'Andromax G2' ],
+        'Smartfren Andromax AD9A1H'                 => [ 'Smartfren', 'Andromax G2 Qwerty' ],
+        'Andromax SD6D1U'                           => [ 'Smartfren', 'Andromax G2 LE' ],
+        'AndroMAXI AD683G'                          => [ 'Smartfren', 'Andromax I' ],
+        'Andromax Vocused'                          => [ 'Smartfren', 'Andromax I' ],
+        'androMax-i AS Ripped'                      => [ 'Smartfren', 'Andromax I' ],
+        'Andromax AD683J'                           => [ 'Smartfren', 'Andromax I2' ],
+        'Andromax-i2'                               => [ 'Smartfren', 'Andromax I2' ],
+        'Andromax I2'                               => [ 'Smartfren', 'Andromax I2' ],
+        'Andromax GT-I9500 i2'                      => [ 'Smartfren', 'Andromax I2' ],
+        'Smartfren Andromax AD689G'                 => [ 'Smartfren', 'Andromax I3' ],
+        'Smartfren Andromax AD682H'                 => [ 'Smartfren', 'Andromax I3s' ],
+        'Andromax B26D2H'                           => [ 'Smartfren', 'Andromax L' ],
+        'Andromax G36C1G'                           => [ 'Smartfren', 'Andromax Qi' ],
+        'Andromax G36C1H'                           => [ 'Smartfren', 'Andromax Qi' ],
+        'Andromax I46D1G'                           => [ 'Smartfren', 'Andromax R' ],
+        'Andromax I56D2G'                           => [ 'Smartfren', 'Andromax R2' ],
+        'Andromax AD682J'                           => [ 'Smartfren', 'Andromax T' ],
+        'Andromax T AD628J'                         => [ 'Smartfren', 'Andromax T' ],
+        'Andromax U!'                               => [ 'Smartfren', 'Andromax U' ],
+        'Andromax-U'                                => [ 'Smartfren', 'Andromax U' ],
+        'Smartfren Andromax U3'                     => [ 'Smartfren', 'Andromax U3' ],
+    ],
+
+    'AD686G'                                    => [ 'Smartfren', 'Andromax C' ],
+    'AD687G'                                    => [ 'Smartfren', 'Andromax G' ],
+    'AD6893G'                                   => [ 'Smartfren', 'Andromax I3' ],
+    'PD6D1J'                                    => [ 'Smartfren', 'Andromax V3s' ],
+    'New Andromax-i'                            => [ 'Smartfren', 'Andromax I' ],
+    'Androtab 7'                                => [ 'Smartfren', 'Androtab 7', DeviceType::TABLET ],
+    'Smartfren Tab 7'                           => [ 'Smartfren', 'Tab 7', DeviceType::TABLET ],
+    'S7'                                        => [ 'Smartfren', 'Tab 7', DeviceType::TABLET ],
+
+    'SmartQ!!' => [
+        'SmartQ G7'                                 => [ 'SmartQ', 'G7', DeviceType::TABLET ],
+        'SmartQR10'                                 => [ 'SmartQ', 'R10', DeviceType::TABLET ],
+        'SmartQT7'                                  => [ 'SmartQ', 'T7', DeviceType::TABLET ],
+        'SmartQT10'                                 => [ 'SmartQ', 'T10', DeviceType::TABLET ],
+        'SmartQT12'                                 => [ 'SmartQ', 'T12', DeviceType::TABLET ],
+        'SmartQT13'                                 => [ 'SmartQ', 'T13', DeviceType::TABLET ],
+        'SmartQT15'                                 => [ 'SmartQ', 'T15', DeviceType::TABLET ],
+        'SmartQT19'                                 => [ 'SmartQ', 'T19', DeviceType::TABLET ],
+        'SmartQT20'                                 => [ 'SmartQ', 'T20', DeviceType::TABLET ],
+        'SmartQT30'                                 => [ 'SmartQ', 'T30', DeviceType::TABLET ],
+        'SmartQ V5'                                 => [ 'SmartQ', 'V5', DeviceType::TABLET ],
+        'SmartQV5II'                                => [ 'SmartQ', 'V5 II', DeviceType::TABLET ],
+        'SmartQ V7'                                 => [ 'SmartQ', 'V7', DeviceType::TABLET ],
+    ],
+
+    'T20'                                       => [ 'SmartQ', 'T20', DeviceType::TABLET ],
+    'T30'                                       => [ 'SmartQ', 'T30', DeviceType::TABLET ],
+
+    'SZENIO!!' => [
+        'SZENIO 2000'                               => [ 'Szenio', '2000', DeviceType::TABLET ],
+        'SZENIO 2500'                               => [ 'Szenio', '2500', DeviceType::TABLET ],
+    ],
+
+    'Sonim!!' => [
+        'Sonim Sonim-XP5700'                        => [ 'Sonim', 'XP5700' ],
+        'Sonim XP5700'                              => [ 'Sonim', 'XP5700' ],
+        'Sonim-XP5700'                              => [ 'Sonim', 'XP5700' ],
+        'Sonim-XP5705'                              => [ 'Sonim', 'XP5705' ],
+        'Sonim-XP6700'                              => [ 'Sonim', 'XP6700' ],
+        'sonim/XP6700'                              => [ 'Sonim', 'XP6700' ],
+        'Sonim XP6700'                              => [ 'Sonim', 'XP6700' ],
+        'Sonim XP6711Z1'                            => [ 'Sonim', 'XP6711' ],
+        'Sonim XP7700'                              => [ 'Sonim', 'XP7700' ],
+        'Sonim-XP7700'                              => [ 'Sonim', 'XP7700' ],
+        'sonim/XP7700'                              => [ 'Sonim', 'XP7700' ],
+    ],
+
+    'OMS1 6'                                    => [ 'Sony Ericsson', 'A8i' ],
+
+    'C[0-9]{4,4}!!' => [
+        'C15(04|05|06)!'                            => [ 'Sony', 'Xperia E' ],                          // NanHu
+        'C16(04|05)!'                               => [ 'Sony', 'Xperia E dual' ],                 // NanHu
+        'C19(04|05)!'                               => [ 'Sony', 'Xperia M' ],                          // Nicki
+        'C20(04|05)!'                               => [ 'Sony', 'Xperia M dual' ],                 // Nicki
+        'C21(04|05)!'                               => [ 'Sony', 'Xperia L' ],                          // TaoShan
+        'C23(04|05)!'                               => [ 'Sony', 'Xperia C' ],                          // Pelican
+        'C3602'                                     => [ 'Sony', 'Xperia "C3602"' ],                    // ...
+        'C53(02|03|06)!'                            => [ 'Sony', 'Xperia SP' ],                     // HuaShan
+        'C55(02|03)!'                               => [ 'Sony', 'Xperia ZR' ],                     // Dogo
+        'C65(02|03|06)!'                            => [ 'Sony', 'Xperia ZL' ],                     // Odin
+        'C66(02|03|06|16|33)!'                      => [ 'Sony', 'Xperia Z' ],                          // Yuga
+        'C670[0-9]!'                                => [ 'Sony', 'C670x' ],                         // Itsuki
+        'C68(02|06|33|43)!'                         => [ 'Sony', 'Xperia Z Ultra' ],                    // Togari
+        'C69(02|03|06|43)!'                         => [ 'Sony', 'Xperia Z1' ],                     // Honami
+        'C6916'                                     => [ 'Sony', 'Xperia Z1s' ],                        // Honami
+    ],
+
+    'D[0-9]{4,4}!!' => [
+        'D20(04|05)!'                               => [ 'Sony', 'Xperia E1' ],                     // Falcon
+        'D21(04|05|14)!'                            => [ 'Sony', 'Xperia E1 dual' ],                    // Falcon
+        'D22(02|03|06|43)!'                         => [ 'Sony', 'Xperia E3' ],                     // ...
+        'D22(12)!'                                  => [ 'Sony', 'Xperia E3 dual' ],                    // ...
+        'D23(02|03|05|06)!'                         => [ 'Sony', 'Xperia M2' ],                     // Eagle
+        'D24(03|06)!'                               => [ 'Sony', 'Xperia M2 Aqua' ],                    // ...
+        'D25(02)!'                                  => [ 'Sony', 'Xperia C3 dual' ],                    // ...
+        'D25(33)!'                                  => [ 'Sony', 'Xperia C3' ],                     // ...
+        'D51(02|03|06)!'                            => [ 'Sony', 'Xperia T3' ],                     // Seagull
+        'D53(03|06|16)!'                            => [ 'Sony', 'Xperia T2 Ultra' ],                   // Tianchi
+        'D53(22)!'                                  => [ 'Sony', 'Xperia T2 Ultra dual' ],              // Tianchi
+        'D55(03)!'                                  => [ 'Sony', 'Xperia Z1 Compact' ],             // Amami
+        'D57(88)!'                                  => [ 'Sony', 'Xperia J1 Compact' ],             // ...
+        'D58(03|33)!'                               => [ 'Sony', 'Xperia Z3 Compact' ],             // ...
+        'D65(02|03|43)!'                            => [ 'Sony', 'Xperia Z2' ],                     // Sirius
+        'D65(63)!'                                  => [ 'Sony', 'Xperia Z2a' ],                        // Canopus
+        'D66(03|16|33|43|53)!'                      => [ 'Sony', 'Xperia Z3' ],                     // ...
+        'D66(83)!'                                  => [ 'Sony', 'Xperia Z3 dual' ],                    // ...
+        'D6708'                                     => [ 'Sony', 'Xperia Z3v' ],                        // ...
+    ],
+
+    'E[0-9]{4,4}!!' => [
+        'E20(03|06|53)!'                            => [ 'Sony', 'Xperia E4g' ],
+        'E20(33|43)!'                               => [ 'Sony', 'Xperia E4g dual' ],
+        'E21(04|05)!'                               => [ 'Sony', 'Xperia E4' ],
+        'E21(15|24)!'                               => [ 'Sony', 'Xperia E4 dual' ],
+        'E23(03|06|53)!'                            => [ 'Sony', 'Xperia M4 Aqua' ],
+        'E23(12|33|63)!'                            => [ 'Sony', 'Xperia M4 Aqua dual' ],
+        'E53(03|06|53)!'                            => [ 'Sony', 'Xperia C4' ],
+        'E53(33|43|63)!'                            => [ 'Sony', 'Xperia C4 dual' ],
+        'E55(06|53)!'                               => [ 'Sony', 'Xperia C5 Ultra' ],
+        'E55(33|63)!'                               => [ 'Sony', 'Xperia C5 Ultra dual' ],
+        'E56(03|06|53)!'                            => [ 'Sony', 'Xperia M5' ],
+        'E56(33|43|63)!'                            => [ 'Sony', 'Xperia M5 dual' ],
+        'E58(03|23)!'                               => [ 'Sony', 'Xperia Z5 Compact' ],
+        'E63(33)!'                                  => [ 'Sony', 'Xperia Z3+ dual' ],
+        'E65(08)!'                                  => [ 'Sony', 'Xperia Z4v' ],
+        'E65(33|53)!'                               => [ 'Sony', 'Xperia Z3+' ],
+        'E66(03|46|53)!'                            => [ 'Sony', 'Xperia Z5' ],
+        'E66(33|83)!'                               => [ 'Sony', 'Xperia Z5 dual' ],
+        'E68(53)!'                                  => [ 'Sony', 'Xperia Z5 Premium' ],
+        'E68(33|83)!'                               => [ 'Sony', 'Xperia Z5 Premium dual' ],
+    ],
+
+    'F[0-9]{4,4}!!' => [
+        'F31(11|12|13|15|16)!'                      => [ 'Sony', 'Xperia XA' ],
+        'F32(11|12|13|15|16)!'                      => [ 'Sony', 'Xperia XA Ultra' ],
+        'F33(11|13)!'                               => [ 'Sony', 'Xperia E5' ],
+        'F51(06)!'                                  => [ 'Sony', 'Xperia T3' ],
+        'F51(21|22)!'                               => [ 'Sony', 'Xperia X' ],
+        'F53(21)!'                                  => [ 'Sony', 'Xperia X Compact' ],
+        'F81(31|32)!'                               => [ 'Sony', 'Xperia X Performance' ],
+        'F83(31|32)!'                               => [ 'Sony', 'Xperia XZ' ],
+    ],
+
+    'G[0-9]{4,4}!!' => [
+        'G31(21)!'                                  => [ 'Sony', 'Xperia XA 2' ],
+        // 'G32(21)!'
+        'G82(31|32)!'                               => [ 'Sony', 'Xperia XZs' ],
+    ],
+
+    'E[0-9]{2,2}[a-z]!!' => [
+        'E10(a|i|iv)!'                              => [ 'Sony Ericsson', 'Xperia X10 Mini' ],          // Robyn
+        'E15(a|av|i|iv|i-o)?$!'                     => [ 'Sony Ericsson', 'Xperia X8' ],                // Shakira
+        'E16i!'                                     => [ 'Sony Ericsson', 'W8 Walkman' ],               // Shakira Walkman
+    ],
+
+    'L[0-9]{2,2}[a-z]!!' => [
+        'L35h'                                      => [ 'Sony', 'Xperia ZL' ],                     // Odin
+        'L36h'                                      => [ 'Sony', 'Xperia Z' ],                          // Yuga
+        'L39(h|t|u)!'                               => [ 'Sony', 'Xperia Z1' ],                     // Honami
+        'L50(w|t|u)!'                               => [ 'Sony', 'Xperia Z2' ],                     // Sirius
+        'L55(t|u)!'                                 => [ 'Sony', 'Xperia Z3' ],                     // ...
+    ],
+
+    '(SNM\-)?LT[0-9]{2,2}[a-z]?!!' => [
+        'LT11i!'                                    => [ 'Sony Ericsson', 'Xperia Neo V' ],         // Haida
+        'LT15(a|at|av|i|iv|i-o)?$!'                 => [ 'Sony Ericsson', 'Xperia Arc' ],               // Anzu
+        'LT15i Speed Edition'                       => [ 'Sony Ericsson', 'Xperia Arc' ],               // Anzu
+        'LT18(a|i|iv|i-o)?$!'                       => [ 'Sony Ericsson', 'Xperia Arc S' ],         // Ayame
+        'LT22i!'                                    => [ 'Sony', 'Xperia P' ],                          // Nypon
+        'LT25i!'                                    => [ 'Sony', 'Xperia V' ],                          // Tsubasa
+        '(SNM\-)?LT25c!'                            => [ 'Sony', 'Xperia VC' ],                     // Tsubasa
+        'LT26ii!'                                   => [ 'Sony', 'Xperia SL' ],                     // Nozomi2
+        'LT26(i|i-o)!'                              => [ 'Sony', 'Xperia S' ],                          // Nozomi
+        'LT26w!'                                    => [ 'Sony', 'Xperia Acro S' ],                 // Hikari
+        'LT28(at|h|i)!'                             => [ 'Sony', 'Xperia Ion' ],                        // Aoba
+        'LT29i!'                                    => [ 'Sony', 'Xperia TX' ],                     // Hayabusa
+        'LT30(at)!'                                 => [ 'Sony', 'Xperia TL' ],                     // Mint
+        'LT30(a|p)!'                                => [ 'Sony', 'Xperia T' ],                          // Mint
+    ],
+
+    '(SNM\-)?M[0-9]{2,2}[a-z]!!' => [
+        '(SNM\-)?M35(c|h|t|ts)!'                    => [ 'Sony', 'Xperia SP' ],                     // HuaShan
+        'M36h!'                                     => [ 'Sony', 'Xperia ZR' ],                     // Dogo
+        'M50w!'                                     => [ 'Sony', 'Xperia T3' ],                     // Seagull
+        'M51w!'                                     => [ 'Sony', 'Xperia Z1 Compact' ],             // Amami
+        'M55w!'                                     => [ 'Sony', 'Xperia Z3 Compact' ],             // ...
+    ],
+
+    'MK16(a|i|$)!'                              => [ 'Sony Ericsson', 'Xperia Pro' ],               // Iyokan
+
+    'MT[0-9]{2,2}[a-z]!!' => [
+        'MT11(a|i|iv|i-o)!'                         => [ 'Sony Ericsson', 'Xperia Neo V' ],         // Haida
+        'MT15(a|i|iv|i-o|$)!'                       => [ 'Sony Ericsson', 'Xperia Neo' ],               // Hallon
+        'MT25i!'                                    => [ 'Sony', 'Xperia Neo L' ],                      // Phoenix
+        'MT27i!'                                    => [ 'Sony', 'Xperia Sola' ],                       // Pepper
+    ],
+
+    'R800(a|at|i|iv|x)!'                        => [ 'Sony Ericsson', 'Xperia Play' ],              // Zeus
+
+    'S[0-9]{2,2}[a-z]!!' => [
+        'S36h'                                      => [ 'Sony', 'Xperia L' ],                          // TaoShan
+        'S39h'                                      => [ 'Sony', 'Xperia C' ],                          // CN3
+        'S50h'                                      => [ 'Sony', 'Xperia M2 dual' ],                    // Eagle
+        'S55(t|u)!'                                 => [ 'Sony', 'Xperia C3 dual' ],                    // ...
+    ],
+
+    'SK17(a|i|iv|i-o)!'                         => [ 'Sony Ericsson', 'Xperia Mini Pro' ],          // Mango
+
+    'ST[0-9]{2,2}[a-z]?!!' => [
+        'ST15(a|i)!'                                => [ 'Sony Ericsson', 'Xperia Mini' ],              // Smultron
+        'ST17(a|i)!'                                => [ 'Sony Ericsson', 'Xperia Active' ],            // Satsuma
+        'ST18(a|av|i|iv)?!'                         => [ 'Sony Ericsson', 'Xperia Ray' ],               // Urushi
+        'ST21(a|i|i-o|iv)?$!'                       => [ 'Sony', 'Xperia Tipo' ],                       // Tapioca
+        'ST21(a2|i2)!'                              => [ 'Sony', 'Xperia Tipo Dual' ],                  // Tapioca
+        'ST23(a|i)?!'                               => [ 'Sony', 'Xperia Miro' ],                       // Mesona
+        'ST25(a|i)!'                                => [ 'Sony', 'Xperia U' ],                          // Kumquat
+        'ST26(a|i)?!'                               => [ 'Sony', 'Xperia J' ],                          // JLo
+        'ST27(a|i)!'                                => [ 'Sony', 'Xperia Go' ],                     // Lotus
+    ],
+
+    'U20(a|i|iv)!'                              => [ 'Sony Ericsson', 'Xperia X10 Mini Pro' ],      // Mimmi
+
+    'WT[0-9]{2,2}[a-z]!!' => [
+        'WT18i!'                                    => [ 'Sony Ericsson', 'Walkman' ],                  // Mulberry
+        'WT19(a|i|iv)!'                             => [ 'Sony Ericsson', 'Live with Walkman' ],        // Coconut
+    ],
+
+    'X8'                                        => [ 'Sony Ericsson', 'Xperia X8' ],                // Shakira
+    'X10(a|i|iv|i-o|s)?$!'                      => [ 'Sony Ericsson', 'Xperia X10' ],               // Rachael
+    'X10 ?(Mini ?Pro)$!'                        => [ 'Sony Ericsson', 'Xperia X10 Mini Pro' ],      // Mimmi
+    'X10 ?(Mini)$!'                             => [ 'Sony Ericsson', 'Xperia X10 Mini' ],          // Robyn
+    'XL39h'                                     => [ 'Sony', 'Xperia Z Ultra' ],                    // Togari
+    'XM50h'                                     => [ 'Sony', 'Xperia T2 Ultra dual' ],              // Tianchi
+    'XM50t'                                     => [ 'Sony', 'Xperia T2 Ultra' ],                   // Tianchi
+    'Z1i'                                       => [ 'Sony Ericsson', 'Xperia Play' ],              // Zeus
+
+    'S51SE'                                     => [ 'Sony Ericsson', 'mini S51SE', 'carrier' => 'EMOBILE' ],              // Smultron
+
+    'IS[0-9]{2,2}S!!' => [
+        'IS11S'                                     => [ 'Sony Ericsson', 'Xperia acro IS11S', 'carrier' => 'au' ],              // Akane
+        'IS12S'                                     => [ 'Sony Ericsson', 'Xperia acro HD IS12S', 'carrier' => 'au' ],           // Hayate
+    ],
+
+    'SO-0[0-9][A-Z]!!' => [
+        'SO-01B'                                    => [ 'Sony Ericsson', 'Xperia SO-01B', 'carrier' => 'DoCoMo' ],               // Rachael
+        'SO-01C'                                    => [ 'Sony Ericsson', 'Xperia arc SO-01C', 'carrier' => 'DoCoMo' ],               // Anzu
+        'SO-01D'                                    => [ 'Sony Ericsson', 'Xperia PLAY SO-01D', 'carrier' => 'DoCoMo' ],              // Zeus
+        'SO-01E'                                    => [ 'Sony', 'Xperia AX SO-01E', 'carrier' => 'DoCoMo' ],                     // Tsubasa
+        'SO-01F'                                    => [ 'Sony', 'Xperia Z1 SO-01F', 'carrier' => 'DoCoMo' ],                     // Honami
+        'SO-01G'                                    => [ 'Sony', 'Xperia Z3 SO-01G', 'carrier' => 'DoCoMo' ],                     // ...
+        'SO-01H'                                    => [ 'Sony', 'Xperia Z5 SO-01H', 'carrier' => 'DoCoMo' ],                     // ...
+        'SO-01J'                                    => [ 'Sony', 'Xperia XZ SO-01J', 'carrier' => 'DoCoMo' ],                     // ...
+        'SO-02C'                                    => [ 'Sony Ericsson', 'Xperia acro SO-02C', 'carrier' => 'DoCoMo' ],              // Azusa
+        'SO-02D'                                    => [ 'Sony Ericsson', 'Xperia NX SO-02D', 'carrier' => 'DoCoMo' ],                // Nozomi
+        'SO-02E'                                    => [ 'Sony', 'Xperia Z SO-02E', 'carrier' => 'DoCoMo' ],                          // Yuga
+        'SO-02F'                                    => [ 'Sony', 'Xperia Z1 f SO-02F', 'carrier' => 'DoCoMo' ],                        // Itsuki
+        'SO-02G'                                    => [ 'Sony', 'Xperia Z3 Compact SO-02G', 'carrier' => 'DoCoMo' ],             // ...
+        'SO-02H'                                    => [ 'Sony', 'Xperia Z5 Compact SO-02H', 'carrier' => 'DoCoMo' ],             // ...
+        'SO-02J'                                    => [ 'Sony', 'Xperia X Compact SO-02J', 'carrier' => 'DoCoMo' ],             // ...
+        'SO-03C'                                    => [ 'Sony Ericsson', 'Xperia ray SO-03C', 'carrier' => 'DoCoMo' ],               // Urushi
+        'SO-03D'                                    => [ 'Sony Ericsson', 'Xperia acro HD SO-03D', 'carrier' => 'DoCoMo' ],           // Hikari
+        'SO-03E'                                    => [ 'Sony', 'Xperia Tablet Z SO-03E', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],       // Pollux
+        'SO-03F'                                    => [ 'Sony', 'Xperia Z2 SO-03F', 'carrier' => 'DoCoMo' ],                     // Sirius
+        'SO-03G'                                    => [ 'Sony', 'Xperia Z4 SO-03G', 'carrier' => 'DoCoMo' ],
+        'SO-03H'                                    => [ 'Sony', 'Xperia Z5 Premium SO-03H', 'carrier' => 'DoCoMo' ],
+        'SO-04D'                                    => [ 'Sony', 'Xperia GX SO-04D', 'carrier' => 'DoCoMo' ],                     // Hayabusa
+        'SO-04E'                                    => [ 'Sony', 'Xperia A SO-04E', 'carrier' => 'DoCoMo' ],                          // Dogo
+        'SO-04EM'                                   => [ 'Sony', 'Xperia feat. HATSUNE MIKU SO-04E', 'carrier' => 'DoCoMo' ],
+        'SO-04F'                                    => [ 'Sony', 'Xperia A2 SO-04F', 'carrier' => 'DoCoMo' ],                     // Altair
+        'SO-04G'                                    => [ 'Sony', 'Xperia A4 SO-04G', 'carrier' => 'DoCoMo' ],
+        'SO-04H'                                    => [ 'Sony', 'Xperia X Performance SO-04H', 'carrier' => 'DoCoMo' ],
+        'SO-05D'                                    => [ 'Sony', 'Xperia SX SO-05D', 'carrier' => 'DoCoMo' ],                     // Komachi
+        'SO-05F'                                    => [ 'Sony', 'Xperia Tablet Z2 SO-05F', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],  // Castor
+        'SO-05G'                                    => [ 'Sony', 'Xperia Tablet Z4 SO-05G', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],  // ...
+        'SO-07D'                                    => [ 'Sony', 'SO-07D', DeviceType::TABLET, 'carrier' => 'DoCoMo' ],  // ...
+    ],
+
+    'SO[LTV][0-9]{2,2}!!' => [
+        'SOL21'                                     => [ 'Sony', 'Xperia VL SOL21', 'carrier' => 'au' ],                     // Surf
+        'SOL22'                                     => [ 'Sony', 'Xperia UL SOL22', 'carrier' => 'au' ],                     // Gaga
+        'SOL23'                                     => [ 'Sony', 'Xperia Z1 SOL23', 'carrier' => 'au' ],                     // Honami
+        'SOL24'                                     => [ 'Sony', 'Xperia Z Ultra SOL24', 'carrier' => 'au' ],                    // Togari
+        'SOL25'                                     => [ 'Sony', 'Xperia ZL2 SOL25', 'carrier' => 'au' ],                        // Canopus
+        'SOL26'                                     => [ 'Sony', 'Xperia Z3 SOL26', 'carrier' => 'au' ],                     // ...
+        'SOT21'                                     => [ 'Sony', 'Xperia Tablet Z2 SOT21', DeviceType::TABLET, 'carrier' => 'au' ],  // Castor
+        'SOT31'                                     => [ 'Sony', 'Xperia Tablet Z4 SOT31', DeviceType::TABLET, 'carrier' => 'au' ],  // Castor
+        'SOV31'                                     => [ 'Sony', 'Xperia Z4 SOV31', 'carrier' => 'au' ],                     // ...
+        'SOV32'                                     => [ 'Sony', 'Xperia Z5 SOV32', 'carrier' => 'au' ],                     // ...
+        'SOV33'                                     => [ 'Sony', 'Xperia X Performance SOV33', 'carrier' => 'au' ],                     // ...
+        'SOV34'                                     => [ 'Sony', 'Xperia XZ SOV34', 'carrier' => 'au' ],                     // ...
+    ],
+
+    '40[0-9]SO!!' => [
+        '401SO'                                     => [ 'Sony', 'Xperia Z3 401SO', 'carrier' => 'Softbank' ],                     // ...
+        '402SO'                                     => [ 'Sony', 'Xperia Z4 402SO', 'carrier' => 'Softbank' ],                     // ...
+    ],
+
+    '50[0-9]SO!!' => [
+        '501SO'                                     => [ 'Sony', 'Xperia Z5 501SO', 'carrier' => 'Softbank' ],                     // ...
+        '502SO'                                     => [ 'Sony', 'Xperia X Performance 502SO', 'carrier' => 'Softbank' ],                     // ...
+    ],
+
+    '60[0-9]SO!!' => [
+        '601SO'                                     => [ 'Sony', 'Xperia XZ 601SO', 'carrier' => 'Softbank' ],                     // ...
+    ],
+
+    'Xperia!!' => [
+        'Xperia X1'                                 => [ 'Sony Ericsson', 'Xperia X1' ],
+        'Xperia X8'                                 => [ 'Sony Ericsson', 'Xperia X8' ],                // Shakira
+        'Xperia X10'                                => [ 'Sony Ericsson', 'Xperia X10' ],               // Rachael
+        'Xperia x10 Mini Pro'                       => [ 'Sony Ericsson', 'Xperia X10 Mini Pro' ],      // Mimmi
+        'Xperia Acro S'                             => [ 'Sony', 'Xperia Acro S' ],                 // Hikari
+        'Xperia Active'                             => [ 'Sony Ericsson', 'Xperia Active' ],            // Satsuma
+        'Xperia Arc'                                => [ 'Sony Ericsson', 'Xperia Arc' ],               // Anzu
+        'Xperia Arc (LT15i)'                        => [ 'Sony Ericsson', 'Xperia Arc' ],               // Anzu
+        'Xperia Arc S'                              => [ 'Sony Ericsson', 'Xperia Arc S' ],         // Ayame
+        'Xperia Arc S (LT18i)'                      => [ 'Sony Ericsson', 'Xperia Arc S' ],         // Ayame
+        'Xperia C'                                  => [ 'Sony', 'Xperia C' ],                          // Pelican
+        'Xperia C4 Dual'                            => [ 'Sony', 'Xperia C4' ],
+        'Xperia E'                                  => [ 'Sony', 'Xperia E' ],                          // NanHu
+        'Xperia E dual'                             => [ 'Sony', 'Xperia E dual' ],                 // NanHu
+        'Xperia E3'                                 => [ 'Sony', 'Xperia E3' ],
+        'Xperia Go'                                 => [ 'Sony', 'Xperia Go' ],                     // Lotus
+        'Xperia ion'                                => [ 'Sony', 'Xperia Ion' ],                        // Aoba
+        'Xperia J'                                  => [ 'Sony', 'Xperia J' ],                          // JLo
+        'Xperia L'                                  => [ 'Sony', 'Xperia L' ],                          // TaoShan
+        'Xperia M'                                  => [ 'Sony', 'Xperia M' ],                          // Nicki
+        'XPERIA M2'                                 => [ 'Sony', 'Xperia M2' ],
+        'Xperia M4 Aqua Dual'                       => [ 'Sony', 'Xperia M4 Aqua' ],
+        'Xperia Miro'                               => [ 'Sony', 'Xperia Miro' ],                       // Mesona
+        'Xperia Mini'                               => [ 'Sony Ericsson', 'Xperia Mini' ],              // Smultron
+        'Xperia Mini Pro'                           => [ 'Sony Ericsson', 'Xperia Mini Pro' ],          // Mango
+        'Xperia Neo'                                => [ 'Sony Ericsson', 'Xperia Neo' ],               // Hallon
+        'Xperia NeoV'                               => [ 'Sony Ericsson', 'Xperia Neo V' ],         // Haida
+        'Xperia Neo V!'                             => [ 'Sony Ericsson', 'Xperia Neo V' ],         // Haida
+        'Xperia Neo L'                              => [ 'Sony', 'Xperia Neo L' ],                      // Phoenix
+        'Xperia P'                                  => [ 'Sony', 'Xperia P' ],                          // Nypon
+        'Xperia Play'                               => [ 'Sony Ericsson', 'Xperia Play' ],              // Zeus
+        'Xperia Pro'                                => [ 'Sony Ericsson', 'Xperia Pro' ],               // Iyokan
+        'Xperia Ray'                                => [ 'Sony Ericsson', 'Xperia Ray' ],               // Urushi
+        'Xperia Ray (ST18i)'                        => [ 'Sony Ericsson', 'Xperia Ray' ],               // Urushi
+        'Xperia S'                                  => [ 'Sony', 'Xperia S' ],                          // Nozomi
+        'Xperia SL'                                 => [ 'Sony', 'Xperia SL' ],                     // Nozomi2
+        'Xperia SP'                                 => [ 'Sony', 'Xperia SP' ],                     // HuaShan
+        'Xperia™ SP'                                => [ 'Sony', 'Xperia SP' ],                     // HuaShan
+        'Xperia Sola'                               => [ 'Sony', 'Xperia Sola' ],                       // Pepper
+        'Xperia T'                                  => [ 'Sony', 'Xperia T' ],                          // Mint
+        'Xperia TX'                                 => [ 'Sony', 'Xperia TX' ],                     // Hayabusa
+        'Xperia Tipo'                               => [ 'Sony', 'Xperia Tipo' ],                       // Tapioca
+        'Xperia U'                                  => [ 'Sony', 'Xperia U' ],                          // Kumquat
+        'Xperia V'                                  => [ 'Sony', 'Xperia V' ],                          // Tsubasa
+        'Xperia.X8'                                 => [ 'Sony Ericsson', 'Xperia X8' ],                // Shakira
+        'Xperia X10 Mini'                           => [ 'Sony Ericsson', 'Xperia X10 Mini' ],          // Robyn
+        'Xperia Z'                                  => [ 'Sony', 'Xperia Z' ],                          // Yuga
+        'Xperia Z (AOSP)'                           => [ 'Sony', 'Xperia Z' ],                          // Yuga
+        'Xperia Z Ultra'                            => [ 'Sony', 'Xperia Z Ultra' ],                    // Togari
+        'Xperia Z Ultra (AOSP)'                     => [ 'Sony', 'Xperia Z Ultra' ],                    // Togari
+        'Xperia ZL'                                 => [ 'Sony', 'Xperia ZL' ],                     // Odin
+        'Xperia ZR'                                 => [ 'Sony', 'Xperia ZR' ],                     // Dogo
+        'Xperia Z1'                                 => [ 'Sony', 'Xperia Z1' ],                     // Honami
+        'Xperia Z1 V3'                              => [ 'Sony', 'Xperia Z1' ],                     // Honami
+        'Xperia Z1 Compact'                         => [ 'Sony', 'Xperia Z1 Compact' ],             // Amami
+        'Xperia Z2'                                 => [ 'Sony', 'Xperia Z2' ],                     // Sirius
+        'Xperia Z3'                                 => [ 'Sony', 'Xperia Z3' ],                     // ...
+        'Xperia Z3 Dual'                            => [ 'Sony', 'Xperia Z3' ],                     // ...
+        'Xperia Z3+'                                => [ 'Sony', 'Xperia Z3+' ],                     // ...
+        'XPERIA Z3 Compact'                         => [ 'Sony', 'Xperia Z3 Compact' ],
+        'Xperia Z3C'                                => [ 'Sony', 'Xperia Z3 Compact' ],
+        'XPERIA Z4'                                 => [ 'Sony', 'Xperia Z4' ],                     // ...
+        'Xperia Z4 Xtreme'                          => [ 'Sony', 'Xperia Z4' ],                     // ...
+        'Xperia-Z'                                  => [ 'Sony', 'Xperia Z' ],                          // Yuga
+        'Xperia-Z1'                                 => [ 'Sony', 'Xperia Z1' ],                     // Honami
+        'Xperia™ C'                                 => [ 'Sony', 'Xperia C' ],                          // Pelican
+        'Xperia™ ZL39H'                             => [ 'Sony', 'Xperia Z Ultra' ],                    // Togari
+        'Xperia™ Miku'                              => [ 'Sony', 'Xperia Feat. Hatsune Miku' ],     // Dogo
+        'Xperia Tablet S'                           => [ 'Sony', 'Xperia Tablet S', DeviceType::TABLET ],
+        'Xperia Live with Walkman'                  => [ 'Sony Ericsson', 'Live with Walkman' ],        // Coconut
+        'Xperia Tablet Z'                           => [ 'Sony', 'Xperia Tablet Z', DeviceType::TABLET ],
+        'Xperia Tablet Z LTE'                       => [ 'Sony', 'Xperia Tablet Z', DeviceType::TABLET ],
+        'Xperia Tablet Z Wi-Fi'                     => [ 'Sony', 'Xperia Tablet Z', DeviceType::TABLET ],
+        'Xperia Tablet Z WiFi'                      => [ 'Sony', 'Xperia Tablet Z', DeviceType::TABLET ],
+        'Xperia Z2 Tablet Wifi'                     => [ 'Sony', 'Xperia Tablet Z2', DeviceType::TABLET ],
+    ],
+
+    'Sony Xperia Ray'                           => [ 'Sony Ericsson', 'Xperia Ray' ],               // Urushi
+    'SonyEricssonMT15'                          => [ 'Sony Ericsson', 'Xperia Neo' ],               // Hallon
+    'SonyEricssonST15'                          => [ 'Sony Ericsson', 'Xperia Mini' ],              // Smultron
+    'Live ?With ?Walkman!'                      => [ 'Sony Ericsson', 'Live with Walkman' ],        // Coconut
+    'Arc'                                       => [ 'Sony Ericsson', 'Xperia Arc' ],               // Anzu
+    'Arc S'                                     => [ 'Sony Ericsson', 'Xperia Arc S' ],         // Ayame
+    'Neo V'                                     => [ 'Sony Ericsson', 'Xperia Neo V' ],         // Haida
+    'Hayabusa'                                  => [ 'Sony', 'Xperia GX or TX' ],                   // Hayabusa
+    'Nozomi'                                    => [ 'Sony', 'Xperia S' ],                          // Nozomi
+    'pepper'                                    => [ 'Sony', 'Xperia Sola' ],                       // Pepper
+    'Tablet P'                                  => [ 'Sony', 'Tablet P', DeviceType::TABLET ],
+    'Tablet S'                                  => [ 'Sony', 'Tablet S', DeviceType::TABLET ],
+
+    'SGP[ST0-9][0-9]{2,2}!!' => [
+        'SGPS(21)!'                                 => [ 'Sony', 'Xperia Tablet Z2', DeviceType::TABLET ],
+        'SGPT(12|13)!'                              => [ 'Sony', 'Xperia Tablet S', DeviceType::TABLET ],
+        'SGP3(11|12|21|41|51)!'                     => [ 'Sony', 'Xperia Tablet Z', DeviceType::TABLET ],
+        'SGP4(12)!'                                 => [ 'Sony', 'Xperia Tablet Z Ultra', DeviceType::TABLET ],
+        'SGP5(11|12|21|41|51|61)!'                  => [ 'Sony', 'Xperia Tablet Z2', DeviceType::TABLET ],  // Castor
+        'SGP6(11|12|21|41)!'                        => [ 'Sony', 'Xperia Tablet Z3 Compact', DeviceType::TABLET ],
+        'SGP7(12|71)!'                              => [ 'Sony', 'Xperia Tablet Z4', DeviceType::TABLET ],
+    ],
+
+    'NWZ?-Z1000Series!'                         => [ 'Sony', 'Walkman Z', DeviceType::MEDIA ],
+
+    'NSZ-G[A-Z][0-9]!!' => [
+        'NSZ-GP9'                                   => [ 'Sony', 'NSZ-GP9', DeviceType::TELEVISION, Flag::GOOGLETV ],
+        'NSZ-GS7'                                   => [ 'Sony', 'NSZ-GS7', DeviceType::TELEVISION, Flag::GOOGLETV ],
+        'NSZ-GS8'                                   => [ 'Sony', 'NSZ-GS8', DeviceType::TELEVISION, Flag::GOOGLETV ],
+        'NSZ-GT1'                                   => [ 'Sony', 'NSZ-GT1', DeviceType::TELEVISION, Flag::GOOGLETV ],
+        'NSZ-GU1'                                   => [ 'Sony', 'BRAVIA Smart Stick NSZ-GU1', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    ],
+
+    'beetle'                                    => [ 'Sony', 'NSZ-GS7', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'magi'                                      => [ 'Sony', 'BRAVIA Smart Stick NSZ-GU1', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'Internet TV'                               => [ 'Sony', 'Internet TV', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'Internet TV Box'                           => [ 'Sony', 'Internet TV', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'BRAVIA'                                    => [ 'Sony', 'Bravia W80', DeviceType::TELEVISION ],
+    'PRS-T1'                                    => [ 'Sony', 'Reader PRS-T1', DeviceType::EREADER ],
+    'SpeedUp S3'                                => [ 'SpeedUp', 'Tab S3', DeviceType::TABLET ],
+
+    '(CSL[- ])?(Spice[- ]?)?Mi(-| )?[0-9]{3,3}!!' => [
+        'Spice Mi-270'                              => [ 'Spice', 'Mi-270' ],
+        'Spice Mi280'                               => [ 'Spice', 'Mi-280' ],
+        'SPICE-MI280'                               => [ 'Spice', 'Mi-280' ],
+        'SPICE Mi-285'                              => [ 'Spice', 'Mi-285 Stellar' ],
+        'Spice Mi300'                               => [ 'Spice', 'Mi-300' ],
+        'CSL Spice MI300'                           => [ 'Spice', 'Mi-300' ],
+        'Spice Mi-310'                              => [ 'Spice', 'Mi-310' ],
+        'Mi320'                                     => [ 'Spice', 'Mi-320' ],
+        'Spice Mi-320'                              => [ 'Spice', 'Mi-320' ],
+        'Mi-347'                                    => [ 'Spice', 'Mi-347' ],
+        'Spice Mi-349'                              => [ 'Spice', 'Mi-349 Smart Flo Edge' ],
+        'Spice Mi-350!'                             => [ 'Spice', 'Mi-350' ],
+        'CSL-MI350'                                 => [ 'Spice', 'Mi-350' ],
+        'Spice Mi-351'                              => [ 'Spice', 'Mi-351 Smart Flo' ],
+        'Spice MI352'                               => [ 'Spice', 'Mi-352 Stellar Xtacy' ],
+        'Spice MI-352'                              => [ 'Spice', 'Mi-352 Stellar Xtacy' ],
+        'Spice MI-353'                              => [ 'Spice', 'Mi-353 Stellar Jazz' ],
+        'Spice Mi-354'                              => [ 'Spice', 'Mi-354 Smart Flo Space' ],
+        'Spice Mi-355'                              => [ 'Spice', 'Mi-355 Stellar Craze' ],
+        'MI-355'                                    => [ 'Spice', 'Mi-355 Stellar Craze' ],
+        'MI355'                                     => [ 'Spice', 'Mi-355 Stellar Craze' ],
+        'Mi-356'                                    => [ 'Spice', 'Mi-356 Smart Flo Mettle 3.5X' ],
+        'Spice Mi-358'                              => [ 'Spice', 'Mi-358 Smart Flo' ],
+        'Spice Mi-359'                              => [ 'Spice', 'Mi-359 Smart Flo' ],
+        'Spice Mi-359 3G'                           => [ 'Spice', 'Mi-359 Smart Flo' ],
+        'Mi-360'                                    => [ 'Spice', 'Mi-360 Stellar' ],
+        'Spice Mi-361'                              => [ 'Spice', 'Mi-361 Stellar' ],
+        'Mi363'                                     => [ 'Spice', 'Mi-363 Switch Star Neo' ],
+        'Spice Mi-405'                              => [ 'Spice', 'Mi-405 Stellar' ],
+        'Mi406'                                     => [ 'Spice', 'Mi-406 Switch Pluto' ],
+        'SPICE-Mi 407'                              => [ 'Spice', 'Mi-407' ],
+        'CSL-MI410'                                 => [ 'Spice', 'Mi-410' ],
+        'Spice MI410'                               => [ 'Spice', 'Mi-410' ],
+        'Spice Mi 415'                              => [ 'Spice', 'Mi-415' ],
+        'Spice Mi-422'                              => [ 'Spice', 'Mi-422 Smart Flo Pace' ],
+        'Mi-423'                                    => [ 'Spice', 'Mi-423 Smart Flo Ivory 2' ],
+        'Spice Mi-424'                              => [ 'Spice', 'Mi-424 Stellar' ],
+        'Spice Mi-425'                              => [ 'Spice', 'Mi-425 Stellar' ],
+        'Mi-426'                                    => [ 'Spice', 'Mi-426 Smart Flo Mettle 4X' ],
+        'Spice Mi-430'                              => [ 'Spice', 'Mi-430 Stellar' ],
+        'Spice Mi-431'                              => [ 'Spice', 'Mi-431 Stellar' ],
+        'Spice Mi-435'                              => [ 'Spice', 'Mi-435 Stellar Nhance' ],
+        'Spice Mi-436'                              => [ 'Spice', 'Mi-436 Stellar Glamour' ],
+        'Spice Mi-437'                              => [ 'Spice', 'Mi-437 Stellar Nhance 2' ],
+        'Mi438'                                     => [ 'Spice', 'Mi-438 Stellar Glide' ],
+        'MI-438'                                    => [ 'Spice', 'Mi-438 Stellar Glide' ],
+        'Mi-439'                                    => [ 'Spice', 'Mi-439 Stellar' ],
+        'SpiceMi441'                                => [ 'Spice', 'Mi-441 Stellar' ],
+        'Spice Mi-445'                              => [ 'Spice', 'Mi-445 Stellar' ],
+        'SpiceMi-449'                               => [ 'Spice', 'Mi-449 Stellar' ],
+        'Spice Mi-449 3G'                           => [ 'Spice', 'Mi-449 Stellar' ],
+        'Spice Mi-450'                              => [ 'Spice', 'Mi-450 Smart Flo Ivory' ],
+        'Spice Mi-451'                              => [ 'Spice', 'Mi-451 Smart Flo Poise' ],
+        'Spice Mi-451 3G'                           => [ 'Spice', 'Mi-451 Smart Flo Poise' ],
+        'Mi-491'                                    => [ 'Spice', 'Mi-491 Stellar Virtuoso Pro' ],
+        'Spice Mi-492'                              => [ 'Spice', 'Mi-492 Stellar Virtuoso Pro+' ],
+        'Spice Mi-495'                              => [ 'Spice', 'Mi-495 Stellar Virtuoso' ],
+        'Spice Mi-496'                              => [ 'Spice', 'Mi-496 Coolpad 2' ],
+        'Spice Mi-497'                              => [ 'Spice', 'Mi-497 Stellar' ],
+        'Spice Mi-498'                              => [ 'Spice', 'Mi-498 Dream Uno' ],
+        'Spice Mi-498H'                             => [ 'Spice', 'Mi-498 Dream Uno' ],
+        'Mi-498 Dream Uno'                          => [ 'Spice', 'Mi-498 Dream Uno' ],
+        'Spice Mi-500'                              => [ 'Spice', 'Mi-500 Stellar Horizon' ],
+        'Mi501'                                     => [ 'Spice', 'Mi-501 Switch Mercury' ],
+        'Spice Mi-501'                              => [ 'Spice', 'Mi-501 Switch Mercury' ],
+        'Spice Mi 502'                              => [ 'Spice', 'Mi-502 Smart Flo Pace2' ],
+        'Spice Mi-502'                              => [ 'Spice', 'Mi-502 Smart Flo Pace2' ],
+        'Spice Mi-502n'                             => [ 'Spice', 'Mi-502 Smart Flo Pace2' ],
+        'SpiceMI502'                                => [ 'Spice', 'Mi-502 Smart Flo Pace2' ],
+        'Mi-503'                                    => [ 'Spice', 'Mi-503 Stellar' ],
+        'Spice Mi-504'                              => [ 'Spice', 'Mi-504 Smart Flo Mettle 5X' ],
+        'Spice Mi-505'                              => [ 'Spice', 'Mi-505 Stellar Horizon Pro' ],
+        'Spice Mi-506'                              => [ 'Spice', 'Mi-506 Stellar Mettle Icon' ],
+        'Spice Mi-507'                              => [ 'Spice', 'Mi-507 Stellar' ],
+        'Mi-508'                                    => [ 'Spice', 'Mi-508 Stellar' ],
+        'MI-509'                                    => [ 'Spice', 'Mi-509 Stellar' ],
+        'SpiceMI-509'                               => [ 'Spice', 'Mi-509 Stellar' ],
+        'SpiceMi-511'                               => [ 'Spice', 'Mi-511' ],
+        'Spice Mi-514'                              => [ 'Spice', 'Mi-514' ],
+        'Spice Mi-515'                              => [ 'Spice', 'Mi-515 Coolpad' ],
+        'Mi-516'                                    => [ 'Spice', 'Mi-516 Stellar' ],
+        'SpiceMi517'                                => [ 'Spice', 'Mi-517' ],
+        'Spice Mi-518'                              => [ 'Spice', 'Mi-518 Stellar' ],
+        'Spice Mi-519'                              => [ 'Spice', 'Mi-519 Stellar' ],
+        'SpiceMI-520'                               => [ 'Spice', 'Mi-520 Stellar' ],
+        'SpiceMI-520N'                              => [ 'Spice', 'Mi-520 Stellar' ],
+        'Spice Mi-524'                              => [ 'Spice', 'Mi-524 Stellar' ],
+        'Spice Mi-525'                              => [ 'Spice', 'Mi-525 Stellar Pinnacle FHD' ],
+        'Spice Mi-526'                              => [ 'Spice', 'Mi-526 Stellar' ],
+        'Spice Mi-526n'                             => [ 'Spice', 'Mi-526N Stellar' ],
+        'Spice Mi-530'                              => [ 'Spice', 'Mi-530 Stellar Pinnacle' ],
+        'Mi530'                                     => [ 'Spice', 'Mi-530 Stellar Pinnacle' ],
+        'Mi531'                                     => [ 'Spice', 'Mi-531' ],
+        'Spice Mi-535'                              => [ 'Spice', 'Mi-535 Stellar Pinnacle Pro' ],
+        'Spice Mi-549'                              => [ 'Spice', 'Mi-549' ],
+        'Spice Mi-550'                              => [ 'Spice', 'Mi-550 Pinnacle Stylus' ],
+        'Spice Mi-551'                              => [ 'Spice', 'Mi-551' ],
+        'Mi-600'                                    => [ 'Spice', 'Mi-600 Stellar' ],
+        'CSL Spice MI700'                           => [ 'Spice', 'Mi-700', DeviceType::TABLET ],
+        'Spice-MI-710'                              => [ 'Spice', 'Mi-710', DeviceType::TABLET ],
+        'SPICE Mi-720'                              => [ 'Spice', 'Mi-720 Tab', DeviceType::TABLET ],
+        'Spice Mi-725'                              => [ 'Spice', 'Mi-725 Stellar Slatepad', DeviceType::TABLET ],
+        'Mi730'                                     => [ 'Spice', 'Mi-730 Tab', DeviceType::TABLET ],
+        'Spice Mi-730'                              => [ 'Spice', 'Mi-730 Tab', DeviceType::TABLET ],
+        'Spice Mi-740'                              => [ 'Spice', 'Mi-740', DeviceType::TABLET ],
+        'SpiceMi1010'                               => [ 'Spice', 'Mi-1010 Stellar Pad', DeviceType::TABLET ],
+    ],
+
+    'Spice N-300'                               => [ 'Spice', 'Buddy N300' ],
+    'Spice N-500'                               => [ 'Spice', 'Communicator N500' ],
+
+    'Xlife-348E+'                               => [ 'Spice', 'Xlife 348E+' ],
+    'Xlife-350'                                 => [ 'Spice', 'Xlife 350' ],
+    'Xlife-364 3G+'                             => [ 'Spice', 'Xlife 364' ],
+    'Xlife-405'                                 => [ 'Spice', 'Xlife 405' ],
+    'Xlife-410 3G'                              => [ 'Spice', 'Xlife 410' ],
+    'Xlife-415'                                 => [ 'Spice', 'Xlife 415' ],
+    'Spice Xlife-425 3G'                        => [ 'Spice', 'Xlife 425' ],
+    'Xlife-431Q'                                => [ 'Spice', 'Xlife 431Q' ],
+    'Xlife-431Q Lite'                           => [ 'Spice', 'Xlife 431Q Lite' ],
+    'Spice Xlife-435Q'                          => [ 'Spice', 'Xlife 435Q' ],
+    'Spice Xlife-451Q'                          => [ 'Spice', 'Xlife 451Q' ],
+    'Xlife-480q'                                => [ 'Spice', 'Xlife 480Q' ],
+    'Xlife-481q'                                => [ 'Spice', 'Xlife 481Q' ],
+    'Xlife-482q'                                => [ 'Spice', 'Xlife 482Q' ],
+    'Spice-Xlife-511Pro'                        => [ 'Spice', 'Xlife 511 Pro' ],
+    'Spice Xlife-512'                           => [ 'Spice', 'Xlife 512' ],
+    'Xlife-514Q'                                => [ 'Spice', 'Xlife 514Q' ],
+    'Xlife-515Q'                                => [ 'Spice', 'Xlife 515Q' ],
+    'Spice Xlife-520HD'                         => [ 'Spice', 'Xlife 520 HD' ],
+    'Spice Xlife-M5+'                           => [ 'Spice', 'Xlife M5+' ],
+    'Xlife-M5q+'                                => [ 'Spice', 'Xlife M5q+' ],
+    'Xlife-M44Q'                                => [ 'Spice', 'Xlife M44q' ],
+    'Spice Xlife-M45q'                          => [ 'Spice', 'Xlife M45q' ],
+    'Spice Xlife-M46q'                          => [ 'Spice', 'Xlife M46q' ],
+    'Xlife-Electro55HD'                         => [ 'Spice', 'Xlife Electro 55 HD' ],
+    'Xlife-Ezy'                                 => [ 'Spice', 'Xlife Ezy' ],
+    'Spice Xlife-Proton4'                       => [ 'Spice', 'Xlife Proton 4' ],
+    'Xlife-Victor4'                             => [ 'Spice', 'Xlife Victor 4' ],
+
+    'Spice Xplor-Proton5'                       => [ 'Spice', 'Xplor Proton 5' ],
+
+    'A5000'                                     => [ 'Star', 'A5000' ],
+    'A7272+'                                    => [ 'Star', 'A7272+' ],
+    'I9300'                                     => [ 'Star', 'I9300' ],
+    'N710'                                      => [ 'Star', 'N710' ],
+    'e1808 v75!'                                => [ 'Star', 'N8000' ],
+    'Star N8000'                                => [ 'Star', 'N8000' ],
+    'Star N9500'                                => [ 'Star', 'N9500' ],
+    'Star N9589'                                => [ 'Star', 'N9589' ],
+    'N9600'                                     => [ 'Star', 'N9600' ],
+    'Star Q9000'                                => [ 'Star', 'Q9000' ],
+    'S5'                                        => [ 'Star', 'S5' ],
+    'STAR S5'                                   => [ 'Star', 'S5' ],
+    'STAR S7589'                                => [ 'Star', 'S7589' ],
+    'V1277'                                     => [ 'Star', 'V1277' ],
+    'e1109 v73!'                                => [ 'Star', 'X18i' ],
+
+    'Starmobile!!' => [
+        'Starmobile ASTRA'                          => [ 'Starmobile', 'Astra' ],
+        'Starmobile CRYSTAL'                        => [ 'Starmobile', 'Crystal' ],
+        'Starmobile DIAMOND'                        => [ 'Starmobile', 'Diamond' ],
+        'Starmobile DIAMOND D3'                     => [ 'Starmobile', 'Diamond D3' ],
+        'Starmobile Diamond S1'                     => [ 'Starmobile', 'Diamond S1' ],
+        'Starmobile Diamond S2'                     => [ 'Starmobile', 'Diamond S2' ],
+        'Starmobile DIAMOND V3'                     => [ 'Starmobile', 'Diamond V3' ],
+        'Starmobile Diamond X1'                     => [ 'Starmobile', 'Diamond X1' ],
+        'Starmobile ENERGY'                         => [ 'Starmobile', 'Energy' ],
+        'Starmobile ENGAGE'                         => [ 'Starmobile', 'Engage' ],
+        'Starmobile Engage7 3G'                     => [ 'Starmobile', 'Engage 7' ],
+        'Starmobile ENGAGE 9i'                      => [ 'Starmobile', 'Engage 9i' ],
+        'Starmobile FLIRT'                          => [ 'Starmobile', 'Flirt' ],
+        'Starmobile GOAL'                           => [ 'Starmobile', 'Goal' ],
+        'Starmobile Hit'                            => [ 'Starmobile', 'Hit' ],
+        'Starmobile JUMP'                           => [ 'Starmobile', 'Jump' ],
+        'Starmobile KNIGHT'                         => [ 'Starmobile', 'Knight' ],
+        'Starmobile Knight Vision'                  => [ 'Starmobile', 'Knight Vision' ],
+        'Starmobile Like'                           => [ 'Starmobile', 'Like' ],
+        'Starmobile MUSE'                           => [ 'Starmobile', 'Muse' ],
+        'Starmobile NAVI'                           => [ 'Starmobile', 'Navi' ],
+        'Starmobile OCTA'                           => [ 'Starmobile', 'Octa' ],
+        'Starmobile PLAY'                           => [ 'Starmobile', 'Play' ],
+        'Starmobile PLAY Click'                     => [ 'Starmobile', 'Play Click' ],
+        'Starmobile PLAY Max'                       => [ 'Starmobile', 'Play Max' ],
+        'Starmobile Play Neo'                       => [ 'Starmobile', 'Play Neo' ],
+        'Starmobile Play Spark'                     => [ 'Starmobile', 'Play Spark' ],
+        'Starmobile QUEST'                          => [ 'Starmobile', 'Quest' ],
+        'Starmobile UP'                             => [ 'Starmobile', 'Up' ],
+        'Starmobile UP Max'                         => [ 'Starmobile', 'Up Max' ],
+        'Starmobile VIDA'                           => [ 'Starmobile', 'Vida' ],
+    ],
+
+    'DIAMOND D1'                                => [ 'Starmobile', 'Diamond D1' ],
+    'DIAMOND S3'                                => [ 'Starmobile', 'Diamond S3' ],
+    'ROAR'                                      => [ 'Starmobile', 'Roar' ],
+
+    '(Starway )?Andromeda!!' => [
+        'Starway Andromeda S705'                    => [ 'Starway', 'Andromeda S705', DeviceType::TABLET ],
+        'Andromeda S707'                            => [ 'Starway', 'Andromeda S707', DeviceType::TABLET ],
+        'Andromeda S770'                            => [ 'Starway', 'Andromeda S770', DeviceType::TABLET ],
+        'Andromeda S840'                            => [ 'Starway', 'Andromeda S840', DeviceType::TABLET ],
+        'Andromeda S845'                            => [ 'Starway', 'Andromeda S840', DeviceType::TABLET ],
+        'STARWAY Andromeda S900'                    => [ 'Starway', 'Andromeda S900', DeviceType::TABLET ],
+        'Starway Andromeda S910'                    => [ 'Starway', 'Andromeda S910', DeviceType::TABLET ],
+        'Andromeda S910'                            => [ 'Starway', 'Andromeda S910', DeviceType::TABLET ],
+        'Andromeda S940'                            => [ 'Starway', 'Andromeda S940', DeviceType::TABLET ],
+    ],
+
+    'STX!!' => [
+        'STX EVO'                                   => [ 'Stonex', 'STX Evo' ],
+        'STX Mini'                                  => [ 'Stonex', 'STX Mini' ],
+        'STX MINI 2'                                => [ 'Stonex', 'STX Mini 2' ],
+        'STX ULTRA'                                 => [ 'Stonex', 'STX Ultra' ],
+        'STX ULTRA 2'                               => [ 'Stonex', 'STX Ultra 2' ],
+    ],
+
+    'Scroll!!' => [
+        'Scroll Engage'                             => [ 'Storage Options', 'Scroll Engage', DeviceType::TABLET ],
+        'Scroll Essential'                          => [ 'Storage Options', 'Scroll Essential', DeviceType::TABLET ],
+        'Scroll Essential II'                       => [ 'Storage Options', 'Scroll Essential 2', DeviceType::TABLET ],
+        'Scroll Evoke'                              => [ 'Storage Options', 'Scroll Evoke', DeviceType::TABLET ],
+        'Scroll Excel'                              => [ 'Storage Options', 'Scroll Excel', DeviceType::TABLET ],
+        'Scroll Excel 2'                            => [ 'Storage Options', 'Scroll Excel 2', DeviceType::TABLET ],
+        'Scroll Extreme'                            => [ 'Storage Options', 'Scroll Extreme', DeviceType::TABLET ],
+        'Scroll Tablet'                             => [ 'Storage Options', 'Scroll Tablet', DeviceType::TABLET ],
+        'Scroll Tablet PC'                          => [ 'Storage Options', 'Scroll Tablet PC', DeviceType::TABLET ],
+    ],
+
+    'eZee!!' => [
+        'eZee\'Tab10c'                              => [ 'Storex', 'eZee\'Tab 10c', DeviceType::TABLET ],
+        'eZee\'Tab702'                              => [ 'Storex', 'eZee\'Tab 702', DeviceType::TABLET ],
+        'eZee\' Tab702'                             => [ 'Storex', 'eZee\'Tab 702', DeviceType::TABLET ],
+        'eZee\'Tab703'                              => [ 'Storex', 'eZee\'Tab 703', DeviceType::TABLET ],
+        'eZee\'Tab705'                              => [ 'Storex', 'eZee\'Tab 705', DeviceType::TABLET ],
+        'eZee\'TAB706'                              => [ 'Storex', 'eZee\'Tab 706', DeviceType::TABLET ],
+        'eZee\'TAB707'                              => [ 'Storex', 'eZee\'Tab 707', DeviceType::TABLET ],
+        'eZee\'Tab709'                              => [ 'Storex', 'eZee\'Tab 709', DeviceType::TABLET ],
+        'eZee\'Tab785'                              => [ 'Storex', 'eZee\'Tab 785', DeviceType::TABLET ],
+        'eZee\'Tab785D11-S'                         => [ 'Storex', 'eZee\'Tab 785', DeviceType::TABLET ],
+        'eZee\'Tab785Q11-M'                         => [ 'Storex', 'eZee\'Tab 785', DeviceType::TABLET ],
+        'eZee\'Tab802'                              => [ 'Storex', 'eZee\'Tab 802', DeviceType::TABLET ],
+        'eZee\'Tab803'                              => [ 'Storex', 'eZee\'Tab 803', DeviceType::TABLET ],
+        'eZee\'Tab804'                              => [ 'Storex', 'eZee\'Tab 804', DeviceType::TABLET ],
+        'eZee Tab805'                               => [ 'Storex', 'eZee\'Tab 805', DeviceType::TABLET ],
+        'Ezee\'TAB901'                              => [ 'Storex', 'eZee\'Tab 901', DeviceType::TABLET ],
+        'eZee\'Tab903'                              => [ 'Storex', 'eZee\'Tab 903', DeviceType::TABLET ],
+        'eZee\'Tab904'                              => [ 'Storex', 'eZee\'Tab 904', DeviceType::TABLET ],
+        'eZee Tab973'                               => [ 'Storex', 'eZee\'Tab 973', DeviceType::TABLET ],
+        'eZee\'TAB973'                              => [ 'Storex', 'eZee\'Tab 973', DeviceType::TABLET ],
+        'eZee\'Tab1001'                             => [ 'Storex', 'eZee\'Tab 1001', DeviceType::TABLET ],
+        'EzeeTab\'1001'                             => [ 'Storex', 'eZee\'Tab 1001', DeviceType::TABLET ],
+        'eZeeTab1003'                               => [ 'Storex', 'eZee\'Tab 1003', DeviceType::TABLET ],
+        'eZee\'Tab1004'                             => [ 'Storex', 'eZee\'Tab 1004', DeviceType::TABLET ],
+        'eZee\' Tab10010-S'                         => [ 'Storex', 'eZee\'Tab 10010s', DeviceType::TABLET ],
+        'eZeeTab7c2'                                => [ 'Storex', 'eZee\'Tab 7c2', DeviceType::TABLET ],
+        'eZeeTab7c5'                                => [ 'Storex', 'eZee\'Tab 7c5', DeviceType::TABLET ],
+        'eZee\'Tab7D10-S'                           => [ 'Storex', 'eZee\'Tab 7d10s', DeviceType::TABLET ],
+        'eZee\'TAB7D12-S'                           => [ 'Storex', 'eZee\'Tab 7d12s', DeviceType::TABLET ],
+        'eZee\'Tab7D13-S'                           => [ 'Storex', 'eZee\'Tab 7d13s', DeviceType::TABLET ],
+        'eZee\'Tab7D14-S'                           => [ 'Storex', 'eZee\'Tab 7d14s', DeviceType::TABLET ],
+        'eZeeTab7D15-M'                             => [ 'Storex', 'eZee\'Tab 7d15s', DeviceType::TABLET ],
+        'eZee\'tab7Q12-S'                           => [ 'Storex', 'eZee\'Tab 7q12s', DeviceType::TABLET ],
+        'eZee\'Tab785D12-S'                         => [ 'Storex', 'eZee\'Tab 785d12s', DeviceType::TABLET ],
+        'eZee\'Tab8D11-S'                           => [ 'Storex', 'eZee\'Tab 8d11s', DeviceType::TABLET ],
+        'eZee\'Tab97D11-S'                          => [ 'Storex', 'eZee\'Tab 97d11s', DeviceType::TABLET ],
+        'eZee\'Tab10D11-M'                          => [ 'Storex', 'eZee\'Tab 10d11m', DeviceType::TABLET ],
+        'eZee\'tab10D12-S'                          => [ 'Storex', 'eZee\'Tab 10d12s', DeviceType::TABLET ],
+        'eZee\'Tab13Q10-M'                          => [ 'Storex', 'eZee\'Tab 13q10m', DeviceType::TABLET ],
+    ],
+
+    'STOREX LinkBox'                            => [ 'Storex', 'LinkBox', DeviceType::TELEVISION ],
+
+    'SRT!!' => [
+        'SRT AN4'                                   => [ 'Strong', 'SRT AN4', DeviceType::TELEVISION ],
+        'SRT AN4M'                                  => [ 'Strong', 'SRT AN4M', DeviceType::TELEVISION ],
+    ],
+
+    'Cyclone!!' => [
+        'Cyclone Explorer'                          => [ 'Sumvision', 'Cyclone Explorer', DeviceType::TABLET ],
+        'CYCLONE EXPLORER II'                       => [ 'Sumvision', 'Cyclone Explorer 2', DeviceType::TABLET ],
+        'cyclone Titan'                             => [ 'Sumvision', 'Cyclone Titan', DeviceType::TABLET ],
+        'Cyclone Voyager'                           => [ 'Sumvision', 'Cyclone Voyager', DeviceType::TABLET ],
+        'Cyclone Voyager 2'                         => [ 'Sumvision', 'Cyclone Voyager 2', DeviceType::TABLET ],
+    ],
+
+    'M1001'                                     => [ 'Superpad', 'M1001', DeviceType::TABLET ],
+
+    'SC-!!' => [
+        'SC-71MID'                                  => [ 'Supersonic', 'Matrix SC-71MID', DeviceType::TABLET ],
+        'SC-72J'                                    => [ 'Supersonic', 'Matrix SC-72J', DeviceType::TABLET ],
+        'SC-72JB'                                   => [ 'Supersonic', 'Matrix SC-72JB', DeviceType::TABLET ],
+        'SC-72JB Fast'                              => [ 'Supersonic', 'Matrix SC-72JB', DeviceType::TABLET ],
+        'SC-72MID'                                  => [ 'Supersonic', 'Matrix SC-72MID', DeviceType::TABLET ],
+        'SC-74JB'                                   => [ 'Supersonic', 'Matrix SC-74JB', DeviceType::TABLET ],
+        'SC-75MID'                                  => [ 'Supersonic', 'Matrix SC-75MID', DeviceType::TABLET ],
+        'SC-90JB'                                   => [ 'Supersonic', 'Matrix SC-90JB', DeviceType::TABLET ],
+        'SC-90MID'                                  => [ 'Supersonic', 'Matrix SC-90MID', DeviceType::TABLET ],
+        'SC-91JB'                                   => [ 'Supersonic', 'Matrix SC-91JB', DeviceType::TABLET ],
+        'SC-91MID'                                  => [ 'Supersonic', 'Matrix SC-91MID', DeviceType::TABLET ],
+    ],
+
+    'SUGAR ([A-Z][0-9]?(?: Pro)?)!'             => [ 'SUGAR', '$1', DeviceType::TABLET ],
+    'SUPRA (M[0-9]{2,3}[A-Z]{0,2})!'            => [ 'SUPRA', '$1', DeviceType::TABLET ],
+    'Fablet F3'                                 => [ 'Swipe', 'Fablet F3' ],
+    'SYTABEX7-2'                                => [ 'Sylvania', 'SYTABEX7', DeviceType::TABLET ],
+
+    '(Symphony|Xplorer)!!' => [
+        'Symphony R100'                             => [ 'Symphony', 'R100' ],
+        'Symphony S101'                             => [ 'Symphony', 'S101' ],
+        'Symphony Play W17'                         => [ 'Symphony', 'Play W17' ],
+        'Xplorer T7i'                               => [ 'Symphony', 'Xplorer T7i', DeviceType::TABLET ],
+        'Xplorer T8i'                               => [ 'Symphony', 'Xplorer T8i', DeviceType::TABLET ],
+        'Symphony T8Q'                              => [ 'Symphony', 'Xplorer T8Q', DeviceType::TABLET ],
+        'SYMPHONY E76'                              => [ 'Symphony', 'Xplorer E76' ],
+        'Xplorer H20'                               => [ 'Symphony', 'Xplorer H20' ],
+        'SYMPHONY H50'                              => [ 'Symphony', 'Xplorer H50' ],
+        'Symphony H100'                             => [ 'Symphony', 'Xplorer H100' ],
+        'Xplorer H200'                              => [ 'Symphony', 'Xplorer H200' ],
+        'Symphony Xplorer P6'                       => [ 'Symphony', 'Xplorer P6' ],
+        'Symphony P7'                               => [ 'Symphony', 'Xplorer P7' ],
+        'Symphony Xplorer P8'                       => [ 'Symphony', 'Xplorer P8' ],
+        'Symphony W10'                              => [ 'Symphony', 'Xplorer W10' ],
+        'Xplorer W12'                               => [ 'Symphony', 'Xplorer W12' ],
+        'Symphony W15'                              => [ 'Symphony', 'Xplorer W15' ],
+        'Symphony Xplorer W15i'                     => [ 'Symphony', 'Xplorer W15i' ],
+        'Symphony Xplorer W16'                      => [ 'Symphony', 'Xplorer W16' ],
+        'Symphony W18'                              => [ 'Symphony', 'Xplorer W18' ],
+        'Symphony Xplorer W21'                      => [ 'Symphony', 'Xplorer W21' ],
+        'Symphony Xplorer W22'                      => [ 'Symphony', 'Xplorer W22' ],
+        'Symphony W25'                              => [ 'Symphony', 'Xplorer W25' ],
+        'Symphony Xplorer W31'                      => [ 'Symphony', 'Xplorer W31' ],
+        'Symphony Xplorer W32'                      => [ 'Symphony', 'Xplorer W32' ],
+        'Symphony Xplorer W35'                      => [ 'Symphony', 'Xplorer W35' ],
+        'Symphony W65'                              => [ 'Symphony', 'Xplorer W65' ],
+        'Symphony W65i'                             => [ 'Symphony', 'Xplorer W65i' ],
+        'Symphony W66'                              => [ 'Symphony', 'Xplorer W66' ],
+        'Symphony W67'                              => [ 'Symphony', 'Xplorer W67' ],
+        'Symphony W68'                              => [ 'Symphony', 'Xplorer W68' ],
+        'Symphony W68Q'                             => [ 'Symphony', 'Xplorer W68Q' ],
+        'Symphony W69'                              => [ 'Symphony', 'Xplorer W69' ],
+        'Symphony Xplorer W69Q'                     => [ 'Symphony', 'Xplorer W69Q' ],
+        'Symphony Xplorer W70Q'                     => [ 'Symphony', 'Xplorer W70Q' ],
+        'Symphony Xplorer W71'                      => [ 'Symphony', 'Xplorer W71' ],
+        'Symphony Xplorer W71i'                     => [ 'Symphony', 'Xplorer W71i' ],
+        'Symphony W72'                              => [ 'Symphony', 'Xplorer W72' ],
+        'Symphony W82'                              => [ 'Symphony', 'Xplorer W82' ],
+        'Symphony W85'                              => [ 'Symphony', 'Xplorer W85' ],
+        'Symphony Xplorer W86'                      => [ 'Symphony', 'Xplorer W86' ],
+        'SYMPHONY W90'                              => [ 'Symphony', 'Xplorer W90' ],
+        'Symphony W91'                              => [ 'Symphony', 'Xplorer W91' ],
+        'Symphony W92'                              => [ 'Symphony', 'Xplorer W92' ],
+        'Symphony W94'                              => [ 'Symphony', 'Xplorer W94' ],
+        'Symphony W95'                              => [ 'Symphony', 'Xplorer W95' ],
+        'Xplorer W125'                              => [ 'Symphony', 'Xplorer W125' ],
+        'Symphony W125'                             => [ 'Symphony', 'Xplorer W125' ],
+        'Symphony W128'                             => [ 'Symphony', 'Xplorer W128' ],
+        'Symphony W130'                             => [ 'Symphony', 'Xplorer W130' ],
+        'Symphony Xplorer w130'                     => [ 'Symphony', 'Xplorer W130' ],
+        'Symphony Xplorer W140'                     => [ 'Symphony', 'Xplorer W140' ],
+        'Symphony W160'                             => [ 'Symphony', 'Xplorer W160' ],
+        'Symphony ZII'                              => [ 'Symphony', 'Xplorer ZI' ],
+        'Xplorer Z III'                             => [ 'Symphony', 'Xplorer ZIII' ],
+        'Xplorer ZV'                                => [ 'Symphony', 'Xplorer ZV' ],
+        'Symphony ZIV'                              => [ 'Symphony', 'Xplorer ZIV' ],
+        'Symphony Z9'                               => [ 'Symphony', 'Xplorer Z9' ],
+    ],
+
+    'W20'                                       => [ 'Symphony', 'Xplorer W20' ],
+    'ZVII'                                      => [ 'Symphony', 'Xplorer ZVII' ],
+    'Roar A50'                                  => [ 'Symphony', 'Roar A50' ],
+    'Synrgic Uno M1'                            => [ 'Synrgic', 'Uno M1' ],
+
+    'T-Smart!!' => [
+        'T-smart D18X'                              => [ 'T-smart', 'D18X' ],
+        'T-smart D28'                               => [ 'T-smart', 'D28' ],
+        'T-smart D28X'                              => [ 'T-smart', 'D28X' ],
+        'T-SmartD58X'                               => [ 'T-smart', 'D58X' ],
+        'T-smart D58X'                              => [ 'T-smart', 'D58X' ],
+        'T-smart D68X'                              => [ 'T-smart', 'D68X' ],
+        'T-SmartD98X'                               => [ 'T-smart', 'D98X' ],
+        'T-smart G18'                               => [ 'T-smart', 'G18' ],
+        'T-smart G28'                               => [ 'T-smart', 'G28' ],
+        'T-smart G58'                               => [ 'T-smart', 'G58' ],
+        'T-smart I08'                               => [ 'T-smart', 'I08' ],
+        'T-smart I58 TD'                            => [ 'T-smart', 'I58' ],
+        'T-smart L818'                              => [ 'T-smart', 'L818' ],
+    ],
+
+    'Tabra QAV801'                              => [ 'Tabra', 'QAV801', DeviceType::TABLET ],
+
+    'TCL!!' => [
+        'TCL-309T'                                  => [ 'TCL', '309T' ],
+        'TCL-550'                                   => [ 'TCL', '550' ],
+        'TCL 580'                                   => [ 'TCL', '580' ],
+        'TCL 750'                                   => [ 'TCL', '750' ],
+        'TCL 919'                                   => [ 'TCL', '919' ],
+        'TCL A506'                                  => [ 'TCL', 'A506' ],
+        'TCL A510'                                  => [ 'TCL', 'A510' ],
+        'TCL A860'                                  => [ 'TCL', 'A860' ],
+        'TCL A865'                                  => [ 'TCL', 'A865' ],
+        'TCL A890!'                                 => [ 'TCL', 'A890' ],
+        'TCL A906'                                  => [ 'TCL', 'A906' ],
+        'TCL A909'                                  => [ 'TCL', 'A909' ],
+        'TCL A916'                                  => [ 'TCL', 'A916' ],
+        'TCL A919'                                  => [ 'TCL', 'A919' ],
+        'TCL A966'                                  => [ 'TCL', 'A966' ],
+        'TCL A966 RUS'                              => [ 'TCL', 'A966' ],
+        'TCL A968'                                  => [ 'TCL', 'A968' ],
+        'TCL A980'                                  => [ 'TCL', 'A980' ],
+        'TCL A986'                                  => [ 'TCL', 'A986' ],
+        'TCL A988'                                  => [ 'TCL', 'A988' ],
+        'TCL A990'                                  => [ 'TCL', 'A990' ],
+        'TCL[- ]A996!'                              => [ 'TCL', 'A996' ],
+        'TCL A998'                                  => [ 'TCL', 'A998' ],
+        'TCL C990'                                  => [ 'TCL', 'C990' ],
+        'TCL C990+'                                 => [ 'TCL', 'C990+' ],
+        'TCL C995'                                  => [ 'TCL', 'C995' ],
+        'TCL D35'                                   => [ 'TCL', 'D35' ],
+        'TCL D40 DUAL'                              => [ 'TCL', 'D40' ],
+        'TCL D55'                                   => [ 'TCL', 'D55' ],
+        'TCL D515'                                  => [ 'TCL', 'D515' ],
+        'TCL-D662'                                  => [ 'TCL', 'D662' ],
+        'TCL D662'                                  => [ 'TCL', 'D662' ],
+        'TCL-D668'                                  => [ 'TCL', 'D668' ],
+        'TCL D668'                                  => [ 'TCL', 'D668' ],
+        'TCL D706'                                  => [ 'TCL', 'D706' ],
+        'TCL D768'                                  => [ 'TCL', 'D768' ],
+        'TCL-D768'                                  => [ 'TCL', 'D768' ],
+        'TCL D920'                                  => [ 'TCL', 'D920' ],
+        'TCL-D920'                                  => [ 'TCL', 'D920' ],
+        'TCL GENESEE E708'                          => [ 'TCL', 'Genesee E708' ],
+        'TCL-E906'                                  => [ 'TCL', 'E906' ],
+        'TCL E928'                                  => [ 'TCL', 'E928' ],
+        'TCL H900M'                                 => [ 'TCL', 'H900M' ],
+        'TCL i708U'                                 => [ 'TCL', 'i708U' ],
+        'TCL i709M'                                 => [ 'TCL', 'i709M' ],
+        'TCL i718M'                                 => [ 'TCL', 'i718M' ],
+        'TCL i800'                                  => [ 'TCL', 'i800' ],
+        'TCL i806'                                  => [ 'TCL', 'i806' ],
+        'TCL J210'                                  => [ 'TCL', 'J210' ],
+        'TCL J210C'                                 => [ 'TCL', 'J210' ],
+        'TCL-J210C'                                 => [ 'TCL', 'J210' ],
+        'TCL J300'                                  => [ 'TCL', 'J300' ],
+        'TCL J305T'                                 => [ 'TCL', 'J305' ],
+        'TCL J310'                                  => [ 'TCL', 'J310' ],
+        'TCL J320'                                  => [ 'TCL', 'J320' ],
+        'TCL J320C'                                 => [ 'TCL', 'J320' ],
+        'TCL-J320D'                                 => [ 'TCL', 'J320' ],
+        'TCL J320D'                                 => [ 'TCL', 'J320' ],
+        'TCL J320T'                                 => [ 'TCL', 'J320' ],
+        'TCL J600T'                                 => [ 'TCL', 'J600' ],
+        'TCL J610'                                  => [ 'TCL', 'J610' ],
+        'TCL J620'                                  => [ 'TCL', 'J620' ],
+        'TCL J630T'                                 => [ 'TCL', 'J630' ],
+        'TCL J636D'                                 => [ 'TCL', 'J636' ],
+        'TCL J636D+'                                => [ 'TCL', 'J636' ],
+        'TCL J706T'                                 => [ 'TCL', 'J706' ],
+        'TCL J720'                                  => [ 'TCL', 'J720' ],
+        'TCL J726T'                                 => [ 'TCL', 'J726' ],
+        'TCL-J736L'                                 => [ 'TCL', 'J736' ],
+        'TCL J738M'                                 => [ 'TCL', 'J738' ],
+        'TCL J900'                                  => [ 'TCL', 'J900' ],
+        'TCL-J900C'                                 => [ 'TCL', 'J900' ],
+        'TCL J900T'                                 => [ 'TCL', 'J900' ],
+        'TCL J920'                                  => [ 'TCL', 'J9260' ],
+        'TCL J926T'                                 => [ 'TCL', 'J926' ],
+        'TCL J928'                                  => [ 'TCL', 'J928' ],
+        'TCL-J929L'                                 => [ 'TCL', 'J929' ],
+        'TCL J936D'                                 => [ 'TCL', 'J936' ],
+        'TCL J938M'                                 => [ 'TCL', 'J938' ],
+        'TCL M2L'                                   => [ 'TCL', 'M2L' ],
+        'TCL M2M'                                   => [ 'TCL', 'M2M' ],
+        'TCL M2U'                                   => [ 'TCL', 'M2U' ],
+        'TCL M3G'                                   => [ 'TCL', 'M3G' ],
+        'TCL TK8263!'                               => [ 'TCL', 'TK8263' ],
+        'TCL P301C'                                 => [ 'TCL', 'P301' ],
+        'TCL P301M'                                 => [ 'TCL', 'P301' ],
+        'TCL P302C'                                 => [ 'TCL', 'P302' ],
+        'TCL-P306C'                                 => [ 'TCL', 'P306' ],
+        'TCL-P308L'                                 => [ 'TCL', 'P308' ],
+        'TCL P308L'                                 => [ 'TCL', 'P308' ],
+        'TCL P308M'                                 => [ 'TCL', 'P308' ],
+        'TCL-P316L'                                 => [ 'TCL', 'P316' ],
+        'TCL P316L'                                 => [ 'TCL', 'P316' ],
+        'TCL-P318L'                                 => [ 'TCL', 'P318' ],
+        'TCL P331M'                                 => [ 'TCL', 'P331' ],
+        'TCL P332U'                                 => [ 'TCL', 'P332' ],
+        'TCL P335M'                                 => [ 'TCL', 'P335' ],
+        'TCL P360W'                                 => [ 'TCL', 'P360' ],
+        'TCL P500M'                                 => [ 'TCL', 'P500' ],
+        'TCL P501M'                                 => [ 'TCL', 'P501' ],
+        'TCL P502U'                                 => [ 'TCL', 'P502' ],
+        'TCL-P516L'                                 => [ 'TCL', 'P516' ],
+        'TCL P518L'                                 => [ 'TCL', 'P518' ],
+        'TCL-P520L'                                 => [ 'TCL', 'P520' ],
+        'TCL P520L'                                 => [ 'TCL', 'P520' ],
+        'TCL P528D'                                 => [ 'TCL', 'P528' ],
+        'TCL P560M'                                 => [ 'TCL', 'P560' ],
+        'TCL P561U'                                 => [ 'TCL', 'P561' ],
+        'TCL-P580L'                                 => [ 'TCL', 'P580' ],
+        'TCL-P588L'                                 => [ 'TCL', 'P588' ],
+        'TCL P588L'                                 => [ 'TCL', 'P588' ],
+        'TCL-P590L'                                 => [ 'TCL', 'P590' ],
+        'TCL P590L'                                 => [ 'TCL', 'P590' ],
+        'TCL P600'                                  => [ 'TCL', 'P600' ],
+        'TCL P606!'                                 => [ 'TCL', 'P606' ],
+        'TCL P618L'                                 => [ 'TCL', 'P618' ],
+        'TCL-P618L'                                 => [ 'TCL', 'P618' ],
+        'TCL P620M'                                 => [ 'TCL', 'P620' ],
+        'TCL P631M'                                 => [ 'TCL', 'P631' ],
+        'TCL P650M'                                 => [ 'TCL', 'P650' ],
+        'TCL-P668L'                                 => [ 'TCL', 'P668' ],
+        'TCL P688L'                                 => [ 'TCL', 'P688' ],
+        'TCL P689L'                                 => [ 'TCL', 'P689' ],
+        'TCL-P688L'                                 => [ 'TCL', 'P688' ],
+        'TCL P728M'                                 => [ 'TCL', 'P728' ],
+        'TCL P900'                                  => [ 'TCL', 'P900' ],
+        'TCL S300T'                                 => [ 'TCL', 'S300' ],
+        'TCL S500'                                  => [ 'TCL', 'S500' ],
+        'TCL S520'                                  => [ 'TCL', 'S520' ],
+        'TCL S530T'                                 => [ 'TCL', 'S530' ],
+        '(TCL )?S600!'                              => [ 'TCL', 'S600' ],
+        'TCL S700'                                  => [ 'TCL', 'S700' ],
+        'TCL S700T'                                 => [ 'TCL', 'S700' ],
+        'TCL S710'                                  => [ 'TCL', 'S710' ],
+        'TCL S720'                                  => [ 'TCL', 'S720' ],
+        'TCL S720T'                                 => [ 'TCL', 'S720' ],
+        'TCL S725T'                                 => [ 'TCL', 'S725' ],
+        'TCL S800'                                  => [ 'TCL', 'S800' ],
+        'TCL-S806'                                  => [ 'TCL', 'S806' ],
+        'TCL S810'                                  => [ 'TCL', 'S810' ],
+        'TCL S820'                                  => [ 'TCL', 'S820' ],
+        'TCL S826L'                                 => [ 'TCL', 'S826' ],
+        'TCL S830'                                  => [ 'TCL', 'S830' ],
+        'TCL S830U'                                 => [ 'TCL', 'S830' ],
+        'TCL S838M'                                 => [ 'TCL', 'S838' ],
+        'TCL S850'                                  => [ 'TCL', 'S850' ],
+        'TCL S850L'                                 => [ 'TCL', 'S850' ],
+        'TCL-S850L'                                 => [ 'TCL', 'S850' ],
+        'TCL S860'                                  => [ 'TCL', 'S860' ],
+        'TCL S900'                                  => [ 'TCL', 'S900' ],
+        'TCL S950!'                                 => [ 'TCL', 'S950' ],
+        'TCL S960!'                                 => [ 'TCL', 'S960' ],
+        'TCL T500L'                                 => [ 'TCL', 'T500' ],
+        'TCL U980'                                  => [ 'TCL', 'U980' ],
+        'TCL W939'                                  => [ 'TCL', 'W939' ],
+        'TCL W969'                                  => [ 'TCL', 'W969' ],
+        'TCLW989'                                   => [ 'TCL', 'W989' ],
+        'TCL Y710'                                  => [ 'TCL', 'Y710' ],
+        'TCL Y900'                                  => [ 'TCL', 'Y900' ],
+        'TCL Y910'                                  => [ 'TCL', 'Hero N3' ],
+        'TCL Y910T'                                 => [ 'TCL', 'Hero N3' ],
+        'TCL TAB 7'                                 => [ 'TCL', 'Tab 7', DeviceType::TABLET ],
+        'TCL Google TV TV'                          => [ 'TCL', 'MoVo UD TV', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    ],
+
+    'TECNO!!' => [
+        'TECNO-A7'                                  => [ 'Tecno', 'Phantom Z' ],
+        'TECNO B3'                                  => [ 'Tecno', 'B3' ],
+        'TECNO B5S'                                 => [ 'Tecno', 'B5S' ],
+        'TECNO-C5'                                  => [ 'Tecno', 'C5' ],
+        'TECNO C5'                                  => [ 'Tecno', 'C5' ],
+        'TECNO-C5S'                                 => [ 'Tecno', 'C5S' ],
+        'TECNO-C7'                                  => [ 'Tecno', 'C7' ],
+        'TECNO-C8'                                  => [ 'Tecno', 'C8' ],
+        'TECNO-CAMON C8'                            => [ 'Tecno', 'C8' ],
+        'TECNO-C9'                                  => [ 'Tecno', 'C9' ],
+        'TECNO D1'                                  => [ 'Tecno', 'D1' ],
+        'TECNO D1E'                                 => [ 'Tecno', 'D1E' ],
+        'TECNO D3'                                  => [ 'Tecno', 'D3' ],
+        'TECNO D5'                                  => [ 'Tecno', 'D5' ],
+        'TECNO D7'                                  => [ 'Tecno', 'D7' ],
+        'TECNO D9'                                  => [ 'Tecno', 'D9' ],
+        'TECNO F5'                                  => [ 'Tecno', 'F5' ],
+        'TECNO F6'                                  => [ 'Tecno', 'F6' ],
+        'TECNO F7'                                  => [ 'Tecno', 'Phantom A' ],
+        'TECNO F8'                                  => [ 'Tecno', 'Phantom AII' ],
+        'TECNO G9'                                  => [ 'Tecno', 'Phantom Pad 2', DeviceType::TABLET ],
+        'TECNO-H3'                                  => [ 'Tecno', 'H3' ],
+        'TECNO H3'                                  => [ 'Tecno', 'H3' ],
+        'TECNO H5'                                  => [ 'Tecno', 'H5' ],
+        'TECNO H6'                                  => [ 'Tecno', 'H6' ],
+        'TECNO H7'                                  => [ 'Tecno', 'H7' ],
+        'TECNO-J5'                                  => [ 'Tecno', 'J5' ],
+        'TECNO-J7'                                  => [ 'Tecno', 'J7' ],
+        'TECNO J7'                                  => [ 'Tecno', 'J7' ],
+        'TECNO-J8'                                  => [ 'Tecno', 'J8' ],
+        'TECNO L3'                                  => [ 'Tecno', 'L3' ],
+        'TECNO-L5'                                  => [ 'Tecno', 'L5' ],
+        'TECNO L6'                                  => [ 'Tecno', 'L6' ],
+        'TECNO L7'                                  => [ 'Tecno', 'L7' ],
+        'TECNO-L8'                                  => [ 'Tecno', 'L8' ],
+        'TECNO-L8Plus'                              => [ 'Tecno', 'L8 Plus' ],
+        'TECNO M3'                                  => [ 'Tecno', 'M3' ],
+        'TECNO-M3'                                  => [ 'Tecno', 'M3' ],
+        'TECNO M3M'                                 => [ 'Tecno', 'M3M' ],
+        'TECNO M3S'                                 => [ 'Tecno', 'M3S' ],
+        'TECNO M5'                                  => [ 'Tecno', 'M5' ],
+        'TECNO M6'                                  => [ 'Tecno', 'M6' ],
+        'TECNO-M6S'                                 => [ 'Tecno', 'M6S' ],
+        'TECNO M7'                                  => [ 'Tecno', 'M7' ],
+        'TECNO M9'                                  => [ 'Tecno', 'Phantom AIII' ],
+        'TECNO-N2'                                  => [ 'Tecno', 'N2' ],
+        'TECNO-N2S'                                 => [ 'Tecno', 'N2S' ],
+        'TECNO N3'                                  => [ 'Tecno', 'N3' ],
+        'TECNO N3S'                                 => [ 'Tecno', 'N3S' ],
+        'TECNO N5'                                  => [ 'Tecno', 'N5' ],
+        'TECNO N5S'                                 => [ 'Tecno', 'N5S' ],
+        'TECNO N6S'                                 => [ 'Tecno', 'N6S' ],
+        'TECNO-N6S'                                 => [ 'Tecno', 'N6S' ],
+        'TECNO N7'                                  => [ 'Tecno', 'N7' ],
+        'TECNO-N9'                                  => [ 'Tecno', 'Phantom Pad', DeviceType::TABLET ],
+        'TECNO N9'                                  => [ 'Tecno', 'Phantom Pad', DeviceType::TABLET ],
+        'TECNO P3'                                  => [ 'Tecno', 'P3' ],
+        'TECNO P3S'                                 => [ 'Tecno', 'P3S' ],
+        'TECNO P5'                                  => [ 'Tecno', 'P5' ],
+        'TECNO P5 PLUS'                             => [ 'Tecno', 'P5 Plus' ],
+        'TECNO P5S'                                 => [ 'Tecno', 'P5S' ],
+        'TECNO P6'                                  => [ 'Tecno', 'P6' ],
+        'TECNO P9'                                  => [ 'Tecno', 'Phantom Pad Mini', DeviceType::TABLET ],
+        'TECNO Q1'                                  => [ 'Tecno', 'Q1' ],
+        'TECNO R5'                                  => [ 'Tecno', 'R5' ],
+        'TECNO R7'                                  => [ 'Tecno', 'R7' ],
+        'TECNO S3'                                  => [ 'Tecno', 'S3' ],
+        'TECNO S3+'                                 => [ 'Tecno', 'S3+' ],
+        'TECNO S3C'                                 => [ 'Tecno', 'S3C' ],
+        'TECNO S3M'                                 => [ 'Tecno', 'S3M' ],
+        'TECNO S5'                                  => [ 'Tecno', 'S5' ],
+        'TECNO S7'                                  => [ 'Tecno', 'S7' ],
+        'TECNO S9'                                  => [ 'Tecno', 'S9' ],
+        'TECNO S9S'                                 => [ 'Tecno', 'S9S' ],
+        'TECNO T1'                                  => [ 'Tecno', 'T1' ],
+        'TECNO T3'                                  => [ 'Tecno', 'T3' ],
+        'TECNO W2'                                  => [ 'Tecno', 'W2' ],
+        'TECNO-W3'                                  => [ 'Tecno', 'W3' ],
+        'TECNO-W3LTE'                               => [ 'Tecno', 'W3' ],
+        'TECNO-W4'                                  => [ 'Tecno', 'W4' ],
+        'TECNO W4'                                  => [ 'Tecno', 'W4' ],
+        'TECNO-W5'                                  => [ 'Tecno', 'W5' ],
+        'TECNO-Y2'                                  => [ 'Tecno', 'Y2' ],
+        'TECNO-Y3'                                  => [ 'Tecno', 'Y3' ],
+        'TECNO-Y3+'                                 => [ 'Tecno', 'Y3+' ],
+        'TECNO-Y4'                                  => [ 'Tecno', 'Y4' ],
+        'TECNO-Y5'                                  => [ 'Tecno', 'Y5' ],
+        'TECNO-Y5S'                                 => [ 'Tecno', 'Y5S' ],
+        'TECNO-Y6'                                  => [ 'Tecno', 'Y6' ],
+        'TECNO 7C'                                  => [ 'Tecno', 'DroiPad 7', DeviceType::TABLET ],
+        'TECNO 7CS'                                 => [ 'Tecno', 'DroiPad 7', DeviceType::TABLET ],
+        'TECNO DP7CPRO'                             => [ 'Tecno', 'DroiPad 7C Pro', DeviceType::TABLET ],
+        'TECNO 8H'                                  => [ 'Tecno', 'DroiPad 8', DeviceType::TABLET ],
+    ],
+
+    'L3'                                        => [ 'Tecno', 'L3' ],
+    'Xtab1081HD'                                => [ 'Techtab', 'Xtab 1081 HD', DeviceType::TABLET ],
+    'Teclast A10'                               => [ 'Teclast', 'A10', DeviceType::TABLET ],
+    'A10H(D5W6)'                                => [ 'Teclast', 'A10H', DeviceType::TABLET ],
+    'A10HD(N9A3)'                               => [ 'Teclast', 'A10HD', DeviceType::TABLET ],
+    'A10t(5DM3)'                                => [ 'Teclast', 'A10T', DeviceType::TABLET ],
+    'A10T(8DM1)'                                => [ 'Teclast', 'A10T', DeviceType::TABLET ],
+    'A11(M5A7)'                                 => [ 'Teclast', 'A11', DeviceType::TABLET ],
+    'A11s(M5A7)'                                => [ 'Teclast', 'A11s', DeviceType::TABLET ],
+    'A15(E6C2)'                                 => [ 'Teclast', 'A15', DeviceType::TABLET ],
+    'A70(CY6T)'                                 => [ 'Teclast', 'A70', DeviceType::TABLET ],
+    'A78h四核(C1V3)'                              => [ 'Teclast', 'A78h', DeviceType::TABLET ],
+    'A80h双核(A4P9)'                              => [ 'Teclast', 'A80h', DeviceType::TABLET ],
+    'A80 se??(M5MA)'                            => [ 'Teclast', 'A80se', DeviceType::TABLET ],
+    'A80 se四核(M5MC)'                            => [ 'Teclast', 'A80se', DeviceType::TABLET ],
+    'A80HD四核(C4H6)'                         => [ 'Teclast', 'A80HD', DeviceType::TABLET ],
+    'A88 mini四核(M1C5)'                          => [ 'Teclast', 'A88 mini', DeviceType::TABLET ],
+    'G17(B5DV)'                                 => [ 'Teclast', 'G17', DeviceType::TABLET ],
+    'G17(B7DV)'                                 => [ 'Teclast', 'G17', DeviceType::TABLET ],
+    'G17h 3G??(K5E2)'                           => [ 'Teclast', 'G17h', DeviceType::TABLET ],
+    'G17h 3G??(K6E2'                            => [ 'Teclast', 'G17h', DeviceType::TABLET ],
+    'G17h 3G四核(K5E2)'                           => [ 'Teclast', 'G17h', DeviceType::TABLET ],
+    'G17h 3G四核(K6E2)'                           => [ 'Teclast', 'G17h', DeviceType::TABLET ],
+    'G17s 3G'                                   => [ 'Teclast', 'G17s', DeviceType::TABLET ],
+    'G17s 3G??(K5E5)'                           => [ 'Teclast', 'G17s', DeviceType::TABLET ],
+    'G17s 3G四核(K5E5)'                           => [ 'Teclast', 'G17s', DeviceType::TABLET ],
+    'G17s 3G四核(K5E4)'                           => [ 'Teclast', 'G17s', DeviceType::TABLET ],
+    'G17s 3G四核(K5E3)'                           => [ 'Teclast', 'G17s', DeviceType::TABLET ],
+    'G18 3G四核(C6B9)'                            => [ 'Teclast', 'G18', DeviceType::TABLET ],
+    'G18mini(C5B9)'                             => [ 'Teclast', 'G18 mini', DeviceType::TABLET ],
+    'G18d 3G四核(D3A2)'                           => [ 'Teclast', 'G18d', DeviceType::TABLET ],
+    'G18d mini(FV2C)'                           => [ 'Teclast', 'G18d mini', DeviceType::TABLET ],
+    'P10HD??(E6NA)'                             => [ 'Teclast', 'P10HD', DeviceType::TABLET ],
+    'P11HD'                                     => [ 'Teclast', 'P11HD', DeviceType::TABLET ],
+    'P11HD四核(G9X6)'                         => [ 'Teclast', 'P11HD', DeviceType::TABLET ],
+    'P11HD??(G9X6)'                             => [ 'Teclast', 'P11HD', DeviceType::TABLET ],
+    'P11HD四核(G9X7)'                         => [ 'Teclast', 'P11HD', DeviceType::TABLET ],
+    'P19HD(E1K3)'                               => [ 'Teclast', 'P19HD', DeviceType::TABLET ],
+    'P19HD(E1K5)'                               => [ 'Teclast', 'P19HD', DeviceType::TABLET ],
+    'P70 3G八核(C2B7)'                            => [ 'Teclast', 'P70 3G', DeviceType::TABLET ],
+    'P70h(A5C2)'                                => [ 'Teclast', 'P70h', DeviceType::TABLET ],
+    'P72'                                       => [ 'Teclast', 'P72', DeviceType::TABLET ],
+    'P72w'                                      => [ 'Teclast', 'P72w', DeviceType::TABLET ],
+    'P75a(G7E3)'                                => [ 'Teclast', 'P75a', DeviceType::TABLET ],
+    'P75HD(M3E5)'                               => [ 'Teclast', 'P75HD', DeviceType::TABLET ],
+    'P76a(K3G5)'                                => [ 'Teclast', 'P76a', DeviceType::TABLET ],
+    'P76a双核(M4Q5)'                              => [ 'Teclast', 'P76a', DeviceType::TABLET ],
+    'Teclast P76e!'                             => [ 'Teclast', 'P76e', DeviceType::TABLET ],
+    'P76e(A3E1)'                                => [ 'Teclast', 'P76e', DeviceType::TABLET ],
+    'P76e(G6R8)'                                => [ 'Teclast', 'P76e', DeviceType::TABLET ],
+    'P76h双核(K8V1)'                              => [ 'Teclast', 'P76h', DeviceType::TABLET ],
+    'P76s双核(DKH5)'                              => [ 'Teclast', 'P76s', DeviceType::TABLET ],
+    'P76TI'                                     => [ 'Teclast', 'P76Ti', DeviceType::TABLET ],
+    'P76v(A3V5)'                                => [ 'Teclast', 'P76v', DeviceType::TABLET ],
+    'P78双核(G1M5)'                               => [ 'Teclast', 'P78', DeviceType::TABLET ],
+    'P78s(G1M5)'                                => [ 'Teclast', 'P78s', DeviceType::TABLET ],
+    'P78s(G1M6)'                                => [ 'Teclast', 'P78s', DeviceType::TABLET ],
+    'P78s(G1M7)'                                => [ 'Teclast', 'P78s', DeviceType::TABLET ],
+    'P78HD四核(C4A5)'                         => [ 'Teclast', 'P78HD', DeviceType::TABLET ],
+    'P78HD??(C4A5)'                             => [ 'Teclast', 'P78HD', DeviceType::TABLET ],
+    'P79HD(A3V9)'                               => [ 'Teclast', 'P79HD', DeviceType::TABLET ],
+    'P79HD 3G(C4K5)'                            => [ 'Teclast', 'P79HD 3G', DeviceType::TABLET ],
+    'P80 四核 (BV8K)'                         => [ 'Teclast', 'P80', DeviceType::TABLET ],
+    'P80 四核 (BV9K)'                         => [ 'Teclast', 'P80', DeviceType::TABLET ],
+    'P80s 四核(EF6W)'                         => [ 'Teclast', 'P80s', DeviceType::TABLET ],
+    'P80 3G四核 (B1KC)'                           => [ 'Teclast', 'P80 3G', DeviceType::TABLET ],
+    'P80 3G四核 (B4KC)'                           => [ 'Teclast', 'P80 3G', DeviceType::TABLET ],
+    'P80 3G八核(A4LL)'                            => [ 'Teclast', 'P80 3G', DeviceType::TABLET ],
+    'P80 3G八核(A5LL)'                            => [ 'Teclast', 'P80 3G', DeviceType::TABLET ],
+    'P80 3G八核(A6LL)'                            => [ 'Teclast', 'P80 3G', DeviceType::TABLET ],
+    'P80 4G(K2G3)'                              => [ 'Teclast', 'P80 4G', DeviceType::TABLET ],
+    'P81HD'                                     => [ 'Teclast', 'P81HD', DeviceType::TABLET ],
+    'P85(A9D3)'                                 => [ 'Teclast', 'P85', DeviceType::TABLET ],
+    'P85(A9D5)'                                 => [ 'Teclast', 'P85', DeviceType::TABLET ],
+    'P85(R8A1)'                                 => [ 'Teclast', 'P85', DeviceType::TABLET ],
+    'Teclast P85!'                              => [ 'Teclast', 'P85', DeviceType::TABLET ],
+    'P85mini(DT8W)'                             => [ 'Teclast', 'P85 mini', DeviceType::TABLET ],
+    'P85s mini(EWE8)'                           => [ 'Teclast', 'P85s mini', DeviceType::TABLET ],
+    'P85t mini(KW8P)'                           => [ 'Teclast', 'P85t mini', DeviceType::TABLET ],
+    'P85HD双核(K6N2)'                         => [ 'Teclast', 'P85HD', DeviceType::TABLET ],
+    'P86(F8G6)'                                 => [ 'Teclast', 'P86', DeviceType::TABLET ],
+    'P88双核(H3D7)'                               => [ 'Teclast', 'P88', DeviceType::TABLET ],
+    'P88(H3D7)'                                 => [ 'Teclast', 'P88', DeviceType::TABLET ],
+    'P88(GT4K)'                                 => [ 'Teclast', 'P88', DeviceType::TABLET ],
+    'P88s mini??(F2V6)'                         => [ 'Teclast', 'P88s mini', DeviceType::TABLET ],
+    'P88s mini四核(F2V7)'                     => [ 'Teclast', 'P88s mini', DeviceType::TABLET ],
+    'P88HD(C5GV)'                               => [ 'Teclast', 'P88HD', DeviceType::TABLET ],
+    'P89 3G八核(D1H8)'                            => [ 'Teclast', 'P89 3G', DeviceType::TABLET ],
+    'P89 3Gk8(D1H8)'                            => [ 'Teclast', 'P89 3G', DeviceType::TABLET ],
+    'P89mini(E2W6)'                             => [ 'Teclast', 'P89 mini', DeviceType::TABLET ],
+    'P89 mini(E2W6)'                            => [ 'Teclast', 'P89 mini', DeviceType::TABLET ],
+    'P89s(F8A5)'                                => [ 'Teclast', 'P89s', DeviceType::TABLET ],
+    'P89s mini(F8A2)'                           => [ 'Teclast', 'P89s mini', DeviceType::TABLET ],
+    'P90(H3U6)'                                 => [ 'Teclast', 'P90', DeviceType::TABLET ],
+    'P90(H3U7)'                                 => [ 'Teclast', 'P90', DeviceType::TABLET ],
+    'P98(F2K9)'                                 => [ 'Teclast', 'P98', DeviceType::TABLET ],
+    'P98 八核(B9A3)'                              => [ 'Teclast', 'P98', DeviceType::TABLET ],
+    'P98 3Gk8(A4HY)'                            => [ 'Teclast', 'P98', DeviceType::TABLET ],
+    'P98 3G??(A4HY)'                            => [ 'Teclast', 'P98', DeviceType::TABLET ],
+    'P98 3G(M1Q2)'                              => [ 'Teclast', 'P98 3G', DeviceType::TABLET ],
+    'P98 3G八核(A3HY)'                            => [ 'Teclast', 'P98 3G', DeviceType::TABLET ],
+    'P98 3G八核(A4HY)'                            => [ 'Teclast', 'P98 3G', DeviceType::TABLET ],
+    'P98 4G??(A8H6)'                            => [ 'Teclast', 'P98 4G', DeviceType::TABLET ],
+    'P98 Air?? (C6V8)'                          => [ 'Teclast', 'P98 Air', DeviceType::TABLET ],
+    'P98Air(C6V8)'                              => [ 'Teclast', 'P98 Air', DeviceType::TABLET ],
+    'P98HD(A2Q6)'                               => [ 'Teclast', 'P98HD', DeviceType::TABLET ],
+    'P98HD+M6'                                  => [ 'Teclast', 'P98HD', DeviceType::TABLET ],
+    'P98T(K3C4)'                                => [ 'Teclast', 'P98T', DeviceType::TABLET ],
+    'T98 4G??(C6R2)'                            => [ 'Teclast', 'T98', DeviceType::TABLET ],
+    'T720 SE'                                   => [ 'Teclast', 'T720', DeviceType::TABLET ],
+    'T760 from moage.com'                       => [ 'Teclast', 'T760', DeviceType::TABLET ],
+    'X10H(G3C5)'                                => [ 'Teclast', 'X10H', DeviceType::TABLET ],
+    'X10HD 3G(M6K6)'                            => [ 'Teclast', 'X10HD 3G', DeviceType::TABLET ],
+    'X16 Plus(D3A5)'                            => [ 'Teclast', 'X16 Plus', DeviceType::TABLET ],
+    'X16 Power(D6F7)'                           => [ 'Teclast', 'X16 Power', DeviceType::TABLET ],
+    'X16 PRO(D6F8)'                             => [ 'Teclast', 'X16 Pro', DeviceType::TABLET ],
+    'X16HD (K3J3)'                              => [ 'Teclast', 'X16HD', DeviceType::TABLET ],
+    'X16HD 3G(M5J4)'                            => [ 'Teclast', 'X16HD 3G', DeviceType::TABLET ],
+    'X16HD 3G(M5J5)'                            => [ 'Teclast', 'X16HD 3G', DeviceType::TABLET ],
+    'X16HD 3G(M5J5'                             => [ 'Teclast', 'X16HD 3G', DeviceType::TABLET ],
+    'X16HD 3G(M5J6)'                            => [ 'Teclast', 'X16HD 3G', DeviceType::TABLET ],
+    'X70(C6F9)'                                 => [ 'Teclast', 'X70', DeviceType::TABLET ],
+    'X70 3G (C5D9)'                             => [ 'Teclast', 'X70 3G', DeviceType::TABLET ],
+    'X70 R(C7F9)'                               => [ 'Teclast', 'X70 R', DeviceType::TABLET ],
+    'X80(C4M5)'                                 => [ 'Teclast', 'X80', DeviceType::TABLET ],
+    'Teclast X80h'                              => [ 'Teclast', 'X80h', DeviceType::TABLET ],
+    'X80h'                                      => [ 'Teclast', 'X80h', DeviceType::TABLET ],
+    'X80h(FB5M)'                                => [ 'Teclast', 'X80h', DeviceType::TABLET ],
+    'X80h(FB6M)'                                => [ 'Teclast', 'X80h', DeviceType::TABLET ],
+    'X80HD'                                     => [ 'Teclast', 'X80HD', DeviceType::TABLET ],
+    'X80HD(G2N3)'                               => [ 'Teclast', 'X80HD', DeviceType::TABLET ],
+    'X80HD(G2N4)'                               => [ 'Teclast', 'X80HD', DeviceType::TABLET ],
+    'X80HD(G2N5)'                               => [ 'Teclast', 'X80HD', DeviceType::TABLET ],
+    'X80HD(G2N6)'                               => [ 'Teclast', 'X80HD', DeviceType::TABLET ],
+    'X80HD(G2N8)'                               => [ 'Teclast', 'X80HD', DeviceType::TABLET ],
+    'X80HD(G2N9)'                               => [ 'Teclast', 'X80HD', DeviceType::TABLET ],
+    'X80HD(G2N9'                                => [ 'Teclast', 'X80HD', DeviceType::TABLET ],
+    'X80 Plus(H5C5)'                            => [ 'Teclast', 'X80 Plus', DeviceType::TABLET ],
+    'X80 Plus(H6C3)'                            => [ 'Teclast', 'X80 Plus', DeviceType::TABLET ],
+    'X80 Plus(H6C3'                             => [ 'Teclast', 'X80 Plus', DeviceType::TABLET ],
+    'X80 Power(B2N3)'                           => [ 'Teclast', 'X80 Power', DeviceType::TABLET ],
+    'X80 Power(B2N4)'                           => [ 'Teclast', 'X80 Power', DeviceType::TABLET ],
+    'X80 Power(B2N6)'                           => [ 'Teclast', 'X80 Power', DeviceType::TABLET ],
+    'X80 Pro(E3E6)'                             => [ 'Teclast', 'X80 Pro', DeviceType::TABLET ],
+    'X80 Pro(E3E7)'                             => [ 'Teclast', 'X80 Pro', DeviceType::TABLET ],
+    'X80 Pro(E3E8)'                             => [ 'Teclast', 'X80 Pro', DeviceType::TABLET ],
+    'X81-8G3D'                                  => [ 'Teclast', 'X81', DeviceType::TABLET ],
+    'X89 (E7ED)'                                => [ 'Teclast', 'X89', DeviceType::TABLET ],
+    'X89HD (H21C)'                              => [ 'Teclast', 'X89HD', DeviceType::TABLET ],
+    'X90HD (M2PC)'                              => [ 'Teclast', 'X90HD', DeviceType::TABLET ],
+    'X98 3G(HKC1)'                              => [ 'Teclast', 'X98 3G', DeviceType::TABLET ],
+    'X98 3G(HKC2)'                              => [ 'Teclast', 'X98 3G', DeviceType::TABLET ],
+    'X98 3G(HKC3'                               => [ 'Teclast', 'X98 3G', DeviceType::TABLET ],
+    'X98 3G(HKC3)'                              => [ 'Teclast', 'X98 3G', DeviceType::TABLET ],
+    'X98 3G(lite)'                              => [ 'Teclast', 'X98 3G', DeviceType::TABLET ],
+    'X98 Air(C5KN)'                             => [ 'Teclast', 'X98 Air', DeviceType::TABLET ],
+    'X98 Air Smile'                             => [ 'Teclast', 'X98 Air', DeviceType::TABLET ],
+    'X98 Air 3G'                                => [ 'Teclast', 'X98 Air 3G', DeviceType::TABLET ],
+    'X98 Air 3G(Smile)'                         => [ 'Teclast', 'X98 Air 3G', DeviceType::TABLET ],
+    'X98 Air 3G(C5J5)'                          => [ 'Teclast', 'X98 Air 3G', DeviceType::TABLET ],
+    'X98 Air 3G(C5J6)'                          => [ 'Teclast', 'X98 Air 3G', DeviceType::TABLET ],
+    'X98 Air 3G(C5J8)'                          => [ 'Teclast', 'X98 Air 3G', DeviceType::TABLET ],
+    'X98 Air 3G(C6J6)'                          => [ 'Teclast', 'X98 Air 3G', DeviceType::TABLET ],
+    'X98 Air 3G(C6J6'                           => [ 'Teclast', 'X98 Air 3G', DeviceType::TABLET ],
+    'X98 Air 3G(C8J6)'                          => [ 'Teclast', 'X98 Air 3G', DeviceType::TABLET ],
+    'X98 Air 3G(C8J7)'                          => [ 'Teclast', 'X98 Air 3G', DeviceType::TABLET ],
+    'X98 Air 3G(C9J6)'                          => [ 'Teclast', 'X98 Air 3G', DeviceType::TABLET ],
+    'X98 Air 3G(C9J7)'                          => [ 'Teclast', 'X98 Air 3G', DeviceType::TABLET ],
+    'X98 Air 3G(C9J8)'                          => [ 'Teclast', 'X98 Air 3G', DeviceType::TABLET ],
+    'X98 Air II'                                => [ 'Teclast', 'X98 Air II', DeviceType::TABLET ],
+    'X98 Air II(HG5N)'                          => [ 'Teclast', 'X98 Air II', DeviceType::TABLET ],
+    'X98 Air II(HG6M)'                          => [ 'Teclast', 'X98 Air II', DeviceType::TABLET ],
+    'X98 Air II(HG7N)'                          => [ 'Teclast', 'X98 Air II', DeviceType::TABLET ],
+    'X98 Air II(HG8N)'                          => [ 'Teclast', 'X98 Air II', DeviceType::TABLET ],
+    'X98 Air II(HG9M)'                          => [ 'Teclast', 'X98 Air II', DeviceType::TABLET ],
+    'X98 Air II(HG9N)'                          => [ 'Teclast', 'X98 Air II', DeviceType::TABLET ],
+    'X98 Air II(HG9N'                           => [ 'Teclast', 'X98 Air II', DeviceType::TABLET ],
+    'X98 Air ? HG9M'                            => [ 'Teclast', 'X98 Air II', DeviceType::TABLET ],
+    'X98 Air Ⅱ HG9M'                            => [ 'Teclast', 'X98 Air II', DeviceType::TABLET ],
+    'X98 Air II(Smile)'                         => [ 'Teclast', 'X98 Air II', DeviceType::TABLET ],
+    'X98 Air III'                               => [ 'Teclast', 'X98 Air III', DeviceType::TABLET ],
+    'X98 Air III(M5C5)'                         => [ 'Teclast', 'X98 Air III', DeviceType::TABLET ],
+    'X98 Air III(M5C5'                          => [ 'Teclast', 'X98 Air III', DeviceType::TABLET ],
+    'X98 Air III(M5C6)'                         => [ 'Teclast', 'X98 Air III', DeviceType::TABLET ],
+    'X98 Plus'                                  => [ 'Teclast', 'X98 Plus', DeviceType::TABLET ],
+    'X98 Plus(A6C7)'                            => [ 'Teclast', 'X98 Plus', DeviceType::TABLET ],
+    'X98 Plus(A5C8)'                            => [ 'Teclast', 'X98 Plus', DeviceType::TABLET ],
+    'X98 Plus 3G(A6C9)'                         => [ 'Teclast', 'X98 Plus', DeviceType::TABLET ],
+    'X98 Plus II (C2D4)'                        => [ 'Teclast', 'X98 Plus II', DeviceType::TABLET ],
+    'X98 Plus II (C2D6)'                        => [ 'Teclast', 'X98 Plus II', DeviceType::TABLET ],
+    'X98 Plus II (C2E3)'                        => [ 'Teclast', 'X98 Plus II', DeviceType::TABLET ],
+    'X98 Pro'                                   => [ 'Teclast', 'X98 Pro', DeviceType::TABLET ],
+    'X98 Pro (K9C6)'                            => [ 'Teclast', 'X98 Pro', DeviceType::TABLET ],
+    'X98 Pro (K9C6'                             => [ 'Teclast', 'X98 Pro', DeviceType::TABLET ],
+    'tegav2'                                    => [ 'Tegatech', 'TEGA v2', DeviceType::TABLET ],
+    'Tele2fon V3'                               => [ 'Tele2fon', 'v3' ],
+    'Tele2fon v5'                               => [ 'Tele2fon', 'v5' ],
+    'TELEFUNKEN Diamond TD1'                    => [ 'Telefunken', 'Diamond TD1' ],
+    'Telpad Dual S'                             => [ 'Telpad', 'Dual S', DeviceType::TABLET ],
+    'Telpad Quad S'                             => [ 'Telpad', 'Quad S', DeviceType::TABLET ],
+    'Telpad QS'                                 => [ 'Telpad', 'Quad S', DeviceType::TABLET ],
+    'T3696'                                     => [ 'Telsda', 'T3696' ],
+    'Tensent S9000'                             => [ 'Tensent', 'S9000' ],
+    'Hudl HT7S3'                                => [ 'Tesco', 'Hudl', DeviceType::TABLET ],
+    'Hudl 2'                                    => [ 'Tesco', 'Hudl 2', DeviceType::TABLET ],
+    'TM-3200R'                                  => [ 'teXet', 'TM-3200R' ],
+    'TM-3204R'                                  => [ 'teXet', 'TM-3204R' ],
+    'TM-3500'                                   => [ 'teXet', 'X-mini 2 TM-3500' ],
+    'teXet X-alpha'                             => [ 'teXet', 'X-alpha TM-3521' ],
+    'TM-4003'                                   => [ 'teXet', 'TM-4003' ],
+    'TM-4004'                                   => [ 'teXet', 'TM-4004' ],
+    'TM-4071'                                   => [ 'teXet', 'X-smart TM-4071' ],
+    'X-basic'                                   => [ 'teXet', 'X-basic TM-4072' ],
+    'TM-4082R/X-driver'                         => [ 'teXet', 'X-driver TM-4082R' ],
+    'teXet X-start'                             => [ 'teXet', 'X-start TM-4172' ],
+    'X-basic2'                                  => [ 'teXet', 'X-basic2 TM-4272' ],
+    'TM-4377'                                   => [ 'teXet', 'TM-4377' ],
+    'X-maxi'                                    => [ 'teXet', 'X-maxi TM-5172' ],
+    'X-medium'                                  => [ 'teXet', 'X-medium TM-4572' ],
+    'teXet iX-mini'                             => [ 'teXet', 'iX-mini TM-4182' ],
+    'TM-4515'                                   => [ 'teXet', 'X-style TM-4515' ],
+    'TM-4577'                                   => [ 'teXet', 'TM-4577' ],
+    'teXet X-navi'                              => [ 'teXet', 'X-navi TM-4672' ],
+    'TEXET TM-4677'                             => [ 'teXet', 'TM-4677' ],
+    'TM-4677'                                   => [ 'teXet', 'TM-4677' ],
+    'teXet X-medium plus'                       => [ 'teXet', 'X-medium plus TM-4872' ],
+    'TM-4982'                                   => [ 'teXet', 'TM-4982' ],
+    'TM-5005'                                   => [ 'teXet', 'TM-5005' ],
+    'teXet X-maxi qHD'                          => [ 'teXet', 'X-maxi TM-5172' ],
+    'TM-5200'                                   => [ 'teXet', 'TM-5200' ],
+    'TM-5377'                                   => [ 'teXet', 'TM-5377' ],
+    'TM-7011'                                   => [ 'teXet', 'TM-7011', DeviceType::TABLET ],
+    'TM-7016'                                   => [ 'teXet', 'TM-7016', DeviceType::TABLET ],
+    'TM-7021'                                   => [ 'teXet', 'TM-7021', DeviceType::TABLET ],
+    'TM-7023'                                   => [ 'teXet', 'TM-7023', DeviceType::TABLET ],
+    'TM-7024'                                   => [ 'teXet', 'TM-7024', DeviceType::TABLET ],
+    'TM-7025'                                   => [ 'teXet', 'TM-7025', DeviceType::TABLET ],
+    'TM-7026'                                   => [ 'teXet', 'TM-7026', DeviceType::TABLET ],
+    'TM-7026 (revision 4)'                      => [ 'teXet', 'TM-7026', DeviceType::TABLET ],
+    'TM-7037W'                                  => [ 'teXet', 'TM-7037W', DeviceType::TABLET ],
+    'TM-7038W'                                  => [ 'teXet', 'TM-7038W', DeviceType::TABLET ],
+    'TM-7041'                                   => [ 'teXet', 'TM-7041', DeviceType::TABLET ],
+    'TM-7043XD'                                 => [ 'teXet', 'TM-7043XD', DeviceType::TABLET ],
+    'TM-7047HD 3G'                              => [ 'teXet', 'TM-7047HD', DeviceType::TABLET ],
+    'NaviPad TM-7055HD 3G'                      => [ 'teXet', 'NaviPad HD TM-7055', DeviceType::TABLET ],
+    'TM-7096'                                   => [ 'teXet', 'X-pad NAVI 7.3 TM-7096', DeviceType::TABLET ],
+    'TM-7099'                                   => [ 'teXet', 'TM-7099', DeviceType::TABLET ],
+    'TM-7854'                                   => [ 'teXet', 'TM-7854', DeviceType::TABLET ],
+    'NaviPad TM-7855 3G'                        => [ 'teXet', 'NaviPad TM-7855', DeviceType::TABLET ],
+    'NaviPad TM-7858 3G (revision 1)'           => [ 'teXet', 'NaviPad TM-7858', DeviceType::TABLET ],
+    'TM-8041HD'                                 => [ 'teXet', 'TM-8041HD', DeviceType::TABLET ],
+    'TM-8048 revision1'                         => [ 'teXet', 'X-force 8 TM-8048', DeviceType::TABLET ],
+    'TM-8051'                                   => [ 'teXet', 'X-pad FORCE 8i TM-8051', DeviceType::TABLET ],
+    'TM-9720'                                   => [ 'teXet', 'TM-9720', DeviceType::TABLET ],
+    'TM-9725'                                   => [ 'teXet', 'TM-9725', DeviceType::TABLET ],
+    'TM-9740'                                   => [ 'teXet', 'TM-9740', DeviceType::TABLET ],
+    'TM-9741'                                   => [ 'teXet', 'TM-9741', DeviceType::TABLET ],
+    'TM-9743W'                                  => [ 'teXet', 'TM-9743W', DeviceType::TABLET ],
+    'TM-9747!'                                  => [ 'teXet', 'TM-9747', DeviceType::TABLET ],
+    'TM-9748 3G'                                => [ 'teXet', 'TM-9748', DeviceType::TABLET ],
+    'TM-9750HD'                                 => [ 'teXet', 'TM-9750HD', DeviceType::TABLET ],
+    'TM-9751HD'                                 => [ 'teXet', 'TM-9751HD', DeviceType::TABLET ],
+    'TM-9757'                                   => [ 'teXet', 'TM-9757', DeviceType::TABLET ],
+    'TM-9757 3G rev1'                           => [ 'teXet', 'TM-9757', DeviceType::TABLET ],
+    'TM-9767'                                   => [ 'teXet', 'X-pad STYLE 10 TM-9767', DeviceType::TABLET ],
+    'TM-1058'                                   => [ 'teXet', 'X-force 10 TM-1058', DeviceType::TABLET ],
+    'EVERY35'                                   => [ 'Thomson', 'Every35' ],
+
+    'TLINK[0-9]{3,3}!!' => [
+        'TLINK350'                                  => [ 'Thomson', 'Tlink350' ],
+        'TLINK351'                                  => [ 'Thomson', 'Tlink351' ],
+        'TLINK355'                                  => [ 'Thomson', 'Tlink355' ],
+        'TLINK405'                                  => [ 'Thomson', 'Tlink405' ],
+        'TLINK410'                                  => [ 'Thomson', 'Tlink410' ],
+        'TLINK455'                                  => [ 'Thomson', 'Tlink455' ],
+        'TLINK475'                                  => [ 'Thomson', 'Tlink475' ],
+        'TLINK535'                                  => [ 'Thomson', 'Tlink535' ],
+    ],
+
+    'MoFing'                                    => [ 'Thomson', 'MoFing', DeviceType::TABLET ],
+    '8950'                                      => [ 'Thomson', '3G 8950', DeviceType::TABLET ],
+    'PRIMO7'                                    => [ 'Thomson', 'Primo 7', DeviceType::TABLET ],
+    'PRIMO8'                                    => [ 'Thomson', 'Primo 8', DeviceType::TABLET ],
+    'QM734-8G'                                  => [ 'Thomson', 'QM734-8G', DeviceType::TABLET ],
+    'QM735-8G'                                  => [ 'Thomson', 'QM735-8G', DeviceType::TABLET ],
+
+    '(CJ-)?ThL!!' => [
+        'ThL A1'                                    => [ 'THL', 'A1' ],
+        'ThL A2'                                    => [ 'THL', 'A2' ],
+        'ThL-I95'                                   => [ 'THL', 'I95' ],
+        'ThL-I95S'                                  => [ 'THL', 'I95S' ],
+        'thl L969'                                  => [ 'THL', 'L969' ],
+        'ThL T1'                                    => [ 'THL', 'T1' ],
+        'ThL T3'                                    => [ 'THL', 'T3' ],
+        'thl T5'                                    => [ 'THL', 'T5' ],
+        'THL T5S'                                   => [ 'THL', 'T5S' ],
+        'thl T6'                                    => [ 'THL', 'T6' ],
+        'thl T6 pro'                                => [ 'THL', 'T6 Pro' ],
+        'thl T6C'                                   => [ 'THL', 'T6C' ],
+        'thl T6S'                                   => [ 'THL', 'T6S' ],
+        'thl T7'                                    => [ 'THL', 'T7' ],
+        'thl T9'                                    => [ 'THL', 'T9' ],
+        'thl T9 Pro'                                => [ 'THL', 'T9 Pro' ],
+        'thl T11'                                   => [ 'THL', 'T11' ],
+        'thl T12'                                   => [ 'THL', 'T12' ],
+        'thl T100'                                  => [ 'THL', 'T100' ],
+        'thl T100S'                                 => [ 'THL', 'T100S' ],
+        'thl  T100S'                                => [ 'THL', 'T100S' ],
+        'ThL V7'                                    => [ 'THL', 'V7' ],
+        'ThL V8'                                    => [ 'THL', 'V8' ],
+        'ThL V9'                                    => [ 'THL', 'V9' ],
+        'ThL V11'                                   => [ 'THL', 'V11' ],
+        'CJ-ThL V11'                                => [ 'THL', 'V11' ],
+        'ThL V12'                                   => [ 'THL', 'V12' ],
+        'ThL W1'                                    => [ 'THL', 'W1' ],
+        'CJ-ThL W1'                                 => [ 'THL', 'W1' ],
+        'ThL W1+'                                   => [ 'THL', 'W1+' ],
+        'ThL W2'                                    => [ 'THL', 'W2' ],
+        'CJ-ThL W2'                                 => [ 'THL', 'W2' ],
+        'ThL W3'                                    => [ 'THL', 'W3' ],
+        'ThL W3dc'                                  => [ 'THL', 'W3' ],
+        'ThL W3 (Dual Core)'                        => [ 'THL', 'W3' ],
+        'ThL W3+ (Dual Core)'                       => [ 'THL', 'W3+' ],
+        'ThL W5'                                    => [ 'THL', 'W5' ],
+        'ThL W6'                                    => [ 'THL', 'W6' ],
+        'ThL W7'                                    => [ 'THL', 'W7' ],
+        'THL W7s'                                   => [ 'THL', 'W7s' ],
+        'ThL W8'                                    => [ 'THL', 'W8' ],
+        'ThL W8s'                                   => [ 'THL', 'W8s' ],
+        'ThL W9'                                    => [ 'THL', 'W9' ],
+        'ThL W11'                                   => [ 'THL', 'W11' ],
+        'Thl w100'                                  => [ 'THL', 'W100' ],
+        'THL W100S'                                 => [ 'THL', 'W100s' ],
+        'THL W200'                                  => [ 'THL', 'W200' ],
+        'ThL W200C'                                 => [ 'THL', 'W200c' ],
+        'ThL W200S'                                 => [ 'THL', 'W200s' ],
+        'ThL W300'                                  => [ 'THL', 'W300' ],
+        'thl 2015'                                  => [ 'THL', '2015' ],
+        'thl 2015A'                                 => [ 'THL', '2015A' ],
+        'thl 4000'                                  => [ 'THL', '4000' ],
+        'thl 4400'                                  => [ 'THL', '4400' ],
+        'thl5000'                                   => [ 'THL', '5000' ],
+        'thl 5000'                                  => [ 'THL', '5000' ],
+        'thl  5000T'                                => [ 'THL', '5000T' ],
+    ],
+
+    'W8 beyond'                                 => [ 'THL', 'W8 beyond' ],
+    'W100'                                      => [ 'THL', 'W100' ],
+
+    'TizzBird!!' => [
+        'TizzBird N1G'                              => [ 'TizzBird', 'N1', DeviceType::TELEVISION ],
+        'TizzBird S20A'                             => [ 'TizzBird', 'S20A', DeviceType::TELEVISION ],
+        'TizzBird S20T'                             => [ 'TizzBird', 'S20T', DeviceType::TELEVISION ],
+    ],
+
+    'MagicBox'                                  => [ 'Tmall', 'MagicBox', DeviceType::TELEVISION ],
+
+    'tolino tab!!' => [
+        'tolino tab 7'                              => [ 'Tolino', 'Tab 7', DeviceType::TABLET ],
+        'tolino tab 8'                              => [ 'Tolino', 'Tab 8', DeviceType::TABLET ],
+        'tolino tab 8.9'                            => [ 'Tolino', 'Tab 8.9', DeviceType::TABLET ],
+    ],
+
+    'ATP7526'                                   => [ 'Tomtec', 'Ultimate10', DeviceType::TABLET ],
+    'ATP7683'                                   => [ 'Tomtec', 'Ultimate10', DeviceType::TABLET ],
+    'Ultimate10'                                => [ 'Tomtec', 'Ultimate10', DeviceType::TABLET ],
+    'Ultimate10-Android4.0'                     => [ 'Tomtec', 'Ultimate10', DeviceType::TABLET ],
+    'Ultimate 10'                               => [ 'Tomtec', 'Ultimate10', DeviceType::TABLET ],
+
+    'TomTom Bridge'                             => [ 'TomTom', 'Bridge', DeviceType::CAR ],
+    'TomTom PRO 8275'                           => [ 'TomTom', 'PRO 8275', DeviceType::CAR ],
+
+    'TOOKY!!' => [
+        'TOOKY A6'                                  => [ 'Tooky', 'A6' ],
+        'TOOKY A9'                                  => [ 'Tooky', 'A9' ],
+        'TOOKY A9PLUS'                              => [ 'Tooky', 'A9 Plus' ],
+        'TOOKY A19PLUS'                             => [ 'Tooky', 'A19 Plus' ],
+        'TOOKY A81'                                 => [ 'Tooky', 'A81' ],
+        'TOOKY A110'                                => [ 'Tooky', 'A110' ],
+        'TOOKY K1'                                  => [ 'Tooky', 'K1' ],
+        'TOOKY T83'                                 => [ 'Tooky', 'T83' ],
+        'TOOKY T85'                                 => [ 'Tooky', 'T85' ],
+        'TOOKY T88'                                 => [ 'Tooky', 'T88' ],
+        'TOOKY T1981'                               => [ 'Tooky', 'T1981' ],
+        'Tooky T1981+'                              => [ 'Tooky', 'T1981 Plus' ],
+        'TOOKY T1981PLUS'                           => [ 'Tooky', 'T1981 Plus' ],
+        'TOOKY T1982'                               => [ 'Tooky', 'T1982' ],
+        'TOOKY T1992'                               => [ 'Tooky', 'T1992' ],
+        'TOOKY W1'                                  => [ 'Tooky', 'W1' ],
+    ],
+
+    'DROIDZ Duo'                                => [ 'Torque', 'DROIDZ Duo', DeviceType::TABLET ],
+    'DROIDZ Duo'                                => [ 'Torque', 'DROIDZ Duo', DeviceType::TABLET ],
+    'DROIDZ Active 3G'                          => [ 'Torque', 'DROIDZ Active', DeviceType::TABLET ],
+    'DROIDZ ATOM S'                             => [ 'Torque', 'DROIDZ Atom S', DeviceType::TABLET ],
+    'DROIDZ Beat TV'                            => [ 'Torque', 'DROIDZ Beat TV', DeviceType::TABLET ],
+    'DROIDZ Drive+'                             => [ 'Torque', 'DROIDZ Drive+', DeviceType::TABLET ],
+    'DROIDZ Duo'                                => [ 'Torque', 'DROIDZ Duo', DeviceType::TABLET ],
+    'DROIDZ Excel'                              => [ 'Torque', 'DROIDZ Excel', DeviceType::TABLET ],
+    'DROIDZ Excite'                             => [ 'Torque', 'DROIDZ Excite', DeviceType::TABLET ],
+    'DROIDZ Force'                              => [ 'Torque', 'DROIDZ Force', DeviceType::TABLET ],
+    'DROIDZ Match TV'                           => [ 'Torque', 'DROIDZ Match TV', DeviceType::TABLET ],
+    'DROIDZ Mini Q'                             => [ 'Torque', 'DROIDZ Mini Q', DeviceType::TABLET ],
+    'DROIDZ Portal X'                           => [ 'Torque', 'DROIDZ Portal X', DeviceType::TABLET ],
+    'DROIDZ Quad'                               => [ 'Torque', 'DROIDZ Quad', DeviceType::TABLET ],
+    'DROIDZ Race'                               => [ 'Torque', 'DROIDZ Race', DeviceType::TABLET ],
+    'DROIDZ Race X'                             => [ 'Torque', 'DROIDZ Race X', DeviceType::TABLET ],
+    'DROIDZ Sport'                              => [ 'Torque', 'DROIDZ Sport', DeviceType::TABLET ],
+    'DROIDZ Ultimate'                           => [ 'Torque', 'DROIDZ Ultimate', DeviceType::TABLET ],
+
+    'TSB CLOUD COMPANION;TOSHIBA AC AND AZ'     => [ 'Toshiba', 'Dynabook AZ', 'desktop' ],
+    'TOSHIBA AC AND AZ'                         => [ 'Toshiba', 'Dynabook AZ', 'desktop' ],
+    'TOSHIBA FOLIO AND A'                       => [ 'Toshiba', 'Folio 100', DeviceType::TABLET ],
+    'T-01C'                                     => [ 'Toshiba', 'REGZA Phone T-01C', 'carrier' => 'DoCoMo' ],
+    'T-01D'                                     => [ 'Toshiba', 'REGZA Phone T-01D', 'carrier' => 'DoCoMo' ],
+    'T-02D'                                     => [ 'Toshiba', 'REGZA Phone T-02D', 'carrier' => 'DoCoMo' ],
+    'IS04'                                      => [ 'Toshiba', 'REGZA Phone IS04', 'carrier' => 'au' ],
+    'IS11T'                                     => [ 'Toshiba', 'REGZA Phone IS11T', 'carrier' => 'au' ],
+    'AT1S0'                                     => [ 'Toshiba', 'Regza AT1S0' ],
+    'AT7-A'                                     => [ 'Toshiba', 'Excite AT7-A', DeviceType::TABLET ],
+    'AT7-B'                                     => [ 'Toshiba', 'Excite AT7-B', DeviceType::TABLET ],
+    'AT7-C'                                     => [ 'Toshiba', 'Excite AT7-C', DeviceType::TABLET ],
+    'AT10-A'                                    => [ 'Toshiba', 'Excite AT10-A', DeviceType::TABLET ],
+    'AT10LE-A'                                  => [ 'Toshiba', 'Excite AT10LE-A', DeviceType::TABLET ],
+    'AT10PE-A'                                  => [ 'Toshiba', 'Excite AT10PE-A', DeviceType::TABLET ],
+    'Tostab03'                                  => [ 'Toshiba', 'Regza AT100', DeviceType::TABLET ],
+    'AT100'                                     => [ 'Toshiba', 'Regza AT100', DeviceType::TABLET ],
+    'AT200'                                     => [ 'Toshiba', 'Regza AT200', DeviceType::TABLET ],
+    'AT270'                                     => [ 'Toshiba', 'Regza AT270', DeviceType::TABLET ],
+    'AT300'                                     => [ 'Toshiba', 'Regza AT300', DeviceType::TABLET ],
+    'AT300SE'                                   => [ 'Toshiba', 'Regza AT300SE', DeviceType::TABLET ],
+    'AT330'                                     => [ 'Toshiba', 'Regza AT330', DeviceType::TABLET ],
+    'AT374'                                     => [ 'Toshiba', 'Regza AT374', DeviceType::TABLET ],
+    'AT400'                                     => [ 'Toshiba', 'Regza AT400', DeviceType::TABLET ],
+    'AT470'                                     => [ 'Toshiba', 'Regza AT470', DeviceType::TABLET ],
+    'AT500'                                     => [ 'Toshiba', 'Regza AT500', DeviceType::TABLET ],
+    'AT500a'                                    => [ 'Toshiba', 'Regza AT500', DeviceType::TABLET ],
+    'AT503'                                     => [ 'Toshiba', 'Regza AT503', DeviceType::TABLET ],
+    'AT570'                                     => [ 'Toshiba', 'Regza AT570', DeviceType::TABLET ],
+    'AT703'                                     => [ 'Toshiba', 'Regza AT703', DeviceType::TABLET ],
+    'AT830'                                     => [ 'Toshiba', 'Regza AT830', DeviceType::TABLET ],
+    'Folio 100'                                 => [ 'Toshiba', 'Folio 100', DeviceType::TABLET ],
+    'folio100'                                  => [ 'Toshiba', 'Folio 100', DeviceType::TABLET ],
+    'THRiVE'                                    => [ 'Toshiba', 'THRiVE', DeviceType::TABLET ],
+    'Hikari-iFrame!'                            => [ 'Toshiba', 'Hikari iFrame', DeviceType::TABLET, 'carrier' => 'NTT' ],
+
+    'Satellite!!' => [
+        'Satellite ([A-Z][0-9]{3,3}[A-Z]?)!'        => [ 'Toshiba', 'Satellite $1', DeviceType::DESKTOP ],
+        'Satellite ([A-Z][0-9]{2,2}[A-Z]+-[A-Z])!'  => [ 'Toshiba', 'Satellite $1', DeviceType::DESKTOP ],
+        'Satellite ([A-Z][0-9]{2,2}-[A-Z]?)!'       => [ 'Toshiba', 'Satellite $1', DeviceType::DESKTOP ],
+        'Satellite Pro ([A-Z][0-9]{3,3})!'          => [ 'Toshiba', 'Satellite Pro $1', DeviceType::DESKTOP ],
+    ],
+
+    'StarTab 715x'                              => [ 'Touch+', 'Startab 715', DeviceType::TABLET ],
+    'TRACER OXYGEN GS1'                         => [ 'Tracer', 'Oxygen GS1' ],
+
+    'ST[0-9]{5,5}-[0-9]!!' => [
+        'ST70104-1!'                                => [ 'Trekstor', 'Surftab Breeze 7.0', DeviceType::TABLET ],
+        'ST70104-2!'                                => [ 'Trekstor', 'Surftab Breeze 7.0', DeviceType::TABLET ],
+        'ST70208-1!'                                => [ 'Trekstor', 'Surftab Ventos 7.0', DeviceType::TABLET ],
+        'ST70208-2!'                                => [ 'Trekstor', 'Surftab Ventos 7.0', DeviceType::TABLET ],
+        'ST70208-4!'                                => [ 'Trekstor', 'Surftab Ventos 7.0', DeviceType::TABLET ],
+        'ST70216-1!'                                => [ 'Trekstor', 'Surftab Ventos 7.0', DeviceType::TABLET ],
+        'ST80208-1!'                                => [ 'Trekstor', 'Surftab Ventos 8.0', DeviceType::TABLET ],
+        'ST80208-2!'                                => [ 'Trekstor', 'Surftab Ventos 8.0', DeviceType::TABLET ],
+        'ST80216-1!'                                => [ 'Trekstor', 'Surftab Ventos 8.0', DeviceType::TABLET ],
+        'ST80216-2!'                                => [ 'Trekstor', 'Surftab Ventos 8.0', DeviceType::TABLET ],
+        'ST97216-1!'                                => [ 'Trekstor', 'Surftab Ventos 9.7', DeviceType::TABLET ],
+        'ST10216-1!'                                => [ 'Trekstor', 'Surftab Ventos 10.1', DeviceType::TABLET ],
+        'ST10216-2!'                                => [ 'Trekstor', 'Surftab Ventos 10.1', DeviceType::TABLET ],
+        'ST10216-2!'                                => [ 'Trekstor', 'Surftab Ventos 10.1', DeviceType::TABLET ],
+        'ST10216-3!'                                => [ 'Trekstor', 'Surftab Ventos 10.1', DeviceType::TABLET ],
+        'ST70404-1!'                                => [ 'Trekstor', 'Surftab Xirion 7.0', DeviceType::TABLET ],
+        'ST70408-1!'                                => [ 'Trekstor', 'Surftab Xirion 7.0', DeviceType::TABLET ],
+        'ST10416-1!'                                => [ 'Trekstor', 'Surftab Xirion 10.1', DeviceType::TABLET ],
+    ],
+
+    'Trevi PHABLET 4C'                          => [ 'Trevi', 'Phablet 4C' ],
+    'PHABLET 4S'                                => [ 'Trevi', 'Phablet 4S' ],
+    'Phablet 4.5Q'                              => [ 'Trevi', 'Phablet 4.5Q' ],
+    'Trevi PHABLET 5 S'                         => [ 'Trevi', 'Phablet 5S' ],
+
+    'TREQ!!' => [
+        'TREQ A10C'                                 => [ 'Treq', 'A10C', DeviceType::TABLET ],
+        'TREQ A10C 2'                               => [ 'Treq', 'A10C 2', DeviceType::TABLET ],
+        'TREQ A10G 3G'                              => [ 'Treq', 'A10G', DeviceType::TABLET ],
+        'treq A10G Duo'                             => [ 'Treq', 'A10G', DeviceType::TABLET ],
+        'TREQ A10 basic'                            => [ 'Treq', 'Basic', DeviceType::TABLET ],
+        'TREQ Basic 2'                              => [ 'Treq', 'Basic 2', DeviceType::TABLET ],
+        'Treq 3G Basic 2'                           => [ 'Treq', 'Basic 2', DeviceType::TABLET ],
+        'Treq Basic 2K-8'                           => [ 'Treq', 'Basic 2K', DeviceType::TABLET ],
+        'TREQ A10 Basic 2+'                         => [ 'Treq', 'Basic 2+', DeviceType::TABLET ],
+        'TREQ basic 3'                              => [ 'Treq', 'Basic 3', DeviceType::TABLET ],
+        'Treq 3G Basic 3'                           => [ 'Treq', 'Basic 3', DeviceType::TABLET ],
+        'Treq Book 3G'                              => [ 'Treq', 'Book 3G', DeviceType::TABLET ],
+        'Treq Call 7K'                              => [ 'Treq', 'Call 7K', DeviceType::TABLET ],
+        'Treq A10 Pocket'                           => [ 'Treq', 'Pocket', DeviceType::TABLET ],
+        'TREQ A10 Pocket2'                          => [ 'Treq', 'Pocket 2', DeviceType::TABLET ],
+        'TREQ POCKET STAR 5'                        => [ 'Treq', 'Pocket Star 5', DeviceType::TABLET ],
+        'TREQ TUNE'                                 => [ 'Treq', 'Tune', DeviceType::TABLET ],
+        'TREQ Tune Z'                               => [ 'Treq', 'Tune Z', DeviceType::TABLET ],
+        'TREQ Turbo'                                => [ 'Treq', 'Turbo', DeviceType::TABLET ],
+        'TREQ-TURBO'                                => [ 'Treq', 'Turbo', DeviceType::TABLET ],
+        'TREQ 3G Turbo'                             => [ 'Treq', 'Turbo', DeviceType::TABLET ],
+    ],
+
+    'Phablet 5,3 Q'                             => [ 'Trevi', 'Phablet 5.3 Q' ],
+    'Trevi REVERSE 5.5Q'                        => [ 'Trevi', 'Phablet 5.5 Q REVERSE' ],
+    'Trevi PHABLET 6 S'                         => [ 'Trevi', 'Phablet 6 S' ],
+    'TAB 7 3G V8'                               => [ 'Trevi', 'Tab 7 V8', DeviceType::TABLET ],
+    'TAB 8 3G V8'                               => [ 'Trevi', 'Tab 8 V8', DeviceType::TABLET ],
+    'TAB9 3G'                                   => [ 'Trevi', 'Tab 9', DeviceType::TABLET ],
+    'TAB9 3G V8'                                => [ 'Trevi', 'Tab 9 V8', DeviceType::TABLET ],
+    'TAB 10 3G V16'                             => [ 'Trevi', 'Tab 10 V16', DeviceType::TABLET ],
+    'Turbo-X pi'                                => [ 'Turbo-X', 'Pi' ],
+    'Turbo-X Ice'                               => [ 'Turbo-X', 'Ice', DeviceType::TABLET ],
+    'Turbo-X Tablet Spice III'                  => [ 'Turbo-X', 'Spice III', DeviceType::TABLET ],
+    'SPICE IV'                                  => [ 'Turbo-X', 'Spice IV', DeviceType::TABLET ],
+    'NuclearSX-SP5'                             => [ 'TVC', 'Nuclear SX-SP5' ],
+
+    '(Amazing|Fantastic)!!' => [
+        'Amazing A1'                                => [ 'TWM', 'Amazing A1' ],
+        'Amazing A3'                                => [ 'TWM', 'Amazing A3' ],
+        'Amazing A4'                                => [ 'TWM', 'Amazing A4' ],
+        'Amazing A4C'                               => [ 'TWM', 'Amazing A4C' ],
+        'Amazing A4S'                               => [ 'TWM', 'Amazing A4S' ],
+        'Amazing A5S'                               => [ 'TWM', 'Amazing A5S' ],
+        'Amazing A6'                                => [ 'TWM', 'Amazing A6' ],
+        'Amazing A7'                                => [ 'TWM', 'Amazing A7' ],
+        'Amazing A8'                                => [ 'TWM', 'Amazing A8' ],
+        'Amazing P6'                                => [ 'TWM', 'Amazing P6' ],
+        'Amazing X1'                                => [ 'TWM', 'Amazing X1' ],
+        'Amazing X2'                                => [ 'TWM', 'Amazing X2' ],
+        'Amazing X3'                                => [ 'TWM', 'Amazing X3' ],
+        'Amazing X3s'                               => [ 'TWM', 'Amazing X3s' ],
+        'Amazing X3s 16G'                           => [ 'TWM', 'Amazing X3s' ],
+        'Amazing X5'                                => [ 'TWM', 'Amazing X5' ],
+        'Amazing X5s'                               => [ 'TWM', 'Amazing X5s' ],
+        'Amazing X6'                                => [ 'TWM', 'Amazing X6' ],
+        'Amazing X7'                                => [ 'TWM', 'Amazing X7' ],
+        'Fantastic T3'                              => [ 'TWM', 'Fantastic T3' ],
+    ],
+
+    'A6S'                                       => [ 'TWM', 'Amazing A6S' ],
+    'TB100'                                     => [ 'Unitech', 'TB100', DeviceType::TABLET ],
+    'M70014'                                    => [ 'United Star Technology', 'M70014', DeviceType::TABLET ],
+    'QOOQ'                                      => [ 'Unowhy', 'QOOQ', DeviceType::TABLET ],
+
+    'UMI!!' => [
+        'UMI C1'                                    => [ 'UMI', 'C1' ],
+        'UMI-R1'                                    => [ 'UMI', 'R1' ],
+        'UMI-R1(TD)'                                => [ 'UMI', 'R1' ],
+        'UMI S1'                                    => [ 'UMI', 'S1' ],
+        'UMI X1'                                    => [ 'UMI', 'X1' ],
+        'UMI X1S'                                   => [ 'UMI', 'X1s' ],
+        'UMI X1-PRO'                                => [ 'UMI', 'X1' ],
+        'UMI X2'                                    => [ 'UMI', 'X1 Pro' ],
+        'UMI-X2'                                    => [ 'UMI', 'X2' ],
+        'UmiX2'                                     => [ 'UMI', 'X2' ],
+        'UMI X3'                                    => [ 'UMI', 'X3' ],
+        'UMIDIGI Z'                                 => [ 'UMI', 'Z' ],
+        'UMI CROSS'                                 => [ 'UMI', 'Cross' ],
+        'UMI Diamond'                               => [ 'UMI', 'Diamond' ],
+        'UMI Diamond X'                             => [ 'UMI', 'Diamond X' ],
+        'UMI eMAX'                                  => [ 'UMI', 'eMax' ],
+        'UMI London'                                => [ 'UMI', 'London' ],
+        'UMI MAX'                                   => [ 'UMI', 'Max' ],
+        'UMI Plus E'                                => [ 'UMI', 'Plus E' ],
+        'Umi Rome-x'                                => [ 'UMI', 'Rome X' ],
+        'UMI Super'                                 => [ 'UMI', 'Super' ],
+        'UMI TOUCH'                                 => [ 'UMI', 'Touch' ],
+        'UMI TOUCH X'                               => [ 'UMI', 'Touch X' ],
+        'UMI ZERO'                                  => [ 'UMI', 'Zero' ],
+    ],
+
+    'U1203'                                     => [ 'Uniscope', 'U1203' ],
+
+    'Unusual!!' => [
+        'UNUSUAL U7X'                               => [ 'Unusual', 'U7X', DeviceType::TABLET ],
+        'Unusual U10Z'                              => [ 'Unusual', 'U10Z', DeviceType::TABLET ],
+        'UNUSUAL 7X'                                => [ 'Unusual', '7X', DeviceType::TABLET ],
+        'Unusual 7X Quad'                           => [ 'Unusual', '7X', DeviceType::TABLET ],
+        'UNUSUAL 7X+'                               => [ 'Unusual', '7X+', DeviceType::TABLET ],
+        'UNUSUAL 10M'                               => [ 'Unusual', '10M', DeviceType::TABLET ],
+        'UNUSUAL 10X'                               => [ 'Unusual', '10X', DeviceType::TABLET ],
+        'UNUSUAL 10XQUAD'                           => [ 'Unusual', '10X', DeviceType::TABLET ],
+        'Unusual 10Z'                               => [ 'Unusual', '10Z', DeviceType::TABLET ],
+        'UNUSUAL 40Y'                               => [ 'Unusual', '40Y', DeviceType::TABLET ],
+    ],
+
+    'UOOGOU!!' => [
+        'UOOGOU F2'                                 => [ 'Uoogou', 'F2' ],
+        'UOOGOU P1'                                 => [ 'Uoogou', 'P1' ],
+        'UOOGOU Q6'                                 => [ 'Uoogou', 'Q6' ],
+        'UOOGOU Q7'                                 => [ 'Uoogou', 'Q7' ],
+        'UOOGOU-Q9'                                 => [ 'Uoogou', 'Q9' ],
+        'UOOGOU R5'                                 => [ 'Uoogou', 'R5' ],
+        'UOOGOU X3'                                 => [ 'Uoogou', 'X3' ],
+        'UOOGOU X5'                                 => [ 'Uoogou', 'X5' ],
+        'UOOGOU X6'                                 => [ 'Uoogou', 'X6' ],
+    ],
+
+    'UTime!!' => [
+        'UTime i8'                                  => [ 'UTime', 'i8' ],
+        'UTime U100'                                => [ 'UTime', 'U100' ],
+        'UTime X1'                                  => [ 'UTime', 'X1' ],
+    ],
+
+    'Usmart!!' => [
+        'USmart CL600'                              => [ 'USmart', 'CL600' ],
+        'Usmart F450'                               => [ 'USmart', 'F450' ],
+        'Usmart-F450'                               => [ 'USmart', 'F450' ],
+    ],
+
+    'KUNO4'                                     => [ 'uWriteTouch', 'KUNO 4', DeviceType::TABLET ],
+    'KUNO 4+'                                   => [ 'uWriteTouch', 'KUNO 4+', DeviceType::TABLET ],
+
+    'PS47'                                      => [ 'Velocity Micro', 'Cruz PS47', DeviceType::TABLET ],
+    'T301'                                      => [ 'Velocity Micro', 'Cruz T301', DeviceType::TABLET ],
+
+    'Verifone Carbon-8'                         => [ 'Verifone', 'Carbon 8', DeviceType::POS ],
+
+    'VS TOUCH!!' => [
+        'VS TOUCHPAD9 A'                            => [ 'Versus', 'Touchpad 9', DeviceType::TABLET ],
+        'Vs TOUCHPAD 9.7'                           => [ 'Versus', 'Touchpad 9.7', DeviceType::TABLET ],
+        'VS TOUCHTAB 7DC'                           => [ 'Versus', 'Touchtab 7 Dual Core', DeviceType::TABLET ],
+        'VS TOUCHTAB 7DC V'                         => [ 'Versus', 'Touchtab 7 Dual Core', DeviceType::TABLET ],
+        'VS TOUCHTAB 8DC'                           => [ 'Versus', 'Touchtab 8 Dual Core', DeviceType::TABLET ],
+        'VS TOUCHTAB 9'                             => [ 'Versus', 'Touchtab 9', DeviceType::TABLET ],
+        'VS TOUCHTAB 10.1DC'                        => [ 'Versus', 'Touchtab 10.1 Dual Core', DeviceType::TABLET ],
+    ],
+
+    'verykool!!' => [
+        'verykool RS75'                             => [ 'verykool', 'Flint RS75' ],
+        'verykool RS76'                             => [ 'verykool', 'RS76' ],
+        'verykool RS90'                             => [ 'verykool', 'Vortex RS90' ],
+        'verykool S351'                             => [ 'verykool', 'Beryl s351' ],
+        'verykool S352'                             => [ 'verykool', 'Jasper II s352' ],
+        'verykool S353'                             => [ 'verykool', 'Jasper s353' ],
+        'verykool S354'                             => [ 'verykool', 'Mystic s354' ],
+        'verykool S400'                             => [ 'verykool', 'Ruby s400' ],
+        'verykool S400T'                            => [ 'verykool', 'Ruby s400' ],
+        'verykool S401'                             => [ 'verykool', 'Aura s401' ],
+        'verykool S450'                             => [ 'verykool', 'Onyx s450' ],
+        'verykool S470'                             => [ 'verykool', 'Black Pearl s470' ],
+        'verykool s505'                             => [ 'verykool', 'Spark s505' ],
+        'verykool S732'                             => [ 'verykool', 's732' ],
+        'verykool s3501'                            => [ 'verykool', 'Lynx s3501' ],
+        'verykool Lynx II s3502'                    => [ 'verykool', 'Lynx II s3502' ],
+        'verykool s3503'                            => [ 'verykool', 'Lynx II s3503' ],
+        'verykool Lynx II s3503'                    => [ 'verykool', 'Lynx II s3503' ],
+        'verykool S3504'                            => [ 'verykool', 'Mystic II s3504' ],
+        'verykool Leo s4002'                        => [ 'verykool', 'Leo s4002' ],
+        'verykool Leo II s4003'                     => [ 'verykool', 'Leo II s4003' ],
+        'verykool Leo 3G Jr s4005'                  => [ 'verykool', 'Leo 3G Jr. s4005' ],
+        'verykool s4006'                            => [ 'verykool', 'Leo 3G s4006' ],
+        'VerykoolS4006'                             => [ 'verykool', 'Leo 3G s4006' ],
+        'VerykoolS4006Q'                            => [ 'verykool', 'Leo 3G s4006' ],
+        'verykools4006T'                            => [ 'verykool', 'Leo 3G s4006' ],
+        'verykool s4010'                            => [ 'verykool', 'Gazelle s4010' ],
+        'verykool s4010t'                           => [ 'verykool', 'Gazelle s4010' ],
+        'verykool s4010u'                           => [ 'verykool', 'Gazelle s4010' ],
+        'verykool s4510'                            => [ 'verykool', 'Luna s4510' ],
+        'verykool s4510u'                           => [ 'verykool', 'Luna s4510' ],
+        'verykool Luna s4510u'                      => [ 'verykool', 'Luna s4510' ],
+        'verykool Luna II s4512'                    => [ 'verykool', 'Luna II s4512' ],
+        'verykools5001'                             => [ 'verykool', 'Lotus s5001' ],
+        'verykool s5001'                            => [ 'verykool', 'Lotus s5001' ],
+        'verykool Lotus s5001'                      => [ 'verykool', 'Lotus s5001' ],
+        'verykool Sol Jr s5002'                     => [ 'verykool', 'Sol Jr. s5002' ],
+        'verykool Sol Quatro Jr s5003'              => [ 'verykool', 'Sol Quatro Jr. s5003' ],
+        'verykools5004'                             => [ 'verykool', 's5004' ],
+        'verykools5005'                             => [ 'verykool', 'Lotus II s5005' ],
+        'verykool s5012'                            => [ 'verykool', 'Orbit s5012' ],
+        'verykool Sol s5013'                        => [ 'verykool', 'Sol s5013' ],
+        'verykool s5014'                            => [ 'verykool', 'Atlas s5014' ],
+        'verykool Atlas s5014'                      => [ 'verykool', 'Atlas s5014' ],
+        'verykool s5015'                            => [ 'verykool', 'Spark II s5015' ],
+        'verykool s5015 Nextel Chile'               => [ 'verykool', 'Spark II s5015' ],
+        'verykool s5015 WOM Chile'                  => [ 'verykool', 'Spark II s5015' ],
+        'verykool Sol Quatro s5016'                 => [ 'verykool', 'Sol Quattro s5016' ],
+        'verykool s5017'                            => [ 'verykool', 'Dorado s5017' ],
+        'VerykoolS5017Q'                            => [ 'verykool', 'Dorado s5017' ],
+        'verykool Dorado s5017'                     => [ 'verykool', 'Dorado s5017' ],
+        'verykool Dorado s5017Q'                    => [ 'verykool', 'Dorado s5017' ],
+        'verykool Giant s5020'                      => [ 'verykool', 'Giant s5020' ],
+        'verykool Helix s5025'                      => [ 'verykool', 'Helix s5025' ],
+        'VerykoolS5030'                             => [ 'verykool', 'Helix II s5003' ],
+        'verykool s5510'                            => [ 'verykool', 'Juno s5510' ],
+        'Verykool Juno s5510'                       => [ 'verykool', 'Juno s5510' ],
+        'verykool s5511'                            => [ 'verykool', 'Juno Quatro s5511' ],
+        'verykool Juno Quatro s5511'                => [ 'verykool', 'Juno Quatro s5511' ],
+        'verykool s5516'                            => [ 'verykool', 'Maverick Jr. s5516' ],
+        'verykool s5518'                            => [ 'verykool', 'Maverick s5518' ],
+        'verykool s5518Q'                           => [ 'verykool', 'Maverick s5518' ],
+        'verykoolS5530'                             => [ 'verykool', 'Maverick II s5530' ],
+        'verykool Cyprus s6001'                     => [ 'verykool', 'Cyprus s6001' ],
+        'verykoolS6005'                             => [ 'verykool', 'Cyprus II s6005' ],
+        'verykoolSL4050'                            => [ 'verykool', 'Leo SL4050' ],
+        'verykool SL4050'                           => [ 'verykool', 'Leo SL4050' ],
+        'verykool Fusion SL4500'                    => [ 'verykool', 'Fusion SL4500' ],
+        'verykool Fusion II SL4502'                 => [ 'verykool', 'Fusion II SL4502' ],
+        'verykool SL5009'                           => [ 'verykool', 'Jet SL5009' ],
+        'verykoolSL5011'                            => [ 'verykool', 'Spark SL5011' ],
+        'verykool SL5011'                           => [ 'verykool', 'Spark SL5011' ],
+        'VerykoolSL5550'                            => [ 'verykool', 'Maverick SL5550' ],
+        'verykoolSL6010'                            => [ 'verykool', 'Cyprus SL6010' ],
+        'verykool SL6010'                           => [ 'verykool', 'Cyprus SL6010' ],
+        'verykool  T742'                            => [ 'verykool', 'Kolorpad T742', DeviceType::TABLET ],
+        'verykool T7440'                            => [ 'verykool', 'Kolorpad II T7440', DeviceType::TABLET ],
+        'verykoolT7442'                             => [ 'verykool', 'Kolorpad III T7442', DeviceType::TABLET ],
+        'VerykoolTL8010'                            => [ 'verykool', 'Kolorpad TL8010', DeviceType::TABLET ],
+    ],
+
+    's732'                                      => [ 'verykool', 's732' ],
+
+    'Aster'                                     => [ 'Vertu', 'Aster' ],
+    'Aster T'                                   => [ 'Vertu', 'Aster T' ],
+    'Vertu Aster T'                             => [ 'Vertu', 'Aster T' ],
+    'Constellation V'                           => [ 'Vertu', 'Constellation V' ],
+    'Signature Touch'                           => [ 'Vertu', 'Signature Touch' ],
+    'Signature Touch L'                         => [ 'Vertu', 'Signature Touch L' ],
+    'VERTU Ti'                                  => [ 'Vertu', 'Ti' ],
+    'Venus V3 5570'                             => [ 'Vestel', 'Venus V3 5570' ],
+
+    'VT6078'                                    => [ 'VIA', 'ALTA DS', DeviceType::SIGNAGE ],
+    'victorys s8'                               => [ 'Victory\'s', 'S8' ],
+    'Victorys V8'                               => [ 'Victory\'s', 'V8' ],
+
+    'Videocon!!' => [
+        'Videocon A10'                              => [ 'Videocon', 'A10' ],
+        'Videocon A10F'                             => [ 'Videocon', 'A10F' ],
+        'Videocon A15'                              => [ 'Videocon', 'A15' ],
+        'Videocon A20'                              => [ 'Videocon', 'A20' ],
+        'Videocon A22'                              => [ 'Videocon', 'A22' ],
+        'Videocon A26'                              => [ 'Videocon', 'A26' ],
+        'Videocon A27'                              => [ 'Videocon', 'A27' ],
+        'Videocon A27i'                             => [ 'Videocon', 'A27i' ],
+        'Videocon A30'                              => [ 'Videocon', 'A30' ],
+        'Videocon A42'                              => [ 'Videocon', 'A42' ],
+        'Videocon A45'                              => [ 'Videocon', 'A45' ],
+        'Videocon A47'                              => [ 'Videocon', 'A47' ],
+        'Videocon A51'                              => [ 'Videocon', 'A51' ],
+        'Videocon A54'                              => [ 'Videocon', 'A54' ],
+        'Videocon V3502'                            => [ 'Videocon', 'V3502' ],
+        'Videocon V5014'                            => [ 'Videocon', 'V5014' ],
+        'Videocon V7400'                            => [ 'Videocon', 'V7400' ],
+        'Videocon v7500'                            => [ 'Videocon', 'V7500' ],
+        'Videocon-V7500'                            => [ 'Videocon', 'V7500' ],
+        'Videocon VA75K'                            => [ 'Videocon', 'VA75K', DeviceType::TABLET ],
+        'Videocon VT85C'                            => [ 'Videocon', 'VT85C' ],
+        'Videocon V50FA3'                           => [ 'Videocon', 'Krypton V50FA' ],
+        'Videocon Z40Lite'                          => [ 'Videocon', 'Infinium Z40 Lite' ],
+        'Videocon Z40Lite+'                         => [ 'Videocon', 'Infinium Z40 Lite+' ],
+        'Videocon Z41 AIRE'                         => [ 'Videocon', 'Infinium Z41 Aire' ],
+        'VIDEOCON Z55 Dash'                         => [ 'Videocon', 'Infinium Z55 Dash' ],
+        'VIDEOCON Z55 Delite'                       => [ 'Videocon', 'Infinium Z55 Delite' ],
+        'VIDEOCON Z55 Krypton'                      => [ 'Videocon', 'Infinium Z55 Krypton' ],
+        'Videocon Z55Krypton'                       => [ 'Videocon', 'Infinium Z55 Krypton' ],
+        'VIDEOCON ZEST FLAME'                       => [ 'Videocon', 'Zest Flame' ],
+        'VIDEOCON ZEST FLASH'                       => [ 'Videocon', 'Zest Flash' ],
+        'Videocon V35DC'                            => [ 'Videocon', 'Zest V35DC' ],
+    ],
+
+    'Z30Aire'                                   => [ 'Videocon', 'Infinium Z30 Aire' ],
+    'Z30Dart'                                   => [ 'Videocon', 'Infinium Z30 Dart' ],
+    'Z30Lite'                                   => [ 'Videocon', 'Infinium Z30 Lite' ],
+    'Z30PACE'                                   => [ 'Videocon', 'Infinium Z30 Pace' ],
+    'Z40Lite+'                                  => [ 'Videocon', 'Infinium Z40 Lite+' ],
+    'Z40Pro'                                    => [ 'Videocon', 'Infinium Z40 Pro' ],
+    'Z4OPro'                                    => [ 'Videocon', 'Infinium Z40 Pro' ],
+    'Z40ProLite'                                => [ 'Videocon', 'Infinium Z40 Pro Lite' ],
+    'Z4OProLite'                                => [ 'Videocon', 'Infinium Z40 Pro Lite' ],
+    'Z40QStar'                                  => [ 'Videocon', 'Infinium Z40Q Star' ],
+    'Z41 AIRE'                                  => [ 'Videocon', 'Infinium Z41 Aire' ],
+    'Z41Aire'                                   => [ 'Videocon', 'Infinium Z41 Aire' ],
+    'Z41Lite+'                                  => [ 'Videocon', 'Infinium Z41 Lite+' ],
+    'Z42 Nova'                                  => [ 'Videocon', 'Infinium Z42 Nova' ],
+    'Z45 Amaze'                                 => [ 'Videocon', 'Infinium Z45 Amaze' ],
+    'Z45 Dazzle'                                => [ 'Videocon', 'Infinium Z45 Dazzle' ],
+    'Z45 Nova'                                  => [ 'Videocon', 'Infinium Z45 Nova' ],
+    'Z45 Nova+'                                 => [ 'Videocon', 'Infinium Z45 Nova+' ],
+    'Z45 Quad'                                  => [ 'Videocon', 'Infinium Z45 Quad' ],
+    'Z45Q Star'                                 => [ 'Videocon', 'Infinium Z45Q Star' ],
+    'Z45Q Star+'                                => [ 'Videocon', 'Infinium Z45Q Star+' ],
+    'Z50 Nova'                                  => [ 'Videocon', 'Infinium Z50 Nova' ],
+    'Z50Pro'                                    => [ 'Videocon', 'Infinium Z50 Pro' ],
+    'Z50 Quad'                                  => [ 'Videocon', 'Infinium Z50 Quad' ],
+    'Z50Q Lite'                                 => [ 'Videocon', 'Infinium Z50Q Lite' ],
+    'Z50Q Star'                                 => [ 'Videocon', 'Infinium Z50Q Star' ],
+    'Z51 blaze'                                 => [ 'Videocon', 'Infinium Z51 Blaze' ],
+    'Z51 Nova'                                  => [ 'Videocon', 'Infinium Z51 Nova' ],
+    'Z51 Nova+'                                 => [ 'Videocon', 'Infinium Z51 Nova+' ],
+    'Z51 PUNCH'                                 => [ 'Videocon', 'Infinium Z51 Punch' ],
+    'Z51 Quad'                                  => [ 'Videocon', 'Infinium Z51 Quad' ],
+    'Z51Q Star'                                 => [ 'Videocon', 'Infinium Z51Q Star' ],
+    'Z52 Inspire'                               => [ 'Videocon', 'Infinium Z52 Inspire' ],
+    'Z52 Thunder'                               => [ 'Videocon', 'Infinium Z52 Thunder' ],
+    'Z52 Thunder+'                              => [ 'Videocon', 'Infinium Z52 Thunder+' ],
+
+    'VT75C'                                     => [ 'Videocon', 'VT75C' ],
+    'VT77C'                                     => [ 'Videocon', 'VT77C' ],
+    'VT79C'                                     => [ 'Videocon', 'VT79C' ],
+    'VT87C+'                                    => [ 'Videocon', 'VT87C+' ],
+
+    'ViewSonic-V350'                            => [ 'ViewSonic', 'V350' ],
+    'ViewSonic V500'                            => [ 'ViewSonic', 'V500' ],
+    'ViewPhone3'                                => [ 'ViewSonic', 'ViewPhone 3' ],
+    'GTablet'                                   => [ 'ViewSonic', 'gTablet', DeviceType::TABLET ],
+    'GtabComb'                                  => [ 'ViewSonic', 'gTablet', DeviceType::TABLET ],
+    'TeamDRH ICS for GTablet'                   => [ 'ViewSonic', 'gTablet', DeviceType::TABLET ],
+    'ViewPad 4'                                 => [ 'ViewSonic', 'ViewPad 4', DeviceType::MEDIA ],
+    'ViewSonic-ViewPad4'                        => [ 'ViewSonic', 'ViewPad 4', DeviceType::MEDIA ],
+    'ViewPad7'                                  => [ 'ViewSonic', 'ViewPad 7', DeviceType::TABLET ],
+    'ViewPad 7D'                                => [ 'ViewSonic', 'ViewPad 7d', DeviceType::TABLET ],
+    'ViewPad 7D Pro'                            => [ 'ViewSonic', 'ViewPad 7d Pro', DeviceType::TABLET ],
+    'ViewSonic-ViewPad7e'                       => [ 'ViewSonic', 'ViewPad 7e', DeviceType::TABLET ],
+    'ViewPad7e'                                 => [ 'ViewSonic', 'ViewPad 7e', DeviceType::TABLET ],
+    'ViewPad 7Q'                                => [ 'ViewSonic', 'ViewPad 7q', DeviceType::TABLET ],
+    'ViewPad 7Q Plus'                           => [ 'ViewSonic', 'ViewPad 7q Plus', DeviceType::TABLET ],
+    'ViewPad 7Q Pro'                            => [ 'ViewSonic', 'ViewPad 7q Pro', DeviceType::TABLET ],
+    'ViewPad7X'                                 => [ 'ViewSonic', 'ViewPad 7x', DeviceType::TABLET ],
+    'ViewPad 8E'                                => [ 'ViewSonic', 'ViewPad 8e', DeviceType::TABLET ],
+    'ViewPad 9Q'                                => [ 'ViewSonic', 'ViewPad 9q', DeviceType::TABLET ],
+    'ViewPad 10e'                               => [ 'ViewSonic', 'ViewPad 10e', DeviceType::TABLET ],
+    'ViewPad 10S'                               => [ 'ViewSonic', 'ViewPad 10s', DeviceType::TABLET ],
+    'ViewPad 70Q'                               => [ 'ViewSonic', 'ViewPad 70q', DeviceType::TABLET ],
+    'ViewPad97A'                                => [ 'ViewSonic', 'ViewPad 97a', DeviceType::TABLET ],
+    'ViewPad97a K1'                             => [ 'ViewSonic', 'ViewPad 97a K1', DeviceType::TABLET ],
+    'ViewPad97a Pro'                            => [ 'ViewSonic', 'ViewPad 97a Pro', DeviceType::TABLET ],
+    'ViewPad 97Q'                               => [ 'ViewSonic', 'ViewPad 97q', DeviceType::TABLET ],
+    'ViewPad 100Q'                              => [ 'ViewSonic', 'ViewPad 100q', DeviceType::TABLET ],
+    'ViewPad 100N Pro'                          => [ 'ViewSonic', 'ViewPad 100n Pro', DeviceType::TABLET ],
+    'ViewPad 701N'                              => [ 'ViewSonic', 'ViewPad 701n', DeviceType::TABLET ],
+    'ViewPad i7D'                               => [ 'ViewSonic', 'ViewPad i7D', DeviceType::TABLET ],
+    'ViewPad E100'                              => [ 'ViewSonic', 'ViewPad E100', DeviceType::TABLET ],
+    'ZiiLABS ViewBook 730'                      => [ 'ViewSonic', 'ViewBook VB730', DeviceType::TABLET ],
+    'ViewSonic VB733'                           => [ 'ViewSonic', 'ViewPad VB733', DeviceType::TABLET ],
+    'VSD220'                                    => [ 'ViewSonic', 'VSD220 Smart Display', DeviceType::MONITOR ],
+    'VSD221'                                    => [ 'ViewSonic', 'VSD221 Smart Display', DeviceType::MONITOR ],
+    'VSD224'                                    => [ 'ViewSonic', 'VSD224 Smart Display', DeviceType::MONITOR ],
+    'VSD231'                                    => [ 'ViewSonic', 'VSD231 Smart Display', DeviceType::MONITOR ],
+    'VSD241'                                    => [ 'ViewSonic', 'VSD241 Smart Display', DeviceType::MONITOR ],
+
+    'VINUS!!' => [
+        'VINUS V6'                                  => [ 'Vinus', 'V6' ],
+        'VINUS-V6'                                  => [ 'Vinus', 'V6' ],
+        'VINUS V8'                                  => [ 'Vinus', 'V8' ],
+        'VINUS V9'                                  => [ 'Vinus', 'V9' ],
+        'VINUS V10'                                 => [ 'Vinus', 'V10' ],
+        'VINUS X2'                                  => [ 'Vinus', 'X2' ],
+    ],
+
+    'VL-[0-9]{3,3}!!' => [
+        'VL-107!'                                   => [ 'Visual Land', 'Prestige 7', DeviceType::TABLET ],
+        'VL-109'                                    => [ 'Visual Land', 'Connect 9', DeviceType::TABLET ],
+        'VL-110'                                    => [ 'Visual Land', 'Prestige 10', DeviceType::TABLET ],
+        'VL-879'                                    => [ 'Visual Land', 'Connect 7', DeviceType::TABLET ],
+    ],
+
+    'PRO7D'                                     => [ 'Visual Land', 'Prestige 7D', DeviceType::TABLET ],
+
+    'TPC-7151'                                  => [ 'Vivax', 'TPC-7151', DeviceType::TABLET ],
+
+    '(BBG-|VIV-)?vivo!!' => [
+        'vivo E1'                                   => [ 'Vivo', 'E1' ],
+        'vivo E1t'                                  => [ 'Vivo', 'E1t' ],
+        'vivo E3'                                   => [ 'Vivo', 'E3' ],
+        'vivo E5'                                   => [ 'Vivo', 'E5' ],
+        'vivo S1'                                   => [ 'Vivo', 'S1' ],
+        'vivo S3'                                   => [ 'Vivo', 'S3' ],
+        'vivo S3+'                                  => [ 'Vivo', 'S3+' ],
+        'vivo S6'                                   => [ 'Vivo', 'S6' ],
+        'vivo S6T'                                  => [ 'Vivo', 'S6T' ],
+        'vivo S7'                                   => [ 'Vivo', 'S7' ],
+        'vivo S7w'                                  => [ 'Vivo', 'S7W' ],
+        'vivo S9!'                                  => [ 'Vivo', 'S9' ],
+        'vivo S1'                                   => [ 'Vivo', 'S1' ],
+        'vivo S6'                                   => [ 'Vivo', 'S6' ],
+        'vivo S7i(t)'                               => [ 'Vivo', 'S7' ],
+        'vivo S7t'                                  => [ 'Vivo', 'S7' ],
+        'vivo S9t'                                  => [ 'Vivo', 'S9' ],
+        'vivo S11'                                  => [ 'Vivo', 'S11' ],
+        'vivo S11t'                                 => [ 'Vivo', 'S11' ],
+        'vivo S12'                                  => [ 'Vivo', 'S12' ],
+        'vivo V1'                                   => [ 'Vivo', 'V1' ],
+        'vivo V1Max'                                => [ 'Vivo', 'V1 Max' ],
+        'vivo V2'                                   => [ 'Vivo', 'V2' ],
+        'vivo V3'                                   => [ 'Vivo', 'V3' ],
+        'vivo V3Max'                                => [ 'Vivo', 'V3 Max' ],
+        'vivo V3Max A'                              => [ 'Vivo', 'V3 Max A' ],
+        'vivo V3M A'                                => [ 'Vivo', 'V3 Max A' ],
+        'vivo V3Max+ A'                             => [ 'Vivo', 'V3 Max+ A' ],
+        'vivo X1'                                   => [ 'Vivo', 'X1' ],
+        'vivo X1S'                                  => [ 'Vivo', 'X1S' ],
+        'vivo X1St'                                 => [ 'Vivo', 'X1S' ],
+        'vivo X1w'                                  => [ 'Vivo', 'X1W' ],
+        'VIVO X2'                                   => [ 'Vivo', 'X2' ],
+        'vivo X3F'                                  => [ 'Vivo', 'X3F' ],
+        'vivo X3L'                                  => [ 'Vivo', 'X3L' ],
+        'vivo X3S'                                  => [ 'Vivo', 'X3S' ],
+        'vivo X3S W'                                => [ 'Vivo', 'X3SW' ],
+        'vivo X3SW'                                 => [ 'Vivo', 'X3SW' ],
+        'vivo X3t'                                  => [ 'Vivo', 'X3T' ],
+        'BBG-vivo X3V!'                             => [ 'Vivo', 'X3V' ],
+        'vivo X3V'                                  => [ 'Vivo', 'X3V' ],
+        'vivo X5'                                   => [ 'Vivo', 'X5' ],
+        'vivo X5F'                                  => [ 'Vivo', 'X5F' ],
+        'vivo X5L'                                  => [ 'Vivo', 'X5L' ],
+        'vivo X5M'                                  => [ 'Vivo', 'X5M' ],
+        'vivo X5S L'                                => [ 'Vivo', 'X5S L' ],
+        'vivo X5SL'                                 => [ 'Vivo', 'X5S L' ],
+        'BBG-vivo X5V!'                             => [ 'Vivo', 'X5V' ],
+        'VIV-vivo X5V!'                             => [ 'Vivo', 'X5V' ],
+        'vivo X5V'                                  => [ 'Vivo', 'X5V' ],
+        'vivo X5Max'                                => [ 'Vivo', 'X5 Max' ],
+        'X5max'                                     => [ 'Vivo', 'X5 Max' ],
+        'vivo X5Max+'                               => [ 'Vivo', 'X5 Max+' ],
+        'vivo X5Max F'                              => [ 'Vivo', 'X5 Max F' ],
+        'vivo X5Max L'                              => [ 'Vivo', 'X5 Max L' ],
+        'vivo X5MaxL'                               => [ 'Vivo', 'X5 Max L' ],
+        'vivo X5Max S'                              => [ 'Vivo', 'X5 Max S' ],
+        'VIV-vivo X5Max S!'                         => [ 'Vivo', 'X5 Max S' ],
+        'VIV-vivo X5Max V'                          => [ 'Vivo', 'X5 Max V' ],
+        'vivo X5MaxV'                               => [ 'Vivo', 'X5 Max V' ],
+        'vivo X5Max V'                              => [ 'Vivo', 'X5 Max V' ],
+        'vivo X5Pro'                                => [ 'Vivo', 'X5 Pro' ],
+        'vivo X5Pro D'                              => [ 'Vivo', 'X5 Pro D' ],
+        'vivo X5Pro L'                              => [ 'Vivo', 'X5 Pro L' ],
+        'VIV-vivo X5Pro V'                          => [ 'Vivo', 'X5 Pro V' ],
+        'vivo X5Pro V'                              => [ 'Vivo', 'X5 Pro V' ],
+        'vivo PD1515A'                              => [ 'Vivo', 'X6 Plus A' ],
+        'vivo X6Plus A'                             => [ 'Vivo', 'X6 Plus A' ],
+        'vivo PD1501D'                              => [ 'Vivo', 'X6 Plus D' ],
+        'vivo X6Plus D'                             => [ 'Vivo', 'X6 Plus D' ],
+        'vivo X6Plus L'                             => [ 'Vivo', 'X6 Plus L' ],
+        'vivo X6A'                                  => [ 'Vivo', 'X6A' ],
+        'vivo PD1415A'                              => [ 'Vivo', 'X6A' ],
+        'vivo X6D'                                  => [ 'Vivo', 'X6D' ],
+        'vivo X6L'                                  => [ 'Vivo', 'X6L' ],
+        'vivo X6S'                                  => [ 'Vivo', 'X6S' ],
+        'vivo X6S A'                                => [ 'Vivo', 'X6S A' ],
+        'vivo X6SPlus'                              => [ 'Vivo', 'X6S Plus' ],
+        'vivo X6SPlus A'                            => [ 'Vivo', 'X6S Plus A' ],
+        'vivo PD1515BA'                             => [ 'Vivo', 'X6S Plus A' ],
+        'vivo X6SPlus D'                            => [ 'Vivo', 'X6S Plus D' ],
+        'vivo X7'                                   => [ 'Vivo', 'X7' ],
+        'vivo X7L'                                  => [ 'Vivo', 'X7L' ],
+        'vivo X7Plus'                               => [ 'Vivo', 'X7 Plus' ],
+        'vivo X9'                                   => [ 'Vivo', 'X9' ],
+        'vivo X9i'                                  => [ 'Vivo', 'X9i' ],
+        'vivo X9L'                                  => [ 'Vivo', 'X9L' ],
+        'vivo X9Plus'                               => [ 'Vivo', 'X9 Plus' ],
+        'vivo Xplay'                                => [ 'Vivo', 'Xplay' ],
+        'vivo X510t'                                => [ 'Vivo', 'Xplay' ],
+        'vivo Xplay2'                               => [ 'Vivo', 'Xplay 2' ],
+        'vivo Xplay2S'                              => [ 'Vivo', 'Xplay 2S' ],
+        'vivo X520L'                                => [ 'Vivo', 'Xplay 3S' ],
+        'vivo Xplay3S'                              => [ 'Vivo', 'Xplay 3S' ],
+        'vivo Xplay3S A'                            => [ 'Vivo', 'Xplay 3S' ],
+        'vivo Xplay5A'                              => [ 'Vivo', 'Xplay 5A' ],
+        'vivo Xplay5S'                              => [ 'Vivo', 'Xplay 5S' ],
+        'vivo PD1516A'                              => [ 'Vivo', 'Xplay 5S' ],
+        'vivo Xplay6'                               => [ 'Vivo', 'Xplay 6' ],
+        'vivo X710F'                                => [ 'Vivo', 'Xshot' ],
+        'vivo X710L'                                => [ 'Vivo', 'Xshot' ],
+        'vivo Xshot'                                => [ 'Vivo', 'Xshot' ],
+        'vivo Xshoot'                               => [ 'Vivo', 'Xshot' ],
+        'vivo Y1'                                   => [ 'Vivo', 'Y1' ],
+        'vivo Y3t'                                  => [ 'Vivo', 'Y3T' ],
+        'vivo Y11'                                  => [ 'Vivo', 'Y11' ],
+        'vivo Y11i T'                               => [ 'Vivo', 'Y11i T' ],
+        'vivo Y11iW'                                => [ 'Vivo', 'Y11i W' ],
+        'vivo Y11t'                                 => [ 'Vivo', 'Y11T' ],
+        'vivo Y13'                                  => [ 'Vivo', 'Y13' ],
+        'vivo Y13iL'                                => [ 'Vivo', 'Y13i L' ],
+        'vivo Y13L'                                 => [ 'Vivo', 'Y13L' ],
+        'vivo Y13T'                                 => [ 'Vivo', 'Y13T' ],
+        'vivo Y15'                                  => [ 'Vivo', 'Y15' ],
+        'vivoY15'                                   => [ 'Vivo', 'Y15' ],
+        'vivo Y15S'                                 => [ 'Vivo', 'Y15S' ],
+        'vivo Y15T'                                 => [ 'Vivo', 'Y15T' ],
+        'VIVO-Y15T'                                 => [ 'Vivo', 'Y15T' ],
+        'vivo Y15W'                                 => [ 'Vivo', 'Y15W' ],
+        'vivo Y17T'                                 => [ 'Vivo', 'Y17T' ],
+        'vivo Y17W'                                 => [ 'Vivo', 'Y17W' ],
+        'vivo Y18L'                                 => [ 'Vivo', 'Y18L' ],
+        'vivo Y19t'                                 => [ 'Vivo', 'Y19T' ],
+        'vivo Y20T'                                 => [ 'Vivo', 'Y20T' ],
+        'vivo Y21'                                  => [ 'Vivo', 'Y21' ],
+        'vivo Y21L'                                 => [ 'Vivo', 'Y21L' ],
+        'vivo Y22'                                  => [ 'Vivo', 'Y22' ],
+        'vivo Y22iL'                                => [ 'Vivo', 'Y22i L' ],
+        'vivo Y22L'                                 => [ 'Vivo', 'Y22L' ],
+        'vivo Y22T'                                 => [ 'Vivo', 'Y22T' ],
+        'vivo Y23L'                                 => [ 'Vivo', 'Y23L' ],
+        'vivo Y27'                                  => [ 'Vivo', 'Y27' ],
+        'vivo Y27L'                                 => [ 'Vivo', 'Y27L' ],
+        'vivo Y28'                                  => [ 'Vivo', 'Y28' ],
+        'vivo Y28L'                                 => [ 'Vivo', 'Y28L' ],
+        'vivo Y29L'                                 => [ 'Vivo', 'Y29L' ],
+        'vivo Y31'                                  => [ 'Vivo', 'Y31' ],
+        'vivo Y31A'                                 => [ 'Vivo', 'Y31A' ],
+        'vivo Y31L'                                 => [ 'Vivo', 'Y31L' ],
+        'vivo Y31i'                                 => [ 'Vivo', 'Y31i' ],
+        'vivo Y33'                                  => [ 'Vivo', 'Y33' ],
+        'vivo Y33L'                                 => [ 'Vivo', 'Y33L' ],
+        'vivo Y35'                                  => [ 'Vivo', 'Y35' ],
+        'vivo Y35A'                                 => [ 'Vivo', 'Y35A' ],
+        'vivo Y35L'                                 => [ 'Vivo', 'Y35L' ],
+        'vivo Y37'                                  => [ 'Vivo', 'Y37' ],
+        'vivo Y37A'                                 => [ 'Vivo', 'Y37A' ],
+        'vivo Y51'                                  => [ 'Vivo', 'Y51' ],
+        'vivo Y51A'                                 => [ 'Vivo', 'Y51A' ],
+        'vivo Y51L'                                 => [ 'Vivo', 'Y51L' ],
+        'vivo Y51n'                                 => [ 'Vivo', 'Y51n' ],
+        'vivo Y51t L'                               => [ 'Vivo', 'Y51t L' ],
+        'vivo 1606'                                 => [ 'Vivo', 'Y53' ],
+        'vivo Y53'                                  => [ 'Vivo', 'Y55' ],
+        'vivo Y55A'                                 => [ 'Vivo', 'Y55A' ],
+        'vivo Y55L'                                 => [ 'Vivo', 'Y55L' ],
+        'vivo 1603'                                 => [ 'Vivo', 'Y55L' ],
+        'vivo Y66'                                  => [ 'Vivo', 'Y66' ],
+        'vivo Y67'                                  => [ 'Vivo', 'Y67' ],
+        'vivo Y613'                                 => [ 'Vivo', 'Y613' ],
+        'vivo Y613F'                                => [ 'Vivo', 'Y613F' ],
+        'vivo Y622'                                 => [ 'Vivo', 'Y622' ],
+        'vivo Y623'                                 => [ 'Vivo', 'Y623' ],
+        'vivo Y627'                                 => [ 'Vivo', 'Y627' ],
+        'vivo Y628'                                 => [ 'Vivo', 'Y628' ],
+        'vivo Y913'                                 => [ 'Vivo', 'Y913' ],
+        'VIV-vivo Y913'                             => [ 'Vivo', 'Y913' ],
+        'VIV-vivo Y923'                             => [ 'Vivo', 'Y923' ],
+        'vivo Y923'                                 => [ 'Vivo', 'Y923' ],
+        'vivo Y927'                                 => [ 'Vivo', 'Y927' ],
+        'vivo Y928'                                 => [ 'Vivo', 'Y928' ],
+        'VIV-vivo Y928'                             => [ 'Vivo', 'Y928' ],
+        'VIV-vivo Y937'                             => [ 'Vivo', 'Y937' ],
+        'vivo Y937'                                 => [ 'Vivo', 'Y937' ],
+    ],
+
+    'VTAB1008'                                  => [ 'Vizio', 'VTAB1008', DeviceType::TABLET ],
+    'VTAB3010'                                  => [ 'Vizio', 'VTAB3010', DeviceType::TABLET ],
+    'VAP430'                                    => [ 'Vizio', 'Co-Star', DeviceType::TELEVISION, Flag::GOOGLETV ],
+    'Xtreme V10'                                => [ 'Voice', 'Xtreme V10' ],
+    'Xtreme V10i'                               => [ 'Voice', 'Xtreme V10i' ],
+    'Xtreme V12'                                => [ 'Voice', 'Xtreme V12' ],
+    'Xtreme V15'                                => [ 'Voice', 'Xtreme V15' ],
+    'Xtreme V20'                                => [ 'Voice', 'Xtreme V20' ],
+    'Xtreme V21'                                => [ 'Voice', 'Xtreme V21' ],
+    'Xtreme V22'                                => [ 'Voice', 'Xtreme V22' ],
+    'Xtreme V25'                                => [ 'Voice', 'Xtreme V25' ],
+    'Xtreme-V30'                                => [ 'Voice', 'Xtreme V30' ],
+    'Xtreme V40i'                               => [ 'Voice', 'Xtreme V40i' ],
+    'Xtreme V44'                                => [ 'Voice', 'Xtreme V44' ],
+    'vollo Vi86'                                => [ 'VOLLO', 'Vi86' ],
+    'VOTO GT2++'                                => [ 'VOTO', 'GT2++' ],
+    'VOTO GT7'                                  => [ 'VOTO', 'GT7' ],
+    'VOTO GT11'                                 => [ 'VOTO', 'GT11' ],
+    'VOTO GT11 Pro'                             => [ 'VOTO', 'GT11 Pro' ],
+    'VOTO GT18'                                 => [ 'VOTO', 'GT18' ],
+    'VOTO V5'                                   => [ 'VOTO', 'V5' ],
+    'VOTO VT868'                                => [ 'VOTO', 'VT868' ],
+    'VOTO VT888'                                => [ 'VOTO', 'VT888' ],
+    'VOTO VT898'                                => [ 'VOTO', 'VT898' ],
+    'VOTO VT898S'                               => [ 'VOTO', 'VT898S' ],
+    'VOTO W5300'                                => [ 'VOTO', 'W5300' ],
+    'VOTO X2'                                   => [ 'VOTO', 'X2' ],
+    'VOYO A15'                                  => [ 'Voyo', 'A15', DeviceType::TABLET ],
+    'voyo X6'                                   => [ 'Voyo', 'X6', DeviceType::TABLET ],
+    'Vsun HEXA'                                 => [ 'Vsun', 'Hexa' ],
+    'VSUN ILLUSION'                             => [ 'Vsun', 'Illusion' ],
+    'VSUN RACE'                                 => [ 'Vsun', 'Race' ],
+    'Vsun SPARK'                                => [ 'Vsun', 'Spark' ],
+    'VSUN TOUCH'                                => [ 'Vsun', 'Touch' ],
+    'Vsun D3B'                                  => [ 'Vsun', 'D3B' ],
+    'Vsun H3'                                   => [ 'Vsun', 'H3' ],
+    'Vsun H9'                                   => [ 'Vsun', 'H9' ],
+    'Vsun i1'                                   => [ 'Vsun', 'i1' ],
+    'Vsun i5'                                   => [ 'Vsun', 'i5' ],
+    'Vsun i9'                                   => [ 'Vsun', 'i9' ],
+    'Vsun V9'                                   => [ 'Vsun', 'V9' ],
+    'WALSUN S1 Pro'                             => [ 'Walsun', 'S1 Pro' ],
+    'WALSUN S2'                                 => [ 'Walsun', 'S2' ],
+    'Walton Primo'                              => [ 'Walton', 'Primo' ],
+    'WALTON Primo C1'                           => [ 'Walton', 'Primo C1' ],
+    'Primo C2'                                  => [ 'Walton', 'Primo C2' ],
+    'Primo C3 3G'                               => [ 'Walton', 'Primo C3' ],
+    'Primo C3'                                  => [ 'Walton', 'Primo C3' ],
+    'PrimoC4'                                   => [ 'Walton', 'Primo C4' ],
+    'WALTON Primo-D1'                           => [ 'Walton', 'Primo D1' ],
+    'Primo-D1'                                  => [ 'Walton', 'Primo D1' ],
+    'Primo D2'                                  => [ 'Walton', 'Primo D2' ],
+    'Primo D3'                                  => [ 'Walton', 'Primo D3' ],
+    'Primo D4'                                  => [ 'Walton', 'Primo D4' ],
+    'Primo D5'                                  => [ 'Walton', 'Primo D5' ],
+    'Primo D6'                                  => [ 'Walton', 'Primo D6' ],
+    'Primo D7'                                  => [ 'Walton', 'Primo D7' ],
+    'Primo E1'                                  => [ 'Walton', 'Primo E1' ],
+    'Primo E2'                                  => [ 'Walton', 'Primo E2' ],
+    'PRIMO E3'                                  => [ 'Walton', 'Primo E3' ],
+    'Primo E4'                                  => [ 'Walton', 'Primo E4' ],
+    'Primo E4+'                                 => [ 'Walton', 'Primo E4+' ],
+    'Primo E5'                                  => [ 'Walton', 'Primo E5' ],
+    'Primo E6'                                  => [ 'Walton', 'Primo E6' ],
+    'Primo E7'                                  => [ 'Walton', 'Primo E7' ],
+    'Primo E7 Plus'                             => [ 'Walton', 'Primo E7+' ],
+    'Primo EF'                                  => [ 'Walton', 'Primo EF' ],
+    'Primo EF2'                                 => [ 'Walton', 'Primo EF2' ],
+    'Primo EF3'                                 => [ 'Walton', 'Primo EF3' ],
+    'Primo EF4'                                 => [ 'Walton', 'Primo EF4' ],
+    'Primo EM'                                  => [ 'Walton', 'Primo EM' ],
+    'Primo F1'                                  => [ 'Walton', 'Primo F1' ],
+    'Walton F2'                                 => [ 'Walton', 'Primo F2' ],
+    'Primo F2'                                  => [ 'Walton', 'Primo F2' ],
+    'Primo-F2'                                  => [ 'Walton', 'Primo F2' ],
+    'Walton Primo F2'                           => [ 'Walton', 'Primo F2' ],
+    'Primo F3'                                  => [ 'Walton', 'Primo F3' ],
+    'Primo F3i'                                 => [ 'Walton', 'Primo F3i' ],
+    'Primo F4'                                  => [ 'Walton', 'Primo F4' ],
+    'Primo F5'                                  => [ 'Walton', 'Primo F5' ],
+    'Primo F6'                                  => [ 'Walton', 'Primo F6' ],
+    'Primo F7'                                  => [ 'Walton', 'Primo F7' ],
+    'WALTON Primo-G1'                           => [ 'Walton', 'Primo G1' ],
+    'WALTON Primo G1'                           => [ 'Walton', 'Primo G1' ],
+    'Primo-G1'                                  => [ 'Walton', 'Primo G1' ],
+    'Primo G1'                                  => [ 'Walton', 'Primo G1' ],
+    'Primo G2'                                  => [ 'Walton', 'Primo G2' ],
+    'Primo-G3'                                  => [ 'Walton', 'Primo G3' ],
+    'Primo G4'                                  => [ 'Walton', 'Primo G4' ],
+    'Primo G5'                                  => [ 'Walton', 'Primo G5' ],
+    'Primo G6'                                  => [ 'Walton', 'Primo G6' ],
+    'Primo-GF'                                  => [ 'Walton', 'Primo GF' ],
+    'Primo GF2'                                 => [ 'Walton', 'Primo GF2' ],
+    'Primo GF3'                                 => [ 'Walton', 'Primo GF3' ],
+    'Primo GF4'                                 => [ 'Walton', 'Primo GF4' ],
+    'Primo GH'                                  => [ 'Walton', 'Primo GH' ],
+    'Primo GH+'                                 => [ 'Walton', 'Primo GH+' ],
+    'Primo-GH2'                                 => [ 'Walton', 'Primo GH2' ],
+    'Primo GH2'                                 => [ 'Walton', 'Primo GH2' ],
+    'Primo GH2 [AOSP]'                          => [ 'Walton', 'Primo GH2' ],
+    'Primo-GH2 (AOSP KITKAT)'                   => [ 'Walton', 'Primo GH2' ],
+    'Primo GH3'                                 => [ 'Walton', 'Primo GH3' ],
+    'Primo-GH3'                                 => [ 'Walton', 'Primo GH3' ],
+    'Primo GH4'                                 => [ 'Walton', 'Primo GH4' ],
+    'Primo GH5'                                 => [ 'Walton', 'Primo GH5' ],
+    'Primo GH5 Plus'                            => [ 'Walton', 'Primo GH5+' ],
+    'Primo GH5 mini'                            => [ 'Walton', 'Primo GH5 mini' ],
+    'Primo GH6'                                 => [ 'Walton', 'Primo GH6' ],
+    'Primo GH6+'                                => [ 'Walton', 'Primo GH6+' ],
+    'Primo GM'                                  => [ 'Walton', 'Primo GM' ],
+    'Primo GM mini'                             => [ 'Walton', 'Primo GM mini' ],
+    'Walton Primo H1'                           => [ 'Walton', 'Primo H1' ],
+    'Primo H2'                                  => [ 'Walton', 'Primo H2' ],
+    'Primo-H3'                                  => [ 'Walton', 'Primo H3' ],
+    'Primo H3'                                  => [ 'Walton', 'Primo H3' ],
+    'Walton Primo H3'                           => [ 'Walton', 'Primo H3' ],
+    'WALTON H3'                                 => [ 'Walton', 'Primo H3' ],
+    'Primo H4'                                  => [ 'Walton', 'Primo H4' ],
+    'Primo H5'                                  => [ 'Walton', 'Primo H5' ],
+    'Primo H6'                                  => [ 'Walton', 'Primo H6' ],
+    'Primo HM'                                  => [ 'Walton', 'Primo HM' ],
+    'WALTON Primo HMmini'                       => [ 'Walton', 'Primo HM mini' ],
+    'Primo HM2'                                 => [ 'Walton', 'Primo HM2' ],
+    'Primo HM3'                                 => [ 'Walton', 'Primo HM3' ],
+    'Primo HM3+'                                => [ 'Walton', 'Primo HM3+' ],
+    'Primo-N'                                   => [ 'Walton', 'Primo N' ],
+    'WALTON Primo-N1'                           => [ 'Walton', 'Primo N1' ],
+    'Primo-N1'                                  => [ 'Walton', 'Primo N1' ],
+    'Primo N2'                                  => [ 'Walton', 'Primo N2' ],
+    'Primo NF'                                  => [ 'Walton', 'Primo NF' ],
+    'Primo NF+'                                 => [ 'Walton', 'Primo NF+' ],
+    'Primo NF2'                                 => [ 'Walton', 'Primo NF2' ],
+    'Primo NF2+'                                => [ 'Walton', 'Primo NF2+' ],
+    'Primo NH'                                  => [ 'Walton', 'Primo NH' ],
+    'Primo NH Lite'                             => [ 'Walton', 'Primo NH Lite' ],
+    'Primo NH2 Lite'                            => [ 'Walton', 'Primo NH2 Lite' ],
+    'Primo NX'                                  => [ 'Walton', 'Primo NX' ],
+    'Primo NX2'                                 => [ 'Walton', 'Primo NX2' ],
+    'Primo NX3'                                 => [ 'Walton', 'Primo NX3' ],
+    'Primo NX3 Plus'                            => [ 'Walton', 'Primo NX3 Plus' ],
+    'Primo NX4 mini'                            => [ 'Walton', 'Primo NX4 Mini' ],
+    'Walton Primo R1'                           => [ 'Walton', 'Primo R1' ],
+    'Primo R1'                                  => [ 'Walton', 'Primo R1' ],
+    'Primo R2'                                  => [ 'Walton', 'Primo R2' ],
+    'Primo R3'                                  => [ 'Walton', 'Primo R3' ],
+    'Primo R4'                                  => [ 'Walton', 'Primo R4' ],
+    'Primo R4 Plus'                             => [ 'Walton', 'Primo R4 Plus' ],
+    'Primo R4s'                                 => [ 'Walton', 'Primo R4s' ],
+    'Primo RH'                                  => [ 'Walton', 'Primo RH' ],
+    'Primo RH2'                                 => [ 'Walton', 'Primo RH2' ],
+    'Primo RM'                                  => [ 'Walton', 'Primo RM' ],
+    'Walton RM2'                                => [ 'Walton', 'Primo RM2' ],
+    'Primo RM2'                                 => [ 'Walton', 'Primo RM2' ],
+    'Primo RM2 mini'                            => [ 'Walton', 'Primo RM2 mini' ],
+    'Primo RX'                                  => [ 'Walton', 'Primo RX' ],
+    'Primo RX2'                                 => [ 'Walton', 'Primo RX2' ],
+    'PrimoRX2'                                  => [ 'Walton', 'Primo RX2' ],
+    'Primo RX3'                                 => [ 'Walton', 'Primo RX3' ],
+    'Primo RX4'                                 => [ 'Walton', 'Primo RX4' ],
+    'Primo RX5'                                 => [ 'Walton', 'Primo RX5' ],
+    'Primo S1'                                  => [ 'Walton', 'Primo S1' ],
+    'PrimoS2'                                   => [ 'Walton', 'Primo S2' ],
+    'WALTON Primo S3'                           => [ 'Walton', 'Primo S3' ],
+    'Primo S3'                                  => [ 'Walton', 'Primo S3' ],
+    'Primo S3 mini'                             => [ 'Walton', 'Primo S3 mini' ],
+    'Primo S4'                                  => [ 'Walton', 'Primo S4' ],
+    'Primo V1'                                  => [ 'Walton', 'Primo V1' ],
+    'Primo V2'                                  => [ 'Walton', 'Primo V2' ],
+    'Primo VX'                                  => [ 'Walton', 'Primo VX' ],
+    'Primo VX+'                                 => [ 'Walton', 'Primo VX+' ],
+    'Walton Primo VX+'                          => [ 'Walton', 'Primo VX+' ],
+    '(WALTON )?Primo-X1!'                       => [ 'Walton', 'Primo X1' ],
+    'Primo-X2'                                  => [ 'Walton', 'Primo X2' ],
+    'Primo X2mini'                              => [ 'Walton', 'Primo X2 mini' ],
+    'Primo X3'                                  => [ 'Walton', 'Primo X3' ],
+    'Primo X3mini'                              => [ 'Walton', 'Primo X3 mini' ],
+    'Primo X4'                                  => [ 'Walton', 'Primo X4' ],
+    'Primo Z'                                   => [ 'Walton', 'Primo Z' ],
+    'Primo-ZX'                                  => [ 'Walton', 'Primo ZX' ],
+    'Primo ZX2'                                 => [ 'Walton', 'Primo ZX2' ],
+    'Primo ZX2 Lite'                            => [ 'Walton', 'Primo ZX2 Lite' ],
+    'Primo ZX2 mini'                            => [ 'Walton', 'Primo ZX2 mini' ],
+    'Primo Walpad 1'                            => [ 'Walton', 'Primo Walpad 1', DeviceType::TABLET ],
+    'Primo Walpad 7'                            => [ 'Walton', 'Primo Walpad 7', DeviceType::TABLET ],
+    'Primo Walpad 8'                            => [ 'Walton', 'Primo Walpad 8', DeviceType::TABLET ],
+    'Walpad 8b'                                 => [ 'Walton', 'Primo Walpad 8b', DeviceType::TABLET ],
+    'Primo Walpad 8W'                           => [ 'Walton', 'Primo Walpad 8W', DeviceType::TABLET ],
+    'Walpad 8x'                                 => [ 'Walton', 'Primo Walpad 8x', DeviceType::TABLET ],
+    'Walpad 10x'                                => [ 'Walton', 'Primo Walpad 10x', DeviceType::TABLET ],
+    'Walpad C'                                  => [ 'Walton', 'Primo Walpad C', DeviceType::TABLET ],
+    'Walpad G'                                  => [ 'Walton', 'Primo Walpad G', DeviceType::TABLET ],
+    'Walpad G2'                                 => [ 'Walton', 'Primo Walpad G2', DeviceType::TABLET ],
+    'Walpad G2i'                                => [ 'Walton', 'Primo Walpad G2i', DeviceType::TABLET ],
+    'Walpad M'                                  => [ 'Walton', 'Primo Walpad M', DeviceType::TABLET ],
+    'xPAD-70'                                   => [ 'WayteQ', 'xPAD-70', DeviceType::TABLET ],
+    'xTAB-7X'                                   => [ 'WayteQ', 'xTAB-7X', DeviceType::TABLET ],
+    'xTAB-9'                                    => [ 'WayteQ', 'xTAB-9', DeviceType::TABLET ],
+    'xTAB-70!'                                  => [ 'WayteQ', 'xTAB-70', DeviceType::TABLET ],
+    'xTAB-100!'                                 => [ 'WayteQ', 'xTAB-100', DeviceType::TABLET ],
+    'WellcoM-A86'                               => [ 'WellcoM', 'A86' ],
+    'WellcoM-A88'                               => [ 'WellcoM', 'A88' ],
+    'WellcoM-A89'                               => [ 'WellcoM', 'A89' ],
+    'WellcoM-A89-Plus'                          => [ 'WellcoM', 'A89 Plus' ],
+    'WellcoM-A99'                               => [ 'WellcoM', 'A99' ],
+    'WellcoM-A800'                              => [ 'WellcoM', 'A800', DeviceType::TABLET ],
+    'ZEN 4.5'                                   => [ 'Wexler', 'Zen 4.5' ],
+    'ZEN 4.7'                                   => [ 'Wexler', 'Zen 4.7' ],
+    'WEXLER. ZEN 5'                             => [ 'Wexler', 'Zen 5' ],
+    'ZEN 5+'                                    => [ 'Wexler', 'Zen 5+' ],
+    'TAB 7i 3G'                                 => [ 'Wexler', 'Tab 7I 3G', DeviceType::TABLET ],
+    'WEXLER TAB7ID'                             => [ 'Wexler', 'Tab 7ID', DeviceType::TABLET ],
+    'WEXLER-TAB-7iS'                            => [ 'Wexler', 'Tab 7IS', DeviceType::TABLET ],
+    'WEXLER-TAB-7T'                             => [ 'Wexler', 'Tab 7T', DeviceType::TABLET ],
+    'TAB 10Q'                                   => [ 'Wexler', 'Tab 10Q', DeviceType::TABLET ],
+    'WEXLER.BOOK T7008'                         => [ 'Wexler', 'Book T7008', DeviceType::TABLET ],
+    'WHAM WG40'                                 => [ 'Wham', 'WG40' ],
+    'BARRY'                                     => [ 'Wiko', 'Barry' ],
+    'BIRDY'                                     => [ 'Wiko', 'Birdy' ],
+    'BLOOM'                                     => [ 'Wiko', 'Bloom' ],
+    'CINK'                                      => [ 'Wiko', 'Cink' ],
+    'CINK+'                                     => [ 'Wiko', 'Cink+' ],
+    'CINK FIVE'                                 => [ 'Wiko', 'Cink Five' ],
+    'Wiko Cink Five'                            => [ 'Wiko', 'Cink Five' ],
+    'CINK KING'                                 => [ 'Wiko', 'Cink King' ],
+    'CINK PEAX'                                 => [ 'Wiko', 'Cink Peax' ],
+    'Wiko Cink Peax'                            => [ 'Wiko', 'Cink Peax' ],
+    'WIKO-CINK PEAX'                            => [ 'Wiko', 'Cink Peax' ],
+    'CINK PEAX+'                                => [ 'Wiko', 'Cink Peax+' ],
+    'CINK PEAX 2'                               => [ 'Wiko', 'Cink Peax 2' ],
+    'Wiko Cink Slim'                            => [ 'Wiko', 'Cink Slim' ],
+    'WIKO-CINK SLIM'                            => [ 'Wiko', 'Cink Slim' ],
+    'CINK SLIM'                                 => [ 'Wiko', 'Cink Slim' ],
+    'Cink Slim A'                               => [ 'Wiko', 'Cink Slim A' ],
+    'Cink Slim B'                               => [ 'Wiko', 'Cink Slim B' ],
+    'CINK SLIM 2'                               => [ 'Wiko', 'Cink Slim 2' ],
+    'DARKFULL'                                  => [ 'Wiko', 'Darkfull' ],
+    'DARKMOON'                                  => [ 'Wiko', 'Darkmoon' ],
+    'DARKNIGHT'                                 => [ 'Wiko', 'Darknight' ],
+    'DARKSIDE'                                  => [ 'Wiko', 'Darkside' ],
+    'GETAWAY'                                   => [ 'Wiko', 'Getaway' ],
+    'GOA'                                       => [ 'Wiko', 'Goa' ],
+    'HIGHWAY'                                   => [ 'Wiko', 'Highway' ],
+    'HIGHWAY PURE'                              => [ 'Wiko', 'Highway Pure' ],
+    'HIGHWAY SIGNS'                             => [ 'Wiko', 'Highway Signs' ],
+    'IGGY'                                      => [ 'Wiko', 'Iggy' ],
+    'JIMMY'                                     => [ 'Wiko', 'Jimmy' ],
+    'KITE'                                      => [ 'Wiko', 'Kite' ],
+    'LENNY'                                     => [ 'Wiko', 'Lenny' ],
+    'LENNY2'                                    => [ 'Wiko', 'Lenny 2' ],
+    'OZZY'                                      => [ 'Wiko', 'Ozzy' ],
+    'Wiko Rainbow'                              => [ 'Wiko', 'Rainbow' ],
+    'RAINBOW'                                   => [ 'Wiko', 'Rainbow' ],
+    'RAINBOW 4G'                                => [ 'Wiko', 'Rainbow' ],
+    'RIDGE'                                     => [ 'Wiko', 'Ridge' ],
+    'RIDGE 4G'                                  => [ 'Wiko', 'Ridge' ],
+    'RIDGE FAB 4G'                              => [ 'Wiko', 'Ridge Fab' ],
+    'SLIDE'                                     => [ 'Wiko', 'Slide' ],
+    'STAIRWAY'                                  => [ 'Wiko', 'Stairway' ],
+    'Wiko Stairway'                             => [ 'Wiko', 'Stairway' ],
+    'SUBLIM'                                    => [ 'Wiko', 'Sublim' ],
+    'SUNSET'                                    => [ 'Wiko', 'Sunset' ],
+    'WAX'                                       => [ 'Wiko', 'Wax' ],
+    'Wileyfox Spark'                            => [ 'Wileyfox', 'Spark' ],
+    'Wileyfox Spark +'                          => [ 'Wileyfox', 'Spark +' ],
+    'Wileyfox Spark X'                          => [ 'Wileyfox', 'Spark X' ],
+    'Wileyfox Storm'                            => [ 'Wileyfox', 'Storm' ],
+    'Wileyfox Swift'                            => [ 'Wileyfox', 'Swift' ],
+    'Swift 2 Plus'                              => [ 'Wileyfox', 'Swift 2 Plus' ],
+    'Swift 2 X'                                 => [ 'Wileyfox', 'Swift 2 X' ],
+    'N5PRO2jingying'                            => [ 'Window', 'N5 Pro 2', DeviceType::MEDIA ],
+    'N12'                                       => [ 'Window', 'N12', DeviceType::TABLET ],
+    'N12R'                                      => [ 'Window', 'N12R', DeviceType::TABLET ],
+    'N50'                                       => [ 'Window', 'N50', DeviceType::TABLET ],
+    'N50DT!'                                    => [ 'Window', 'N50DT', DeviceType::TABLET ],
+    'N50GT'                                     => [ 'Window', 'N50GT', DeviceType::TABLET ],
+    'N50GT A'                                   => [ 'Window', 'N50GT-A', DeviceType::TABLET ],
+    'N70'                                       => [ 'Window', 'N70', DeviceType::TABLET ],
+    'N70 3G'                                    => [ 'Window', 'N70', DeviceType::TABLET ],
+    'N70 C'                                     => [ 'Window', 'N70C', DeviceType::TABLET ],
+    'N70DC'                                     => [ 'Window', 'N70DC', DeviceType::TABLET ],
+    'N70-S'                                     => [ 'Window', 'N70S', DeviceType::TABLET ],
+    'N70HD'                                     => [ 'Window', 'N70HD', DeviceType::TABLET ],
+    'N70 DUAL CORE'                             => [ 'Window', 'N70 Dual Core', DeviceType::TABLET ],
+    'N70DC-S'                                   => [ 'Window', 'N70 Dual Core', DeviceType::TABLET ],
+    'N70DC-T'                                   => [ 'Window', 'N70 Dual Core', DeviceType::TABLET ],
+    'N80($| from moage.com)!'                   => [ 'Window', 'N80', DeviceType::TABLET ],
+    'N80DC'                                     => [ 'Window', 'N80 Dual Core', DeviceType::TABLET ],
+    'N80IPS'                                    => [ 'Window', 'N80 IPS', DeviceType::TABLET ],
+    'N90'                                       => [ 'Window', 'N90', DeviceType::TABLET ],
+    'N90 DUAL CORE!'                            => [ 'Window', 'N90 Dual Core', DeviceType::TABLET ],
+    'N90FHDRK'                                  => [ 'Window', 'N90 FHD', DeviceType::TABLET ],
+    'N101 DUAL CORE!'                           => [ 'Window', 'N101 Dual Core', DeviceType::TABLET ],
+    'Wink City S'                               => [ 'Wink', 'City S' ],
+
+    'N612'                                      => [ 'Wishway', 'N612' ],
+    'A81E'                                      => [ 'Witstech', 'A81E', DeviceType::TABLET ],
+
+    'miTab!!' => [
+        'miTab BALTIMORE'                           => [ 'Wolder', 'miTab BALTIMORE', DeviceType::TABLET ],
+        'miTab BERLIN'                              => [ 'Wolder', 'miTab BERLIN', DeviceType::TABLET ],
+        'miTab Boston'                              => [ 'Wolder', 'miTab BOSTON', DeviceType::TABLET ],
+        'miTab BROOKLYN'                            => [ 'Wolder', 'miTab BROOKLYN', DeviceType::TABLET ],
+        'miTabCALIFORNIA'                           => [ 'Wolder', 'miTab CALIFORNIA', DeviceType::TABLET ],
+        'miTab CHICAGO'                             => [ 'Wolder', 'miTab CHICAGO', DeviceType::TABLET ],
+        'miTab EPSILON'                             => [ 'Wolder', 'miTab EPSILON', DeviceType::TABLET ],
+        'miTab-EPSILON'                             => [ 'Wolder', 'miTab EPSILON', DeviceType::TABLET ],
+        'miTab FEEL'                                => [ 'Wolder', 'miTab FEEL', DeviceType::TABLET ],
+        'miTab FUNK'                                => [ 'Wolder', 'miTab FUNK', DeviceType::TABLET ],
+        'miTab-GENIUS'                              => [ 'Wolder', 'miTab GENIUS', DeviceType::TABLET ],
+        'miTab GENIUS'                              => [ 'Wolder', 'miTab GENIUS', DeviceType::TABLET ],
+        'miTab HERO'                                => [ 'Wolder', 'miTab HERO', DeviceType::TABLET ],
+        'miTab HOP!'                                => [ 'Wolder', 'miTab HOP!', DeviceType::TABLET ],
+        'miTab IOWA'                                => [ 'Wolder', 'miTab IOWA', DeviceType::TABLET ],
+        'miTab IRON'                                => [ 'Wolder', 'miTab IRON', DeviceType::TABLET ],
+        'miTab JUMP'                                => [ 'Wolder', 'miTab JUMP', DeviceType::TABLET ],
+        'miTab LION'                                => [ 'Wolder', 'miTab LION', DeviceType::TABLET ],
+        'miTab LIVE'                                => [ 'Wolder', 'miTab LIVE', DeviceType::TABLET ],
+        'miTab NEO'                                 => [ 'Wolder', 'miTab NEO', DeviceType::TABLET ],
+        'miTab THINK'                               => [ 'Wolder', 'miTab THINK', DeviceType::TABLET ],
+        'miTab Seattle'                             => [ 'Wolder', 'miTab SEATTLE', DeviceType::TABLET ],
+        'miTab URBAN'                               => [ 'Wolder', 'miTab URBAN', DeviceType::TABLET ],
+    ],
+
+    'AT-A[QS][0-9]{2,2}!!' => [
+        'AT-AQ28D'                                  => [ 'Wolfgang', 'AT-AQ28D' ],
+        'AT-AS35D'                                  => [ 'Wolfgang', 'AT-AS35D' ],
+        'AT-AS40D'                                  => [ 'Wolfgang', 'AT-AS40D' ],
+        'AT-AS40D2'                                 => [ 'Wolfgang', 'AT-AS40D2' ],
+        'AT-AS40D3'                                 => [ 'Wolfgang', 'AT-AS40D3' ],
+        'AT-AS40SE'                                 => [ 'Wolfgang', 'AT-AS40SE' ],
+        'AT-AS40W'                                  => [ 'Wolfgang', 'AT-AS40W' ],
+        'AT-AS43D'                                  => [ 'Wolfgang', 'AT-AS43D' ],
+        'AT-AS43D2'                                 => [ 'Wolfgang', 'AT-AS43D2' ],
+        'AT-AS43D3'                                 => [ 'Wolfgang', 'AT-AS43D3' ],
+        'AT-AS43D4'                                 => [ 'Wolfgang', 'AT-AS43D4' ],
+        'AT-AS45D1'                                 => [ 'Wolfgang', 'AT-AS45D1' ],
+        'AT-AS45FW'                                 => [ 'Wolfgang', 'AT-AS45FW' ],
+        'AT-AS45SE'                                 => [ 'Wolfgang', 'AT-AS45SE' ],
+        'AT-AS45IPS'                                => [ 'Wolfgang', 'AT-AS45IPS' ],
+        'AT-AS45Q'                                  => [ 'Wolfgang', 'AT-AS45Q' ],
+        'AT-AS45Q1'                                 => [ 'Wolfgang', 'AT-AS45Q1' ],
+        'AT-AS45qHD'                                => [ 'Wolfgang', 'AT-AS45QHD' ],
+        'AT-AS45q2'                                 => [ 'Wolfgang', 'AT-AS45Q2' ],
+        'AT-AS45WP'                                 => [ 'Wolfgang', 'AT-AS45WP' ],
+        'AT-AS45LTE'                                => [ 'Wolfgang', 'AT-AS45LTE' ],
+        'AT-AS50HD'                                 => [ 'Wolfgang', 'AT-AS50HD' ],
+        'AT-AS50SE'                                 => [ 'Wolfgang', 'AT-AS50SE' ],
+        'AT-AS50Q'                                  => [ 'Wolfgang', 'AT-AS50Q' ],
+        'AT-AS53N'                                  => [ 'Wolfgang', 'AT-AS53N' ],
+        'AT-AS55HD'                                 => [ 'Wolfgang', 'AT-AS55HD' ],
+        'AT-AS55HD1'                                => [ 'Wolfgang', 'AT-AS55HD1' ],
+    ],
+
+    'M12'                                       => [ 'Wopad', 'M12', DeviceType::TABLET ],
+    'SK-Mtek GT7305'                            => [ 'WonderMedia', 'SK-Mtek GT7305' ],
+    'WM8650'                                    => [ 'WonderMedia', 'WM8650', DeviceType::TABLET ],
+    'WM8650-mid'                                => [ 'WonderMedia', 'WM8650', DeviceType::TABLET ],
+    'wm8710-tvbox'                              => [ 'WonderMedia', 'WM8710', DeviceType::TELEVISION ],
+    'WM8850-mid'                                => [ 'WonderMedia', 'WM8850', DeviceType::TABLET ],
+    'PAD1001'                                   => [ 'Wortmann', 'TERRA MOBILE PAD 1001', DeviceType::TABLET ],
+
+    'Woxter!!' => [
+        'Woxter android box 500'                    => [ 'Woxter', 'Android TV 500', DeviceType::TELEVISION ],
+        'Woxter Android TV BOX 600'                 => [ 'Woxter', 'Android TV 600', DeviceType::TELEVISION ],
+        'Woxter Android TV 700'                     => [ 'Woxter', 'Android TV 700', DeviceType::TELEVISION ],
+        'woxter TV800 hw'                           => [ 'Woxter', 'Android TV 800', DeviceType::TELEVISION ],
+        'Woxter Funny Tab 80'                       => [ 'Woxter', 'Funny Tab 80' ],
+        'Woxter Zielo D15'                          => [ 'Woxter', 'Zielo D15' ],
+        'Woxter Zielo H10'                          => [ 'Woxter', 'Zielo H10' ],
+        'Woxter Zielo Q20'                          => [ 'Woxter', 'Zielo Q20' ],
+        'Woxter Zielo Q25'                          => [ 'Woxter', 'Zielo Q25' ],
+        'Woxter Zielo Q26'                          => [ 'Woxter', 'Zielo Q26' ],
+        'Woxter Q27'                                => [ 'Woxter', 'Zielo Q27' ],
+        'Woxter Zielo Q30'                          => [ 'Woxter', 'Zielo Q30' ],
+        'Woxter Zielo Q40'                          => [ 'Woxter', 'Zielo Q40' ],
+        'Woxter Zielo Q50'                          => [ 'Woxter', 'Zielo Q50' ],
+        'Woxter Zielo S10'                          => [ 'Woxter', 'Zielo S10' ],
+        'Woxter Zielo S11'                          => [ 'Woxter', 'Zielo S11' ],
+        'Woxter Zielo Z400'                         => [ 'Woxter', 'Zielo Z400' ],
+        'Woxter Zielo Z420'                         => [ 'Woxter', 'Zielo Z420' ],
+        'Woxter Zielo Z420Plus'                     => [ 'Woxter', 'Zielo Z420 Plus' ],
+        'Woxter Zielo Z450'                         => [ 'Woxter', 'Zielo Z450' ],
+        'Woxter Zielo Z500'                         => [ 'Woxter', 'Zielo Z500' ],
+        'Woxter Zielo Z800'                         => [ 'Woxter', 'Zielo Z800' ],
+        'Woxter Zielo Z820Plus'                     => [ 'Woxter', 'Zielo Z820 Plus' ],
+        'Woxter Zielo ZX840HD'                      => [ 'Woxter', 'Zielo ZX840 HD' ],
+        'Woxter Zielo ZX900'                        => [ 'Woxter', 'Zielo ZX900' ],
+        'Woxter Tablet PC 50BL'                     => [ 'Woxter', 'Tablet PC 50 BL', DeviceType::TABLET ],
+        'Woxter Tablet PC 50BL DUAL'                => [ 'Woxter', 'Tablet PC 50 BL Dual', DeviceType::TABLET ],
+        'Woxter 51BL'                               => [ 'Woxter', 'Tablet PC 51 BL', DeviceType::TABLET ],
+        'Woxter51BL'                                => [ 'Woxter', 'Tablet PC 51 BL', DeviceType::TABLET ],
+        'Woxter Tablet PC 75CXi'                    => [ 'Woxter', 'Tablet PC 75 CXi', DeviceType::TABLET ],
+        'Woxter Tablet PC 76CXi'                    => [ 'Woxter', 'Tablet PC 76 CXi', DeviceType::TABLET ],
+        'Woxter Tablet PC 85CXi'                    => [ 'Woxter', 'Tablet PC 85 CXi', DeviceType::TABLET ],
+        'Woxter Tablet PC 85 HDS'                   => [ 'Woxter', 'Tablet PC 85 HDS', DeviceType::TABLET ],
+        'Woxter Tablet PC 90BL'                     => [ 'Woxter', 'Tablet PC 90 BL', DeviceType::TABLET ],
+        'Woxter Tablet PC 97IPS'                    => [ 'Woxter', 'Tablet PC 97 IPS', DeviceType::TABLET ],
+        'Woxter Tablet PC 97IPS DUAL'               => [ 'Woxter', 'Tablet PC 97 IPS Dual', DeviceType::TABLET ],
+        'Woxter 97 IPS DUAL 3G'                     => [ 'Woxter', 'Tablet PC 97 IPS Dual 3G', DeviceType::TABLET ],
+        'Woxter Tablet PC 100CX'                    => [ 'Woxter', 'Tablet PC 100 CX', DeviceType::TABLET ],
+        'Woxter Tablet PC 101IPS DUAL'              => [ 'Woxter', 'Tablet PC 101 IPS Dual', DeviceType::TABLET ],
+        'Woxter Tablet PC 101 IPS DUAL'             => [ 'Woxter', 'Tablet PC 101 IPS Dual', DeviceType::TABLET ],
+        'Woxteri80'                                 => [ 'Woxter', 'i-80', DeviceType::TABLET ],
+        'WOXTER I-100'                              => [ 'Woxter', 'i-100', DeviceType::TABLET ],
+        'WOXTER I-101'                              => [ 'Woxter', 'i-101', DeviceType::TABLET ],
+        'Woxter SX100'                              => [ 'Woxter', 'SX 100', DeviceType::TABLET ],
+        'Woxter SX110'                              => [ 'Woxter', 'SX 110', DeviceType::TABLET ],
+        'Woxter QX 70'                              => [ 'Woxter', 'QX 70', DeviceType::TABLET ],
+        'Woxter QX78'                               => [ 'Woxter', 'QX 78', DeviceType::TABLET ],
+        'Woxter QX 80'                              => [ 'Woxter', 'QX 80', DeviceType::TABLET ],
+        'Woxter QX82'                               => [ 'Woxter', 'QX 82', DeviceType::TABLET ],
+        'Woxter QX 90'                              => [ 'Woxter', 'QX 90', DeviceType::TABLET ],
+        'Woxter QX93'                               => [ 'Woxter', 'QX 93', DeviceType::TABLET ],
+        'Woxter QX95'                               => [ 'Woxter', 'QX 95', DeviceType::TABLET ],
+        'Woxter QX 100'                             => [ 'Woxter', 'QX 100', DeviceType::TABLET ],
+        'Woxter QX103'                              => [ 'Woxter', 'QX 103', DeviceType::TABLET ],
+        'Woxter QX105'                              => [ 'Woxter', 'QX 105', DeviceType::TABLET ],
+        'Woxter QX115'                              => [ 'Woxter', 'QX 115', DeviceType::TABLET ],
+        'Woxter QX120'                              => [ 'Woxter', 'QX 120', DeviceType::TABLET ],
+        'Woxter Tablet PC nimbus 70D'               => [ 'Woxter', 'Nimbus 70D', DeviceType::TABLET ],
+        'Woxter Nimbus 97Q'                         => [ 'Woxter', 'Nimbus 97Q', DeviceType::TABLET ],
+        'Woxter Nimbus 98Q'                         => [ 'Woxter', 'Nimbus 98Q', DeviceType::TABLET ],
+        'Woxter Nimbus115'                          => [ 'Woxter', 'Nimbus 115', DeviceType::TABLET ],
+        'Woxter Nimbus 102Q'                        => [ 'Woxter', 'Nimbus 102Q', DeviceType::TABLET ],
+        'Woxter Nimbus1000'                         => [ 'Woxter', 'Nimbus 1000', DeviceType::TABLET ],
+        'Woxter Nimbus1100RX'                       => [ 'Woxter', 'Nimbus 1100 RX', DeviceType::TABLET ],
+        'Woxter Smart Tab 80'                       => [ 'Woxter', 'Smart Tab 80', DeviceType::TABLET ],
+    ],
+
+    'Wxt Tab PC 65CXi'                          => [ 'Woxter', 'Tablet PC 65 CXi', DeviceType::TABLET ],
+    'Proton Lite'                               => [ 'X-View', 'Proton Lite', DeviceType::TABLET ],
+    'XELIO P900A'                               => [ 'Xelio', 'P900A' ],
+    'MI-ONE'                                    => [ 'Xiaomi', 'Mi 1' ],
+    'MI-ONEC1'                                  => [ 'Xiaomi', 'Mi 1' ],
+    'MI-ONE C1'                                 => [ 'Xiaomi', 'Mi 1' ],
+    'MI-ONE Plus!'                              => [ 'Xiaomi', 'Mi 1' ],
+    'mione plus'                                => [ 'Xiaomi', 'Mi 1' ],
+    'MI ONE plus'                               => [ 'Xiaomi', 'Mi 1' ],
+    'MI-ONEPlus'                                => [ 'Xiaomi', 'Mi 1' ],
+    'Xiaomi M1'                                 => [ 'Xiaomi', 'Mi 1' ],
+    'MI 1S'                                     => [ 'Xiaomi', 'Mi 1S' ],
+    'MI 1S'                                     => [ 'Xiaomi', 'Mi 1S' ],
+    'MI 1SC'                                    => [ 'Xiaomi', 'Mi 1S' ],
+    'MI1/1s'                                    => [ 'Xiaomi', 'Mi 1S' ],
+    'MI-TWO'                                    => [ 'Xiaomi', 'Mi 2' ],
+    'MI-TWOPlus'                                => [ 'Xiaomi', 'Mi 2' ],
+    'MI2'                                       => [ 'Xiaomi', 'Mi 2' ],
+    'MI 2'                                      => [ 'Xiaomi', 'Mi 2' ],
+    'MI 2C'                                     => [ 'Xiaomi', 'Mi 2' ],
+    'MI 2A!'                                    => [ 'Xiaomi', 'Mi 2A' ],
+    'MI2A'                                      => [ 'Xiaomi', 'Mi 2A' ],
+    'MI 2S'                                     => [ 'Xiaomi', 'Mi 2S' ],
+    'MI 2SC'                                    => [ 'Xiaomi', 'Mi 2S' ],
+    'MI 2/2S'                                   => [ 'Xiaomi', 'Mi 2S' ],
+    'Xiaomi MI-2S'                              => [ 'Xiaomi', 'Mi 2S' ],
+    'xiaomi M3'                                 => [ 'Xiaomi', 'Mi 3' ],
+    'Mi3'                                       => [ 'Xiaomi', 'Mi 3' ],
+    'MI-Three'                                  => [ 'Xiaomi', 'Mi 3' ],
+    'MI-ThreePlus'                              => [ 'Xiaomi', 'Mi 3' ],
+    'MI 3'                                      => [ 'Xiaomi', 'Mi 3' ],
+    'MI 3C'                                     => [ 'Xiaomi', 'Mi 3' ],
+    'MI 3W'                                     => [ 'Xiaomi', 'Mi 3' ],
+    '2013061'                                   => [ 'Xiaomi', 'Mi 3' ],
+    'Mi3W'                                      => [ 'Xiaomi', 'Mi 3' ],
+    'Xiaomi Mi 4'                               => [ 'Xiaomi', 'Mi 4' ],
+    'xiaomi M4'                                 => [ 'Xiaomi', 'Mi 4' ],
+    'MI 4'                                      => [ 'Xiaomi', 'Mi 4' ],
+    'MI 4LTE'                                   => [ 'Xiaomi', 'Mi 4' ],
+    'MI 4C'                                     => [ 'Xiaomi', 'Mi 4' ],
+    'MI 4W'                                     => [ 'Xiaomi', 'Mi 4' ],
+    '2014216 TD-LTE'                            => [ 'Xiaomi', 'Mi 4' ],
+    'Mi-4c'                                     => [ 'Xiaomi', 'Mi 4' ],
+    'Mi 4i'                                     => [ 'Xiaomi', 'Mi 4i' ],
+    'XIAOMI MI 4W'                              => [ 'Xiaomi', 'Mi 4W' ],
+    'MI 5'                                      => [ 'Xiaomi', 'Mi 5' ],
+    'Xiaomi M5'                                 => [ 'Xiaomi', 'Mi 5' ],
+    'MI 5s'                                     => [ 'Xiaomi', 'Mi 5S' ],
+    'MI 5s Plus'                                => [ 'Xiaomi', 'Mi 5S Plus' ],
+    'MI MAX'                                    => [ 'Xiaomi', 'Mi Max' ],
+    'MI NOTE LTE'                               => [ 'Xiaomi', 'Mi Note' ],
+    'Mi Note 2'                                 => [ 'Xiaomi', 'Mi Note 2' ],
+    'MI NOTE Pro'                               => [ 'Xiaomi', 'Mi Note Pro' ],
+    'Xiaomi Redmi'                              => [ 'Xiaomi', 'Redmi 1' ],
+    'Redmi'                                     => [ 'Xiaomi', 'Redmi 1' ],
+    'HM 1'                                      => [ 'Xiaomi', 'Redmi 1' ],
+    'HM 1A'                                     => [ 'Xiaomi', 'Redmi 1A' ],
+    'HM 1AC'                                    => [ 'Xiaomi', 'Redmi 1A' ],
+    'Redmi 1S'                                  => [ 'Xiaomi', 'Redmi 1S' ],
+    'HM 1S'                                     => [ 'Xiaomi', 'Redmi 1S' ],
+    'HM 1SLTE'                                  => [ 'Xiaomi', 'Redmi 1S' ],
+    'Xiaomi Redmi 1s'                           => [ 'Xiaomi', 'Redmi 1S' ],
+    'Xiaomi Redmi One S'                        => [ 'Xiaomi', 'Redmi 1S' ],
+    'HM 1SC'                                    => [ 'Xiaomi', 'Redmi 1S' ],
+    'HM 1SLTETD'                                => [ 'Xiaomi', 'Redmi 1S' ],
+    'HM 1STD'                                   => [ 'Xiaomi', 'Redmi 1S' ],
+    'HM 1SW'                                    => [ 'Xiaomi', 'Redmi 1S' ],
+    '20141(12)!'                                => [ 'Xiaomi', 'Redmi 2' ],
+    '20148(11|12|13|17|18|19|21)!'              => [ 'Xiaomi', 'Redmi 2' ],
+    '20145(02)!'                                => [ 'Xiaomi', 'Redmi 2' ],
+    'HM 2'                                      => [ 'Xiaomi', 'Redmi 2' ],
+    'HM 2LTE!'                                  => [ 'Xiaomi', 'Redmi 2' ],
+    'HM 2A!'                                    => [ 'Xiaomi', 'Redmi 2A' ],
+    'Redmi 3'                                   => [ 'Xiaomi', 'Redmi 3' ],
+    'Redmi 3S'                                  => [ 'Xiaomi', 'Redmi 3S' ],
+    'Redmi 3X'                                  => [ 'Xiaomi', 'Redmi 3X' ],
+    'Redmi 4'                                   => [ 'Xiaomi', 'Redmi 4' ],
+    'Redmi 4A'                                  => [ 'Xiaomi', 'Redmi 4A' ],
+    'Redmi 4X'                                  => [ 'Xiaomi', 'Redmi 4X' ],
+    'Redmi 4 Prime'                             => [ 'Xiaomi', 'Redmi 4 Prime' ],
+    'REDMI NOTE'                                => [ 'Xiaomi', 'Redmi Note 1' ],
+    'HM NOTE'                                   => [ 'Xiaomi', 'Redmi Note 1' ],
+    'HM Note 4G!'                               => [ 'Xiaomi', 'Redmi Note 1' ],
+    'HM NOTE LTE'                               => [ 'Xiaomi', 'Redmi Note 1' ],
+    'HM NOTE 1LTE!'                             => [ 'Xiaomi', 'Redmi Note 1' ],
+    'HM NOTE 1TD'                               => [ 'Xiaomi', 'Redmi Note 1' ],
+    'HM Note1 TD'                               => [ 'Xiaomi', 'Redmi Note 1' ],
+    'HM NOTE 1S!'                               => [ 'Xiaomi', 'Redmi Note 1' ],
+    'HM NOTE 1W'                                => [ 'Xiaomi', 'Redmi Note 1' ],
+    'HM NOTE1W'                                 => [ 'Xiaomi', 'Redmi Note 1' ],
+    'Redmi Note 4G (LTE)'                       => [ 'Xiaomi', 'Redmi Note 1' ],
+    'Xiaomi Note 4G'                            => [ 'Xiaomi', 'Redmi Note 1' ],
+    '2013122'                                   => [ 'Xiaomi', 'Redmi Note 1' ],
+    '2014715'                                   => [ 'Xiaomi', 'Redmi Note 1' ],
+    'HM Note 2'                                 => [ 'Xiaomi', 'Redmi Note 2' ],
+    'Redmi Note 2'                              => [ 'Xiaomi', 'Redmi Note 2' ],
+    'Xiaomi Note2'                              => [ 'Xiaomi', 'Redmi Note 2' ],
+    'Redmi Note 3'                              => [ 'Xiaomi', 'Redmi Note 3' ],
+    'Xiaomi Redmi Note 3'                       => [ 'Xiaomi', 'Redmi Note 3' ],
+    'Redmi Note 3 Pro'                          => [ 'Xiaomi', 'Redmi Note 3 Pro' ],
+    'Redmi Note 4'                              => [ 'Xiaomi', 'Redmi Note 4' ],
+    'Redmi Note 4X'                             => [ 'Xiaomi', 'Redmi Note 4X' ],
+    'Redmi Pro'                                 => [ 'Xiaomi', 'Redmi Pro' ],
+    '(Xiaomi )?20130(22|23)!'                   => [ 'Xiaomi', 'Redmi Red Rice' ],
+    '20140(11)!'                                => [ 'Xiaomi', 'Redmi Red Rice' ],
+    '20145(01)!'                                => [ 'Xiaomi', 'Redmi Red Rice' ],
+    'RedRice'                                   => [ 'Xiaomi', 'Redmi Red Rice' ],
+    'MI PAD'                                    => [ 'Xiaomi', 'MiPad', DeviceType::TABLET ],
+    'MI PAD 3'                                  => [ 'Xiaomi', 'MiPad 3', DeviceType::TABLET ],
+    'MiBOX iCNTV'                               => [ 'Xiaomi', 'MiBox 1', DeviceType::TELEVISION ],
+    'MiBOX1S'                                   => [ 'Xiaomi', 'MiBox 1S', DeviceType::TELEVISION ],
+    'MiBOX2'                                    => [ 'Xiaomi', 'MiBox 2', DeviceType::TELEVISION ],
+    'XO Learning tablet'                        => [ 'XO', 'Tablet', DeviceType::TABLET ],
+
+
+    '(XOLO )?[ABQX][0-9]{3,4}!!' => [
+        'A500L'                                     => [ 'XOLO', 'A500L' ],
+        'A500s'                                     => [ 'XOLO', 'A500s' ],
+        'A500S IPS'                                 => [ 'XOLO', 'A500s' ],
+        'XoLo A500S'                                => [ 'XOLO', 'A500s' ],
+        'A500s Lite'                                => [ 'XOLO', 'A500s Lite' ],
+        'XOLO A700'                                 => [ 'XOLO', 'A700' ],
+        'XOLO A800'                                 => [ 'XOLO', 'A800' ],
+        'XOLO A1000'                                => [ 'XOLO', 'A1000' ],
+        'XOLO B700'                                 => [ 'XOLO', 'B700' ],
+        'Q500'                                      => [ 'XOLO', 'Q500' ],
+        'Q500s IPS'                                 => [ 'XOLO', 'Q500s' ],
+        'Q510s'                                     => [ 'XOLO', 'Q510s' ],
+        'Q520s'                                     => [ 'XOLO', 'Q520s' ],
+        'Q600'                                      => [ 'XOLO', 'Q600' ],
+        'Q600 Club'                                 => [ 'XOLO', 'Q600 Club' ],
+        'Q600s'                                     => [ 'XOLO', 'Q600s' ],
+        'Q610s'                                     => [ 'XOLO', 'Q610s' ],
+        'Q700'                                      => [ 'XOLO', 'Q700' ],
+        'XOLO Q700'                                 => [ 'XOLO', 'Q700' ],
+        'Q700 Club'                                 => [ 'XOLO', 'Q700 Club' ],
+        'XOLO Q700i'                                => [ 'XOLO', 'Q700i' ],
+        'Q700i'                                     => [ 'XOLO', 'Q700i' ],
+        'Q700S'                                     => [ 'XOLO', 'Q700s' ],
+        'Q700S Plus'                                => [ 'XOLO', 'Q700s Plus' ],
+        'Q710'                                      => [ 'XOLO', 'Q710' ],
+        'Q800'                                      => [ 'XOLO', 'Q800' ],
+        'XOLO Q800'                                 => [ 'XOLO', 'Q800' ],
+        'Q800X'                                     => [ 'XOLO', 'Q800 X-Edition' ],
+        'Q900'                                      => [ 'XOLO', 'Q900' ],
+        'Q900S'                                     => [ 'XOLO', 'Q900s' ],
+        'Q900S Plus'                                => [ 'XOLO', 'Q900s Plus' ],
+        'Q900T'                                     => [ 'XOLO', 'Q900T' ],
+        'Q1000'                                     => [ 'XOLO', 'Q1000' ],
+        'Xolo Q1000'                                => [ 'XOLO', 'Q1000' ],
+        'Q1000 Opus'                                => [ 'XOLO', 'Q1000 Opus' ],
+        'XOLO Q1000 Opus2!'                         => [ 'XOLO', 'Q1000 Opus 2' ],
+        'Q1000S'                                    => [ 'XOLO', 'Q1000s' ],
+        'XOLO Q1000S'                               => [ 'XOLO', 'Q1000s' ],
+        'Q1000s Plus'                               => [ 'XOLO', 'Q1000s Plus' ],
+        'Q1010'                                     => [ 'XOLO', 'Q1010' ],
+        'Q1010i'                                    => [ 'XOLO', 'Q1010i' ],
+        'Q1011'                                     => [ 'XOLO', 'Q1011' ],
+        'Q1100'                                     => [ 'XOLO', 'Q1100' ],
+        'Xolo Q1100'                                => [ 'XOLO', 'Q1100' ],
+        'Q1200'                                     => [ 'XOLO', 'Q1200' ],
+        'Q2000'                                     => [ 'XOLO', 'Q2000' ],
+        'Q2000L'                                    => [ 'XOLO', 'Q2000L' ],
+        'Q2100'                                     => [ 'XOLO', 'Q2100' ],
+        'Q2500'                                     => [ 'XOLO', 'Q2500' ],
+        'Q3000'                                     => [ 'XOLO', 'Q3000' ],
+        'XOLO Q3000'                                => [ 'XOLO', 'Q3000' ],
+        'Xolo X500'                                 => [ 'XOLO', 'X500' ],
+        'X900'                                      => [ 'XOLO', 'X900' ],
+        'Xolo X900'                                 => [ 'XOLO', 'X900' ],
+        'XOLO X910'                                 => [ 'XOLO', 'X910' ],
+        'XOLO X1000'                                => [ 'XOLO', 'X1000' ],
+    ],
+
+    'BLACK'                                     => [ 'XOLO', 'Black' ],
+    'era1X'                                     => [ 'XOLO', 'Era 1X' ],
+    'era 4K'                                    => [ 'XOLO', 'Era 4K' ],
+    '8x-1000'                                   => [ 'XOLO', 'Hive 8x 1000' ],
+    'Omega 5.0'                                 => [ 'XOLO', 'Omega 5.0' ],
+    'Omega 5.5'                                 => [ 'XOLO', 'Omega 5.5' ],
+    'XOLO One'                                  => [ 'XOLO', 'One' ],
+    'XOLO One16'                                => [ 'XOLO', 'One' ],
+    'XOLO One HD'                               => [ 'XOLO', 'One HD' ],
+    'XOLO One LFC'                              => [ 'XOLO', 'One LFC Edition' ],
+    'XOLO Play'                                 => [ 'XOLO', 'Play' ],
+    'XOLO PLAY T1000'                           => [ 'XOLO', 'Play' ],
+    'XOLO T1000'                                => [ 'XOLO', 'Play' ],
+    'Play 6X-1000'                              => [ 'XOLO', 'Play 6X 1000' ],
+    'Play8X-1100'                               => [ 'XOLO', 'Play 8X 1100' ],
+    'Xolo QC800'                                => [ 'XOLO', 'Tab', DeviceType::TABLET ],
+
+    'iX101T1'                                   => [ 'Xplore', 'iX101T1', DeviceType::TABLET ],
+    'iX101T1-2G'                                => [ 'Xplore', 'iX101T1', DeviceType::TABLET ],
+    'iX101T1-XS'                                => [ 'Xplore', 'iX101T1', DeviceType::TABLET ],
+    'X403'                                      => [ 'Xtouch', 'X403' ],
+    'Xtouch X405'                               => [ 'Xtouch', 'X405' ],
+    'X505'                                      => [ 'Xtouch', 'X505' ],
+    'X506'                                      => [ 'Xtouch', 'X506' ],
+    'X506S'                                     => [ 'Xtouch', 'X506S' ],
+    'X507Q'                                     => [ 'Xtouch', 'X507Q' ],
+    'X708S'                                     => [ 'Xtouch', 'X708S', DeviceType::TABLET ],
+    'Xtreamer Mobile AiKi'                      => [ 'Xtreamer', 'Aiki' ],
+    'Xtreamer Mobile AiKi a7*'                  => [ 'Xtreamer', 'Aiki' ],
+    'Aiki-4S'                                   => [ 'Xtreamer', 'Aiki 4S' ],
+    'Aiki-5'                                    => [ 'Xtreamer', 'Aiki 5' ],
+    'Xtreamer Mobile Aiki5s'                    => [ 'Xtreamer', 'Aiki 5S' ],
+    'Xtreamer Joyz'                             => [ 'Xtreamer', 'Joyz' ],
+    'Xtreamer Wonder'                           => [ 'Xtreamer', 'Wonder', DeviceType::TELEVISION ],
+    'Q07CL01'                                   => [ 'XVision', 'Q07', DeviceType::TABLET ],
+    'Luna TAB07-920N'                           => [ 'Yarvik', 'Luna 7', DeviceType::TABLET ],
+    'Luna TAB07-100'                            => [ 'Yarvik', 'Luna 7c', DeviceType::TABLET ],
+    'Luna TAB07-101'                            => [ 'Yarvik', 'Luna 7c', DeviceType::TABLET ],
+    'Luna TAB274'                               => [ 'Yarvik', 'Luna 7c', DeviceType::TABLET ],
+    'Luna TAB374'                               => [ 'Yarvik', 'Luna 8c', DeviceType::TABLET ],
+    'Luna TAB474'                               => [ 'Yarvik', 'Luna 10', DeviceType::TABLET ],
+    'Luna TAB10-150'                            => [ 'Yarvik', 'Luna 10c', DeviceType::TABLET ],
+    'TAB09-410'                                 => [ 'Yarvik', 'Noble 9.7', DeviceType::TABLET ],
+    'TAB10-410'                                 => [ 'Yarvik', 'Noble 10.1', DeviceType::TABLET ],
+    'Noble TAB07-485'                           => [ 'Yarvik', 'Noble Mini', DeviceType::TABLET ],
+    'TAB07-485'                                 => [ 'Yarvik', 'Noble Mini', DeviceType::TABLET ],
+    'Xenta-TAB07-210'                           => [ 'Yarvik', 'Xenta 7c', DeviceType::TABLET ],
+    'Xenta-TAB07-211'                           => [ 'Yarvik', 'Xenta 7c', DeviceType::TABLET ],
+    'TAB07-200'                                 => [ 'Yarvik', 'Xenta 7ic', DeviceType::TABLET ],
+    'Xenta TAB07-200'                           => [ 'Yarvik', 'Xenta 7ic', DeviceType::TABLET ],
+    'Xenta TAB08-200'                           => [ 'Yarvik', 'Xenta 8ic', DeviceType::TABLET ],
+    'Xenta TAB08-201-3G'                        => [ 'Yarvik', 'Xenta 8c', DeviceType::TABLET ],
+    'TAB9-200'                                  => [ 'Yarvik', 'Xenta 9.7ic', DeviceType::TABLET ],
+    'Xenta TAB9-200'                            => [ 'Yarvik', 'Xenta 9.7ic', DeviceType::TABLET ],
+    'Xenta TAB09-211'                           => [ 'Yarvik', 'Xenta 9.7ic+', DeviceType::TABLET ],
+    'Xenta TAB10-211'                           => [ 'Yarvik', 'Xenta 10ic', DeviceType::TABLET ],
+    'Xenta TAB10-201'                           => [ 'Yarvik', 'Xenta 10ic', DeviceType::TABLET ],
+    'TAB10-201'                                 => [ 'Yarvik', 'Xenta 10ic', DeviceType::TABLET ],
+    'Xenta TAB13-201'                           => [ 'Yarvik', 'Xenta 13c', DeviceType::TABLET ],
+    'N6'                                        => [ 'Yarvik', 'TAB210 Tablet', DeviceType::TABLET ],
+    'TAB210'                                    => [ 'Yarvik', 'TAB210 Tablet', DeviceType::TABLET ],
+    'TAB220'                                    => [ 'Yarvik', 'GoTab Velocity', DeviceType::TABLET ],
+    'TAB224'                                    => [ 'Yarvik', 'GoTab Velocity', DeviceType::TABLET ],
+    'TAB250'                                    => [ 'Yarvik', 'TAB250 Tablet', DeviceType::TABLET ],
+    'TAB275'                                    => [ 'Yarvik', 'GoTab Ion', DeviceType::TABLET ],
+    'TAB260'                                    => [ 'Yarvik', 'GoTab Velocity', DeviceType::TABLET ],
+    'TAB264'                                    => [ 'Yarvik', 'GoTab Velocity', DeviceType::TABLET ],
+    'TAB360'                                    => [ 'Yarvik', 'GoTab Gravity', DeviceType::TABLET ],
+    'TAB364'                                    => [ 'Yarvik', 'GoTab Gravity', DeviceType::TABLET ],
+    'TAB410'                                    => [ 'Yarvik', 'TAB410 Tablet', DeviceType::TABLET ],
+    'TAB411'                                    => [ 'Yarvik', 'GoTab Slimline', DeviceType::TABLET ],
+    'TAB420'                                    => [ 'Yarvik', 'GoTab Xerios', DeviceType::TABLET ],
+    'TAB424'                                    => [ 'Yarvik', 'GoTab Xerios', DeviceType::TABLET ],
+    'TAB450'                                    => [ 'Yarvik', 'GoTab Slimline', DeviceType::TABLET ],
+    'TAB460'                                    => [ 'Yarvik', 'GoTab Xerios', DeviceType::TABLET ],
+    'TAB461'                                    => [ 'Yarvik', 'GoTab Xerios', DeviceType::TABLET ],
+    'TAB464'                                    => [ 'Yarvik', 'GoTab Xerios', DeviceType::TABLET ],
+    'TAB465EUK'                                 => [ 'Yarvik', 'GoTab Exxa', DeviceType::TABLET ],
+    'TAB468'                                    => [ 'Yarvik', 'GoTab Zetta', DeviceType::TABLET ],
+    'TAB469'                                    => [ 'Yarvik', 'GoTab Yotta', DeviceType::TABLET ],
+    'TAB466EUK'                                 => [ 'Yarvik', 'GoTab Zetta', DeviceType::TABLET ],
+    'TAB467'                                    => [ 'Yarvik', 'GoTab Zetta', DeviceType::TABLET ],
+    'TAB462'                                    => [ 'Yarvik', 'Zania 10ic', DeviceType::TABLET ],
+    'YP712'                                     => [ 'Yashi', 'YPAD 7" YP712', DeviceType::TABLET ],
+
+    '(Andy|Yezz)!!' => [
+        'Andy 3.5EI'                                => [ 'Yezz', 'Andy A3.5EI' ],
+        'Andy 3.5EI3'                               => [ 'Yezz', 'Andy A3.5EI3' ],
+        'yezz Andy A3.5EP'                          => [ 'Yezz', 'Andy A3.5EP' ],
+        'Andy 3.5EP'                                => [ 'Yezz', 'Andy A3.5EP' ],
+        'ANDY A3.5EP'                               => [ 'Yezz', 'Andy A3.5EP' ],
+        'Andy A4'                                   => [ 'Yezz', 'Andy A4' ],
+        'YEZZ-A4M'                                  => [ 'Yezz', 'Andy A4M' ],
+        'Andy A4M'                                  => [ 'Yezz', 'Andy A4M' ],
+        'YEZZ-A4.5'                                 => [ 'Yezz', 'Andy A4.5' ],
+        'Andy A4.5'                                 => [ 'Yezz', 'Andy A4.5' ],
+        'Andy A5'                                   => [ 'Yezz', 'Andy A5' ],
+        'YEZZ-A5'                                   => [ 'Yezz', 'Andy A5' ],
+        'YEZZ-A5EI'                                 => [ 'Yezz', 'Andy A5EI' ],
+        'YEZZ-A5QP'                                 => [ 'Yezz', 'Andy A5QP' ],
+        'ANDY A5QP'                                 => [ 'Yezz', 'Andy A5QP' ],
+        'YEZZ-A6M'                                  => [ 'Yezz', 'Andy A6M' ],
+        'ANDY A6M'                                  => [ 'Yezz', 'Andy A6M' ],
+        'Yezz Andy AC4E'                            => [ 'Yezz', 'Andy AC4E' ],
+        'Yezz-AC4EI'                                => [ 'Yezz', 'Andy AC4EI' ],
+        'Andy AC4.5'                                => [ 'Yezz', 'Andy AC4.5' ],
+        'Andy AC5'                                  => [ 'Yezz', 'Andy AC5' ],
+        'YEZZ-AZ4.5'                                => [ 'Yezz', 'Andy AZ4.5' ],
+        'ANDY AZ4.5'                                => [ 'Yezz', 'Andy AZ4.5' ],
+        'Andy C3.5EI'                               => [ 'Yezz', 'Andy C3.5EI' ],
+        'YEZZ-C3.5EI'                               => [ 'Yezz', 'Andy C3.5EI' ],
+        'ANDY-C3.5EI'                               => [ 'Yezz', 'Andy C3.5EI' ],
+        'YEZZ-C4E'                                  => [ 'Yezz', 'Andy C4E' ],
+        'Andy C4E'                                  => [ 'Yezz', 'Andy C4E' ],
+        'ANDY-C4E'                                  => [ 'Yezz', 'Andy C4E' ],
+        'Andy C4EI'                                 => [ 'Yezz', 'Andy C4EI' ],
+        'Andy C5EI'                                 => [ 'Yezz', 'Andy C5EI' ],
+        'Andy C5M'                                  => [ 'Yezz', 'Andy C5M' ],
+        'ANDY C5QL'                                 => [ 'Yezz', 'Andy C5QL' ],
+        'Andy C5V'                                  => [ 'Yezz', 'Andy C5V' ],
+        'YEZZ-Andy C5V'                             => [ 'Yezz', 'Andy C5V' ],
+        'Andy C5VP'                                 => [ 'Yezz', 'Andy C5VP' ],
+        'ANDY 3G 3.5'                               => [ 'Yezz', 'Andy 3.5' ],
+        'ANDY-3.5E2I'                               => [ 'Yezz', 'Andy 3.5E2I' ],
+        'ANDY-3.5EH'                                => [ 'Yezz', 'Andy 3.5EH' ],
+        'ANDY 35EI'                                 => [ 'Yezz', 'Andy 3.5EI' ],
+        'ANDY-3.5EI'                                => [ 'Yezz', 'Andy 3.5EI' ],
+        'YEZZ-3.5EI'                                => [ 'Yezz', 'Andy 3.5EI' ],
+        'ANDY 35EI2'                                => [ 'Yezz', 'Andy 3.5EI2' ],
+        'YEZZ-4E'                                   => [ 'Yezz', 'Andy 4E' ],
+        'Andy 4E'                                   => [ 'Yezz', 'Andy 4E' ],
+        'ANDY-4E'                                   => [ 'Yezz', 'Andy 4E' ],
+        'ANDY-4E2I'                                 => [ 'Yezz', 'Andy 4E2I' ],
+        'ANDY 4E2I'                                 => [ 'Yezz', 'Andy 4E2I' ],
+        'ANDY 4E3I'                                 => [ 'Yezz', 'Andy 4E3I' ],
+        'Andy 4EI'                                  => [ 'Yezz', 'Andy 4EI' ],
+        'ANDY-4EI'                                  => [ 'Yezz', 'Andy 4EI' ],
+        'ANDY 4EI2'                                 => [ 'Yezz', 'Andy 4EI2' ],
+        'ANDY 4EL2 LTE'                             => [ 'Yezz', 'Andy 4EI2' ],
+        'ANDY 45EL'                                 => [ 'Yezz', 'Andy 4.5EL' ],
+        'Andy 4.5M'                                 => [ 'Yezz', 'Andy 4.5M' ],
+        'Andy 4.7T'                                 => [ 'Yezz', 'Andy 4.7T' ],
+        'ANDY 5E2I'                                 => [ 'Yezz', 'Andy 5E2I' ],
+        'ANDY 5EI'                                  => [ 'Yezz', 'Andy 5EI' ],
+        'ANDY5EI'                                   => [ 'Yezz', 'Andy 5EI' ],
+        'Yezz-ANDY5EL'                              => [ 'Yezz', 'Andy 5EL' ],
+        'ANDY 5EL'                                  => [ 'Yezz', 'Andy 5EL' ],
+        'ANDY-5T'                                   => [ 'Yezz', 'Andy 5T' ],
+        'Andy5T'                                    => [ 'Yezz', 'Andy 5T' ],
+        'ANDY 5T'                                   => [ 'Yezz', 'Andy 5T' ],
+        'Andy 5TL'                                  => [ 'Yezz', 'Andy 5TL' ],
+        'YEZZ-Andy 5.5EI'                           => [ 'Yezz', 'Andy 5.5EI' ],
+        'Andy 5.5EI'                                => [ 'Yezz', 'Andy 5.5EI' ],
+        'ANDY 55EI'                                 => [ 'Yezz', 'Andy 5.5EI' ],
+        'Andy 55ML VR'                              => [ 'Yezz', 'Andy 5.5ML VR' ],
+        'ANDY 6EL LTE'                              => [ 'Yezz', 'Andy 6EL' ],
+        'YEZZ-6Q'                                   => [ 'Yezz', 'Andy 6Q' ],
+        'Andy 6Q'                                   => [ 'Yezz', 'Andy 6Q' ],
+        'Yezz-T7FD'                                 => [ 'Yezz', 'Epic T7FD', DeviceType::TABLET ],
+    ],
+
+    'C868'                                      => [ 'Yicheer', 'C868' ],
+    'DEM752NC'                                  => [ 'Yifang', 'M752' ],
+    'EMR1879'                                   => [ 'Yidong', 'EMR1879', DeviceType::TABLET ],
+    'YD201'                                     => [ 'Yota', 'YotaPhone 2' ],
+    'YD202'                                     => [ 'Yota', 'YotaPhone 2' ],
+    'YD203'                                     => [ 'Yota', 'YotaPhone 2' ],
+    'YD206'                                     => [ 'Yota', 'YotaPhone 2' ],
+
+    'YU4711'                                    => [ 'Yu', 'Yunique' ],
+    'YU5010'                                    => [ 'Yu', 'Yuphoria' ],
+    'YU5010A'                                   => [ 'Yu', 'Yuphoria' ],
+    'YU5050'                                    => [ 'Yu', 'Yutopia' ],
+    'YUREKA'                                    => [ 'Yu', 'Yureka' ],
+    'YU5200'                                    => [ 'Yu', 'Yureka S' ],
+    'YUreka+'                                   => [ 'Yu', 'Yureka Plus' ],
+    'YU5510'                                    => [ 'Yu', 'Yureka Plus' ],
+    'YU5510A'                                   => [ 'Yu', 'Yureka Plus' ],
+    'YU5530'                                    => [ 'Yu', 'Yunicorn' ],
+    'YU 6000'                                   => [ 'Yu', 'Yureka Note' ],
+
+    'YX-YUSUN E80'                              => [ 'Yusun', 'E80' ],
+    'YX-YUSUN E89'                              => [ 'Yusun', 'E89' ],
+    'YX-YUSUN E96'                              => [ 'Yusun', 'E96' ],
+    'YUSUN E98'                                 => [ 'Yusun', 'E98' ],
+    'YUSUN L71'                                 => [ 'Yusun', 'L71' ],
+    'YUSUN L88'                                 => [ 'Yusun', 'L88' ],
+    'LA-I Dual core'                            => [ 'Yusun', 'LA-I' ],
+    'LA-M3'                                     => [ 'Yusun', 'LA-M3' ],
+    'LA1-L'                                     => [ 'Yusun', 'LA1-L' ],
+    'LA2-E'                                     => [ 'Yusun', 'LA2-E' ],
+    'LA2-E1'                                    => [ 'Yusun', 'LA2-E1' ],
+    'LA2-L'                                     => [ 'Yusun', 'LA2-L' ],
+    'LA2-T'                                     => [ 'Yusun', 'LA2-T' ],
+    'YUSUN LA2-T'                               => [ 'Yusun', 'LA2-T' ],
+    'YUSUN LA2 T'                               => [ 'Yusun', 'LA2-T' ],
+    'YUSUN LA2-T1'                              => [ 'Yusun', 'LA2-T1' ],
+    'YUSUN LA2 T1'                              => [ 'Yusun', 'LA2-T1' ],
+    'LA2-T1'                                    => [ 'Yusun', 'LA2-T1' ],
+    'YUSUN LA2-W'                               => [ 'Yusun', 'LA2-W' ],
+    'LA2-W'                                     => [ 'Yusun', 'LA2-W' ],
+    'LA2-W1'                                    => [ 'Yusun', 'LA2-W1' ],
+    'YUSUN LA2 W1'                              => [ 'Yusun', 'LA2-W1' ],
+    'LA3-W'                                     => [ 'Yusun', 'LA3-W' ],
+    'LA3S'                                      => [ 'Yusun', 'LA3S' ],
+    'LA5-W'                                     => [ 'Yusun', 'LA5-W' ],
+    'YUSUN LA5-W'                               => [ 'Yusun', 'LA5-W' ],
+    'YUSUN T22'                                 => [ 'Yusun', 'T22' ],
+    'YUSUN-T22'                                 => [ 'Yusun', 'T22' ],
+    'YUSUN T29'                                 => [ 'Yusun', 'T29' ],
+    'YUSUN T30'                                 => [ 'Yusun', 'T30' ],
+    'YUSUN T31'                                 => [ 'Yusun', 'T31' ],
+    'YUSUN T35!'                                => [ 'Yusun', 'T35' ],
+    'YUSUN T50'                                 => [ 'Yusun', 'T50' ],
+    'YUSUN T85'                                 => [ 'Yusun', 'T85' ],
+    'YUSUN W35'                                 => [ 'Yusun', 'W35' ],
+    'YUSUN W90'                                 => [ 'Yusun', 'W90' ],
+    'YUSUN W91'                                 => [ 'Yusun', 'W91' ],
+    'YUSUN W306'                                => [ 'Yusun', 'W306' ],
+    'yusun W702'                                => [ 'Yusun', 'W702' ],
+    'YUSUN W706'                                => [ 'Yusun', 'W706' ],
+    'YUSUN W708'                                => [ 'Yusun', 'W708' ],
+    'YUSUN - W 800'                             => [ 'Yusun', 'W800' ],
+    'YUSUN--W 800'                              => [ 'Yusun', 'W800' ],
+    'YUSUN W808'                                => [ 'Yusun', 'W808' ],
+    'YUSUN -- W 900'                            => [ 'Yusun', 'W900' ],
+    'TB782B'                                    => [ 'Zeki', 'TB782B', DeviceType::TABLET ],
+    'TBD753B'                                   => [ 'Zeki', 'TBD753B', DeviceType::TABLET ],
+    'TBDB763'                                   => [ 'Zeki', 'TBDB763', DeviceType::TABLET ],
+    'TBDB863'                                   => [ 'Zeki', 'TBDB863', DeviceType::TABLET ],
+    'TBDC1093'                                  => [ 'Zeki', 'TBDC1093', DeviceType::TABLET ],
+    'TBDG734'                                   => [ 'Zeki', 'TBDG734', DeviceType::TABLET ],
+    'TBDG874'                                   => [ 'Zeki', 'TBDG874', DeviceType::TABLET ],
+    'TBDG1073'                                  => [ 'Zeki', 'TBDG1073', DeviceType::TABLET ],
+    'TBQC1063'                                  => [ 'Zeki', 'TBQC1063', DeviceType::TABLET ],
+    'ZENITHINK C94!'                            => [ 'Zenithink', 'C94', DeviceType::TABLET ],
+    'p7901a'                                    => [ 'Zenithink', 'Epad P7901A', DeviceType::TABLET ],
+    'zt180'                                     => [ 'Zenithink', 'ZT-180', DeviceType::TABLET ],
+    'Z282 C91'                                  => [ 'Zenithink', 'ZT-282', DeviceType::TABLET ],
+    'Admire Alpha'                              => [ 'Zen', 'Admire Alpha' ],
+    'Admire Curve'                              => [ 'Zen', 'Admire Curve' ],
+    'Zen PO neo'                                => [ 'Zen', 'Powermax Neo' ],
+    'ZEN U1'                                    => [ 'Zen', 'Ultrafone U1' ],
+    'ZEN U4'                                    => [ 'Zen', 'Ultrafone U4' ],
+    'ZEN U5'                                    => [ 'Zen', 'Ultrafone U5' ],
+    'ZEN 303 3G'                                => [ 'Zen', 'Ultrafone 303' ],
+
+    'ultrafone!!' => [
+        'ultrafone 102'                             => [ 'Zen', 'Ultrafone 102' ],
+        'ultrafone 104'                             => [ 'Zen', 'Ultrafone 104' ],
+        'ultrafone 105'                             => [ 'Zen', 'Ultrafone 105' ],
+        'ultrafone 105 Pro'                         => [ 'Zen', 'Ultrafone 105 Pro' ],
+        'ultrafone 105+'                            => [ 'Zen', 'Ultrafone 105+' ],
+        'ultrafone 108'                             => [ 'Zen', 'Ultrafone 108' ],
+        'ultrafone 109'                             => [ 'Zen', 'Ultrafone 109' ],
+        'ultrafone 111'                             => [ 'Zen', 'Ultrafone 111' ],
+        'ultrafone 302'                             => [ 'Zen', 'Ultrafone 302' ],
+        'ultrafone 303'                             => [ 'Zen', 'Ultrafone 303' ],
+        'Ultrafone 303 Elite'                       => [ 'Zen', 'Ultrafone 303 Elite' ],
+        'ultrafone 303 Play'                        => [ 'Zen', 'Ultrafone 303 Play' ],
+        'ultrafone 303P'                            => [ 'Zen', 'Ultrafone 303P' ],
+        'ultrafone 304'                             => [ 'Zen', 'Ultrafone 304' ],
+        'ultrafone 308'                             => [ 'Zen', 'Ultrafone 308' ],
+        'ultrafone 312'                             => [ 'Zen', 'Ultrafone 312' ],
+        'ultrafone 402'                             => [ 'Zen', 'Ultrafone 402' ],
+        'ultrafone 501'                             => [ 'Zen', 'Ultrafone 501' ],
+        'ultrafone 502'                             => [ 'Zen', 'Ultrafone 502' ],
+        'ultrafone 503'                             => [ 'Zen', 'Ultrafone 503' ],
+        'ultrafone 504'                             => [ 'Zen', 'Ultrafone 504' ],
+        'ultrafone 506'                             => [ 'Zen', 'Ultrafone 506' ],
+        'ultrafone 701HD'                           => [ 'Zen', 'Ultrafone 701HD' ],
+        'ultrafone 701FHD'                          => [ 'Zen', 'Ultrafone 701FHD' ],
+    ],
+
+    'ZIGO EON5I'                                => [ 'Zigo', 'Eon 5i' ],
+    'Zigo Eon6i'                                => [ 'Zigo', 'Eon 6i' ],
+    'Zigo Eon7i'                                => [ 'Zigo', 'Eon 7i Advance' ],
+    'Zigo Eon52i'                               => [ 'Zigo', 'Eon 52i PIEZO' ],
+    'Zigo Eon 53'                               => [ 'Zigo', 'Eon 53i Inspire' ],
+    'Zigo Nebula6 9'                            => [ 'Zigo', 'Nebula Tab 6.9', DeviceType::TABLET ],
+    'NEBULA6.9'                                 => [ 'Zigo', 'Nebula Tab 6.9', DeviceType::TABLET ],
+    'Zigo Nebula Tab 7.1'                       => [ 'Zigo', 'Nebula Tab 7.1', DeviceType::TABLET ],
+    'Zigo N81'                                  => [ 'Zigo', 'Nebula Tab 8.1', DeviceType::TABLET ],
+    'Jaguar3'                                   => [ 'ZiiLabs', 'Jaguar 3', DeviceType::TABLET ],
+    'Jaguar7'                                   => [ 'ZiiLabs', 'Jaguar 7', DeviceType::TABLET ],
+    'Ziss Ranger HD'                            => [ 'Ziss', 'Ranger HD' ],
+    'ZBOX-ID18'                                 => [ 'Zotac', 'ZBOX ID18', DeviceType::DESKTOP ],
+    'ZBOX-ID81'                                 => [ 'Zotac', 'ZBOX ID81', DeviceType::DESKTOP ],
+
+    'ZTE A[0-9]{3,3}!!' => [
+        'ZTE A880'                                  => [ 'ZTE', 'Xiao Xian' ],
+        'ZTE A905L'                                 => [ 'ZTE', 'A905L' ],
+    ],
+
+    'ZTE B[0-9]{3,3}!!' => [
+        'ZTE B790'                                  => [ 'ZTE', 'Boost Tango' ],
+        'ZTE B792'                                  => [ 'ZTE', 'Boost Kuta' ],
+        'ZTE B795'                                  => [ 'ZTE', 'Boost Icon Nero' ],
+        'ZTE B816'                                  => [ 'ZTE', 'Boost INDY' ],
+        'ZTE B880'                                  => [ 'ZTE', 'Xiao Xian 2' ],
+    ],
+
+    'ZTE BA[0-9]{3,3}!!' => [
+        'ZTE BA510'                                 => [ 'ZTE', 'Blade A510' ],
+        'ZTE BA601'                                 => [ 'ZTE', 'Blade A601' ],
+        'ZTE BA610C'                                => [ 'ZTE', 'Voyage 4' ],
+        'ZTE BA610T'                                => [ 'ZTE', 'Voyage 4' ],
+        'ZTE BA611C'                                => [ 'ZTE', 'BA611C' ],
+        'ZTE BA910'                                 => [ 'ZTE', 'Blade A910' ],
+    ],
+
+    'ZTE BV0[0-9]{3,3}!!' => [
+        'ZTE BV0701'                                => [ 'ZTE', 'Xiao Xian 4' ],
+        'ZTE BV0710'                                => [ 'ZTE', 'V7 Max' ],
+        'ZTE BV0720'                                => [ 'ZTE', 'Blade A2' ],
+        'ZTE BV0730'                                => [ 'ZTE', 'BV0730' ],
+    ],
+
+    'ZTE C[0-9]{3,3}!!' => [
+        'ZTE C310'                                  => [ 'ZTE', 'Blade C310' ],
+        'ZTE C880'                                  => [ 'ZTE', 'C880' ],
+        'ZTE C880A'                                 => [ 'ZTE', 'Blade A1' ],
+        'ZTE C880S'                                 => [ 'ZTE', 'Xiao Xian 3' ],
+        'ZTE C880U'                                 => [ 'ZTE', 'Blade A1' ],
+    ],
+
+    'ZTE C N[0-9]{3,3}!!' => [
+        'ZTE C N600!'                               => [ 'ZTE', 'C N600' ],
+        'ZTE C N606'                                => [ 'ZTE', 'C N606' ],
+        'ZTE C N700'                                => [ 'ZTE', 'C N700' ],
+        'ZTE C N760'                                => [ 'ZTE', 'C N760' ],
+        'ZTE C N780'                                => [ 'ZTE', 'C N780' ],
+        'ZTE C N880!'                               => [ 'ZTE', 'Blade' ],
+    ],
+
+    'ZTE C R[0-9]{3,3}!!' => [
+        'ZTE C R750'                                => [ 'ZTE', 'C R750' ],
+        'ZTE C R750+'                               => [ 'ZTE', 'C R750' ],
+    ],
+
+    'ZTE C X[0-9]{3,3}!!' => [
+        'ZTE C X500'                                => [ 'ZTE', 'Score' ],
+        'ZTE C X920'                                => [ 'ZTE', 'C X920' ],
+    ],
+
+    'ZTE ?G[0-9]{3,3}!!' => [
+        'ZTE ?G601U!'                               => [ 'ZTE', 'G601U' ],
+        'ZTE G717C'                                 => [ 'ZTE', 'G717C' ],
+        'ZTE G718C'                                 => [ 'ZTE', 'G718C' ],
+        'ZTE G719C'                                 => [ 'ZTE', 'G719C' ],
+        'ZTE G720C'                                 => [ 'ZTE', 'G720C' ],
+        'ZTE ?G720T!'                               => [ 'ZTE', 'G720T' ],
+        'ZTE G721C'                                 => [ 'ZTE', 'G721C' ],
+    ],
+
+    '(ZTE ?)?N[0-9]{3,3}!!' => [
+        'N762'                                      => [ 'ZTE', 'N762' ],
+        'ZTE N788'                                  => [ 'ZTE', 'N788' ],
+        'ZTE N789'                                  => [ 'ZTE', 'N789' ],
+        'ZTE N790!'                                 => [ 'ZTE', 'N790' ],
+        'ZTE N795'                                  => [ 'ZTE', 'N795' ],
+        'ZTE N798!'                                 => [ 'ZTE', 'N798' ],
+        'ZTE N799!'                                 => [ 'ZTE', 'Blade Eg' ],
+        'N799D'                                     => [ 'ZTE', 'Blade Eg' ],
+        'N800'                                      => [ 'ZTE', 'Awe' ],
+        'ZTE N807'                                  => [ 'ZTE', 'N807' ],
+        'N810'                                      => [ 'ZTE', 'Reef' ],
+        'ZTE N818'                                  => [ 'ZTE', 'N818' ],
+        'ZTE N818-YUNOS'                            => [ 'ZTE', 'N818' ],
+        'N850L'                                     => [ 'ZTE', 'Director' ],
+        'ZTE N855D'                                 => [ 'ZTE', 'N855D' ],
+        'ZTE N855D+'                                => [ 'ZTE', 'N855D' ],
+        'N860'                                      => [ 'ZTE', 'Warp' ],
+        'N880'                                      => [ 'ZTE', 'Blade' ],
+        'ZTE N880E!'                                => [ 'ZTE', 'N880E' ],
+        'ZTE N880F'                                 => [ 'ZTE', 'N880F' ],
+        'ZTE N880G'                                 => [ 'ZTE', 'N880G' ],
+        'ZTE N880W'                                 => [ 'ZTE', 'N880W' ],
+        'ZTE N881E'                                 => [ 'ZTE', 'N881E' ],
+        'ZTE N881F'                                 => [ 'ZTE', 'N881F' ],
+        'ZTE N882E'                                 => [ 'ZTE', 'N882E' ],
+        'ZTE N900'                                  => [ 'ZTE', 'N900' ],
+        'ZTE N900D'                                 => [ 'ZTE', 'N900' ],
+        'ZTE N909'                                  => [ 'ZTE', 'N909' ],
+        'ZTE N909D'                                 => [ 'ZTE', 'N909' ],
+        'ZTE N909-YUNOS'                            => [ 'ZTE', 'N909' ],
+        'ZTE N910'                                  => [ 'ZTE', 'Anthem' ],
+        'ZTEN918St'                                 => [ 'ZTE', 'N918St' ],
+        'ZTE N919'                                  => [ 'ZTE', 'N919' ],
+        'ZTE N919D'                                 => [ 'ZTE', 'N919' ],
+        'ZTE N928Dt'                                => [ 'ZTE', 'Weiwu 3C' ],
+        'ZTE N939Sc'                                => [ 'ZTE', 'Weiwu 3' ],
+        'ZTE N939St'                                => [ 'ZTE', 'Weiwu 3' ],
+        'N958St'                                    => [ 'ZTE', 'Nubia V5 Max' ],
+        'ZTE N960'                                  => [ 'ZTE', 'Skate' ],
+        'ZTE N970'                                  => [ 'ZTE', 'Grand X' ],
+        'ZTE N980'                                  => [ 'ZTE', 'N980' ],
+        'ZTE N983'                                  => [ 'ZTE', 'N983' ],
+        'N986'                                      => [ 'ZTE', 'N986' ],
+        'ZTE N986'                                  => [ 'ZTE', 'N986' ],
+    ],
+
+    '(ZXY-)?(ZTE )?N[0-9]{4,4}!!' => [
+        'N8000'                                     => [ 'ZTE', 'Engage LT' ],
+        'N8000 USA Cricket'                         => [ 'ZTE', 'Engage LT' ],
+        'N8000 USA RS'                              => [ 'ZTE', 'Engage LT' ],
+        'N8000 WHTE CKT'                            => [ 'ZTE', 'Engage LT' ],
+        'ZXY-ZTE N8010'                             => [ 'ZTE', 'N8010' ],
+        'ZXY-ZTE N8300'                             => [ 'ZTE', 'N8300' ],
+        'N9100'                                     => [ 'ZTE', 'Force' ],
+        'N9101'                                     => [ 'ZTE', 'Imperial' ],
+        'ZTE N9120'                                 => [ 'ZTE', 'Avid' ],
+        'N9130'                                     => [ 'ZTE', 'Speed' ],
+        'N9180'                                     => [ 'ZTE', 'Red Bull V5' ],
+        'N9500'                                     => [ 'ZTE', 'Flash' ],
+        'N9510'                                     => [ 'ZTE', 'Warp' ],
+        'ZTE N9511'                                 => [ 'ZTE', 'Fury' ],
+        'N9515'                                     => [ 'ZTE', 'Warp Sync' ],
+        'N9520'                                     => [ 'ZTE', 'Stormer' ],
+        'N9810'                                     => [ 'ZTE', 'Vital' ],
+        'N9835'                                     => [ 'ZTE', 'Grand S Pro' ],
+    ],
+
+    '(ZXY-)?NX[0-9]{2,3}!!' => [
+        'NX40X'                                     => [ 'ZTE', 'Nubia Z5 mini' ],
+        'NX40X APT'                                 => [ 'ZTE', 'Nubia Z5 mini' ],
+        'NX402'                                     => [ 'ZTE', 'Nubia Z5 mini' ],
+        'NX403A'                                    => [ 'ZTE', 'Nubia Z5 mini' ],
+        'NX404H'                                    => [ 'ZTE', 'Nubia Z5s mini' ],
+        'NX405H'                                    => [ 'ZTE', 'Nubia Z5s mini' ],
+        'NX501'                                     => [ 'ZTE', 'Nubia Z5' ],
+        'NX50X'                                     => [ 'ZTE', 'Nubia Z5' ],
+        'NX503'                                     => [ 'ZTE', 'Nubia Z5s' ],
+        'NX503A'                                    => [ 'ZTE', 'Nubia Z5s' ],
+        'NX503J'                                    => [ 'ZTE', 'Nubia Z5s' ],
+        'NX505J'                                    => [ 'ZTE', 'Nubia Z7 Max' ],
+        'NX506J'                                    => [ 'ZTE', 'Nubia Z7' ],
+        'NX507H'                                    => [ 'ZTE', 'Nubia Z7 mini' ],
+        'NX507J'                                    => [ 'ZTE', 'Nubia Z7 mini' ],
+        'NX508J'                                    => [ 'ZTE', 'Nubia Z9' ],
+        'NX510J'                                    => [ 'ZTE', 'Nubia Z9 Max' ],
+        'NX511J'                                    => [ 'ZTE', 'Nubia Z9 mini' ],
+        'NX512J'                                    => [ 'ZTE', 'Nubia Z9 Max' ],
+        'ZXY-NX512J'                                => [ 'ZTE', 'Nubia Z9 Max' ],
+        'NX531J'                                    => [ 'ZTE', 'Nubia Z11' ],
+        'NX529J'                                    => [ 'ZTE', 'Nubia Z11 Mini' ],
+        'NX549J'                                    => [ 'ZTE', 'Nubia Z11 Mini S' ],
+        'NX513J'                                    => [ 'ZTE', 'Nubia My Prague' ],
+        'NX601J'                                    => [ 'ZTE', 'Nubia X6' ],
+    ],
+
+    'ZTE M[0-9]{3,3}!!' => [
+        'ZTE M901C'                                 => [ 'ZTE', 'Grand Memo 2' ],
+    ],
+
+    'ZTE P[0-9]{3,3}!!' => [
+        'ZTE P727A'                                 => [ 'ZTE', 'P722A' ],
+    ],
+
+    'ZTE ?Q[0-9]{3,3}!!' => [
+        'ZTE Q101T'                                 => [ 'ZTE', 'Q101T' ],
+        'ZTE Q201T'                                 => [ 'ZTE', 'Q201T' ],
+        'ZTE Q301C'                                 => [ 'ZTE', 'Q301C' ],
+        'ZTE Q302C'                                 => [ 'ZTE', 'Q302C' ],
+        'ZTE Q501T'                                 => [ 'ZTE', 'Q501T' ],
+        'ZTE Q501U'                                 => [ 'ZTE', 'Q501U' ],
+        'ZTE Q503U'                                 => [ 'ZTE', 'Q503U' ],
+        'ZTE ?Q505T!'                               => [ 'ZTE', 'Q505T' ],
+        'ZTE Q507T'                                 => [ 'ZTE', 'Q507T' ],
+        'ZTE Q508U'                                 => [ 'ZTE', 'Q508U' ],
+        'ZTE ?Q509T!'                               => [ 'ZTE', 'Q509T' ],
+        'ZTE Q519T'                                 => [ 'ZTE', 'Q519T' ],
+        'ZTE Q529C'                                 => [ 'ZTE', 'Q529C' ],
+        'ZTE Q529E'                                 => [ 'ZTE', 'Q529E' ],
+        'ZTE Q529T'                                 => [ 'ZTE', 'Q529T' ],
+        'ZTE Q701C'                                 => [ 'ZTE', 'Q701C' ],
+        'ZTE ?Q705U!'                               => [ 'ZTE', 'Q705U' ],
+        'ZTE Q801L'                                 => [ 'ZTE', 'Q801L' ],
+        'ZTE ?Q801U!'                               => [ 'ZTE', 'Q801U' ],
+        'ZTE Q802C'                                 => [ 'ZTE', 'Q802C' ],
+        'ZTE Q802D'                                 => [ 'ZTE', 'Q802D' ],
+        'ZTE ?Q802T!'                               => [ 'ZTE', 'Q802T' ],
+        'ZTE Q805T'                                 => [ 'ZTE', 'Q805T' ],
+    ],
+
+    'ZTE Q[0-9]!!' => [
+        'ZTE Q2S-C'                                 => [ 'ZTE', 'Q2S-C' ],
+        'ZTE Q2S-T'                                 => [ 'ZTE', 'Q2S-T' ],
+        'ZTE Q5-T'                                  => [ 'ZTE', 'Q5-T' ],
+        'ZTE Q7'                                    => [ 'ZTE', 'Q7' ],
+        'ZTE Q7-C'                                  => [ 'ZTE', 'Q7-C' ],
+    ],
+
+    'ZTE R[0-9]{3,3}!!' => [
+        'ZTE R880H'                                 => [ 'ZTE', 'Spark' ],
+    ],
+
+    'ZTE S[0-9]{3,3}!!' => [
+        'ZTE S118'                                  => [ 'ZTE', 'Grand S Lite' ],
+        'ZTE S251'                                  => [ 'ZTE', 'Grand S II' ],
+        'ZTE S291'                                  => [ 'ZTE', 'Grand S II' ],
+    ],
+
+    'ZTE T[0-9]!!' => [
+        'ZTE T12'                                   => [ 'ZTE', 'Uno' ],                        // Telstra
+        'ZTE T22'                                   => [ 'ZTE', 'Urbane' ],                     // Telstra
+        'ZTE T28'                                   => [ 'ZTE', 'Active Touch' ],               // Telstra
+        'ZTE T28 Prepaid'                           => [ 'ZTE', 'Active Touch' ],               // Telstra
+        'ZTE T60'                                   => [ 'ZTE', 'QWERTY Touch' ],               // Telstra
+        'ZTE T80'                                   => [ 'ZTE', 'Evolution' ],                  // Telstra
+        'ZTE T81'                                   => [ 'ZTE', 'Grand X LTE' ],
+        'ZTE T82'                                   => [ 'ZTE', 'Grand X LTE' ],
+        'ZTE T83'                                   => [ 'ZTE', 'Dave' ],                       // Telstra
+        'ZTE T84'                                   => [ 'ZTE', 'Tough Max' ],                  // Telstra
+        'ZTE T86'                                   => [ 'ZTE', 'T86' ],
+        'ZTE T220'                                  => [ 'ZTE', 'Blade A3' ],
+        'ZTE T221'                                  => [ 'ZTE', 'Blade AF3' ],
+        'ZTE T230'                                  => [ 'ZTE', 'T230' ],
+        'ZTE T311'                                  => [ 'ZTE', 'Blade Q Lux' ],
+        'ZTE T320'                                  => [ 'ZTE', 'Blade GF3' ],
+        'ZTE T520'                                  => [ 'ZTE', 'Blade L5' ],
+        'ZTE T610'                                  => [ 'ZTE', 'Blade L4 Pro' ],
+        'ZTE T617'                                  => [ 'ZTE', 'Blade D Lux' ],
+        'ZTE T620'                                  => [ 'ZTE', 'Blade D2' ],
+        'ZTE T630'                                  => [ 'ZTE', 'Blade X5' ],
+        'ZTE T660'                                  => [ 'ZTE', 'Blade V6' ],
+        'ZTE T663'                                  => [ 'ZTE', 'Blade Z7' ],
+        'ZTE T760'                                  => [ 'ZTE', 'Smart Touch 2' ],              // Telstra
+        'ZTE T790'                                  => [ 'ZTE', 'Pulse' ],                      // Telstra
+        'ZTE T792'                                  => [ 'ZTE', 'Rush' ],                       // Telstra
+        'ZTE T809'                                  => [ 'ZTE', 'Easy Smart' ],                 // Telstra
+        'ZTE T815'                                  => [ 'ZTE', 'Tempo' ],                      // Telstra
+        'ZTE T816'                                  => [ 'ZTE', 'Smart Plus' ],                 // Telstra
+        'ZTE T912'                                  => [ 'ZTE', 'Blade S6 Lite' ],
+        'ZTE T920'                                  => [ 'ZTE', 'Blade S7' ],
+    ],
+
+    'ZTE T ?U[0-9]{3,3}!!' => [
+        'ZTE T U802'                                => [ 'ZTE', 'T U802' ],
+        'ZTE TU802'                                 => [ 'ZTE', 'T U802' ],
+        'ZTE T U805'                                => [ 'ZTE', 'T U805' ],
+        'ZTE TU805'                                 => [ 'ZTE', 'T U805' ],
+        'ZTE T U806'                                => [ 'ZTE', 'T U806' ],
+        'ZTE T U812'                                => [ 'ZTE', 'T U812' ],
+        'ZTE TU812'                                 => [ 'ZTE', 'T U812' ],
+        'ZTE T U830'                                => [ 'ZTE', 'T U830' ],
+        'ZTE T ?U880!'                              => [ 'ZTE', 'Blade' ],
+        'ZTE T ?U900!'                              => [ 'ZTE', 'T U900' ],
+        'ZTE T ?U960!'                              => [ 'ZTE', 'T U960' ],
+    ],
+
+    '(ZTE ?)?U[0-9]{3,3}!!' => [
+        'ZTE ?U788!'                                => [ 'ZTE', 'U788' ],
+        'ZTE U788+'                                 => [ 'ZTE', 'U788+' ],
+        'ZTE ?U790!'                                => [ 'ZTE', 'U790' ],
+        'ZTE ?U791!'                                => [ 'ZTE', 'U791' ],
+        'ZTE ?U793!'                                => [ 'ZTE', 'U793' ],
+        'ZTE ?U795!'                                => [ 'ZTE', 'U795' ],
+        'ZTE ?U795+!'                               => [ 'ZTE', 'U795+' ],
+        'ZTE ?U807!'                                => [ 'ZTE', 'U807' ],
+        'ZTE ?U807N!'                               => [ 'ZTE', 'U807N' ],
+        'ZTE U808'                                  => [ 'ZTE', 'U808' ],
+        'ZTE U809'                                  => [ 'ZTE', 'U809' ],
+        'ZTE ?U817!'                                => [ 'ZTE', 'U817' ],
+        'ZTE ?U818!'                                => [ 'ZTE', 'U818' ],
+        'ZTE ?U819!'                                => [ 'ZTE', 'U819' ],
+        'ZTE ?U879!'                                => [ 'ZTE', 'U879' ],
+        'U880'                                      => [ 'ZTE', 'Blade' ],
+        'U880E'                                     => [ 'ZTE', 'Blade' ],
+        'U880s'                                     => [ 'ZTE', 'Blade' ],
+        'ZTE ?U880!'                                => [ 'ZTE', 'Blade' ],
+        'ZTE ?U885!'                                => [ 'ZTE', 'U885' ],
+        'ZTE ?U887!'                                => [ 'ZTE', 'U887' ],
+        'ZTE ?U889!'                                => [ 'ZTE', 'U889' ],
+        'ZTE U930 Ultimate'                         => [ 'ZTE', 'Grand X Ultimate' ],
+        'ZTE ?U930HD!'                              => [ 'ZTE', 'U930HD' ],
+        'ZTE U930!'                                 => [ 'ZTE', 'Grand X' ],
+        'ZTE ?U935!'                                => [ 'ZTE', 'U935' ],
+        'ZTE U950'                                  => [ 'ZTE', 'U950' ],
+        'ZTE ?U956!'                                => [ 'ZTE', 'U956' ],
+        'ZTE ?U960E!'                               => [ 'ZTE', 'U960E' ],
+        'ZTE ?U960s2!'                              => [ 'ZTE', 'U960s2' ],
+        'ZTE ?U960s3!'                              => [ 'ZTE', 'U960s3' ],
+        'ZTE U968'                                  => [ 'ZTE', 'U968' ],
+        'ZTE U969'                                  => [ 'ZTE', 'U969' ],
+        'ZTE U970!'                                 => [ 'ZTE', 'Grand X' ],
+        'ZTE U985'                                  => [ 'ZTE', 'Grand Era' ],
+        'ZTE U988S'                                 => [ 'ZTE', 'Geek' ],
+    ],
+
+    'ZTE U N[0-9]{3,3}!!' => [
+        'ZTE U N720'                                => [ 'ZTE', 'U N720' ],
+        'ZTE U N721'                                => [ 'ZTE', 'U N721' ],
+    ],
+
+    'ZTE U[ \(\-]V[\)\-]?[0-9]{3,3}!!' => [
+        'ZTE U V760'                                => [ 'ZTE', 'U V760' ],
+        'ZTE U V852'                                => [ 'ZTE', 'Dreamer' ],
+        'ZTE U V856'                                => [ 'ZTE', 'Mimosa Mini' ],
+        'ZTE U V857'                                => [ 'ZTE', 'U V857' ],
+        'ZTE U V859'                                => [ 'ZTE', 'U V859' ],
+        'ZTE U-V880'                                => [ 'ZTE', 'Blade' ],
+        'ZTE U V880'                                => [ 'ZTE', 'Blade' ],
+        'ZTE U V-880'                               => [ 'ZTE', 'Blade' ],
+        'ZTE U(V)880+'                              => [ 'ZTE', 'Blade' ],
+        'ZTE U V881'                                => [ 'ZTE', 'Blade II' ],
+        'ZTE U V889D'                               => [ 'ZTE', 'U V889D' ],
+        'ZTE U V960'                                => [ 'ZTE', 'Skate' ],
+    ],
+
+    'ZTE U X[0-9]{3,3}!!' => [
+        'ZTE U X850'                                => [ 'ZTE', 'Racer' ],
+        'ZTE U X876'                                => [ 'ZTE', 'U X876' ],
+    ],
+
+    '(ZTE ?)?V[0-9]{3,3}[A-Z]!!' => [
+        'ZTE V765M'                                 => [ 'ZTE', 'LEO Q1' ],
+        'ZTE V769M'                                 => [ 'ZTE', 'LEO Q2' ],
+        'ZTE V779M'                                 => [ 'ZTE', 'V779M' ],
+        'ZTEV779M'                                  => [ 'ZTE', 'V779M' ],
+        'ZTE V788D'                                 => [ 'ZTE', 'Kis' ],
+        'ZTE V788D B17'                             => [ 'ZTE', 'Kis' ],
+        'ZTE V811W'                                 => [ 'ZTE', 'Kis 3' ],
+        'ZTE V813W'                                 => [ 'ZTE', 'Blade C2 Plus' ],
+        'ZTE V815W'                                 => [ 'ZTE', 'Blade G' ],
+        'ZTE V816W'                                 => [ 'ZTE', 'V816W' ],
+        'ZTE V830W'                                 => [ 'ZTE', 'Blade G Lux' ],
+        'ZTE V831W'                                 => [ 'ZTE', 'V831W' ],
+        'V865M'                                     => [ 'ZTE', 'Telepatria' ],
+        'ZTE V877b'                                 => [ 'ZTE', 'V877B' ],
+        'ZTE V880E'                                 => [ 'ZTE', 'V880E' ],
+        'ZTE V880G'                                 => [ 'ZTE', 'Blade G' ],
+        'ZTE V880H'                                 => [ 'ZTE', 'Blade G2' ],
+        'ZTE V889D'                                 => [ 'ZTE', 'V889D' ],
+        'ZTE V889F'                                 => [ 'ZTE', 'Blade III Pro' ],
+        'ZTE V889M'                                 => [ 'ZTE', 'V889M' ],
+        'ZTE V889S'                                 => [ 'ZTE', 'Blade C' ],
+        'ZTE V967S'                                 => [ 'ZTE', 'V967S' ],
+        'ZTEv967s'                                  => [ 'ZTE', 'V967S' ],
+        'ZTE V970M!'                                => [ 'ZTE', 'Grand X' ],
+        'ZTE V970T'                                 => [ 'ZTE', 'Grand X' ],
+        'ZTE V993W'                                 => [ 'ZTE', 'Nubia V5' ],
+    ],
+
+    '(ZTE ?)?V ?[0-9]{3,3}!!' => [
+        'ZTE V768'                                  => [ 'ZTE', 'Concord' ],
+        'ZTE V790'                                  => [ 'ZTE', 'Kis 3' ],
+        'ZTE V791'                                  => [ 'ZTE', 'V791' ],
+        'ZTE V793'                                  => [ 'ZTE', 'Kis Flex' ],
+        'ZTE V795'                                  => [ 'ZTE', 'Kis 2' ],
+        'ZTE V797'                                  => [ 'ZTE', 'V797' ],
+        'ZTE V807'                                  => [ 'ZTE', 'Blade C' ],
+        'ZTE V808'                                  => [ 'ZTE', 'V808' ],
+        'ZTE V809'                                  => [ 'ZTE', 'Blade C2' ],
+        'ZTE V811'                                  => [ 'ZTE', 'Hop Smart' ],
+        'ZTE V812'                                  => [ 'ZTE', 'Skinny' ],
+        'ZTE V817'                                  => [ 'ZTE', 'V817' ],
+        'ZTE V818'                                  => [ 'ZTE', 'V818' ],
+        'ZTE V829'                                  => [ 'ZTE', 'Blade G Plus' ],
+        'ZTE V856'                                  => [ 'ZTE', 'Movistar One' ],
+        'ZTE V860'                                  => [ 'ZTE', 'Roamer' ],
+        'ZTE V875'                                  => [ 'ZTE', 'V875' ],
+        'V880'                                      => [ 'ZTE', 'Blade' ],
+        'ZTE V880'                                  => [ 'ZTE', 'Blade' ],
+        'ZTE V881'                                  => [ 'ZTE', 'Blade II' ],
+        'ZTE V882'                                  => [ 'ZTE', 'Lord' ],
+        'ZTE V887'                                  => [ 'ZTE', 'Blade L' ],
+        'ZTE V955'                                  => [ 'ZTE', 'V955' ],
+        'ZTE V956'                                  => [ 'ZTE', 'Blade E' ],
+        'ZTE V960'                                  => [ 'ZTE', 'Skate' ],
+        'ZTE V965'                                  => [ 'ZTE', 'V965' ],
+        'ZTE V968'                                  => [ 'ZTE', 'Grand X Quad' ],
+        'ZTE V969'                                  => [ 'ZTE', 'Grand X2 L' ],
+        'ZTE V970!'                                 => [ 'ZTE', 'Grand X' ],
+        'ZTE V975'                                  => [ 'ZTE', 'Geek' ],
+        'ZTE V983'                                  => [ 'ZTE', 'Grand X Pro' ],
+        'ZTE V985'                                  => [ 'ZTE', 'Grand Era' ],
+        'ZTE V985 Grand Era'                        => [ 'ZTE', 'Grand Era' ],
+        'ZTE V ?987!'                               => [ 'ZTE', 'Grand X Quad' ],
+        'ZTE V988'                                  => [ 'ZTE', 'Grand S' ],
+        'ZTE V998'                                  => [ 'ZTE', 'Grand S' ],
+    ],
+
+    '(ZTE ?)?X[0-9]{3,3}!!' => [
+        'X500'                                      => [ 'ZTE', 'Score' ],
+        'ZTE X500'                                  => [ 'ZTE', 'Score' ],
+        'X500 USA General'                          => [ 'ZTE', 'Score' ],
+        'X501 USA Cricket'                          => [ 'ZTE', 'Groove' ],
+        'X501 USA RS'                               => [ 'ZTE', 'Groove' ],
+        'ZTE X850'                                  => [ 'ZTE', 'Racer' ],
+        'ZTE X876'                                  => [ 'ZTE', 'Raise' ],
+    ],
+
+    '(ZTE )?Z[0-9]!!' => [
+        'ZTE Z601'                                  => [ 'ZTE', 'Z601' ],
+        'Z660G'                                     => [ 'ZTE', 'Wirl' ],
+        'Z665C'                                     => [ 'ZTE', 'Valet' ],
+        'Z667'                                      => [ 'ZTE', 'Prelude 2' ],
+        'ZTE Z667'                                  => [ 'ZTE', 'Prelude 2' ],
+        'ZTE Z667G'                                 => [ 'ZTE', 'Wirl 2' ],
+        'Z667G'                                     => [ 'ZTE', 'Wirl 2' ],
+        'Z667T'                                     => [ 'ZTE', 'Zinger' ],
+        'ZTE Z669'                                  => [ 'ZTE', 'Prelude 2' ],
+        'Z716BL'                                    => [ 'ZTE', 'Citrine' ],
+        'ZTE Z716BL'                                => [ 'ZTE', 'Citrine' ],
+        'Z717VL'                                    => [ 'ZTE', 'Citrine' ],
+        'Z730'                                      => [ 'ZTE', 'Concord II' ],
+        'Z740'                                      => [ 'ZTE', 'Radiant' ],
+        'ZTE Z740'                                  => [ 'ZTE', 'Radiant' ],
+        'Z740G'                                     => [ 'ZTE', 'Sonata 4G' ],
+        'ZTE Z740G'                                 => [ 'ZTE', 'Sonata 4G' ],
+        'Z750C'                                     => [ 'ZTE', 'Savvy' ],
+        'Z752C'                                     => [ 'ZTE', 'Zephyr' ],
+        'Z753G'                                     => [ 'ZTE', 'Paragon' ],
+        'ZTE Z753G'                                 => [ 'ZTE', 'Paragon' ],
+        'ZTE Z755'                                  => [ 'ZTE', 'Sonata 2' ],
+        'Z768G'                                     => [ 'ZTE', 'Midnight' ],
+        'Z777'                                      => [ 'ZTE', 'Grand X' ],
+        'ZTE Z777'                                  => [ 'ZTE', 'Grand X' ],
+        'Z787'                                      => [ 'ZTE', 'Grand X Max' ],
+        'ZTE Z787'                                  => [ 'ZTE', 'Grand X Max' ],
+        'Z788G'                                     => [ 'ZTE', 'Illustra' ],
+        'ZTE Z791G'                                 => [ 'ZTE', 'Scend' ],
+        'Z791G'                                     => [ 'ZTE', 'Scend' ],
+        'Z792'                                      => [ 'ZTE', 'Fanfare' ],
+        'ZTE Z792'                                  => [ 'ZTE', 'Fanfare' ],
+        'Z793C'                                     => [ 'ZTE', 'Atrium' ],
+        'Z795G'                                     => [ 'ZTE', 'Solar' ],
+        'Z796C'                                     => [ 'ZTE', 'Majesty' ],
+        'Z797C'                                     => [ 'ZTE', 'Quartz' ],
+        'Z799C'                                     => [ 'ZTE', 'Quartz' ],
+        'ZTE Z812'                                  => [ 'ZTE', 'Maven' ],
+        'ZTE Z813'                                  => [ 'ZTE', 'Overture 2' ],
+        'Z818L'                                     => [ 'ZTE', 'Allstar' ],
+        'ZTE Z818L'                                 => [ 'ZTE', 'Allstar' ],
+        'Z819L'                                     => [ 'ZTE', 'Stratos' ],
+        'ZTE Z830'                                  => [ 'ZTE', 'Compel' ],
+        'ZTE Z831'                                  => [ 'ZTE', 'Maven 2' ],
+        'ZTE Z832'                                  => [ 'ZTE', 'Sonata 3' ],
+        'ZTE Z861BL'                                => [ 'ZTE', 'ZFive-L' ],
+        'ZTE Z901L'                                 => [ 'ZTE', 'Merit' ],
+        'ZTE Z916BL'                                => [ 'ZTE', 'Zmax Grand' ],
+        'ZTE Z917VL'                                => [ 'ZTE', 'Zmax Champ' ],
+        'Z930L'                                     => [ 'ZTE', 'Unico' ],
+        'Z932L'                                     => [ 'ZTE', 'Rapido' ],
+        'Z936L'                                     => [ 'ZTE', 'Lever' ],
+        'ZTE Z955L'                                 => [ 'ZTE', 'Zmax 2' ],
+        'Z955L'                                     => [ 'ZTE', 'Zmax 2' ],
+        'ZTE Z956'                                  => [ 'ZTE', 'Z956' ],
+        'ZTE Z958'                                  => [ 'ZTE', 'Zmax 2' ],
+        'Z963VL'                                    => [ 'ZTE', 'Max Duo' ],
+        'ZTE Z968'                                  => [ 'ZTE', 'Zmax' ],
+        'Z970'                                      => [ 'ZTE', 'Zmax' ],
+        'Z987'                                      => [ 'ZTE', 'Grand X Max+' ],
+        'ZTE Z987'                                  => [ 'ZTE', 'Grand X Max+' ],
+        'ZTE Z988'                                  => [ 'ZTE', 'Grand X Max 2' ],
+        'ZTE Z990!'                                 => [ 'ZTE', 'Roamer' ],
+        'ZTE Z992'                                  => [ 'ZTE', 'Avail 2' ],
+        'Z992'                                      => [ 'ZTE', 'Avail 2' ],
+        'ZTE Z993'                                  => [ 'ZTE', 'Prelude' ],
+        'ZTE Z995'                                  => [ 'ZTE', 'Overture' ],
+        'ZTE Z998'                                  => [ 'ZTE', 'Unico' ],
+    ],
+
+    '(ZTE )?Blade!!' => [
+        'ZTE Blade'                                 => [ 'ZTE', 'Blade' ],
+        'Blade(-V880|-opda)?$!'                     => [ 'ZTE', 'Blade' ],
+        'ZTE Blade 2'                               => [ 'ZTE', 'Blade II' ],
+        'BLADEII'                                   => [ 'ZTE', 'Blade II' ],
+        'Blade2'                                    => [ 'ZTE', 'Blade II' ],
+        'ZTE Blade III'                             => [ 'ZTE', 'Blade III' ],
+        'Blade III'                                 => [ 'ZTE', 'Blade III' ],
+        'BLADE III IL'                              => [ 'ZTE', 'Blade III' ],
+        'ZTE Blade III Pro'                         => [ 'ZTE', 'Blade III Pro' ],
+        'ZTE Blade Apex'                            => [ 'ZTE', 'Blade Apex' ],
+        'ZTE Blade Apex2'                           => [ 'ZTE', 'Blade Apex2' ],
+        'ZTE Blade Apex3'                           => [ 'ZTE', 'Blade Apex3' ],
+        'ZTE BLADE V0730'                           => [ 'ZTE', 'Blade A2 Plus' ],
+        'ZTE Blade A5'                              => [ 'ZTE', 'Blade A5' ],
+        'ZTE BLADE A5 PRO'                          => [ 'ZTE', 'Blade A5 Pro' ],
+        'ZTE BLADE A110'                            => [ 'ZTE', 'Blade A110' ],
+        'ZTE BLADE A112'                            => [ 'ZTE', 'Blade A112' ],
+        'ZTE BLADE A310'                            => [ 'ZTE', 'Blade A310' ],
+        'ZTE Blade A315'                            => [ 'ZTE', 'Blade A315' ],
+        'ZTE Blade A410'                            => [ 'ZTE', 'Blade A410' ],
+        'ZTE Blade A430'                            => [ 'ZTE', 'Blade A430' ],
+        'ZTE Blade A450'                            => [ 'ZTE', 'Blade A450' ],
+        'ZTE Blade A452'                            => [ 'ZTE', 'Blade A452' ],
+        'ZTE BLADE A460'                            => [ 'ZTE', 'Blade A460' ],
+        'ZTE Blade A462'                            => [ 'ZTE', 'Blade A462' ],
+        'ZTE Blade A465'                            => [ 'ZTE', 'Blade A465' ],
+        'ZTE Blade A470'                            => [ 'ZTE', 'Blade A470' ],
+        'ZTE Blade A475'                            => [ 'ZTE', 'Blade A475' ],
+        'ZTE Blade A476'                            => [ 'ZTE', 'Blade A476' ],
+        'ZTE BLADE A510'                            => [ 'ZTE', 'Blade A510' ],
+        'ZTE BLADE A512'                            => [ 'ZTE', 'Blade A512' ],
+        'ZTE Blade A515'                            => [ 'ZTE', 'Blade A515' ],
+        'ZTE Blade A570'                            => [ 'ZTE', 'Blade A570' ],
+        'ZTE BLADE A610'                            => [ 'ZTE', 'Blade A610' ],
+        'ZTE BLADE A612'                            => [ 'ZTE', 'Blade A612' ],
+        'ZTE Blade AF5'                             => [ 'ZTE', 'Blade AF5' ],
+        'ZTE Blade Buzz'                            => [ 'ZTE', 'Blade Buzz' ],
+        'ZTE BLADE C'                               => [ 'ZTE', 'Blade C' ],
+        'ZTE Blade C2'                              => [ 'ZTE', 'Blade C2' ],
+        'ZTE Blade C2 Plus'                         => [ 'ZTE', 'Blade C2 Plus' ],
+        'ZTE Blade C310'                            => [ 'ZTE', 'Blade C310' ],
+        'ZTE Blade C312'                            => [ 'ZTE', 'Blade C312' ],
+        'ZTE Blade C320'                            => [ 'ZTE', 'Blade C320' ],
+        'ZTE Blade C340'                            => [ 'ZTE', 'Blade C340' ],
+        'ZTE Blade C341'                            => [ 'ZTE', 'Blade C341' ],
+        'ZTE Blade C342'                            => [ 'ZTE', 'Blade C342' ],
+        'ZTE Blade C370'                            => [ 'ZTE', 'Blade C370' ],
+        'ZTE Blade D6 Lite 3G'                      => [ 'ZTE', 'Blade D6 Lite' ],
+        'ZTE Blade D6 Lite 4G'                      => [ 'ZTE', 'Blade D6 Lite' ],
+        'ZTE Blade G'                               => [ 'ZTE', 'Blade G' ],
+        'Blade G LTE'                               => [ 'ZTE', 'Blade G' ],
+        'ZTE Blade G LTE'                           => [ 'ZTE', 'Blade G' ],
+        'ZTE Blade G Lux'                           => [ 'ZTE', 'Blade G Lux' ],
+        'Blade G Lux'                               => [ 'ZTE', 'Blade G Lux' ],
+        'ZTE Blade G Plus!'                         => [ 'ZTE', 'Blade G Plus' ],
+        'ZTE Blade G Pro'                           => [ 'ZTE', 'Blade G Pro' ],
+        'ZTE Blade G2'                              => [ 'ZTE', 'Blade G2' ],
+        'Blade G2'                                  => [ 'ZTE', 'Blade G2' ],
+        'ZTE Blade HN'                              => [ 'ZTE', 'Blade HN' ],
+        'Blade Super'                               => [ 'ZTE', 'Blade Super' ],
+        'Blade S'                                   => [ 'ZTE', 'Blade S' ],
+        'ZTE Blade S6'                              => [ 'ZTE', 'Blade S6' ],
+        'Blade S6'                                  => [ 'ZTE', 'Blade S6' ],
+        'Blade S6 Plus'                             => [ 'ZTE', 'Blade S6 Plus' ],
+        'ZTE Blade S6 Plus'                         => [ 'ZTE', 'Blade S6 Plus' ],
+        'ZTE Blade L'                               => [ 'ZTE', 'Blade L' ],
+        'ZTE Blade L2'                              => [ 'ZTE', 'Blade L2' ],
+        'Blade L2'                                  => [ 'ZTE', 'Blade L2' ],
+        'Blade L2 Plus'                             => [ 'ZTE', 'Blade L2 Plus' ],
+        'ZTE Blade L2 PLUS'                         => [ 'ZTE', 'Blade L2 Plus' ],
+        'ZTE Blade L3'                              => [ 'ZTE', 'Blade L3' ],
+        'Blade L3'                                  => [ 'ZTE', 'Blade L3' ],
+        'ZTE Blade L3 Apex'                         => [ 'ZTE', 'Blade L3 Apex' ],
+        'ZTE Blade L3 Lite'                         => [ 'ZTE', 'Blade L3 Lite' ],
+        'ZTE Blade L3 Plus'                         => [ 'ZTE', 'Blade L3 Plus' ],
+        'ZTE Blade L4 Pro'                          => [ 'ZTE', 'Blade L4 Pro' ],
+        'ZTE Blade L5'                              => [ 'ZTE', 'Blade L5' ],
+        'Blade L5 Plus'                             => [ 'ZTE', 'Blade L5 Plus' ],
+        'ZTE Blade L5 Plus'                         => [ 'ZTE', 'Blade L5 Plus' ],
+        'ZTE BLADE L0510'                           => [ 'ZTE', 'Blade L5 Plus' ],
+        'ZTE Blade L6'                              => [ 'ZTE', 'Blade L6' ],
+        'ZTE BLADE L110'                            => [ 'ZTE', 'Blade L110' ],
+        'ZTE Blade L370'                            => [ 'ZTE', 'Blade L370' ],
+        'Blade Q'                                   => [ 'ZTE', 'Blade Q' ],
+        'ZTE Blade Q'                               => [ 'ZTE', 'Blade Q' ],
+        'ZTE Blade Q Lux'                           => [ 'ZTE', 'Blade Q Lux' ],
+        'Blade Q Lux'                               => [ 'ZTE', 'Blade Q Lux' ],
+        'ZTE Blade Q Lux 3G'                        => [ 'ZTE', 'Blade Q Lux' ],
+        'ZTE Blade Q Maxi'                          => [ 'ZTE', 'Blade Q Maxi' ],
+        'Blade Q Maxi'                              => [ 'ZTE', 'Blade Q Maxi' ],
+        'ZTE Blade Q Mini'                          => [ 'ZTE', 'Blade Q Mini' ],
+        'ZTE Blade Q pro'                           => [ 'ZTE', 'Blade Q Pro' ],
+        'ZTE Blade Q1'                              => [ 'ZTE', 'Blade Q1' ],
+        'ZTE Blade Q3'                              => [ 'ZTE', 'Blade Q3' ],
+        'Blade S Lite'                              => [ 'ZTE', 'Blade S Lite' ],
+        'ZTE Blade S6 Flex'                         => [ 'ZTE', 'Blade S6 Flex' ],
+        'Blade S6 Lite'                             => [ 'ZTE', 'Blade S6 Lite' ],
+        'ZTE Blade V'                               => [ 'ZTE', 'Blade V' ],
+        'ZTE Blade-V'                               => [ 'ZTE', 'Blade V' ],
+        'ZTE Blade V2'                              => [ 'ZTE', 'Blade V2' ],
+        'ZTE Blade V2 Lite'                         => [ 'ZTE', 'Blade V2 Lite' ],
+        'ZTE Blade V6'                              => [ 'ZTE', 'Blade V6' ],
+        'Blade V6'                                  => [ 'ZTE', 'Blade V6' ],
+        'ZTE BLADE V7'                              => [ 'ZTE', 'Blade V7' ],
+        'ZTE BLADE V7 LITE'                         => [ 'ZTE', 'Blade V7 Lite' ],
+        'ZTE BLADE V0720'                           => [ 'ZTE', 'Blade V7 Lite' ],
+        'ZTE Blade V220'                            => [ 'ZTE', 'Blade V220' ],
+        'ZTE Blade V580'                            => [ 'ZTE', 'Blade V580' ],
+        'Blade V880'                                => [ 'ZTE', 'Blade V880' ],
+        'ZTE Blade Vec'                             => [ 'ZTE', 'Blade Vec' ],
+        'ZTE Blade Vec 4G'                          => [ 'ZTE', 'Blade Vec' ],
+        'ZTE Blade Vec Pro'                         => [ 'ZTE', 'Blade Vec Pro' ],
+        'ZTE Blade X9'                              => [ 'ZTE', 'Blade X9' ],
+    ],
+
+    'ZTE Geek!!' => [
+        'ZTE Geek'                                  => [ 'ZTE', 'Geek' ],
+        'ZTE Geek 2'                                => [ 'ZTE', 'Geek II' ],
+        'ZTE Geek 2 LTE'                            => [ 'ZTE', 'Geek II' ],
+        'ZTE GEEK II 4G'                            => [ 'ZTE', 'Geek II' ],
+        'ZTE Geek 2 pro'                            => [ 'ZTE', 'Geek II Pro' ],
+        'ZTE GEEK II Pro'                           => [ 'ZTE', 'Geek II Pro' ],
+        'ZTE GEEK II Pro 4G'                        => [ 'ZTE', 'Geek II Pro' ],
+    ],
+
+    '(ZTE )?(Grand|Mimosa)!!' => [
+        'ZTE Grand Era'                             => [ 'ZTE', 'Grand Era' ],
+        'ZTE Grand Memo'                            => [ 'ZTE', 'Grand Memo' ],
+        'ZTE Grand Memo lite'                       => [ 'ZTE', 'Grand Memo Lite' ],
+        'Grand Memo lite'                           => [ 'ZTE', 'Grand Memo Lite' ],
+        'ZTE Grand S'                               => [ 'ZTE', 'Grand S' ],
+        'ZTE Grand S lite'                          => [ 'ZTE', 'Grand S Lite' ],
+        'ZTE Grand S Flex'                          => [ 'ZTE', 'Grand S Flex' ],
+        'Grand S Flex'                              => [ 'ZTE', 'Grand S Flex' ],
+        'ZTE Grand S2'                              => [ 'ZTE', 'Grand S II' ],
+        'ZTE Grand S II'                            => [ 'ZTE', 'Grand S II' ],
+        'ZTE Grand S II LTE'                        => [ 'ZTE', 'Grand S II' ],
+        'ZTE Grand X'                               => [ 'ZTE', 'Grand X' ],
+        'Grand X'                                   => [ 'ZTE', 'Grand X' ],
+        'ZTE Mimosa X'                              => [ 'ZTE', 'Grand X' ],
+        'ZTE Grand X Classic'                       => [ 'ZTE', 'Grand X Classic' ],
+        'Grand X In'                                => [ 'ZTE', 'Grand X IN' ],
+        'Grand X Intel'                             => [ 'ZTE', 'Grand X IN' ],
+        'Grand X Pro'                               => [ 'ZTE', 'Grand X Pro' ],
+        'ZTE Grand X Quad'                          => [ 'ZTE', 'Grand X Quad' ],
+        'Grand X Quad Lite'                         => [ 'ZTE', 'Grand X Quad Lite' ],
+        'ZTE Grand X Quad Lite'                     => [ 'ZTE', 'Grand X Quad Lite' ],
+        'Grand X2'                                  => [ 'ZTE', 'Grand X2' ],
+        'ZTE Grand X2'                              => [ 'ZTE', 'Grand X2' ],
+        'ZTE Grand X 2'                             => [ 'ZTE', 'Grand X2' ],
+        'ZTE Grand X2 In'                           => [ 'ZTE', 'Grand X2' ],
+    ],
+
+    '(ZTE )?Kis!!' => [
+        'KIS'                                       => [ 'ZTE', 'Kis' ],
+        'KIS PLUS'                                  => [ 'ZTE', 'Kis Plus' ],
+        'ZTE Kis Pro'                               => [ 'ZTE', 'Kis Pro' ],
+        'ZTE Kis Q'                                 => [ 'ZTE', 'Kis Q' ],
+        'ZTE KIS Flex'                              => [ 'ZTE', 'Kis Flex' ],
+        'ZTE Kis Lite'                              => [ 'ZTE', 'Kis Lite' ],
+        'ZTE KIS II'                                => [ 'ZTE', 'Kis 2' ],
+        'KIS II'                                    => [ 'ZTE', 'Kis 2' ],
+        'KIS II Max'                                => [ 'ZTE', 'Kis 2 Max' ],
+        'ZTE KIS II Max'                            => [ 'ZTE', 'Kis 2 Max' ],
+        'ZTE Kis II Max plus'                       => [ 'ZTE', 'Kis 2 Max Plus' ],
+        'ZTE KIS II PRO'                            => [ 'ZTE', 'Kis 2 Pro' ],
+        'ZTE Kis 3'                                 => [ 'ZTE', 'Kis 3' ],
+        'ZTE Kis3 max'                              => [ 'ZTE', 'Kis 3 Max' ],
+        'KIS C341'                                  => [ 'ZTE', 'Kis C341' ],
+        'Kis T3'                                    => [ 'ZTE', 'Kis T3' ],
+    ],
+
+    '(ZTE )?Racer!!' => [
+        'ZTE Racer'                                 => [ 'ZTE', 'Racer' ],
+        'Racer'                                     => [ 'ZTE', 'Racer' ],
+        'RacerII'                                   => [ 'ZTE', 'Racer II' ],
+    ],
+
+    '(ZTE )?Skate!!' => [
+        'Skate'                                     => [ 'ZTE', 'Skate' ],
+        'ZTE Skate'                                 => [ 'ZTE', 'Skate' ],
+        'Skate Pro'                                 => [ 'ZTE', 'Skate Pro' ],
+        'ZTE Skate 2'                               => [ 'ZTE', 'Skate 2' ],
+    ],
+
+    'ZTE Libra'                                 => [ 'ZTE', 'Libra' ],
+    'ZTE LINK'                                  => [ 'ZTE', 'Link' ],
+    'ZTE T T9'                                  => [ 'ZTE', 'Light Tab T9', DeviceType::TABLET ],
+    'Light Tab'                                 => [ 'ZTE', 'Light Tab V9', DeviceType::TABLET ],
+    'ZTE V7073'                                 => [ 'ZTE', 'Light Tab V9', DeviceType::TABLET ],
+    'V9'                                        => [ 'ZTE', 'Light Tab V9', DeviceType::TABLET ],
+    'ZTE V9'                                    => [ 'ZTE', 'Light Tab V9', DeviceType::TABLET ],
+    'V9S'                                       => [ 'ZTE', 'Light Tab V9S', DeviceType::TABLET ],
+    'ZTE V9A'                                   => [ 'ZTE', 'Light Tab 2', DeviceType::TABLET ],
+    'ZTE C V9E'                                 => [ 'ZTE', 'Light Tab 2', DeviceType::TABLET ],
+    'V9e'                                       => [ 'ZTE', 'Light Tab 2', DeviceType::TABLET ],
+    'V9e+'                                      => [ 'ZTE', 'Light Tab 2', DeviceType::TABLET ],
+    'V9A'                                       => [ 'ZTE', 'Light Tab 2', DeviceType::TABLET ],
+    'Light Tab 2'                               => [ 'ZTE', 'Light Tab 2', DeviceType::TABLET ],
+    'Light Tab 2W'                              => [ 'ZTE', 'Light Tab 2W', DeviceType::TABLET ],
+    'ZTE V7273'                                 => [ 'ZTE', 'Light Tab 2W', DeviceType::TABLET ],
+    'V9C'                                       => [ 'ZTE', 'Light Tab 3', DeviceType::TABLET ],
+    'ZTE e-Learning PAD E8Q'                    => [ 'ZTE', 'e-Learning PAD E8Q', DeviceType::TABLET ],
+    'ZTE E10T'                                  => [ 'ZTE', 'e-Learning PAD E10T', DeviceType::TABLET ],
+    'A3'                                        => [ 'ZTE', 'A3' ],
+    'A4'                                        => [ 'ZTE', 'A4' ],
+    'ZTE R22'                                   => [ 'ZTE', 'R22' ],
+    'ZTE R84'                                   => [ 'ZTE', 'R84' ],
+    'ZTE V10'                                   => [ 'ZTE', 'V10', DeviceType::TABLET ],
+    'ZTE V70'                                   => [ 'ZTE', 'V70', DeviceType::TABLET ],
+    'ZTE V72'                                   => [ 'ZTE', 'V72', DeviceType::TABLET ],
+    'ZTE V72A'                                  => [ 'ZTE', 'V72A', DeviceType::TABLET ],
+    'ZTE K88'                                   => [ 'ZTE', 'K88', DeviceType::TABLET ],
+    'ZTE K97'                                   => [ 'ZTE', 'K97', DeviceType::TABLET ],
+    'ZTE T T98'                                 => [ 'ZTE', 'T98', DeviceType::TABLET ],
+    'ZTE TT98'                                  => [ 'ZTE', 'T98', DeviceType::TABLET ],
+    'V55'                                       => [ 'ZTE', 'Optik', DeviceType::TABLET ],
+    'Acqua'                                     => [ 'ZTE', 'Acqua' ],
+    'a5'                                        => [ 'ZTE', 'Blade' ],
+    'Crescent'                                  => [ 'ZTE', 'Blade S' ],
+    'ZTE Crescent'                              => [ 'ZTE', 'Blade S' ],
+    'ZTE JOE'                                   => [ 'ZTE', 'U N700' ],
+    'ZTE 975'                                   => [ 'ZTE', 'Geek' ],
+    'ZTE Tureis'                                => [ 'ZTE', 'Tureis' ],
+    'ZTE CLARO Q1'                              => [ 'ZTE', 'CLARO Q1' ],
+    'ZTE LEO M1'                                => [ 'ZTE', 'LEO M1' ],
+    'ZTE LEO S1'                                => [ 'ZTE', 'LEO S1' ],
+    'ZTE LEO S2'                                => [ 'ZTE', 'LEO S2' ],
+    'ZTE LEO Q1'                                => [ 'ZTE', 'LEO Q1' ],
+    'ZTE LEO Q2'                                => [ 'ZTE', 'LEO Q2' ],
+    'E810'                                      => [ 'ZTE', 'E810' ],
+    'ZTE GV821'                                 => [ 'ZTE', 'V821' ],
+    'ZTE-860U'                                  => [ 'ZTE', 'Warp' ],
+    'N861'                                      => [ 'ZTE', 'Warp II' ],
+    'MEM02'                                     => [ 'ZTE', 'Grand Memo 2' ],
+    'ZXY-ZTE-C X920'                            => [ 'ZTE', 'C X920' ],
+    'ZTE Roamer'                                => [ 'ZTE', 'Roamer' ],
+    'V8000 USA Cricket'                         => [ 'ZTE', 'Engage' ],
+    'V8110'                                     => [ 'ZTE', 'V8110' ],
+    'ZXY-ZTE V6700'                             => [ 'ZTE', 'V6700' ],
+    'ZTE V9800'                                 => [ 'ZTE', 'Grand Era LTE' ],
+    'ZTE U9810'                                 => [ 'ZTE', 'U9810' ],
+    'ZTE U9815'                                 => [ 'ZTE', 'Grand Memo' ],
+    'ZTE V9815'                                 => [ 'ZTE', 'Grand Memo' ],
+    'ZTE Grand Memo LTE'                        => [ 'ZTE', 'Grand Memo' ],
+    'ZTE V9820'                                 => [ 'ZTE', 'Bold Powerphone' ],
+    'nubia Z5'                                  => [ 'ZTE', 'Nubia Z5' ],
+    'ZTE Nubia Z7'                              => [ 'ZTE', 'Nubia Z7' ],
+    'ZTE Nubia X6'                              => [ 'ZTE', 'Nubia X6' ],
+    'ZTE Switch X1'                             => [ 'ZTE', 'Switch X1' ],
+    'ZTE Switch X2'                             => [ 'ZTE', 'Switch X2' ],
+    'ZTE Maxx'                                  => [ 'ZTE', 'Maxx' ],
+    'ZTE Fit 4G Smart'                          => [ 'ZTE', 'Fit 4G Smart' ],
+    'ATLAS W'                                   => [ 'ZTE', 'Atlas W' ],
+    'ZTE N5'                                    => [ 'ZTE', 'Grand Memo' ],
+    'ZTE N5L'                                   => [ 'ZTE', 'Grand Memo' ],
+    'ZTE N5S'                                   => [ 'ZTE', 'Grand Memo' ],
+    'ZTE U5'                                    => [ 'ZTE', 'Grand Memo' ],
+    'ZTE U5S'                                   => [ 'ZTE', 'Grand Memo' ],
+    'ZTEU5S'                                    => [ 'ZTE', 'Grand Memo' ],
+    'ZTE V5S'                                   => [ 'ZTE', 'Grand Memo' ],
+    'ZTEV5S'                                    => [ 'ZTE', 'Grand Memo' ],
+    'N918St'                                    => [ 'ZTE', 'Grand Memo' ],
+    'ZTE A2015'                                 => [ 'ZTE', 'Axon Pro' ],
+    'ZTE A2016'                                 => [ 'ZTE', 'Axon Pro' ],
+    'ZTE A2017'                                 => [ 'ZTE', 'Axon 7' ],
+    'ZTE A2017G'                                => [ 'ZTE', 'Axon 7' ],
+    'ZTE A2017U'                                => [ 'ZTE', 'Axon 7' ],
+    'ZTE B2015'                                 => [ 'ZTE', 'Axon Mini' ],
+    'ZTE B2016'                                 => [ 'ZTE', 'Axon Mini' ],
+    'ZTE B2017'                                 => [ 'ZTE', 'Axon Mini' ],
+    'ZTE B2017G'                                => [ 'ZTE', 'Axon Mini' ],
+    'ZTE C2016'                                 => [ 'ZTE', 'Axon Max' ],
+    'ZTE C2017'                                 => [ 'ZTE', 'Axon Max' ],
+    'ZTE STAR'                                  => [ 'ZTE', 'Star 1' ],
+    'ZTE Star 1'                                => [ 'ZTE', 'Star 1' ],
+    'ZTE S2004'                                 => [ 'ZTE', 'Tianji 3' ],
+    'ZTE S2005'                                 => [ 'ZTE', 'Star 2' ],
+    'ZTE S2007'                                 => [ 'ZTE', 'Star 2' ],
+    'ZTE S2010'                                 => [ 'ZTE', 'Star S2010' ],
+    'ZTE S2014'                                 => [ 'ZTE', 'Voyage Plus 4' ],
+    'ZTE U9180'                                 => [ 'ZTE', 'Red Bull V5' ],
+    'ZTE U9370'                                 => [ 'ZTE', 'U9370' ],
+    'ZTE V6500'                                 => [ 'ZTE', 'Nova' ],
+    'ZTE V8110'                                 => [ 'ZTE', 'V8110' ],
+
+    'ZTE B860A'                                 => [ 'ZTE', 'B860A', DeviceType::TELEVISION ],
+
+    'ZTE W1010'                                 => [ 'ZTE', 'Axon Watch', DeviceType::WATCH ],
+
+    '003Z'                                      => [ 'ZTE', 'Libero 003Z', 'carrier' => 'Softbank' ],
+    '008Z'                                      => [ 'ZTE', 'シンプルスマートフォン 008Z', 'carrier' => 'Softbank' ],
+    '009Z'                                      => [ 'ZTE', 'STAR7 009Z', 'carrier' => 'Softbank' ],
+    '402ZT'                                     => [ 'ZTE', 'Blade Q+ 402ZT', 'carrier' => 'Softbank' ],
+    '502ZT'                                     => [ 'ZTE', 'Spro 2 502ZT', 'carrier' => 'Softbank' ],
+
+    'ZA400'                                     => [ 'Zonda', 'Mini Colors ZA400' ],
+    'ZA402'                                     => [ 'Zonda', 'Scratch ZA402' ],
+    'ZA450'                                     => [ 'Zonda', 'Mini Selfie ZA450' ],
+    'ZA451'                                     => [ 'Zonda', 'Speed ZA451' ],
+    'ZA459'                                     => [ 'Zonda', 'Dezign ZA459' ],
+    'ZA500'                                     => [ 'Zonda', 'Metallic ZA500' ],
+    'ZA501'                                     => [ 'Zonda', 'Colors ZA501' ],
+    'ZA705'                                     => [ 'Zonda', 'ZA905' ],
+    'ZA935'                                     => [ 'Zonda', 'Runner ZA935' ],
+    'ZA940'                                     => [ 'Zonda', 'Joy ZA940' ],
+    'ZA945'                                     => [ 'Zonda', 'Fit ZA945' ],
+    'ZA950'                                     => [ 'Zonda', 'Mega 5.0 ZA950' ],
+    'ZA955'                                     => [ 'Zonda', 'ZA955' ],
+    'ZA990'                                     => [ 'Zonda', 'Life ZA990' ],
+
+    '(Zopo )?ZP ?[0-9]{3,3}!!' => [
+        '(Zopo )?ZP100!'                            => [ 'Zopo', 'ZP100 Pilot' ],
+        'ZP200'                                     => [ 'Zopo', 'ZP200 Shining' ],
+        'ZP200+'                                    => [ 'Zopo', 'ZP200+ Shining' ],
+        'ZP300'                                     => [ 'Zopo', 'ZP300 Field' ],
+        'ZP300S'                                    => [ 'Zopo', 'ZP300 Field' ],
+        'Zopo zp300'                                => [ 'Zopo', 'ZP300 Field' ],
+        'Zopo ZP300+'                               => [ 'Zopo', 'ZP300 Field Plus' ],
+        'ZP300+'                                    => [ 'Zopo', 'ZP300 Field Plus' ],
+        'ZP320'                                     => [ 'Zopo', 'ZP320' ],
+        'ZP330'                                     => [ 'Zopo', 'ZP330 Color C' ],
+        'ZP331'                                     => [ 'Zopo', 'ZP331 Color C1' ],
+        'ZP350'                                     => [ 'Zopo', 'ZP350 Color E' ],
+        'ZP353'                                     => [ 'Zopo', 'ZP353 Color E1' ],
+        'ZP500'                                     => [ 'Zopo', 'ZP500 Libero' ],
+        'ZP500S'                                    => [ 'Zopo', 'ZP500 Libero' ],
+        'ZP500+'                                    => [ 'Zopo', 'ZP500 Libero Plus' ],
+        'ZP520'                                     => [ 'Zopo', 'ZP520' ],
+        'ZP530'                                     => [ 'Zopo', 'ZP530 Touch' ],
+        'ZP550'                                     => [ 'Zopo', 'ZP550 Speed 7C' ],
+        'ZP580'                                     => [ 'Zopo', 'ZP580' ],
+        'ZP590'                                     => [ 'Zopo', 'ZP590' ],
+        'ZP600 EX'                                  => [ 'Zopo', 'ZP600 Libero EX' ],
+        'ZP600+'                                    => [ 'Zopo', 'ZP600 Libero Plus' ],
+        'ZP700'                                     => [ 'Zopo', 'ZP700 Cuppy' ],
+        'ZP720'                                     => [ 'Zopo', 'ZP720 Focus' ],
+        'ZP780'                                     => [ 'Zopo', 'ZP780' ],
+        'ZP800'                                     => [ 'Zopo', 'ZP800 Libero HD' ],
+        'ZP800H'                                    => [ 'Zopo', 'ZP800 Libero HD' ],
+        'ZP810'                                     => [ 'Zopo', 'ZP810' ],
+        'ZP810H DUAL SIM'                           => [ 'Zopo', 'ZP810' ],
+        'ZP820'                                     => [ 'Zopo', 'ZP820 Raiden' ],
+        '(Zopo )?ZP900!'                            => [ 'Zopo', 'ZP900 Leader' ],
+        'ZP 900H'                                   => [ 'Zopo', 'ZP900 Leader' ],
+        'ZOPO 900H'                                 => [ 'Zopo', 'ZP900 Leader' ],
+        'ZP908'                                     => [ 'Zopo', 'ZP908 Leader' ],
+        'ZP910'                                     => [ 'Zopo', 'ZP910 Leader' ],
+        'ZP920'                                     => [ 'Zopo', 'ZP920 Magic' ],
+        'ZP950'                                     => [ 'Zopo', 'ZP950 Leader Max' ],
+        'ZP950H'                                    => [ 'Zopo', 'ZP950 Leader Max' ],
+        'ZP950H DUAL SIM'                           => [ 'Zopo', 'ZP950 Leader Max' ],
+        'ZP950+'                                    => [ 'Zopo', 'ZP950+ Leader Max' ],
+        'ZP951'                                     => [ 'Zopo', 'ZP951 Speed 7' ],
+        'ZP951 HERO1'                               => [ 'Zopo', 'ZP951 Speed 7' ],
+        'ZP952'                                     => [ 'Zopo', 'ZP952 Speed 7 Plus' ],
+        'ZP955'                                     => [ 'Zopo', 'ZP955 Speed 8' ],
+        'ZP958'                                     => [ 'Zopo', 'ZP958 Leader Max' ],
+        'ZOPO C2'                                   => [ 'Zopo', 'ZP960 C2' ],
+        'ZP980'                                     => [ 'Zopo', 'ZP980' ],
+        'Zopo 980'                                  => [ 'Zopo', 'ZP980' ],
+        'Zopo ZP980'                                => [ 'Zopo', 'ZP980' ],
+        'ZP980+'                                    => [ 'Zopo', 'ZP980+' ],
+        'ZP980 PLUS'                                => [ 'Zopo', 'ZP980+' ],
+        'ZOPO ZP980+'                               => [ 'Zopo', 'ZP980+' ],
+        'ZP990'                                     => [ 'Zopo', 'ZP990 Captain S' ],
+        'ZP990+'                                    => [ 'Zopo', 'ZP990+' ],
+        'ZP998'                                     => [ 'Zopo', 'ZP998 C2 II' ],
+        'ZOPO ZP998'                                => [ 'Zopo', 'ZP998 C2 II' ],
+        'ZP999'                                     => [ 'Zopo', 'ZP999 Lion Heart' ],
+    ],
+
+    'C2'                                        => [ 'Zopo', 'ZP960 C2' ],
+    'ZA966'                                     => [ 'Zyrex', 'OneScribe ZA966' ],
+    'ZA977'                                     => [ 'Zyrex', 'OneScribe ZA977' ],
+    'ZA985'                                     => [ 'Zyrex', 'OneScribe ZA985' ],
+    'ZA987'                                     => [ 'Zyrex', 'OneScribe ZA987' ],
+    'ZA990'                                     => [ 'Zyrex', 'OneScribe ZA990' ],
+
+    /* Telecom provider branded devices */
+    '9020[A]!'                                  => [ 'AT&T', 'Trek HD', DeviceType::TABLET ],
+
+    'BASE!!' => [
+        'BASE lutea'                                => [ 'BASE', 'Lutea' ],
+        'BASE Lutea 2'                              => [ 'BASE', 'Lutea 2' ],
+        'BASE Lutea 3'                              => [ 'BASE', 'Lutea 3' ],
+        'BASE Varia'                                => [ 'BASE', 'Varia' ],
+        'BASE Tab'                                  => [ 'BASE', 'TAB', DeviceType::TABLET ],
+        'BASE Tab 7.1'                              => [ 'BASE', 'TAB 7-1', DeviceType::TABLET ],
+    ],
+
+    'Beeline!!' => [
+        'Beeline Fast'                              => [ 'Beeline', 'Fast' ],
+        'Beeline Pro 2'                             => [ 'Beeline', 'Pro 2' ],
+        'Beeline Pro 3'                             => [ 'Beeline', 'Pro 3' ],
+        'Beeline Pro 4'                             => [ 'Beeline', 'Pro 4' ],
+        'Beeline Smart'                             => [ 'Beeline', 'Smart' ],
+        'Beeline Smart2'                            => [ 'Beeline', 'Smart2' ],
+        'Beeline Smart 2'                           => [ 'Beeline', 'Smart2' ],
+        'Beeline Smart 3'                           => [ 'Beeline', 'Smart3' ],
+        'Beeline Smart 4'                           => [ 'Beeline', 'Smart4' ],
+        'Beeline Smart 5'                           => [ 'Beeline', 'Smart5' ],
+        'Beeline Smart 6'                           => [ 'Beeline', 'Smart6' ],
+        'Beeline Smart Dual'                        => [ 'Beeline', 'Smart Dual' ],
+        'Beeline E300'                              => [ 'Beeline', 'E300' ],
+        'Beeline E400'                              => [ 'Beeline', 'E400' ],
+        'Beeline E600'                              => [ 'Beeline', 'E600' ],
+        'Beeline M2'                                => [ 'Beeline', 'M2', DeviceType::TABLET ],
+        'Beeline Tab'                               => [ 'Beeline', 'Tab', DeviceType::TABLET ],
+        'Beeline Tab 2'                             => [ 'Beeline', 'Tab 2', DeviceType::TABLET ],
+        'Beeline Tab IS'                            => [ 'Beeline', 'Tab IS', DeviceType::TABLET ],
+        'Beeline Tab Fast'                          => [ 'Beeline', 'Tab Fast', DeviceType::TABLET ],
+        'Beeline Tab Fast 2'                        => [ 'Beeline', 'Tab Fast 2', DeviceType::TABLET ],
+        'Beeline Tab Pro'                           => [ 'Beeline', 'Tab Pro', DeviceType::TABLET ],
+    ],
+
+    'Bouygues Telecom Bs 351'                   => [ 'Bouygues', 'Bs 351' ],
+    'Bouygues Telecom Bs 402'                   => [ 'Bouygues', 'Bs 402' ],
+    'Bouygues Telecom Bs 403'                   => [ 'Bouygues', 'Bs 403' ],
+    'Bouygues Telecom Bs 451'                   => [ 'Bouygues', 'Bs 451' ],
+    'Bs 451'                                    => [ 'Bouygues', 'Bs 451' ],
+    'Bs 501'                                    => [ 'Bouygues', 'Bs 501' ],
+    'Bs541'                                     => [ 'Bouygues', 'Bs 541' ],
+    'Ultym 5'                                   => [ 'Bouygues', 'Ultym 5' ],
+    'Ultym 5L'                                  => [ 'Bouygues', 'Ultym 5L' ],
+    'Ultym 5.2'                                 => [ 'Bouygues', 'Ultym 5.2' ],
+    'Bbox Miami'                                => [ 'Bouygues', 'Bbox Miami', DeviceType::TELEVISION ],
+
+    'BQS-3510'                                  => [ 'BQ Mobile', 'Aspen Mini' ],
+    'BQS-3552'                                  => [ 'BQ Mobile', 'Berkeley' ],
+    'BQS-4001'                                  => [ 'BQ Mobile', 'Oxford' ],
+    'BQS-4004'                                  => [ 'BQ Mobile', 'Dusseldorf' ],
+    'BQS-4005'                                  => [ 'BQ Mobile', 'Seoul' ],
+    'BQS-4007'                                  => [ 'BQ Mobile', 'Valencia' ],
+    'BQS-4008'                                  => [ 'BQ Mobile', 'Shanghai' ],
+    'BQS-4009'                                  => [ 'BQ Mobile', 'Orleans' ],
+    'BQS-4010'                                  => [ 'BQ Mobile', 'Aspen' ],
+    'BQS-4501 Bristol'                          => [ 'BQ Mobile', 'Bristol' ],
+    'BQS-4502'                                  => [ 'BQ Mobile', 'Kingston' ],
+    'BQS-4503'                                  => [ 'BQ Mobile', 'Dubai' ],
+    'BQS-4510'                                  => [ 'BQ Mobile', 'Florence' ],
+    'BQS-4515'                                  => [ 'BQ Mobile', 'Moscow' ],
+    'BQS-4516'                                  => [ 'BQ Mobile', 'Singapore' ],
+    'BQS-4525'                                  => [ 'BQ Mobile', 'Vienna' ],
+    'BQS-4552'                                  => [ 'BQ Mobile', 'Melbourne' ],
+    'BQS-4555'                                  => [ 'BQ Mobile', 'Turbo' ],
+    'BQS-4560'                                  => [ 'BQ Mobile', 'Golf' ],
+    'BQS-4700'                                  => [ 'BQ Mobile', 'Harvard' ],
+    'BQS-4701'                                  => [ 'BQ Mobile', 'Venice' ],
+    'BQS-4702'                                  => [ 'BQ Mobile', 'Osaka' ],
+    'BQS-4707'                                  => [ 'BQ Mobile', 'Montreal' ],
+    'BQS-4800'                                  => [ 'BQ Mobile', 'Blade' ],
+    'BQS-5000 Tokyo'                            => [ 'BQ Mobile', 'Tokyo' ],
+    'BQS-5003'                                  => [ 'BQ Mobile', 'Colombo' ],
+    'BQS-5004'                                  => [ 'BQ Mobile', 'Paris' ],
+    'BQS-5005'                                  => [ 'BQ Mobile', 'Sydney' ],
+    'BQS-5009'                                  => [ 'BQ Mobile', 'Sydney' ],
+    'BQS-5001'                                  => [ 'BQ Mobile', 'Milan' ],
+    'BQS 5007'                                  => [ 'BQ Mobile', 'Rimini' ],
+    'BQS-5010'                                  => [ 'BQ Mobile', 'Praque' ],
+    'BQS-5011'                                  => [ 'BQ Mobile', 'Monte Carlo' ],
+    'BQS-5020'                                  => [ 'BQ Mobile', 'Strike' ],
+    'BQS-5025'                                  => [ 'BQ Mobile', 'HighWay' ],
+    'BQS-5040'                                  => [ 'BQ Mobile', 'Force' ],
+    'BQS-5045'                                  => [ 'BQ Mobile', 'Fast' ],
+    'BQS-5050'                                  => [ 'BQ Mobile', 'Strike Selfie' ],
+    'BQS-5070'                                  => [ 'BQ Mobile', 'Magic' ],
+    'BQS-5200'                                  => [ 'BQ Mobile', 'San Marino' ],
+    'BQS-5500'                                  => [ 'BQ Mobile', 'Vancouver' ],
+    'BQS-5502'                                  => [ 'BQ Mobile', 'Hammer' ],
+    'BQS-5505'                                  => [ 'BQ Mobile', 'Amsterdam' ],
+    'BQS 5505'                                  => [ 'BQ Mobile', 'Amsterdam' ],
+
+    'dtab01'                                    => [ 'DoCoMo', 'dtab', DeviceType::TABLET ],
+
+    'Etisalat Smartphone'                       => [ 'Etisalat', 'Smartphone' ],
+
+    'GM FOX'                                    => [ 'General Mobile', 'Fox' ],
+    'GM 5 Plus d'                               => [ 'General Mobile', 'GM5 Plus' ],
+
+    '(i-mobile|i-style|IQ)!!' => [
+        'i-mobile i651'                             => [ 'i-Mobile', 'i651' ],
+        'i-mobile 697'                              => [ 'i-Mobile', 'i679' ],
+        'i-mobile i691'                             => [ 'i-Mobile', 'i691' ],
+        'i-mobile i692'                             => [ 'i-Mobile', 'i692' ],
+        'i-mobile i693'                             => [ 'i-Mobile', 'i693' ],
+        'i-mobile i695'                             => [ 'i-Mobile', 'i695' ],
+        'i-mobile i698'                             => [ 'i-Mobile', 'i698' ],
+        'i-mobile i810'                             => [ 'i-Mobile', 'i810' ],
+        'i-mobile i858'                             => [ 'i-Mobile', 'i858' ],
+        'i-mobile i858 Plus'                        => [ 'i-Mobile', 'i858 Plus' ],
+        'i-mobile 3G 8500'                          => [ 'i-Mobile', '3G 8500' ],
+        'i-mobile IQ 1'                             => [ 'i-Mobile', 'iQ 1' ],
+        'i-mobile IQ1-1'                            => [ 'i-Mobile', 'iQ 1.1' ],
+        'I-mobile IQ1-1A'                           => [ 'i-Mobile', 'iQ 1.1A' ],
+        'i-mobile IQ 2'                             => [ 'i-Mobile', 'iQ 2' ],
+        'i-mobile IQ II'                            => [ 'i-Mobile', 'iQ 2' ],
+        'i-mobile IQ 2A'                            => [ 'i-Mobile', 'iQ 2A' ],
+        'i-mobile IQ 3'                             => [ 'i-Mobile', 'iQ 3' ],
+        'I-mobile IQ 4'                             => [ 'i-Mobile', 'iQ 4' ],
+        'i-mobile IQ 5'                             => [ 'i-Mobile', 'iQ 5' ],
+        'i-mobile IQ 5A'                            => [ 'i-Mobile', 'iQ 5A' ],
+        'i-mobile IQ 5.1'                           => [ 'i-Mobile', 'iQ 5.1' ],
+        'i-mobile IQ 5.1A'                          => [ 'i-Mobile', 'iQ 5.1A' ],
+        'i-mobile IQ5.1 Pro'                        => [ 'i-Mobile', 'iQ 5.1 Pro' ],
+        'i-mobile IQ5.1A Pro'                       => [ 'i-Mobile', 'iQ 5.1A Pro' ],
+        'i-mobile IQ 5.3'                           => [ 'i-Mobile', 'iQ 5.3' ],
+        'i-mobile IQ 5.5'                           => [ 'i-Mobile', 'iQ 5.5' ],
+        'IQ 5.5'                                    => [ 'i-Mobile', 'iQ 5.5' ],
+        'IQ 5.6'                                    => [ 'i-Mobile', 'iQ 5.6' ],
+        'IQ 5.6A'                                   => [ 'i-Mobile', 'iQ 5.6A' ],
+        'i-mobile IQ 5.7'                           => [ 'i-Mobile', 'iQ 5.7' ],
+        'i-mobile IQ 5.8 DTV'                       => [ 'i-Mobile', 'iQ 5.8 DTV' ],
+        'i-mobile IQ 6'                             => [ 'i-Mobile', 'iQ 6' ],
+        'i-mobile IQ 6A'                            => [ 'i-Mobile', 'iQ 6A' ],
+        'i-mobile IQ 6.1'                           => [ 'i-Mobile', 'iQ 6.1' ],
+        'i-mobile IQ 6.2'                           => [ 'i-Mobile', 'iQ 6.2' ],
+        'i-mobile IQ6.3'                            => [ 'i-Mobile', 'iQ 6.3' ],
+        'i-mobile IQ6.6'                            => [ 'i-Mobile', 'iQ 6.6' ],
+        'i-mobile IQ 6.9 DTV'                       => [ 'i-Mobile', 'iQ 6.9 DTV' ],
+        'i-mobile IQ 9'                             => [ 'i-Mobile', 'iQ 9' ],
+        'i-mobile IQ 9A'                            => [ 'i-Mobile', 'iQ 9A' ],
+        'IQ9.1'                                     => [ 'i-Mobile', 'iQ 9.1' ],
+        'i-mobile IQ 9.2'                           => [ 'i-Mobile', 'iQ 9.2' ],
+        'i-mobile IQ 9.2A'                          => [ 'i-Mobile', 'iQ 9.2A' ],
+        'i-mobile IQ X'                             => [ 'i-Mobile', 'iQ X' ],
+        'i-mobile IQ X zeen'                        => [ 'i-Mobile', 'iQ X Zeen' ],
+        'i-mobile IQ XA'                            => [ 'i-Mobile', 'iQ XA' ],
+        'i-mobile IQ X2'                            => [ 'i-Mobile', 'iQ X2' ],
+        'i-mobile IQ X2A'                           => [ 'i-Mobile', 'iQ X2A' ],
+        'i-mobile IQ X3'                            => [ 'i-Mobile', 'iQ X3' ],
+        'i-mobile IQ X3A'                           => [ 'i-Mobile', 'iQ X3A' ],
+        'i-mobile IQ BIG'                           => [ 'i-Mobile', 'iQ Big' ],
+        'i-mobile IQX BLIZ!'                        => [ 'i-Mobile', 'iQ X Bliz' ],
+        'i-mobile IQX OKU!'                         => [ 'i-Mobile', 'iQ X Oku' ],
+        'i-mobile IQ 1068'                          => [ 'i-Mobile', 'iQ 1068' ],
+        'i-STYLE 1'                                 => [ 'i-Mobile', 'i-Style 1' ],
+        'i-mobile i-STYLE 1'                        => [ 'i-Mobile', 'i-Style 1' ],
+        'I-STYLE 1 I'                               => [ 'i-Mobile', 'i-Style 1i' ],
+        'i-mobile i-STYLE 1 i'                      => [ 'i-Mobile', 'i-Style 1i' ],
+        'i-mobile i-STYLE 2'                        => [ 'i-Mobile', 'i-Style 2' ],
+        'i-mobile i-STYLE 2i'                       => [ 'i-Mobile', 'i-Style 2i' ],
+        'i-STYLE2.1'                                => [ 'i-Mobile', 'i-Style 2.1' ],
+        'i-STYLE2.1A'                               => [ 'i-Mobile', 'i-Style 2.1A' ],
+        'i-mobile i-STYLE 2.2'                      => [ 'i-Mobile', 'i-Style 2.2' ],
+        'i-mobile i-style 2.3'                      => [ 'i-Mobile', 'i-Style 2.3' ],
+        'i-mobile i-style 2.3A'                     => [ 'i-Mobile', 'i-Style 2.3A' ],
+        'i-mobile i-STYLE 2.4'                      => [ 'i-Mobile', 'i-Style 2.4' ],
+        'i-mobile i-STYLE 2.5'                      => [ 'i-Mobile', 'i-Style 2.5' ],
+        'i-mobile i-style 2.6'                      => [ 'i-Mobile', 'i-Style 2.6' ],
+        'i-mobile i-style 2.6A'                     => [ 'i-Mobile', 'i-Style 2.6A' ],
+        'i-mobile i-style 2.8'                      => [ 'i-Mobile', 'i-Style 2.8' ],
+        'i-mobile i-STYLE 2.9'                      => [ 'i-Mobile', 'i-Style 2.9' ],
+        'i-mobile i-style 3'                        => [ 'i-Mobile', 'i-Style 3' ],
+        'i-mobile i-style 3i'                       => [ 'i-Mobile', 'i-Style 3i' ],
+        'i-mobile i-STYLE 4'                        => [ 'i-Mobile', 'i-Style 4' ],
+        'i-style 4'                                 => [ 'i-Mobile', 'i-Style 4' ],
+        'i-mobile i-STYLE 4i'                       => [ 'i-Mobile', 'i-Style 4i' ],
+        'i-MOBILE i-STYLE 5'                        => [ 'i-Mobile', 'i-Style 5' ],
+        'i-MOBILE i-STYLE 5i'                       => [ 'i-Mobile', 'i-Style 5i' ],
+        'i-mobile i-STYLE 6'                        => [ 'i-Mobile', 'i-Style 6' ],
+        'i-mobile i-STYLE 6A'                       => [ 'i-Mobile', 'i-Style 6A' ],
+        'i-mobile i-STYLE 7'                        => [ 'i-Mobile', 'i-Style 7' ],
+        'i-mobile i-STYLE 7A'                       => [ 'i-Mobile', 'i-Style 7A' ],
+        'i-mobile i-style 7.1'                      => [ 'i-Mobile', 'i-Style 7.1' ],
+        'i-mobile i-STYLE 7.2'                      => [ 'i-Mobile', 'i-Style 7.2' ],
+        'i-mobile i-STYLE 7.3'                      => [ 'i-Mobile', 'i-Style 7.3' ],
+        'i-mobile i-STYLE 7.3A'                     => [ 'i-Mobile', 'i-Style 7.3A' ],
+        'i-mobile i-STYLE 7.5'                      => [ 'i-Mobile', 'i-Style 7.5' ],
+        'i-mobile i-STYLE 7.5A'                     => [ 'i-Mobile', 'i-Style 7.5A' ],
+        'i-STYLE 7.6'                               => [ 'i-Mobile', 'i-Style 7.6' ],
+        'i-mobile i-STYLE 7.7 DTV'                  => [ 'i-Mobile', 'i-Style 7.7 DTV' ],
+        'i-mobile i-STYLE 7.8 DTV'                  => [ 'i-Mobile', 'i-Style 7.8 DTV' ],
+        'i-mobile i-STYLE 7.9 DTV'                  => [ 'i-Mobile', 'i-Style 7.9 DTV' ],
+        'i-mobile i-style 8'                        => [ 'i-Mobile', 'i-Style 8' ],
+        'i-mobile i-STYLE 8.1'                      => [ 'i-Mobile', 'i-Style 8.1' ],
+        'i-mobile i-STYLE 8.2'                      => [ 'i-Mobile', 'i-Style 8.2' ],
+        'i-mobile i-STYLE 8.2A'                     => [ 'i-Mobile', 'i-Style 8.2A' ],
+        'i-mobile i-STYLE 8.3 DTV'                  => [ 'i-Mobile', 'i-Style 8.3 DTV' ],
+        'i-mobile i-STYLE 8.6 DTV'                  => [ 'i-Mobile', 'i-Style 8.6 DTV' ],
+        'i-mobile i-STYLE 210'                      => [ 'i-Mobile', 'i-Style 210' ],
+        'i-mobile i-STYLE 215'                      => [ 'i-Mobile', 'i-Style 215' ],
+        'i-mobile I-STYLE 217'                      => [ 'i-Mobile', 'i-Style 217' ],
+        'i-mobile i-STYLE 218'                      => [ 'i-Mobile', 'i-Style 218' ],
+        'i-mobile i-STYLE 711'                      => [ 'i-Mobile', 'i-Style 711' ],
+        'i-mobile i-STYLE 810'                      => [ 'i-Mobile', 'i-Style 810' ],
+        'i-mobile i-style Q1'                       => [ 'i-Mobile', 'i-Style Q1' ],
+        'I-mobile I-style Q1i'                      => [ 'i-Mobile', 'i-Style Q1i' ],
+        'i-mobile i-STYLE Q2'                       => [ 'i-Mobile', 'i-Style Q2' ],
+        'i-mobile i-STYLE Q2 DUO'                   => [ 'i-Mobile', 'i-Style Q2 Duo' ],
+        'i-STYLE Q2 DUO!'                           => [ 'i-Mobile', 'i-Style Q2 Duo' ],
+        'i-mobile i-style Q3'                       => [ 'i-Mobile', 'i-Style Q3' ],
+        'i-mobile i-style Q3i'                      => [ 'i-Mobile', 'i-Style Q3i' ],
+        'i-STYLE Q4'                                => [ 'i-Mobile', 'i-Style Q4' ],
+        'i-STYLE Q4A'                               => [ 'i-Mobile', 'i-Style Q4A' ],
+        'i-mobile i-STYLE Q 5'                      => [ 'i-Mobile', 'i-Style Q5' ],
+        'i-mobile i-STYLE Q 5A'                     => [ 'i-Mobile', 'i-Style Q5A' ],
+        'i-mobile i-STYLE Q6'                       => [ 'i-Mobile', 'i-Style Q6' ],
+        'i-mobile i-STYLE Q6A'                      => [ 'i-Mobile', 'i-Style Q6A' ],
+        'i-mobile I-Note'                           => [ 'i-Mobile', 'i-Note', DeviceType::TABLET ],
+        'i-mobile i-note WiFi'                      => [ 'i-Mobile', 'i-Note', DeviceType::TABLET ],
+        'I-mobile I-note S'                         => [ 'i-Mobile', 'i-Note S', DeviceType::TABLET ],
+        'I-note WiFi 1.1'                           => [ 'i-Mobile', 'i-Note 1.1', DeviceType::TABLET ],
+        'i-mobile M1703'                            => [ 'i-Mobile', 'i-Note 1.1', DeviceType::TABLET ],
+        'i-mobile i-note 2'                         => [ 'i-Mobile', 'i-Note 2', DeviceType::TABLET ],
+        'i-mobile i-NOTE WIFI 2'                    => [ 'i-Mobile', 'i-Note 2', DeviceType::TABLET ],
+        'i-mobile i-note 3'                         => [ 'i-Mobile', 'i-Note 3', DeviceType::TABLET ],
+        'i-mobile i-note WIFI3'                     => [ 'i-Mobile', 'i-Note 3', DeviceType::TABLET ],
+        'i-mobile i-note WiFi 7'                    => [ 'i-Mobile', 'i-Note 7', DeviceType::TABLET ],
+        'i-mobile i-note WiFi 9'                    => [ 'i-Mobile', 'i-Note 9', DeviceType::TABLET ],
+    ],
+
+    'KPN!!' => [
+        'KPN Smart 200'                             => [ 'KPN', 'Smart 200' ],
+        'KPN Smart 300'                             => [ 'KPN', 'Smart 300' ],
+        'KPN Smart 400'                             => [ 'KPN', 'Smart 400' ],
+    ],
+
+    'Kyivstar!!' => [
+        'Kyivstar Aqua'                             => [ 'Kyivstar', 'Aqua' ],
+        'Kyivstar Shine'                            => [ 'Kyivstar', 'Shine' ],
+        'Kyivstar Spark'                            => [ 'Kyivstar', 'Spark' ],
+        'Kyivstar Aqua'                             => [ 'Kyivstar', 'Aqua' ],
+        'Kyivstar Terra'                            => [ 'Kyivstar', 'Terra' ],
+    ],
+
+    'MegaFon SP-AI'                             => [ 'Мегафон', 'SP-A1' ],
+    'MegaFon SP-A3'                             => [ 'Мегафон', 'SP-A3' ],
+    'MegaFon SP-A5'                             => [ 'Мегафон', 'SP-A5' ],
+    'MegaFon SP-A10'                            => [ 'Мегафон', 'SP-A10' ],
+    'SP-A20i'                                   => [ 'Мегафон', 'SP-A20i Mint' ],
+    'MegaFon V9'                                => [ 'Мегафон', 'V9' ],
+    'MegaFon V9+'                               => [ 'Мегафон', 'V9+' ],
+    'MS3B'                                      => [ 'Мегафон', 'Optima' ],
+    'MS4A'                                      => [ 'Мегафон', '4G Turbo' ],
+    'MegaFon SIM+'                              => [ 'Мегафон', 'Sim+' ],
+    'MT7A'                                      => [ 'Мегафон', 'Login', DeviceType::TABLET ],
+    'MS3A'                                      => [ 'Мегафон', 'Login 2', DeviceType::TABLET ],
+    'MegaFon Login 3'                           => [ 'Мегафон', 'Login 3', DeviceType::TABLET ],
+
+    'M9000'                                     => [ 'MobiFone', 'M9000' ],
+
+    'G0775'                                     => [ 'Movistar', 'Go Mobile 775' ],
+    'GO778'                                     => [ 'Movistar', 'Go Mobile 778' ],
+    'B916C'                                     => [ 'Movistar', 'Go Mobile 950' ],
+    'GO980'                                     => [ 'Movistar', 'Go Mobile 980' ],
+    'GO984'                                     => [ 'Movistar', 'Go Mobile 984' ],
+    'Gomobile GO1001'                           => [ 'Movistar', 'Go Mobile 1001' ],
+    'Movistar Express'                          => [ 'Movistar', 'Express' ],
+    'Movistar Link'                             => [ 'Movistar', 'Link' ],
+    'Movistar Motion'                           => [ 'Movistar', 'Motion' ],
+    'Movistar Prime'                            => [ 'Movistar', 'Primee' ],
+
+    'MTC!!' => [
+        'MTC 916'                                   => [ 'MTC', '916' ],
+        'MTC 950'                                   => [ 'MTC', '950' ],
+        'MTC 955'                                   => [ 'MTC', '955' ],
+        'MTC 960'                                   => [ 'MTC', '960' ],
+        'MTC-962'                                   => [ 'MTC', '962' ],
+        'MTC 968'                                   => [ 'MTC', '968' ],
+        'MTC 970!'                                  => [ 'MTC', '970' ],
+        'MTC 972'                                   => [ 'MTC', '972' ],
+        'MTC975'                                    => [ 'MTC', '975' ],
+        'MTC 978'                                   => [ 'MTC', '978' ],
+        'MTC980'                                    => [ 'MTC', '980' ],
+        'MTC 982'                                   => [ 'MTC', '982' ],
+        'MTC 1055'                                  => [ 'MTC', '1055' ],
+        'MTC 1065'                                  => [ 'MTC', '1065' ],
+        'MTC 1078'                                  => [ 'MTC', '1078' ],
+        'MTC 982O'                                  => [ 'MTC', '982O' ],
+        'MTC Bravo'                                 => [ 'MTC', 'Bravo' ],
+        'MTC Evo'                                   => [ 'MTC', 'Evo' ],
+        'MTC Fit'                                   => [ 'MTC', 'Fit' ],
+        'MTC Neo'                                   => [ 'MTC', 'Neo' ],
+        'MTC Mini'                                  => [ 'MTC', 'Mini' ],
+        'MTC Pro'                                   => [ 'MTC', 'Pro' ],
+        'MTC SMART Run'                             => [ 'MTC', 'Smart Run' ],
+        'MTC SMART Run 4G'                          => [ 'MTC', 'Smart Run' ],
+        'MTC SMART Sprint 4G'                       => [ 'MTC', 'Smart Sprint' ],
+        'MTC Viva'                                  => [ 'MTC', 'Viva' ],
+    ],
+
+    'SMART Sprint'                              => [ 'MTC', 'Smart Sprint' ],
+    'SMART Start'                               => [ 'MTC', 'Smart Start' ],
+
+    'NATCOM N8302'                              => [ 'Natcom', 'N8302' ],
+
+    'HB-1000'                                   => [ 'NTT', 'Hikari Box Plus', DeviceType::TELEVISION ],
+    'BSTB-200C'                                 => [ 'NTT', 'Hikari Box 3', DeviceType::TELEVISION ],
+
+    'O2 Joggler'                                => [ 'O2', 'Joggler', DeviceType::TABLET ],
+
+    'Optimus Barcelona'                         => [ 'Optimus', 'Barcelona' ],                          /* Gigabyte GSmart G1305 */
+    'Optimus Boston'                            => [ 'Optimus', 'Boston' ],                         /* Gigabyte GSmart G1305 */
+    'Boston 4G'                                 => [ 'Optimus', 'Boston 4G' ],
+    'Optimus Madrid'                            => [ 'Optimus', 'Madrid' ],                         /* Gigabyte GSmart G1305 */
+    'Optimus Monte Carlo'                       => [ 'Optimus', 'Monte Carlo' ],                        /* ZTE Skate */
+    'Optimus San Francisco'                     => [ 'Optimus', 'San Francisco' ],                      /* ZTE Blade */
+    'Optimus San Remo'                          => [ 'Optimus', 'San Remo' ],
+    'San Remo Mini'                             => [ 'Optimus', 'San Remo Mini' ],
+    'Optimus Zali'                              => [ 'Optimus', 'Zali' ],
+
+    'Boston'                                    => [ 'Orange', 'Boston' ],
+    'Orange Boston'                             => [ 'Orange', 'Boston' ],
+    'Orange Covo'                               => [ 'Orange', 'Covo' ],
+    'Orange Daytona'                            => [ 'Orange', 'Daytona' ],
+    'Orange Dublin'                             => [ 'Orange', 'Dublin' ],
+    'Orange Fova'                               => [ 'Orange', 'Fova' ],
+    'Orange Gova'                               => [ 'Orange', 'Gova' ],
+    'Orange Hi 4G'                              => [ 'Orange', 'Hi' ],
+    'Orange Hiro'                               => [ 'Orange', 'Hiro' ],
+    'Orange infinity 996'                       => [ 'Orange', 'Infinity' ],
+    'Orange Infinity 8008X'                     => [ 'Orange', 'Infinity' ],
+    'Orange Kivo'                               => [ 'Orange', 'Kivo' ],
+    'Luno'                                      => [ 'Orange', 'Luno' ],
+    'Orange Monte Carlo'                        => [ 'Orange', 'Monte Carlo' ],
+    'Orange Neva 80'                            => [ 'Orange', 'Neva 80' ],
+    '6034R ORANGE Niva'                         => [ 'Orange', 'Nivo' ],
+    'Orange Niva'                               => [ 'Orange', 'Nivo' ],
+    'Orange Nura'                               => [ 'Orange', 'Nura' ],
+    'Nura 2'                                    => [ 'Orange', 'Nura 2' ],
+    'Orange Novi'                               => [ 'Orange', 'Novi' ],
+    'Orange Reyo'                               => [ 'Orange', 'Reyo' ],
+    'Orange Rise 30'                            => [ 'Orange', 'Rise 30' ],
+    'Orange Rono'                               => [ 'Orange', 'Rono' ],
+    'Orange Roya'                               => [ 'Orange', 'Roya' ],
+    'Orange Runo'                               => [ 'Orange', 'Runo' ],
+    'San Francisco'                             => [ 'Orange', 'San Francisco' ],                       /* ZTE Blade */
+    'San Francisco for'                         => [ 'Orange', 'San Francisco' ],                       /* ZTE Blade */
+    'Orange San Francisco'                      => [ 'Orange', 'San Francisco' ],                       /* ZTE Blade */
+    'San Francisco II'                          => [ 'Orange', 'San Francisco II' ],
+    'Orange Sego'                               => [ 'Orange', 'Sego' ],
+    'Orange Tactile internet 2'                 => [ 'Orange', 'Tactile internet 2' ],
+    'Orange Tado'                               => [ 'Orange', 'Tado' ],
+    'Orange Yomi'                               => [ 'Orange', 'Yomi' ],
+    'Orange Yumo'                               => [ 'Orange', 'Yumo' ],
+    'Orange Zali'                               => [ 'Orange', 'Zali' ],
+    'Zilo'                                      => [ 'Orange', 'Zilo' ],
+
+    '(QMobile|QTab|Q-Smart|Noir)!!' => [
+        'QMobile A1'                                => [ 'Q-Mobile', 'Noir A1' ],
+        'QMobile A2 Lite'                           => [ 'Q-Mobile', 'Bolt A2 Lite' ],
+        'QMobile A2 Classic'                        => [ 'Q-Mobile', 'Bolt A2 Classic' ],
+        'QMobile A4'                                => [ 'Q-Mobile', 'Bolt A4' ],
+        'QMobile A5'                                => [ 'Q-Mobile', 'Noir A5' ],
+        'Noir A7'                                   => [ 'Q-Mobile', 'Noir A7' ],
+        'QMobile A7'                                => [ 'Q-Mobile', 'Noir A7' ],
+        'Noir A8'                                   => [ 'Q-Mobile', 'Noir A8' ],
+        'QMobile A8'                                => [ 'Q-Mobile', 'Noir A8' ],
+        'QMobile A10'                               => [ 'Q-Mobile', 'Noir A10' ],
+        'QMobile A10 Noir'                          => [ 'Q-Mobile', 'Noir A10' ],
+        'QMobile Noir A10'                          => [ 'Q-Mobile', 'Noir A10' ],
+        'QMobile A10 Lite'                          => [ 'Q-Mobile', 'Noir A10 Lite' ],
+        'QMobile A11Note'                           => [ 'Q-Mobile', 'Noir A11' ],
+        'QMobile A12'                               => [ 'Q-Mobile', 'Noir A12' ],
+        'QMobile A20'                               => [ 'Q-Mobile', 'Noir A20' ],
+        'QMobile A30'                               => [ 'Q-Mobile', 'Noir A30' ],
+        'QMobile A34'                               => [ 'Q-Mobile', 'Noir A34' ],
+        'QMobile A35'                               => [ 'Q-Mobile', 'Noir A35' ],
+        'QMobile A36'                               => [ 'Q-Mobile', 'Noir A36' ],
+        'QMobile A51'                               => [ 'Q-Mobile', 'Noir A51' ],
+        'QMobile A63'                               => [ 'Q-Mobile', 'Noir A63' ],
+        'QMobile A65'                               => [ 'Q-Mobile', 'Noir A65' ],
+        'QMobile A75'                               => [ 'Q-Mobile', 'Noir A75' ],
+        'QMobile A80'                               => [ 'Q-Mobile', 'Noir A80' ],
+        'QMobile A120'                              => [ 'Q-Mobile', 'Noir A120' ],
+        'QMobile A170'                              => [ 'Q-Mobile', 'Noir A17  0' ],
+        'QMobile A290'                              => [ 'Q-Mobile', 'Noir A290' ],
+        'QMobile A300'                              => [ 'Q-Mobile', 'Noir A300' ],
+        'Qmobile A500'                              => [ 'Q-Mobile', 'Noir A500' ],
+        'QMobile A700'                              => [ 'Q-Mobile', 'Noir A700' ],
+        'Qmobile A900'                              => [ 'Q-Mobile', 'Noir A900' ],
+        'QMobile A910'                              => [ 'Q-Mobile', 'Noir A910' ],
+        'QMobile i1'                                => [ 'Q-Mobile', 'Noir i1' ],
+        'QMobile i2'                                => [ 'Q-Mobile', 'Noir i2' ],
+        'QMobile i4'                                => [ 'Q-Mobile', 'Noir i4' ],
+        'QMobile i5'                                => [ 'Q-Mobile', 'Noir i5' ],
+        'QMobile i5i'                               => [ 'Q-Mobile', 'Noir i5i' ],
+        'QMobile i5i Classic'                       => [ 'Q-Mobile', 'Noir i5i Classic' ],
+        'QMobile i6i'                               => [ 'Q-Mobile', 'Noir i6i' ],
+        'QMobile i6 Metal ONE'                      => [ 'Q-Mobile', 'i6 Metal One' ],
+        'QMobile i7'                                => [ 'Q-Mobile', 'Noir i7' ],
+        'QMobile i7i'                               => [ 'Q-Mobile', 'Noir i7i' ],
+        'QMobile i8'                                => [ 'Q-Mobile', 'Noir i8' ],
+        'QMobile i9'                                => [ 'Q-Mobile', 'Noir i9' ],
+        'Qmobile Noir i9'                           => [ 'Q-Mobile', 'Noir i9' ],
+        'QMobile i10'                               => [ 'Q-Mobile', 'Noir i10' ],
+        'QMobile i12'                               => [ 'Q-Mobile', 'Noir i12' ],
+        'Q-Smart FLY 01'                            => [ 'Q-Mobile', 'Q-Smart Fly 01' ],
+        'QMobile L15'                               => [ 'Q-Mobile', 'Linq L15' ],
+        'QMobile L20'                               => [ 'Q-Mobile', 'Linq L20' ],
+        'QMobile M82'                               => [ 'Q-Mobile', 'Noir M82' ],
+        'QMobile M88'                               => [ 'Q-Mobile', 'Noir M88' ],
+        'QMobile M95'                               => [ 'Q-Mobile', 'Noir M95' ],
+        'QMobile M350'                              => [ 'Q-Mobile', 'Noir M350' ],
+        'QMobile T2'                                => [ 'Q-Mobile', 'Bolt T2' ],
+        'QMobile T5'                                => [ 'Q-Mobile', 'Bolt T5' ],
+        'QMobile T50'                               => [ 'Q-Mobile', 'Bolt T50' ],
+        'QMobile T200'                              => [ 'Q-Mobile', 'Bolt T200' ],
+        'QMobileT200i'                              => [ 'Q-Mobile', 'Bolt T200i' ],
+        'QMobile T250'                              => [ 'Q-Mobile', 'Bolt T250' ],
+        'QMobile T400'                              => [ 'Q-Mobile', 'Bolt T400' ],
+        'QMobile T500'                              => [ 'Q-Mobile', 'Bolt T500' ],
+        'Q-Smart S1'                                => [ 'Q-Mobile', 'Q-Smart S1' ],
+        'QMobile S1'                                => [ 'Q-Mobile', 'Q-Smart S1' ],
+        'QMobile S2'                                => [ 'Q-Mobile', 'Q-Smart S2' ],
+        'QMobile S3'                                => [ 'Q-Mobile', 'Q-Smart S3' ],
+        'QMobile S5'                                => [ 'Q-Mobile', 'Q-Smart S5' ],
+        'Q-Smart model S6'                          => [ 'Q-Mobile', 'Q-Smart S6' ],
+        'Q-mobile S10'                              => [ 'Q-Mobile', 'Q-Smart S10' ],
+        'Qmobile-S11'                               => [ 'Q-Mobile', 'Q-Smart S11' ],
+        'Q-mobile S11!'                             => [ 'Q-Mobile', 'Q-Smart S11' ],
+        'Q-Smart S12'                               => [ 'Q-Mobile', 'Q-Smart S12' ],
+        'Qmobile S13'                               => [ 'Q-Mobile', 'Q-Smart S13' ],
+        'Q-Smart S16'                               => [ 'Q-Mobile', 'Q-Smart S16' ],
+        'Q-Smart S18'                               => [ 'Q-Mobile', 'Q-Smart S18' ],
+        'Q-Smart S19'                               => [ 'Q-Mobile', 'Q-Smart S19' ],
+        'Q-Smart S20'                               => [ 'Q-Mobile', 'Q-Smart S20' ],
+        'Q-Smart S21'                               => [ 'Q-Mobile', 'Q-Smart S21' ],
+        'Q-Smart S29'                               => [ 'Q-Mobile', 'Q-Smart S29' ],
+        'Q-Smart QS16'                              => [ 'Q-Mobile', 'Q-Smart QS16' ],
+        'Q-Smart QS470'                             => [ 'Q-Mobile', 'Q-Smart QS470' ],
+        'Q-Smart QS550'                             => [ 'Q-Mobile', 'Q-Smart QS550' ],
+        'Q-Smart QS558'                             => [ 'Q-Mobile', 'Q-Smart QS558' ],
+        'QTab Q100'                                 => [ 'Q-Mobile', 'QTab Q100', DeviceType::TABLET ],
+        'QTab Q300'                                 => [ 'Q-Mobile', 'QTab Q300', DeviceType::TABLET ],
+        'QTab Q850'                                 => [ 'Q-Mobile', 'QTab Q850', DeviceType::TABLET ],
+        'QMobile V2'                                => [ 'Q-Mobile', 'Noir V2' ],
+        'QMobile V4'                                => [ 'Q-Mobile', 'Noir V4' ],
+        'QMobile W7'                                => [ 'Q-Mobile', 'Noir W7' ],
+        'QMobile W8'                                => [ 'Q-Mobile', 'Noir W8' ],
+        'QMobile W10'                               => [ 'Q-Mobile', 'Noir W10' ],
+        'QMobile W15'                               => [ 'Q-Mobile', 'Noir W15' ],
+        'QMobile W35'                               => [ 'Q-Mobile', 'Noir W35' ],
+        'QMobile W50'                               => [ 'Q-Mobile', 'Noir W50' ],
+        'QMobile X1'                                => [ 'Q-Mobile', 'Noir X1' ],
+        'QMobile X2'                                => [ 'Q-Mobile', 'Noir X2' ],
+        'QMobile X2i'                               => [ 'Q-Mobile', 'Noir X2i' ],
+        'QMobile X2 Music'                          => [ 'Q-Mobile', 'X2 Music' ],
+        'QMobile X5'                                => [ 'Q-Mobile', 'Noir X5' ],
+        'QMobile X6'                                => [ 'Q-Mobile', 'Noir X6' ],
+        'QMobile X6i'                               => [ 'Q-Mobile', 'Noir X6i' ],
+        'QMobile X10'                               => [ 'Q-Mobile', 'Noir X10' ],
+        'QMobile X11'                               => [ 'Q-Mobile', 'Noir X11' ],
+        'QMobile X14'                               => [ 'Q-Mobile', 'Noir X14' ],
+        'QMobile X20'                               => [ 'Q-Mobile', 'Noir X20' ],
+        'QMobile X25'                               => [ 'Q-Mobile', 'Noir X25' ],
+        'QMobile X30'                               => [ 'Q-Mobile', 'Noir X30' ],
+        'QMobile X32'                               => [ 'Q-Mobile', 'Noir X32' ],
+        'QMobile X35'                               => [ 'Q-Mobile', 'Noir X35' ],
+        'QMobile X40'                               => [ 'Q-Mobile', 'Noir X40' ],
+        'QMobile X60'                               => [ 'Q-Mobile', 'Noir X60' ],
+        'QMobile X70'                               => [ 'Q-Mobile', 'Noir X70' ],
+        'QMobile X80'                               => [ 'Q-Mobile', 'Noir X80' ],
+        'QMobile X90'                               => [ 'Q-Mobile', 'Noir X90' ],
+        'QMobile X95'                               => [ 'Q-Mobile', 'Noir X95' ],
+        'QMobile X100'                              => [ 'Q-Mobile', 'Linq X100' ],
+        'QMobileX200'                               => [ 'Q-Mobile', 'Noir X200' ],
+        'QMobile X250'                              => [ 'Q-Mobile', 'Noir X250' ],
+        'QMobile X300'                              => [ 'Q-Mobile', 'Noir X300' ],
+        'QMobile X500'                              => [ 'Q-Mobile', 'Noir X500' ],
+        'QMobile X550'                              => [ 'Q-Mobile', 'Noir X550' ],
+        'QMobile X600'                              => [ 'Q-Mobile', 'Noir X600' ],
+        'QMobile X700i'                             => [ 'Q-Mobile', 'Titan X700' ],
+        'QMobile X800'                              => [ 'Q-Mobile', 'Noir X800' ],
+        'QMobile X900'                              => [ 'Q-Mobile', 'Noir X900' ],
+        'QMobile Z8'                                => [ 'Q-Mobile', 'Noir Z8' ],
+        'QMobile Z8 Plus'                           => [ 'Q-Mobile', 'Noir Z8 Plus' ],
+        'QMobile Z9'                                => [ 'Q-Mobile', 'Noir Z9' ],
+        'QMobile Z10'                               => [ 'Q-Mobile', 'Noir Z10' ],
+    ],
+
+    'Z4 mini'                                   => [ 'Q-Mobile', 'Noir Quatro Z4 mini' ],
+    'Soshphone 4G'                              => [ 'SoshPhone', '4G' ],
+
+    'MOVE'                                      => [ 'T-Mobile', 'MOVE' ],                              /* Alcatel One Touch 908 */
+    'HTC Dream'                                 => [ 'T-Mobile', 'G1' ],                                /* HTC Dream */
+    'HTC Dream G1'                              => [ 'T-Mobile', 'G1' ],                                /* HTC Dream */
+    'HTC Dream SparksMod '                      => [ 'T-Mobile', 'G1' ],                                /* HTC Dream */
+    'T-Mobile G1'                               => [ 'T-Mobile', 'G1' ],                                /* HTC Dream */
+    'HTC Vision'                                => [ 'T-Mobile', 'G2' ],                                /* HTC Desire Z */
+    'T-Mobile G2'                               => [ 'T-Mobile', 'G2' ],                                /* HTC Desire Z */
+    'T-Mobile G2 Touch'                         => [ 'T-Mobile', 'G2' ],                                /* HTC Desire Z */
+    'T-Mobile HTC G2'                           => [ 'T-Mobile', 'G2' ],                                /* HTC Desire Z */
+    'LG-P999'                                   => [ 'T-Mobile', 'G2x' ],                               /* LG Optimus 2X */
+    'LG-E739'                                   => [ 'T-Mobile', 'myTouch' ],                           /* LG E739 */
+    'T-Mobile myTouch'                          => [ 'T-Mobile', 'myTouch' ],                           /* LG E739 */
+    'T-Mobile myTouch 3G'                       => [ 'T-Mobile', 'myTouch 3G'],                     /* HTC Magic */
+    'T-Mobile myTouch 3G Slide'                 => [ 'T-Mobile', 'myTouch 3G Slide' ],                  /* HTC Espresso */
+    'T-mobile my touch 3g slide'                => [ 'T-Mobile', 'myTouch 3G Slide' ],                  /* HTC Espresso */
+    'HTC T-Mobile myTouch 3G Slide'             => [ 'T-Mobile', 'myTouch 3G Slide' ],                  /* HTC Espresso */
+    'T-Mobile Espresso'                         => [ 'T-Mobile', 'myTouch 3G Slide' ],                  /* HTC Espresso */
+    'HTC my ?Touch 3G Slide!'                   => [ 'T-Mobile', 'myTouch 3G Slide' ],                  /* HTC Espresso */
+    'T-Mobile myTouch 4G'                       => [ 'T-Mobile', 'myTouch 4G' ],                        /* HTC Glacier */
+    'HTC Glacier'                               => [ 'T-Mobile', 'myTouch 4G' ],                        /* HTC Glacier */
+    'HTC Panache'                               => [ 'T-Mobile', 'myTouch 4G' ],                        /* HTC Glacier */
+    'My ?Touch ?4G$!'                           => [ 'T-Mobile', 'myTouch 4G' ],                        /* HTC Glacier */
+    'HTC My ?Touch ?4G$!'                       => [ 'T-Mobile', 'myTouch 4G' ],                        /* HTC Glacier */
+    'HTC S910m'                                 => [ 'T-Mobile', 'myTouch 4G' ],                        /* HTC Glacier */
+    'HTC myTouch 4G Slide'                      => [ 'T-Mobile', 'myTouch 4G Slide' ],                  /* HTC Doubleshot */
+    'myTouch 4G Slide'                          => [ 'T-Mobile', 'myTouch 4G Slide' ],                  /* HTC Doubleshot */
+    'myTouch Slide 4G'                          => [ 'T-Mobile', 'myTouch 4G Slide' ],                  /* HTC Doubleshot */
+    'HTC Doubleshot'                            => [ 'T-Mobile', 'myTouch 4G Slide' ],                  /* HTC Doubleshot */
+    'T-Mobile myTouch Q'                        => [ 'T-Mobile', 'myTouch Q' ],                     /* Huawei U8730 */
+    'LG-C800'                                   => [ 'T-Mobile', 'myTouch Q' ],
+    'T-Mobile Opal'                             => [ 'T-Mobile', 'Opal' ],
+    'HUAWEI U8686'                              => [ 'T-Mobile', 'Prism' ],
+    'Prism'                                     => [ 'T-Mobile', 'Prism' ],
+    'Prism II'                                  => [ 'T-Mobile', 'Prism II' ],
+    'U8220'                                     => [ 'T-Mobile', 'Pulse' ],
+    'Pulse'                                     => [ 'T-Mobile', 'Pulse' ],
+    'Pulse Mini'                                => [ 'T-Mobile', 'Pulse Mini' ],                        /* Huawei U8110 */
+    'T-Mobile Vivacity'                         => [ 'T-Mobile', 'Vivacity' ],
+    'SpringBoard'                               => [ 'T-Mobile', 'SpringBoard', DeviceType::TABLET ],
+
+    'Telenor!!' => [
+        'Telenor OneTouch'                          => [ 'Telenor', 'One Touch' ],
+        'Telenor One Touch C'                       => [ 'Telenor', 'One Touch C' ],
+        'Telenor One Touch S'                       => [ 'Telenor', 'One Touch S' ],
+        'Telenor Touch Plus'                        => [ 'Telenor', 'Touch Plus' ],
+        'Telenor K530'                              => [ 'Telenor', 'K530' ],
+        'Telenor N940'                              => [ 'Telenor', 'N940' ],
+        'Telenor S800'                              => [ 'Telenor', 'S800' ],
+        'Telenor Smart'                             => [ 'Telenor', 'Smart' ],
+        'Telenor Smart 2'                           => [ 'Telenor', 'Smart 2' ],
+        'Telenor Smart HD'                          => [ 'Telenor', 'Smart HD' ],
+        'Telenor Smart Mini'                        => [ 'Telenor', 'Smart Mini' ],
+        'Telenor SmartPlus'                         => [ 'Telenor', 'Smart Plus' ],
+        'Telenor Smart Pro'                         => [ 'Telenor', 'Smart Pro' ],
+        'Telenor Smart Pro 2'                       => [ 'Telenor', 'Smart Pro 2' ],
+        'TELENOR SMART TOUCH MINI'                  => [ 'Telenor', 'Smart Touch Mini' ],
+        'Telenor Touch Mini'                        => [ 'Telenor', 'Smart Touch Mini' ],
+        'Telenor Touch Pad'                         => [ 'Telenor', 'Touch Pad', DeviceType::TABLET ],
+    ],
+
+    'T-Hub2'                                    => [ 'Telstra', 'T-Hub 2', DeviceType::TABLET ],
+
+    'tmn!!' => [
+        'tmn smart a6'                              => [ 'TMN', 'Smart A6' ],
+        'tmn smart a7'                              => [ 'TMN', 'Smart A7' ],
+        'tmn smart a8'                              => [ 'TMN', 'Smart A8' ],
+        'tmn smart a15'                             => [ 'TMN', 'Smart A15' ],
+        'tmn smart a18'                             => [ 'TMN', 'Smart A18' ],
+        'tmn smart a20'                             => [ 'TMN', 'Smart A20' ],
+        'tmn smart a60'                             => [ 'TMN', 'Smart A60' ],
+    ],
+
+    'soft stone'                                => [ 'TMN', 'Soft Stone' ],
+
+    'TRUE BEYOND 3G'                            => [ 'True', 'Beyond' ],
+
+    'StarTrail TT'                              => [ 'Tunisie Telecom', 'StarTrail' ],
+
+    'Turkcell!!' => [
+        'Turkcell Maxi Plus 5'                      => [ 'Turkcell', 'Maxi Plus 5' ],
+        'TURKCELL MaxiPRO5'                         => [ 'Turkcell', 'Maxi Pro 5' ],
+        'Turkcell T10'                              => [ 'Turkcell', 'T10' ],
+        'Turkcell T11'                              => [ 'Turkcell', 'T11' ],
+        'Turkcell T20'                              => [ 'Turkcell', 'T20' ],
+        'TURKCELL T40'                              => [ 'Turkcell', 'T40' ],
+        'TURKCELL T50'                              => [ 'Turkcell', 'T50' ],
+        'TURKCELL TURBO T50'                        => [ 'Turkcell', 'Turbo T50' ],
+        'TURKCELL T60'                              => [ 'Turkcell', 'T60' ],
+        'TURKCELL T70'                              => [ 'Turkcell', 'T70' ],
+    ],
+
+    'RP-UDM01A'                                 => [ 'Verico', 'Uni Pad' ],
+
+    'QMV7A'                                     => [ 'Verizon', 'Ellipsis 7', DeviceType::TABLET ],
+    'QMV7B'                                     => [ 'Verizon', 'Ellipsis 7', DeviceType::TABLET ],
+    'QTAQZ3'                                    => [ 'Verizon', 'Ellipsis 8', DeviceType::TABLET ],
+    'QTAQZ3KID'                                 => [ 'Verizon', 'Ellipsis 8', DeviceType::TABLET ],
+    'QTAIR7'                                    => [ 'Verizon', 'Ellipsis 10', DeviceType::TABLET ],
+
+    'Viettel i5'                                => [ 'Viettel', 'i5' ],
+    'Viettel I8'                                => [ 'Viettel', 'i8' ],
+    'V8403'                                     => [ 'Viettel', 'V8403' ],
+    'VIETTEL V8404!'                            => [ 'Viettel', 'V8404' ],
+    'V8405'                                     => [ 'Viettel', 'V8405' ],
+    'V8408'                                     => [ 'Viettel', 'V8408' ],
+    'V8409'                                     => [ 'Viettel', 'V8409' ],
+    'Viettel V8410'                             => [ 'Viettel', 'V8410' ],
+    'VIETTEL V8411'                             => [ 'Viettel', 'V8411' ],
+    'V8412'                                     => [ 'Viettel', 'V8412' ],
+    'V8413'                                     => [ 'Viettel', 'V8413' ],
+    'V8501'                                     => [ 'Viettel', 'V8501' ],
+    'Viettel V8502'                             => [ 'Viettel', 'V8502' ],
+    'V8502'                                     => [ 'Viettel', 'V8502' ],
+    'V8503'                                     => [ 'Viettel', 'V8503' ],
+    'V8505'                                     => [ 'Viettel', 'V8505' ],
+    'VIETTEL V8506'                             => [ 'Viettel', 'V8506' ],
+    'V8507'                                     => [ 'Viettel', 'V8507' ],
+    'V8508'                                     => [ 'Viettel', 'V8508' ],
+    'VIETTEL V8509'                             => [ 'Viettel', 'V8509' ],
+    'V8510'                                     => [ 'Viettel', 'V8510' ],
+    'V8511'                                     => [ 'Viettel', 'V8511' ],
+    'V8602'                                     => [ 'Viettel', 'V8602' ],
+    'V8603'                                     => [ 'Viettel', 'V8603' ],
+
+    'Vodafone!!' => [
+        'Vodafone 785'                              => [ 'Vodafone', 'Smart 4 Mini' ],
+        'Vodafone 845'                              => [ 'Vodafone', '845 Nova' ],                          /* Huawei U8100 */
+        'Vodafone 858'                              => [ 'Vodafone', '858 Smart' ],                     /* Huawei U8160 */
+        'Vodafone 861'                              => [ 'Vodafone', '861 Smart' ],
+        'Vodafone 875'                              => [ 'Vodafone', 'Smart Mini' ],
+        'Vodafone 890N'                             => [ 'Vodafone', 'Smart 4 Turbo' ],
+        'Vodafone 945'                              => [ 'Vodafone', '945' ],                               /* ZTE Joe */
+        'Vodafone 958'                              => [ 'Vodafone', '958' ],
+        'Vodafone 975!'                             => [ 'Vodafone', '975' ],
+        'Vodafone 980'                              => [ 'Vodafone', '980' ],
+        'Vodafone 985N'                             => [ 'Vodafone', 'Smart 4 Power' ],
+        'Vodafone Blade V'                          => [ 'Vodafone', 'Blade V' ],
+        'Vodafone Smart ll'                         => [ 'Vodafone', 'Smart II' ],
+        'Vodafone Smart II!'                        => [ 'Vodafone', 'Smart II' ],
+        'Vodafone Smart 4'                          => [ 'Vodafone', 'Smart 4' ],
+        'Vodafone Smart 4 max'                      => [ 'Vodafone', 'Smart 4 Max' ],
+        'Vodafone Smart 4 turbo'                    => [ 'Vodafone', 'Smart 4 Turbo' ],
+        'Vodafone Smart 4G'                         => [ 'Vodafone', 'Smart 4G' ],
+        'VodafoneSmartChat!'                        => [ 'Vodafone', 'Smart Chat' ],
+        'Vodafone Smart Chat'                       => [ 'Vodafone', 'Smart Chat' ],
+        'Vodafone Smart ultra 6'                    => [ 'Vodafone', 'Smart Ultra 6' ],
+        'Vodafone SU6'                              => [ 'Vodafone', 'Smart Ultra 6' ],
+        'Vodafone SmartTab II 10'                   => [ 'Vodafone', 'Smart Tab II 10', DeviceType::TABLET ],
+        'Vodafone Smart Tab III 7'                  => [ 'Vodafone', 'Smart Tab III 7', DeviceType::TABLET ],
+        'Vodafone Smart Tab III 10'                 => [ 'Vodafone', 'Smart Tab III 10', DeviceType::TABLET ],
+        'Vodafone Smart Tab 4'                      => [ 'Vodafone', 'Smart Tab 4', DeviceType::TABLET ],
+        'Vodafone Smart Tab 3G!'                    => [ 'Vodafone', 'Smart Tab 3G', DeviceType::TABLET ],
+        'Vodafone Smart Tab 4G!'                    => [ 'Vodafone', 'Smart Tab 4G', DeviceType::TABLET ],
+        'Vodafone Tab grand 6'                      => [ 'Vodafone', 'Tab Grand 6', DeviceType::TABLET ],
+    ],
+
+    'SmartTab!!' => [
+        'SmartTab2'                                 => [ 'Vodafone', 'Smart Tab 2', DeviceType::TABLET ],
+        'SmartTab7'                                 => [ 'Vodafone', 'Smart Tab 7', DeviceType::TABLET ],
+        'SmartTabII7'                               => [ 'Vodafone', 'Smart Tab II 7', DeviceType::TABLET ],        /* Lenovo */
+        'SmartTabII10'                              => [ 'Vodafone', 'Smart Tab II 10', DeviceType::TABLET ],
+        'SmartTab10'                                => [ 'Vodafone', 'Smart Tab 10', DeviceType::TABLET ]           /* ZTE Web Tab 10 */
+    ],
+
+    'VF685'                                     => [ 'Vodafone', 'Smart 4 Fun' ],
+    'VF695'                                     => [ 'Vodafone', 'Smart First 6' ],
+    'VF-696'                                    => [ 'Vodafone', 'Smart Grand 6' ],
+    'VF-795'                                    => [ 'Vodafone', 'Smart Speed 6' ],
+    'VF-895N'                                   => [ 'Vodafone', 'Smart Prime 6' ],
+    'VFD 300'                                   => [ 'Vodafone', 'Smart Mini 7' ],
+    'VFD 900'                                   => [ 'Vodafone', 'Smart Platinum 7' ],
+    'Huawei 858'                                => [ 'Vodafone', '858 Smart' ],
+    '[a-z][a-z](?:-[a-z][a-z])?, SmartTabII7!'  => [ 'Vodafone', 'Smart Tab II 7', DeviceType::TABLET ],        /* Lenovo */
+    'VF-1397'                                   => [ 'Vodafone', 'Tab Speed 6', DeviceType::TABLET ],
+    'VF-1497'                                   => [ 'Vodafone', 'Tab Prime', DeviceType::TABLET ],
+];

+ 18 - 0
Qii/Library/Third/data/models-asha.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$ASHA_MODELS = [
+    'Asha230SingleSIM'                          => [ 'Nokia', 'Asha 230' ],
+    'Asha230DualSIM'                            => [ 'Nokia', 'Asha 230' ],
+    '500'                                       => [ 'Nokia', 'Asha 500' ],
+    'Asha500SingleSIM'                          => [ 'Nokia', 'Asha 500' ],
+    'Asha500DualSIM'                            => [ 'Nokia', 'Asha 500' ],
+    '501'                                       => [ 'Nokia', 'Asha 501' ],
+    '501s'                                      => [ 'Nokia', 'Asha 501' ],
+    '501.1'                                     => [ 'Nokia', 'Asha 501' ],
+    '501.2'                                     => [ 'Nokia', 'Asha 501' ],
+    '502'                                       => [ 'Nokia', 'Asha 502' ],
+    '503'                                       => [ 'Nokia', 'Asha 503' ],
+    '503s'                                      => [ 'Nokia', 'Asha 503' ],
+];

+ 18 - 0
Qii/Library/Third/data/models-bada.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$BADA_MODELS = [
+    'GT- ?S52(50|53)!'                          => [ 'Samsung', 'Wave 525' ],
+    'GT-S53(30|33)!'                            => [ 'Samsung', 'Wave 533' ],
+    'GT-S5380!'                                 => [ 'Samsung', 'Wave Y' ],
+    'GT-S57(50|53)!'                            => [ 'Samsung', 'Wave 575' ],
+    'GT-S57(80)!'                               => [ 'Samsung', 'Wave 578' ],
+    'GT-S72(30|33)!'                            => [ 'Samsung', 'Wave 723' ],
+    'GT-S7250!'                                 => [ 'Samsung', 'Wave M' ],
+    'GT-S8500!'                                 => [ 'Samsung', 'Wave' ],
+    'SCH-F859!'                                 => [ 'Samsung', 'Wave' ],
+    'GT- ?S8530!'                               => [ 'Samsung', 'Wave II' ],
+    'GT- ?S8600!'                               => [ 'Samsung', 'Wave 3' ],
+    'SHW-M410'                                  => [ 'Samsung', 'Wave 3' ]
+];

+ 52 - 0
Qii/Library/Third/data/models-blackberry.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$BLACKBERRY_MODELS = [
+    '9000'      => 'Bold',
+    '9600'      => 'Bold',
+    '9650'      => 'Bold',
+    '9700'      => 'Bold',
+    '9780'      => 'Bold',
+    '9788'      => 'Bold',
+    '9790'      => 'Bold',
+    '9900'      => 'Bold',
+    '9930'      => 'Bold',
+    '8300'      => 'Curve',
+    '8310'      => 'Curve',
+    '8320'      => 'Curve',
+    '8330'      => 'Curve',
+    '8350i'     => 'Curve',
+    '8520'      => 'Curve',
+    '8530'      => 'Curve',
+    '8900'      => 'Curve',
+    '9220'      => 'Curve',
+    '9300'      => 'Curve',
+    '9310'      => 'Curve',
+    '9315'      => 'Curve',
+    '9320'      => 'Curve',
+    '9330'      => 'Curve',
+    '9350'      => 'Curve',
+    '9360'      => 'Curve',
+    '9370'      => 'Curve',
+    '9380'      => 'Curve',
+    '8100'      => 'Pearl',
+    '8110'      => 'Pearl',
+    '8120'      => 'Pearl',
+    '8130'      => 'Pearl',
+    '8220'      => 'Pearl',
+    '8230'      => 'Pearl',
+    '9100'      => 'Pearl',
+    '9105'      => 'Pearl',
+    '9500'      => 'Storm',
+    '9520'      => 'Storm2',
+    '9530'      => 'Storm',
+    '9550'      => 'Storm',
+    '9670'      => 'Style',
+    '9800'      => 'Torch',
+    '9810'      => 'Torch',
+    '9850'      => 'Torch',
+    '9860'      => 'Torch',
+    '9630'      => 'Tour',
+    '9981'      => 'Porsche P'
+];

+ 52 - 0
Qii/Library/Third/data/models-brew.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$BREW_MODELS = [
+    'Coolpad D508'                              => [ 'Coolpad', 'D508' ],
+    'Coolpad E600'                              => [ 'Coolpad', 'E600' ],
+    'HUAWEI U2801!'                             => [ 'Huawei', 'U2801' ],
+    'HUAWEI U5200!'                             => [ 'Huawei', 'U5200' ],
+    'E4255'                                     => [ 'Kyocera', 'DuraMax E4255' ],
+    'S2151!'                                    => [ 'Kyocera', 'Coast S2151' ],
+    'EX200!'                                    => [ 'Motorola', 'EX200' ],
+    'M260!'                                     => [ 'Samsung', 'Factor' ],
+    'M390!'                                     => [ 'Samsung', 'Array' ],
+    'M550!'                                     => [ 'Samsung', 'Exclaim' ],
+    'SCH-B309!'                                 => [ 'Samsung', 'SCH-B309' ],
+    'SCH-F839'                                  => [ 'Samsung', 'SCH-F839' ],
+    'SCH-M519!'                                 => [ 'Samsung', 'Metro TV' ],
+    'SCH-S559!'                                 => [ 'Samsung', 'SCH-S559' ],
+    'SCH-S579!'                                 => [ 'Samsung', 'SCH-S579' ],
+    'SCH-U380'                                  => [ 'Samsung', 'Brightside' ],
+    'SCH-U485'                                  => [ 'Samsung', 'Intensity III' ],
+    'SCH-U820'                                  => [ 'Samsung', 'Reality' ],
+    'SCH-W709!'                                 => [ 'Samsung', 'SCH-W709' ],
+    'sam-r631'                                  => [ 'Samsung', 'Messenger Touch R631' ],
+    'SPH M330'                                  => [ 'Samsung', 'SPH-M330' ],
+    'PLS M330'                                  => [ 'Samsung', 'PLS-M330' ],
+    'Sprint M850'                               => [ 'Samsung', 'Instinct HD' ],
+    'SCP-6750'                                  => [ 'Sanyo', 'Katana Eclipse X' ],
+    'SCP6760'                                   => [ 'Sanyo', 'Incognito' ],
+    'SCP-6760'                                  => [ 'Sanyo', 'Incognito' ],
+    'SCP6780'                                   => [ 'Sanyo', 'Innuendo' ],
+    'HS-E316!'                                  => [ 'Hisense', 'E316' ],
+    'VX9200!'                                   => [ 'LG', 'Env3' ],
+    'VX9600!'                                   => [ 'LG', 'Versa' ],
+    'VX11000'                                   => [ 'LG', 'Env Touch' ],
+    'VN170'                                     => [ 'LG', 'Revere 3' ],
+    'VN271'                                     => [ 'LG', 'Extravert' ],
+    'VN280'                                     => [ 'LG', 'Extravert 2' ],
+    'VN360'                                     => [ 'LG', 'Exalt' ],
+    'LG272'                                     => [ 'LG', 'Rumor Reflex' ],
+    'LG510'                                     => [ 'LG', 'Rumor Touch' ],
+    'LN510'                                     => [ 'LG', 'Rumor Touch' ],
+    'LX610'                                     => [ 'LG', 'Lotus Elite' ],
+    'VN530'                                     => [ 'LG', 'Octane' ],
+    'CDM8999'                                   => [ 'Pantech', 'Crux' ],
+    'CDM8992'                                   => [ 'Pantech', 'Hotshot' ],
+    'TXT8045'                                   => [ 'Pantech', 'Jest 2' ],
+    'P5000'                                     => [ 'Pantech', 'Link II' ],
+    'P6020'                                     => [ 'Pantech', 'Persuit II' ],
+    'P6030'                                     => [ 'Pantech', 'Reneu' ],
+];

+ 114 - 0
Qii/Library/Third/data/models-feature.php

@@ -0,0 +1,114 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+use WhichBrowser\Constants\DeviceType;
+
+DeviceModels::$FEATURE_MODELS = [
+    'Amstrad Gamma'                             => [ 'Amstrad', 'E-m@iler Plus', DeviceType::DESKTOP ],
+    'Benefon Q'                                 => [ 'Benefon', 'Q' ],
+    'EF71'                                      => [ 'BenQ-Siemens', 'EF71' ],
+    'Lightpipe'                                 => [ 'Kyocera', 'E1100 Neo' ],
+    'K612'                                      => [ 'Kyocera', 'K612 Strobe' ],
+    'EX115'                                     => [ 'Motorola', 'Starling EX115' ],
+    'EX118'                                     => [ 'Motorola', 'MOTOKEY XT EX118' ],
+    'EX119'                                     => [ 'Motorola', 'Brea EX119' ],
+    'EX128'                                     => [ 'Motorola', 'Kingfisher EX128' ],
+    'EX225'                                     => [ 'Motorola', 'MOTOKEY Social EX225' ],
+    'EX226'                                     => [ 'Motorola', 'MOTOKEY Social EX226' ],
+    'EX430'                                     => [ 'Motorola', 'MotoGo EX430' ],
+    'MOTOQA1'                                   => [ 'Motorola', 'Karma QA1' ],
+    'KC910i'                                    => [ 'LG', 'KC910i Renoir' ],
+    'KP500!'                                    => [ 'LG', 'KP500 Cookie' ],
+    'KP570!'                                    => [ 'LG', 'KP570 Cookie' ],
+    'LG-KU380'                                  => [ 'LG', 'KU380' ],
+    'LG-KU580'                                  => [ 'LG', 'KU580 Hero' ],
+    'LG-KU990'                                  => [ 'LG', 'KU990 Viewty' ],
+    'KU990i'                                    => [ 'LG', 'KU990 Viewty' ],
+    'GM360'                                     => [ 'LG', 'GM360 Viewty Snap' ],
+    'GR700'                                     => [ 'LG', 'GR700 Vu Plus' ],
+    'GS290'                                     => [ 'LG', 'GS290 Cookie Fresh' ],
+    'GS500'                                     => [ 'LG', 'GS500 Cookie Plus' ],
+    'GT500!'                                    => [ 'LG', 'GT500 Puccini' ],
+    'GT550'                                     => [ 'LG', 'GT550 Encore' ],
+    'COCOON'                                    => [ 'O2', 'Cocoon' ],
+    'P7000'                                     => [ 'Pantech', 'Impact' ],
+    'P9020'                                     => [ 'Pantech', 'Pursuit' ],
+    'P9050'                                     => [ 'Pantech', 'Laser' ],
+    'PM-8200'                                   => [ 'Sanyo', 'PM-8200' ],
+    'SCP-5500'                                  => [ 'Sanyo', 'VM4500' ],
+    'SCP-6600'                                  => [ 'Sanyo', 'Katana' ],
+    'PLS6600KJ'                                 => [ 'Sanyo', 'Katana' ],
+    'GT-B2710'                                  => [ 'Samsung', 'Xcover 271' ],
+    'GT-B3210'                                  => [ 'Samsung', 'Corby TXT' ],
+    'GT-B3313'                                  => [ 'Samsung', 'Corby Mate' ],
+    'GT-C3200'                                  => [ 'Samsung', 'Monte Bar' ],
+    'GT-C3222'                                  => [ 'Samsung', 'Ch@t 322' ],
+    'GT-C3322'                                  => [ 'Samsung', 'GT-C3322 Duos' ],
+    'GT-C3500'                                  => [ 'Samsung', 'Ch@t 350' ],
+    'GT-C5010!'                                 => [ 'Samsung', 'C5010 Squash' ],
+    'GT-E1282!'                                 => [ 'Samsung', 'Guru' ],
+    'GT-E2152'                                  => [ 'Samsung', 'GT-E2152 Duos' ],
+    'GT-E2220'                                  => [ 'Samsung', 'Ch@t 220' ],
+    'GT-E2222'                                  => [ 'Samsung', 'Ch@t 222' ],
+    'GT-E2202'                                  => [ 'Samsung', 'Metro' ],
+    'GT-E2250'                                  => [ 'Samsung', 'Utica' ],
+    'GT-E2252'                                  => [ 'Samsung', 'Metro 2252' ],
+    'GT-E3213'                                  => [ 'Samsung', 'E3213 Hero' ],
+    'GT-E3309I'                                 => [ 'Samsung', 'E3309 Manhattan' ],
+    'm3510c'                                    => [ 'Samsung', 'M3510' ],
+    'GT-M8910'                                  => [ 'Samsung', 'M8910 Pixon12' ],
+    'GT-S3332'                                  => [ 'Samsung', 'Ch@t 333' ],
+    'GT-S33(50|53)!'                            => [ 'Samsung', 'Ch@t 335' ],
+    'GT-S35(70|72)!'                            => [ 'Samsung', 'Ch@t 357' ],
+    'GT-S5229'                                  => [ 'Samsung', 'Tocco Lite 2' ],
+    'GT-S5270!'                                 => [ 'Samsung', 'Ch@t 527' ],
+    'GT-S5610!'                                 => [ 'Samsung', 'Primo' ],
+    'SCH-W169'                                  => [ 'Samsung', 'W169 Duos' ],
+    'SCH-W279'                                  => [ 'Samsung', 'Primo Duos' ],
+    'SGH-A667'                                  => [ 'Samsung', 'A667 Evergreen' ],
+    'SGH-A697'                                  => [ 'Samsung', 'A697 Sunburst' ],
+    'SGH-A877'                                  => [ 'Samsung', 'A877 Impression' ],
+    'SGH-A927'                                  => [ 'Samsung', 'A927 Flight II' ],
+    'SGH-A997'                                  => [ 'Samsung', 'Rugby III' ],
+    'SGH-D880'                                  => [ 'Samsung', 'D880 Duos' ],
+    'SGH-E250i'                                 => [ 'Samsung', 'E250' ],
+    'SGH-E250V'                                 => [ 'Samsung', 'E250' ],
+    'SGH-G600'                                  => [ 'Samsung', 'G600' ],
+    'SGH-J700i'                                 => [ 'Samsung', 'J700' ],
+    'SGH-J700V'                                 => [ 'Samsung', 'J700' ],
+    'SGH-M200'                                  => [ 'Samsung', 'M200' ],
+    'SGH-S150G'                                 => [ 'Samsung', 'S150 TracFone' ],
+    'SGH-S390G'                                 => [ 'Samsung', 'S390 TracFone' ],
+    'SGH-T189N'                                 => [ 'Samsung', 'Freeform M'],
+    'SGHX660V'                                  => [ 'Samsung', 'X660' ],
+    'SGH-Z107!'                                 => [ 'Samsung', 'Z107' ],
+    'SGH-Z130!'                                 => [ 'Samsung', 'Z130' ],
+    'SGH-Z500!'                                 => [ 'Samsung', 'Z500' ],
+    'SM-B313E'                                  => [ 'Samsung', 'Metro 313' ],
+    'SM-B350E'                                  => [ 'Samsung', 'Metro 350' ],
+    'SM-B780(A|W)!'                             => [ 'Samsung', 'Rugby 4' ],
+    'S7350'                                     => [ 'Samsung', 'S7350 Ultra S' ],
+    'sam-r560'                                  => [ 'Samsung', 'Messenger II R560' ],
+    'Sendo Wap'                                 => [ 'Sendo', 'Z100' ],
+    'CK13[ai]?$!'                               => [ 'Sony Ericsson', 'txt' ],
+    'CK15[ai]?$!'                               => [ 'Sony Ericsson', 'txt Pro' ],
+    'F100[ai]?$!'                               => [ 'Sony Ericsson', 'Jalou' ],
+    'J105[ai]?$!'                               => [ 'Sony Ericsson', 'Naite' ],
+    'J108[ai]?$!'                               => [ 'Sony Ericsson', 'Cedar' ],
+    'J10(i2?)?$!'                               => [ 'Sony Ericsson', 'Elm' ],
+    'J20[ai]?$!'                                => [ 'Sony Ericsson', 'Hazel' ],
+    'U100[ai]?$!'                               => [ 'Sony Ericsson', 'Yari' ],
+    'U10[ai]?$!'                                => [ 'Sony Ericsson', 'Aino' ],
+    'W100i?$!'                                  => [ 'Sony Ericsson', 'Spiro' ],
+    'W150i?$!'                                  => [ 'Sony Ericsson', 'Yendo' ],
+    'W20i?$!'                                   => [ 'Sony Ericsson', 'Zylo' ],
+    'WT13i$!'                                   => [ 'Sony Ericsson', 'Mix Walkman' ],
+    'X5i$!'                                     => [ 'Sony Ericsson', 'Xperia Pureness X5' ],
+    'tecnot36'                                  => [ 'Tecno', 'T36' ],
+    'Vodafone 575'                              => [ 'Vodafone', '575' ],
+    'GT-I6410!'                                 => [ 'Vodafone', '360 M1' ],
+    'GT-I8320!'                                 => [ 'Vodafone', '360 H1' ],
+    'GT-I8330!'                                 => [ 'Vodafone', '360 H2' ],
+    'WIDETEL WCX150'                            => [ 'Widetel', 'WCX150' ],
+];

+ 31 - 0
Qii/Library/Third/data/models-firefoxos.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$FIREFOXOS_MODELS = [
+    'ALCATEL ONE TOUCH FIRE'                    => [ 'Alcatel', 'One Touch Fire' ],
+    'ALCATEL ONE TOUCH 4012A'                   => [ 'Alcatel', 'One Touch Fire' ],
+    'ALCATEL ONE TOUCH 4012X'                   => [ 'Alcatel', 'One Touch Fire' ],
+    'ALCATELOneTouch4012A!'                     => [ 'Alcatel', 'One Touch Fire' ],
+    'ALCATELOneTouch4012X!'                     => [ 'Alcatel', 'One Touch Fire' ],
+    'OneTouch4019A'                             => [ 'Alcatel', 'One Touch Fire C' ],
+    'ALCATELOneTouch4019A!'                     => [ 'Alcatel', 'One Touch Fire C' ],
+    'ALCATELOneTouch4019X!'                     => [ 'Alcatel', 'One Touch Fire C' ],
+    'ALCATELOneTouch4020D!'                     => [ 'Alcatel', 'One Touch Fire C' ],
+    'ALCATELOneTouch4022!'                      => [ 'Alcatel', 'One Touch Pixi 3 (3.5)' ],
+    'ALCATELOneTouch4023!'                      => [ 'Alcatel', 'One Touch Pixi 3 (3.5)' ],
+    'ALCATELOneTouch6015X!'                     => [ 'Alcatel', 'One Touch Fire E' ],
+    'HUAWEI Ascend Y300-F1'                     => [ 'Huawei', 'Ascend Y300 F1' ],
+    'HUAWEIY300-F1'                             => [ 'Huawei', 'Ascend Y300 F1' ],
+    'LG-D3(00|01)!'                             => [ 'LG', 'Fireweb' ],
+    'LGL25'                                     => [ 'LG', 'Fx0' ],
+    'madai'                                     => [ 'LG', 'Fx0' ],
+    'Orange KLIF'                               => [ 'Orange', 'Kilf' ],
+    'Orange KLIFD'                              => [ 'Orange', 'Kilf' ],
+    'OPEN'                                      => [ 'ZTE', 'Open' ],
+    'ZTEOPEN'                                   => [ 'ZTE', 'Open' ],
+    'OpenC'                                     => [ 'ZTE', 'Open C' ],
+    'Open C'                                    => [ 'ZTE', 'Open C' ],
+    'OPENC2'                                    => [ 'ZTE', 'Open C2' ],
+    'OPEN2'                                     => [ 'ZTE', 'Open II' ],
+];

+ 86 - 0
Qii/Library/Third/data/models-ios.php

@@ -0,0 +1,86 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+use WhichBrowser\Constants\DeviceType;
+
+DeviceModels::$IOS_MODELS = [
+
+    /* Generic names */
+    'iPhone'                                    => [ 'Apple', 'iPhone', DeviceType::MOBILE ],
+    'iPhone 3G'                                 => [ 'Apple', 'iPhone 3G', DeviceType::MOBILE ],
+    'iPhone 3GS'                                => [ 'Apple', 'iPhone 3GS', DeviceType::MOBILE ],
+    'iPhone 4'                                  => [ 'Apple', 'iPhone 4', DeviceType::MOBILE ],
+    'iPhone 4S'                                 => [ 'Apple', 'iPhone 4S', DeviceType::MOBILE ],
+    'iPhone 5'                                  => [ 'Apple', 'iPhone 5', DeviceType::MOBILE ],
+    'iPhone 5c'                                 => [ 'Apple', 'iPhone 5c', DeviceType::MOBILE ],
+    'iPhone 5s'                                 => [ 'Apple', 'iPhone 5s', DeviceType::MOBILE ],
+    'iPhone 6'                                  => [ 'Apple', 'iPhone 6', DeviceType::MOBILE ],
+    'iPhone 6 Plus'                             => [ 'Apple', 'iPhone 6 Plus', DeviceType::MOBILE ],
+    'iPod'                                      => [ 'Apple', 'iPod touch', DeviceType::MEDIA ],
+    'iPod touch'                                => [ 'Apple', 'iPod touch', DeviceType::MEDIA ],
+    'iPad'                                      => [ 'Apple', 'iPad', DeviceType::TABLET ],
+
+    /* Offical gestalt names */
+    'iPhone1,1'                                 => [ 'Apple', 'iPhone', DeviceType::MOBILE ],
+    'iPhone1,2'                                 => [ 'Apple', 'iPhone 3G', DeviceType::MOBILE ],
+    'iPhone2,1'                                 => [ 'Apple', 'iPhone 3GS', DeviceType::MOBILE ],
+    'iPhone3,1'                                 => [ 'Apple', 'iPhone 4', DeviceType::MOBILE ],
+    'iPhone3,2'                                 => [ 'Apple', 'iPhone 4', DeviceType::MOBILE ],
+    'iPhone3,3'                                 => [ 'Apple', 'iPhone 4', DeviceType::MOBILE ],
+    'iPhone4,1'                                 => [ 'Apple', 'iPhone 4S', DeviceType::MOBILE ],
+    'iPhone5,1'                                 => [ 'Apple', 'iPhone 5', DeviceType::MOBILE ],
+    'iPhone5,2'                                 => [ 'Apple', 'iPhone 5', DeviceType::MOBILE ],
+    'iPhone5,3'                                 => [ 'Apple', 'iPhone 5c', DeviceType::MOBILE ],
+    'iPhone5,4'                                 => [ 'Apple', 'iPhone 5c', DeviceType::MOBILE ],
+    'iPhone6,1'                                 => [ 'Apple', 'iPhone 5s', DeviceType::MOBILE ],
+    'iPhone6,2'                                 => [ 'Apple', 'iPhone 5s', DeviceType::MOBILE ],
+    'iPhone7,1'                                 => [ 'Apple', 'iPhone 6 Plus', DeviceType::MOBILE ],
+    'iPhone7,2'                                 => [ 'Apple', 'iPhone 6', DeviceType::MOBILE ],
+    'iPhone8,1'                                 => [ 'Apple', 'iPhone 6s', DeviceType::MOBILE ],
+    'iPhone8,2'                                 => [ 'Apple', 'iPhone 6s Plus', DeviceType::MOBILE ],
+    'iPhone8,4'                                 => [ 'Apple', 'iPhone SE', DeviceType::MOBILE ],
+    'iPhone9,1'                                 => [ 'Apple', 'iPhone 7', DeviceType::MOBILE ],
+    'iPhone9,2'                                 => [ 'Apple', 'iPhone 7 Plus', DeviceType::MOBILE ],
+    'iPhone9,3'                                 => [ 'Apple', 'iPhone 7', DeviceType::MOBILE ],
+    'iPhone9,4'                                 => [ 'Apple', 'iPhone 7 Plus', DeviceType::MOBILE ],
+    'iPod1,1'                                   => [ 'Apple', 'iPod touch', DeviceType::MEDIA ],
+    'iPod2,1'                                   => [ 'Apple', 'iPod touch (2nd gen)', DeviceType::MEDIA ],
+    'iPod3,1'                                   => [ 'Apple', 'iPod touch (3rd gen)', DeviceType::MEDIA ],
+    'iPod4,1'                                   => [ 'Apple', 'iPod touch (4th gen)', DeviceType::MEDIA ],
+    'iPod5,1'                                   => [ 'Apple', 'iPod touch (5th gen)', DeviceType::MEDIA ],
+    'iPod7,1'                                   => [ 'Apple', 'iPod touch (6th gen)', DeviceType::MEDIA ],
+    'iPad1,1'                                   => [ 'Apple', 'iPad', DeviceType::TABLET ],
+    'iPad1,2'                                   => [ 'Apple', 'iPad 2', DeviceType::TABLET ],
+    'iPad2,1'                                   => [ 'Apple', 'iPad 2', DeviceType::TABLET ],
+    'iPad2,2'                                   => [ 'Apple', 'iPad 2', DeviceType::TABLET ],
+    'iPad2,3'                                   => [ 'Apple', 'iPad 2', DeviceType::TABLET ],
+    'iPad2,4'                                   => [ 'Apple', 'iPad 2', DeviceType::TABLET ],
+    'iPad2,5'                                   => [ 'Apple', 'iPad mini', DeviceType::TABLET ],
+    'iPad2,6'                                   => [ 'Apple', 'iPad mini', DeviceType::TABLET ],
+    'iPad2,7'                                   => [ 'Apple', 'iPad mini', DeviceType::TABLET ],
+    'iPad3,1'                                   => [ 'Apple', 'iPad (3rd gen)', DeviceType::TABLET ],
+    'iPad3,2'                                   => [ 'Apple', 'iPad (3rd gen)', DeviceType::TABLET ],
+    'iPad3,3'                                   => [ 'Apple', 'iPad (3rd gen)', DeviceType::TABLET ],
+    'iPad3,4'                                   => [ 'Apple', 'iPad (4th gen)', DeviceType::TABLET ],
+    'iPad3,5'                                   => [ 'Apple', 'iPad (4th gen)', DeviceType::TABLET ],
+    'iPad3,6'                                   => [ 'Apple', 'iPad (4th gen)', DeviceType::TABLET ],
+    'iPad4,1'                                   => [ 'Apple', 'iPad Air', DeviceType::TABLET ],
+    'iPad4,2'                                   => [ 'Apple', 'iPad Air', DeviceType::TABLET ],
+    'iPad4,3'                                   => [ 'Apple', 'iPad Air', DeviceType::TABLET ],
+    'iPad4,4'                                   => [ 'Apple', 'iPad mini 2', DeviceType::TABLET ],
+    'iPad4,5'                                   => [ 'Apple', 'iPad mini 2', DeviceType::TABLET ],
+    'iPad4,6'                                   => [ 'Apple', 'iPad mini 2', DeviceType::TABLET ],
+    'iPad4,7'                                   => [ 'Apple', 'iPad mini 3', DeviceType::TABLET ],
+    'iPad4,8'                                   => [ 'Apple', 'iPad mini 3', DeviceType::TABLET ],
+    'iPad5,1'                                   => [ 'Apple', 'iPad mini 4', DeviceType::TABLET ],
+    'iPad5,2'                                   => [ 'Apple', 'iPad mini 4', DeviceType::TABLET ],
+    'iPad5,3'                                   => [ 'Apple', 'iPad Air 2', DeviceType::TABLET ],
+    'iPad5,4'                                   => [ 'Apple', 'iPad Air 2', DeviceType::TABLET ],
+    'iPad6,3'                                   => [ 'Apple', 'iPad Pro (9.7″)', DeviceType::TABLET ],
+    'iPad6,4'                                   => [ 'Apple', 'iPad Pro (9.7″)', DeviceType::TABLET ],
+    'iPad6,7'                                   => [ 'Apple', 'iPad Pro (12.9″)', DeviceType::TABLET ],
+    'iPad6,8'                                   => [ 'Apple', 'iPad Pro (12.9″)', DeviceType::TABLET ],
+    'iPad6,11'                                  => [ 'Apple', 'iPad (5th gen)', DeviceType::TABLET ],
+    'iPad6,12'                                  => [ 'Apple', 'iPad (5th gen)', DeviceType::TABLET ],
+];

+ 353 - 0
Qii/Library/Third/data/models-kddi.php

@@ -0,0 +1,353 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$KDDI_MODELS = [
+    'KC3Q'                                 => [ 'iida', 'misora' ],                            // KYX02 by Kyocera
+    'KC3S'                                 => [ 'iida', 'PRISMOID' ],                          // KYX03 by Kyocera
+    'KC3V'                                 => [ 'iida', 'lotta' ],                             // KYX04 by Kyocera
+    'ST22'                                 => [ 'iida', 'INFOBAR' ],                           // A5307ST by Sanyo
+    'ST33'                                 => [ 'iida', 'INFOBAR 2' ],                         // W55SA by Sanyo
+    'SN3K'                                 => [ 'iida', 'G9' ],                                // SOX01 by Sony Ericsson
+    'SN3T'                                 => [ 'iida', 'G11' ],                               // SOX02 by Sony Ericsson
+    'TS3Q'                                 => [ 'iida', 'PLY' ],                               // TSX04 by Toshiba
+    'TS3U'                                 => [ 'iida', 'LIGHT POOL' ],                        // by Toshiba
+    'TS3W'                                 => [ 'iida', 'X-RAY' ],                             // by Toshiba
+
+    'CA11'                                 => [ 'Casio', 'C303CA' ],
+    'CA12'                                 => [ 'Casio', 'C311CA' ],
+    'CA13'                                 => [ 'Casio', 'C409CA' ],
+    'CA14'                                 => [ 'Casio', 'C452CA' ],
+    'CA21'                                 => [ 'Casio', 'A3012CA' ],
+    'CA22'                                 => [ 'Casio', 'A5302CA' ],
+    'CA23'                                 => [ 'Casio', 'A5401CA' ],
+    'CA24'                                 => [ 'Casio', 'A5403CA' ],
+    'CA25'                                 => [ 'Casio', 'A5406CA' ],
+    'CA26'                                 => [ 'Casio', 'A5407CA' ],
+    'CA27'                                 => [ 'Casio', 'A5512CA' ],
+    'CA28'                                 => [ 'Casio', 'GzOne Type-R A5513CA' ],
+    'CA31'                                 => [ 'Casio', 'W21CA' ],
+    'CA32'                                 => [ 'Casio', 'W31CA' ],
+    'CA33'                                 => [ 'Casio', 'W41CA' ],
+    'CA34'                                 => [ 'Casio', 'W42CA' ],
+    'CA35'                                 => [ 'Casio', 'W43CA' ],
+    'CA36'                                 => [ 'Casio', 'E03CA' ],
+    'CA37'                                 => [ 'Casio', 'W51CA' ],
+    'CA38'                                 => [ 'Casio', 'W52CA' ],
+    'CA39'                                 => [ 'Casio', 'W53CA' ],
+    'CA3A'                                 => [ 'Casio', 'W61CA' ],
+    'CA3B'                                 => [ 'Casio', 'W62CA' ],
+    'CA3C'                                 => [ 'Casio', 'W63CA' ],
+    'CA3D'                                 => [ 'Casio', 'CA001' ],
+    'CA3E'                                 => [ 'Casio', 'CA002' ],
+    'CA3F'                                 => [ 'Casio', 'CA003' ],
+    'CA3G'                                 => [ 'Casio', 'CA004' ],
+    'CA3H'                                 => [ 'Casio', 'CA005' ],
+    'CA3I'                                 => [ 'Casio', 'GzOne Type-X CAY01' ],
+    'CA3J'                                 => [ 'Casio', 'CA006' ],
+    'CA3K'                                 => [ 'Casio', 'CA007' ],
+    'DN01'                                 => [ 'Denso', 'C202DE' ],
+    'DN11'                                 => [ 'Denso', 'C402DE' ],
+    'ERK0'                                 => [ 'Ericsson', 'R280' ],
+    'FJ31'                                 => [ 'Fujitsu', 'F001' ],
+    'HI01'                                 => [ 'Hitachi', 'C201H' ],
+    'HI02'                                 => [ 'Hitachi', 'C201H' ],
+    'HI11'                                 => [ 'Hitachi', 'C302H' ],
+    'HI12'                                 => [ 'Hitachi', 'C309H' ],
+    'HI13'                                 => [ 'Hitachi', 'C407H' ],
+    'HI14'                                 => [ 'Hitachi', 'C451H' ],
+    'HI21'                                 => [ 'Hitachi', 'C3001H' ],
+    'HI23'                                 => [ 'Hitachi', 'A5303H' ],
+    'HI24'                                 => [ 'Hitachi', 'A5303H II' ],
+    'HI31'                                 => [ 'Hitachi', 'W11H' ],
+    'HI32'                                 => [ 'Hitachi', 'W21H' ],
+    'HI33'                                 => [ 'Hitachi', 'W22H' ],
+    'HI34'                                 => [ 'Hitachi', 'PENCK W31H' ],
+    'HI35'                                 => [ 'Hitachi', 'W32H' ],
+    'HI36'                                 => [ 'Hitachi', 'W41H' ],
+    'HI37'                                 => [ 'Hitachi', 'W42H' ],
+    'HI38'                                 => [ 'Hitachi', 'W43H' ],
+    'HI39'                                 => [ 'Hitachi', 'W51H' ],
+    'HI3A'                                 => [ 'Hitachi', 'W52H' ],
+    'HI3B'                                 => [ 'Hitachi', 'W53H' ],
+    'HI3C'                                 => [ 'Hitachi', 'W61H' ],
+    'HI3D'                                 => [ 'Hitachi', 'W62H' ],
+    'HI3E'                                 => [ 'Hitachi', 'W63H' ],
+    'HI3F'                                 => [ 'Hitachi', 'H001' ],                           // HI001
+    'HI3G'                                 => [ 'Hitachi', 'Mobile Hi-Vision CAM Wooo HIY01' ],
+    'HI3H'                                 => [ 'Hitachi', 'beskey HIY02' ],
+    'KC11'                                 => [ 'Kyocera', 'C307K' ],
+    'KC12'                                 => [ 'Kyocera', 'C313K' ],
+    'KC13'                                 => [ 'Kyocera', 'C414K' ],
+    'KC14'                                 => [ 'Kyocera', 'A1012K' ],
+    'KC15'                                 => [ 'Kyocera', 'A1013K' ],
+    'KC21'                                 => [ 'Kyocera', 'C3002K' ],
+    'KC22'                                 => [ 'Kyocera', 'A5305K' ],
+    'KC23'                                 => [ 'Kyocera', 'A1401K' ],
+    'KC24'                                 => [ 'Kyocera', 'A5502K' ],
+    'KC25'                                 => [ 'Kyocera', 'A5502K' ],
+    'KC26'                                 => [ 'Kyocera', 'A1403K' ],
+    'KC27'                                 => [ 'Kyocera', 'A5515K' ],
+    'KC28'                                 => [ 'Kyocera', 'A5521K' ],
+    'KC29'                                 => [ 'Kyocera', 'A5526K' ],
+    'KC2A'                                 => [ 'Kyocera', 'A5528K' ],
+    'KC31'                                 => [ 'Kyocera', 'W11K' ],
+    'KC32'                                 => [ 'Kyocera', 'W21K' ],
+    'KC33'                                 => [ 'Kyocera', 'W31K' ],
+    'KC34'                                 => [ 'Kyocera', 'W32K' ],
+    'KC35'                                 => [ 'Kyocera', 'W41K' ],
+    'KC36'                                 => [ 'Kyocera', 'W42K' ],
+    'KC37'                                 => [ 'Kyocera', 'W43K' ],
+    'KC38'                                 => [ 'Kyocera', 'W44K' ],
+    'KC39'                                 => [ 'Kyocera', 'W51K' ],
+    'KC3A'                                 => [ 'Kyocera', 'MEDIA SKIN W52K' ],
+    'KC3B'                                 => [ 'Kyocera', 'W53K/W64K' ],
+    'KC3D'                                 => [ 'Kyocera', 'W61K' ],
+    'KC3E'                                 => [ 'Kyocera', 'W44K II' ],
+    'KC3G'                                 => [ 'Kyocera', 'W62K' ],
+    'KC3H'                                 => [ 'Kyocera', 'W63K' ],
+    'KC3I'                                 => [ 'Kyocera', 'W65K' ],
+    'KC3K'                                 => [ 'Kyocera', 'W63K' ],
+    'KC3M'                                 => [ 'Kyocera', 'K001' ],                           // KY001
+    'KC3N'                                 => [ 'Kyocera', 'NS01' ],                           // KYX01
+    'KC3O'                                 => [ 'Kyocera', 'K002' ],                           // KY002
+    'KC3P'                                 => [ 'Kyocera', 'K003' ],                           // KY003
+    'KC3R'                                 => [ 'Kyocera', 'SA001' ],
+    'KC3T'                                 => [ 'Kyocera', 'E07K' ],
+    'KC3U'                                 => [ 'Kyocera', 'K004' ],                           // KY004
+    'KC3W'                                 => [ 'Kyocera', 'mamorino' ],                       // KYY01
+    'KC3X'                                 => [ 'Kyocera', 'SA002' ],
+    'KC3Y'                                 => [ 'Kyocera', 'K005' ],                           // KY005
+    'KC3Z'                                 => [ 'Kyocera', 'K006' ],                           // KY006
+    'KC41'                                 => [ 'Kyocera', 'K006' ],
+    'KC42'                                 => [ 'Kyocera', 'K007' ],                           // KY007
+    'KC43'                                 => [ 'Kyocera', 'K008' ],                           // KY008
+    'KC44'                                 => [ 'Kyocera', 'mamorino 2' ],                     // KYY02
+    'KC45'                                 => [ 'Kyocera', 'K010' ],                           // KY010
+    'KC46'                                 => [ 'Kyocera', 'K009' ],                           // KY009
+    'KC47'                                 => [ 'Kyocera', 'Mi-Look' ],
+    'KC48'                                 => [ 'Kyocera', 'E10K' ],
+    'KC4A'                                 => [ 'Kyocera', 'K011' ],
+    'KCC1'                                 => [ 'Kyocera', 'D303K' ],
+    'KCC2'                                 => [ 'Kyocera', 'D304K' ],
+    'KCI1'                                 => [ 'Kyocera', '703G' ],
+    'KCI2'                                 => [ 'Kyocera', '702G' ],
+    'KCT1'                                 => [ 'Kyocera', 'TK01' ],
+    'KCT2'                                 => [ 'Kyocera', 'TK02' ],
+    'KCT3'                                 => [ 'Kyocera', 'TK02' ],
+    'KCT4'                                 => [ 'Kyocera', 'TK03' ],
+    'KCT5'                                 => [ 'Kyocera', 'TK04' ],
+    'KCT6'                                 => [ 'Kyocera', 'TK05' ],
+    'KCT7'                                 => [ 'Kyocera', 'TK11' ],
+    'KCT8'                                 => [ 'Kyocera', 'TK12' ],
+    'KCT9'                                 => [ 'Kyocera', 'TK21' ],
+    'KCTA'                                 => [ 'Kyocera', 'TK22' ],
+    'KCTB'                                 => [ 'Kyocera', 'TK23' ],
+    'KCTC'                                 => [ 'Kyocera', 'TK31' ],
+    'MA11'                                 => [ 'Panasonic', 'C308P' ],
+    'MA12'                                 => [ 'Panasonic', 'C308P' ],
+    'MA13'                                 => [ 'Panasonic', 'C408P' ],
+    'MA21'                                 => [ 'Panasonic', 'C3003P' ],
+    'MA31'                                 => [ 'Panasonic', 'W51P' ],
+    'MA32'                                 => [ 'Panasonic', 'W52P' ],
+    'MA33'                                 => [ 'Panasonic', 'W61P' ],
+    'MA34'                                 => [ 'Panasonic', 'W62P' ],
+    'MA35'                                 => [ 'Panasonic', 'P001' ],
+    'MAC1'                                 => [ 'Panasonic', 'D305P' ],
+    'MAC2'                                 => [ 'Panasonic', 'D305P' ],
+    'MAI1'                                 => [ 'Panasonic', '704G' ],
+    'MAI2'                                 => [ 'Panasonic', '704G' ],
+    'MAT1'                                 => [ 'Panasonic', 'TP01' ],
+    'MAT2'                                 => [ 'Panasonic', 'TP01' ],
+    'MAT3'                                 => [ 'Panasonic', 'TP11' ],
+    'MIT1'                                 => [ 'Mitsubishi', 'TD11' ],
+    'PT21'                                 => [ 'Pantech', 'A1405PT' ],
+    'PT23'                                 => [ 'Pantech', 'A1407PT' ],
+    'PT33'                                 => [ 'Pantech', 'W61PT' ],
+    'PT34'                                 => [ 'Pantech', 'W62PT' ],
+    'PT35'                                 => [ 'Pantech', 'NS02' ],
+    'PT36'                                 => [ 'Pantech', 'PT002' ],
+    'SA21'                                 => [ 'Sanyo', 'A3011SA' ],
+    'SA22'                                 => [ 'Sanyo', 'A3015SA' ],
+    'SA24'                                 => [ 'Sanyo', 'A1302SA' ],
+    'SA25'                                 => [ 'Sanyo', 'A1303SA' ],
+    'SA26'                                 => [ 'Sanyo', 'A5503SA' ],
+    'SA27'                                 => [ 'Sanyo', 'A5505SA' ],
+    'SA28'                                 => [ 'Sanyo', 'A1305SA' ],
+    'SA29'                                 => [ 'Sanyo', 'A5522SA' ],
+    'SA2A'                                 => [ 'Sanyo', 'A5527SA' ],
+    'SA31'                                 => [ 'Sanyo', 'W21SA' ],
+    'SA32'                                 => [ 'Sanyo', 'W22SA' ],
+    'SA33'                                 => [ 'Sanyo', 'W31SA' ],
+    'SA34'                                 => [ 'Sanyo', 'W32SA' ],
+    'SA35'                                 => [ 'Sanyo', 'W33SA' ],
+    'SA36'                                 => [ 'Sanyo', 'W41SA' ],
+    'SA37'                                 => [ 'Sanyo', 'E02SA' ],
+    'SA38'                                 => [ 'Sanyo', 'W43SA' ],
+    'SA39'                                 => [ 'Sanyo', 'W51SA' ],
+    'SA3A'                                 => [ 'Sanyo', 'W52SA' ],
+    'SA3B'                                 => [ 'Sanyo', 'W54SA' ],
+    'SA3C'                                 => [ 'Sanyo', 'W61SA' ],
+    'SA3D'                                 => [ 'Sanyo', 'W63SA' ],
+    'SA3E'                                 => [ 'Sanyo', 'W64SA' ],
+    'SY12'                                 => [ 'Sanyo', 'C401SA' ],
+    'SY13'                                 => [ 'Sanyo', 'C405SA' ],
+    'SY14'                                 => [ 'Sanyo', 'C412SA' ],
+    'SY15'                                 => [ 'Sanyo', 'C1001SA' ],
+    'SYC1'                                 => [ 'Sanyo', 'D301SA' ],
+    'SYT1'                                 => [ 'Sanyo', 'TS01' ],
+    'SYT2'                                 => [ 'Sanyo', 'TS02' ],
+    'SYT3'                                 => [ 'Sanyo', 'TS11' ],
+    'SYT4'                                 => [ 'Sanyo', 'TS31' ],
+    'SH31'                                 => [ 'Sharp', 'W41SH' ],
+    'SH32'                                 => [ 'Sharp', 'W51SH' ],
+    'SH33'                                 => [ 'Sharp', 'W52SH' ],
+    'SH34'                                 => [ 'Sharp', 'W61SH' ],
+    'SH35'                                 => [ 'Sharp', 'W62SH' ],
+    'SH36'                                 => [ 'Sharp', 'URBANO W63SH' ],
+    'SH37'                                 => [ 'Sharp', 'W64SH' ],
+    'SH38'                                 => [ 'Sharp', 'SH001' ],
+    'SH39'                                 => [ 'Sharp', 'E05SH' ],
+    'SH3A'                                 => [ 'Sharp', 'E06SH' ],
+    'SH3B'                                 => [ 'Sharp', 'SH002' ],
+    'SH3C'                                 => [ 'Sharp', 'Sportio water beat SHY01' ],
+    'SH3D'                                 => [ 'Sharp', 'SH003' ],
+    'SH3E'                                 => [ 'Sharp', 'SH004' ],
+    'SH3F'                                 => [ 'Sharp', 'SH005' ],
+    'SH3G'                                 => [ 'Sharp', 'SH006' ],
+    'SH3H'                                 => [ 'Sharp', 'SH007' ],
+    'SH3I'                                 => [ 'Sharp', 'SH008' ],
+    'SH3J'                                 => [ 'Sharp', 'SH009' ],
+    'SH3K'                                 => [ 'Sharp', 'SH010' ],
+    'SH3L'                                 => [ 'Sharp', 'SH011' ],
+    'SN11'                                 => [ 'Sony', 'C305S' ],
+    'SN13'                                 => [ 'Sony', 'C406S' ],
+    'SN14'                                 => [ 'Sony', 'C404S' ],
+    'SN15'                                 => [ 'Sony', 'C413S' ],
+    'SN16'                                 => [ 'Sony', 'C413S' ],
+    'SN17'                                 => [ 'Sony Ericsson', 'C1002S' ],
+    'SN21'                                 => [ 'Sony Ericsson', 'A3014S' ],
+    'SN22'                                 => [ 'Sony Ericsson', 'A1101S' ],
+    'SN23'                                 => [ 'Sony Ericsson', 'A1301S' ],
+    'SN24'                                 => [ 'Sony Ericsson', 'A5402S' ],
+    'SN25'                                 => [ 'Sony Ericsson', 'A5404S' ],
+    'SN26'                                 => [ 'Sony Ericsson', 'A1402S' ],
+    'SN27'                                 => [ 'Sony Ericsson', 'A1402S II' ],
+    'SN28'                                 => [ 'Sony Ericsson', 'A1402S II' ],
+    'SN29'                                 => [ 'Sony Ericsson', 'A1404S' ],
+    'SN31'                                 => [ 'Sony Ericsson', 'W21S' ],
+    'SN32'                                 => [ 'Sony Ericsson', 'W31S' ],
+    'SN33'                                 => [ 'Sony Ericsson', 'W32S' ],
+    'SN34'                                 => [ 'Sony Ericsson', 'W41S' ],
+    'SN35'                                 => [ 'Sony Ericsson', 'EZ FeliCa W32S' ],
+    'SN36'                                 => [ 'Sony Ericsson', 'W42S' ],
+    'SN37'                                 => [ 'Sony Ericsson', 'W43S' ],
+    'SN38'                                 => [ 'Sony Ericsson', 'W44S' ],
+    'SN39'                                 => [ 'Sony Ericsson', 'W51S' ],
+    'SN3A'                                 => [ 'Sony Ericsson', 'W52S' ],
+    'SN3B'                                 => [ 'Sony Ericsson', 'W53S' ],
+    'SN3C'                                 => [ 'Sony Ericsson', 'W54S' ],
+    'SN3D'                                 => [ 'Sony Ericsson', 'W61S' ],
+    'SN3E'                                 => [ 'Sony Ericsson', 'W62S' ],
+    'SN3F'                                 => [ 'Sony Ericsson', 're W63S' ],
+    'SN3G'                                 => [ 'Sony Ericsson', 'W64S' ],
+    'SN3H'                                 => [ 'Sony Ericsson', 'Xmini W65S' ],
+    'SN3I'                                 => [ 'Sony Ericsson', 'Premier3 SOY01' ],
+    'SN3J'                                 => [ 'Sony Ericsson', 'S001' ],
+    'SN3L'                                 => [ 'Sony Ericsson', 'BRAVIA Phone U1 SOY02' ],
+    'SN3M'                                 => [ 'Sony Ericsson', 'S002' ],
+    'SN3N'                                 => [ 'Sony Ericsson', 'URBANO BARONE SOY03' ],
+    'SN3O'                                 => [ 'Sony Ericsson', 'S003' ],
+    'SN3P'                                 => [ 'Sony Ericsson', 'S004' ],
+    'SN3Q'                                 => [ 'Sony Ericsson', 'S005' ],
+    'SN3R'                                 => [ 'Sony Ericsson', 'URBANO MOND SOY04' ],
+    'SN3S'                                 => [ 'Sony Ericsson', 'S006' ],
+    'SN3U'                                 => [ 'Sony Ericsson', 'S007' ],
+    'SN3V'                                 => [ 'Sony Ericsson', 'URBANO AFFARE SOY05' ],
+    'ST11'                                 => [ 'Sanyo', 'C403ST' ],
+    'ST12'                                 => [ 'Sanyo', 'C411ST' ],
+    'ST13'                                 => [ 'Sanyo', 'A1011ST' ],
+    'ST14'                                 => [ 'Sanyo', 'A1014ST' ],
+    'ST21'                                 => [ 'Sanyo', 'A5306ST' ],
+    'ST23'                                 => [ 'Sanyo', 'A5405SA' ],
+    'ST24'                                 => [ 'Sanyo', 'A5507SA' ],
+    'ST25'                                 => [ 'Sanyo', 'talby A5508SA' ],
+    'ST26'                                 => [ 'Sanyo', 'Sweets A5510SA' ],
+    'ST27'                                 => [ 'Sanyo', 'A5514SA' ],
+    'ST28'                                 => [ 'Sanyo', 'A5518SA' ],
+    'ST29'                                 => [ 'Sanyo', 'Sweets pure A5519SA' ],
+    'ST2A'                                 => [ 'Sanyo', 'A5520SA' ],
+    'ST2C'                                 => [ 'Sanyo', 'Sweets cute A5524SA' ],
+    'ST2D'                                 => [ 'Sanyo', 'A5525SA' ],
+    'ST31'                                 => [ 'Sanyo', 'W42SA' ],
+    'ST32'                                 => [ 'Sanyo', 'W53SA' ],
+    'ST34'                                 => [ 'Sanyo', 'W62SA' ],
+    'SY01'                                 => [ 'Sanyo', 'SCP-4000' ],
+    'SY02'                                 => [ 'Sanyo', 'SCP-4500' ],
+    'SY03'                                 => [ 'Sanyo', 'SCP-5000' ],
+    'SY11'                                 => [ 'Sanyo', 'C304SA' ],
+    'SY12'                                 => [ 'Sanyo', 'C401SA' ],
+    'SY13'                                 => [ 'Sanyo', 'C405SA' ],
+    'SY14'                                 => [ 'Sanyo', 'C412SA' ],
+    'SY15'                                 => [ 'Sanyo', 'C1001SA' ],
+    'TS01'                                 => [ 'Toshiba', 'IS02' ],
+    'TS11'                                 => [ 'Toshiba', 'C301T' ],
+    'TS12'                                 => [ 'Toshiba', 'C310T' ],
+    'TS13'                                 => [ 'Toshiba', 'C410T' ],
+    'TS14'                                 => [ 'Toshiba', 'C415T' ],
+    'TS21'                                 => [ 'Toshiba', 'C5001T' ],
+    'TS22'                                 => [ 'Toshiba', 'A3013T' ],
+    'TS23'                                 => [ 'Toshiba', 'A5301T' ],
+    'TS24'                                 => [ 'Toshiba', 'A5304T' ],
+    'TS25'                                 => [ 'Toshiba', 'A1304T' ],
+    'TS26'                                 => [ 'Toshiba', 'A5501T' ],
+    'TS27'                                 => [ 'Toshiba', 'A5504T' ],
+    'TS28'                                 => [ 'Toshiba', 'A5506T' ],
+    'TS29'                                 => [ 'Toshiba', 'A5509T' ],
+    'TS2A'                                 => [ 'Toshiba', 'A5511T' ],
+    'TS2B'                                 => [ 'Toshiba', 'A5516T' ],
+    'TS2C'                                 => [ 'Toshiba', 'A5517T' ],
+    'TS2D'                                 => [ 'Toshiba', 'A5523T' ],
+    'TS2E'                                 => [ 'Toshiba', 'A5529T' ],
+    'TS31'                                 => [ 'Toshiba', 'W21T' ],
+    'TS32'                                 => [ 'Toshiba', 'W31T' ],
+    'TS33'                                 => [ 'Toshiba', 'W32T' ],
+    'TS34'                                 => [ 'Toshiba', 'W41T' ],
+    'TS35'                                 => [ 'Toshiba', 'neon W42T' ],
+    'TS36'                                 => [ 'Toshiba', 'W43T' ],
+    'TS37'                                 => [ 'Toshiba', 'W44T' ],
+    'TS38'                                 => [ 'Toshiba', 'W45T' ],
+    'TS39'                                 => [ 'Toshiba', 'DRAPE W46T' ],
+    'TS3A'                                 => [ 'Toshiba', 'W47T' ],
+    'TS3B'                                 => [ 'Toshiba', 'W51T' ],
+    'TS3C'                                 => [ 'Toshiba', 'W52T' ],
+    'TS3D'                                 => [ 'Toshiba', 'W53T' ],
+    'TS3E'                                 => [ 'Toshiba', 'W54T' ],
+    'TS3G'                                 => [ 'Toshiba', 'W55T' ],
+    'TS3H'                                 => [ 'Toshiba', 'W56T' ],
+    'TS3I'                                 => [ 'Toshiba', 'W61T' ],
+    'TS3J'                                 => [ 'Toshiba', 'W62T' ],
+    'TS3K'                                 => [ 'Toshiba', 'Sportio W63T' ],
+    'TS3L'                                 => [ 'Toshiba', 'W64T' ],
+    'TS3M'                                 => [ 'Toshiba', 'W65T' ],
+    'TS3N'                                 => [ 'Toshiba', 'T001' ],
+    'TS3O'                                 => [ 'Toshiba', 'biblio TSY01' ],
+    'TS3P'                                 => [ 'Toshiba', 'T002' ],
+    'TS3R'                                 => [ 'Toshiba', 'T003' ],
+    'TS3S'                                 => [ 'Toshiba', 'T004' ],
+    'TS3T'                                 => [ 'Toshiba', 'E08T' ],
+    'TS3V'                                 => [ 'Toshiba', 'T005' ],
+    'TS3X'                                 => [ 'Toshiba', 'T006' ],
+    'TS3Y'                                 => [ 'Toshiba', 'T008' ],
+    'TS3Z'                                 => [ 'Toshiba', 'T007' ],
+    'TS41'                                 => [ 'Toshiba', 'E09F' ],
+    'TSC1'                                 => [ 'Toshiba', 'D302T' ],
+    'TSI1'                                 => [ 'Toshiba', '701G' ],
+    'TST1'                                 => [ 'Toshiba', 'TT01' ],
+    'TST2'                                 => [ 'Toshiba', 'TT02' ],
+    'TST3'                                 => [ 'Toshiba', 'TT03' ],
+    'TST4'                                 => [ 'Toshiba', 'TT11' ],
+    'TST5'                                 => [ 'Toshiba', 'TT21' ],
+    'TST6'                                 => [ 'Toshiba', 'TT22' ],
+    'TST7'                                 => [ 'Toshiba', 'TT31' ],
+];

+ 94 - 0
Qii/Library/Third/data/models-palmos.php

@@ -0,0 +1,94 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+use WhichBrowser\Constants\DeviceType;
+use WhichBrowser\Constants\DeviceSubType;
+
+DeviceModels::$PALMOS_MODELS = [
+    'Palm-D061'                             => [ 'Palm', 'Centro 685', DeviceType::MOBILE ],
+    'Palm-D062'                             => [ 'Palm', 'Centro 690', DeviceType::MOBILE ],
+    'Palm-TunX'                             => [ 'Palm', 'LifeDrive', DeviceType::PDA ],
+    'Palm-stuj'                             => [ 'Palm', 'm125', DeviceType::PDA ],
+    'Palm-hbbs'                             => [ 'Palm', 'm130', DeviceType::PDA ],
+    'Palm-trnd'                             => [ 'Palm', 'm500', DeviceType::PDA ],
+    'Palm-ecty'                             => [ 'Palm', 'm505', DeviceType::PDA ],
+    'Palm-lith'                             => [ 'Palm', 'm515', DeviceType::PDA ],
+    'Palm-sky1'                             => [ 'Palm', 'i705', DeviceType::PDA ],
+    'hspr-H101'                             => [ 'Palm', 'Treo 600', DeviceType::MOBILE ],
+    'hspr-H102'                             => [ 'Palm', 'Treo 650', DeviceType::MOBILE ],
+    'Palm-D053'                             => [ 'Palm', 'Treo 680', DeviceType::MOBILE ],
+    'Palm-D052'                             => [ 'Palm', 'Treo 700', DeviceType::MOBILE ],
+    'Palm-D060'                             => [ 'Palm', 'Treo 755', DeviceType::MOBILE ],
+    'Palm-MT64'                             => [ 'Palm', 'Tungsten C', DeviceType::PDA ],
+    'Palm-Cct1'                             => [ 'Palm', 'Tungsten E', DeviceType::PDA ],
+    'Palm-Zir4'                             => [ 'Palm', 'Tungsten E2', DeviceType::PDA ],
+    'Palm-Frg1'                             => [ 'Palm', 'Tungsten T', DeviceType::PDA ],
+    'Palm-Frg2'                             => [ 'Palm', 'Tungsten T2', DeviceType::PDA ],
+    'Palm-Arz1'                             => [ 'Palm', 'Tungsten T3', DeviceType::PDA ],
+    'Palm-TnT5'                             => [ 'Palm', 'Tungsten T5', DeviceType::PDA ],
+    'Palm-atc1'                             => [ 'Palm', 'Tungsten W', DeviceType::PDA ],
+    'Palm-D050'                             => [ 'Palm', 'TX', DeviceType::PDA ],
+    'Palm-Cubs'                             => [ 'Palm', 'Zire', DeviceType::PDA ],
+    'Palm-Zi21'                             => [ 'Palm', 'Zire 21', DeviceType::PDA ],
+    'Palm-D051'                             => [ 'Palm', 'Zire 22', DeviceType::PDA ],
+    'Palm-Zi22'                             => [ 'Palm', 'Zire 31', DeviceType::PDA ],
+    'Palm-Zpth'                             => [ 'Palm', 'Zire 71', DeviceType::PDA ],
+    'Palm-Zi72'                             => [ 'Palm', 'Zire 72', DeviceType::PDA ],
+
+    'sony-ystn'                             => [ 'Sony', 'CLIÉ PEG-N600C', DeviceType::PDA ],
+    'sony-ysmt'                             => [ 'Sony', 'CLIÉ PEG-N700C', DeviceType::PDA ],
+    'sony-ysm2'                             => [ 'Sony', 'CLIÉ PEG-N750C', DeviceType::PDA ],
+    'sony-nsca'                             => [ 'Sony', 'CLIÉ PEG-S320', DeviceType::PDA ],
+    'sony-nsc2'                             => [ 'Sony', 'CLIÉ PEG-S360', DeviceType::PDA ],
+    'sony-vnce'                             => [ 'Sony', 'CLIÉ PEG-T400', DeviceType::PDA ],
+    'sony-mdna'                             => [ 'Sony', 'CLIÉ PEG-T600C', DeviceType::PDA ],
+    'sony-npls'                             => [ 'Sony', 'CLIÉ PEG-T650C', DeviceType::PDA ],
+    'sony-rdwd'                             => [ 'Sony', 'CLIÉ PEG-NR70', DeviceType::PDA ],
+    'sony-crdb'                             => [ 'Sony', 'CLIÉ PEG-NX60', DeviceType::PDA ],
+    'sony-tldo'                             => [ 'Sony', 'CLIÉ PEG-NX73V', DeviceType::PDA ],
+    'sony-mdrd'                             => [ 'Sony', 'CLIÉ PEG-NX80V', DeviceType::PDA ],
+    'sony-grnd'                             => [ 'Sony', 'CLIÉ PEG-NZ90', DeviceType::PDA ],
+    'sony-frta'                             => [ 'Sony', 'CLIÉ PEG-SL10', DeviceType::PDA ],
+    'sony-cocs'                             => [ 'Sony', 'CLIÉ PEG-SL20', DeviceType::PDA ],
+    'sony-glps'                             => [ 'Sony', 'CLIÉ PEG-SJ22', DeviceType::PDA ],
+    'sony-mcnd'                             => [ 'Sony', 'CLIÉ PEG-SJ33', DeviceType::PDA ],
+    'sony-vrna'                             => [ 'Sony', 'CLIÉ PEG-TG50', DeviceType::PDA ],
+    'sony-atom'                             => [ 'Sony', 'CLIÉ PEG-TH55', DeviceType::PDA ],
+    'sony-goha'                             => [ 'Sony', 'CLIÉ PEG-TJ25', DeviceType::PDA ],
+    'sony-leia'                             => [ 'Sony', 'CLIÉ PEG-TJ27', DeviceType::PDA ],
+    'sony-hwai'                             => [ 'Sony', 'CLIÉ PEG-TJ30', DeviceType::PDA ],
+    'sony-goku'                             => [ 'Sony', 'CLIÉ PEG-TJ35', DeviceType::PDA ],
+    'sony-luke'                             => [ 'Sony', 'CLIÉ PEG-TJ37', DeviceType::PDA ],
+    'sony-amno'                             => [ 'Sony', 'CLIÉ PEG-UX40', DeviceType::PDA ],
+    'sony-prmr'                             => [ 'Sony', 'CLIÉ PEG-UX50', DeviceType::PDA ],
+    'sony-ancy'                             => [ 'Sony', 'CLIÉ PEG-VZ90', DeviceType::PDA ],
+
+    'smsn-phix'                             => [ 'Samsung', 'SPH-i300', DeviceType::MOBILE ],
+    'smsn-Phx2'                             => [ 'Samsung', 'SPH-i330', DeviceType::MOBILE ],
+    'smsn-blch'                             => [ 'Samsung', 'SPH-i500', DeviceType::MOBILE ],
+    'smsn-BLFM'                             => [ 'Samsung', 'SPH-i530', DeviceType::MOBILE ],
+    'smsn-glxy'                             => [ 'Samsung', 'SPH-i550', DeviceType::MOBILE ],
+
+    'grmn-3200'                             => [ 'Garmin', 'iQue 3200', DeviceType::GPS ],
+    'grmn-3600'                             => [ 'Garmin', 'iQue 3600', DeviceType::GPS ],
+    'grmn-3700'                             => [ 'Garmin', 'iQue 3600a', DeviceType::GPS ],
+
+    'trgp-trg1'                             => [ 'HandEra', 'TRG Pro', DeviceType::PDA ],
+    'trgp-trg2'                             => [ 'HandEra', '330', DeviceType::PDA ],
+
+    'qcom-qc20'                             => [ 'Kyocera', 'QCP-6035', DeviceType::MOBILE ],
+    'kwc.-7135'                             => [ 'Kyocera', 'QCP-7135', DeviceType::MOBILE ],
+
+    'Tpwv-Rdog'                             => [ 'Tapwave', 'Zodiac', [ DeviceType::GAMING, DeviceSubType::PORTABLE ] ],
+
+    'gsRl-zicn'                             => [ 'Group Sense', 'Xplore G18', DeviceType::MOBILE ],
+    'gsRl-zcn2'                             => [ 'Group Sense', 'Xplore M28', DeviceType::MOBILE ],
+    'gsRl-zcn5'                             => [ 'Group Sense', 'Xplore M68', DeviceType::MOBILE ],
+
+    'acer-momo'                             => [ 'Acer', 's10', DeviceType::PDA ],
+    'acer-coco'                             => [ 'Acer', 's50', DeviceType::PDA ],
+
+    'Acea-MZ01'                             => [ 'Aceeca', 'Meazura MEZ1000', DeviceType::PDA ],
+    'Acea-PD01'                             => [ 'Aceeca', 'PDA32', DeviceType::PDA ],
+];

+ 13 - 0
Qii/Library/Third/data/models-s30plus.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+use WhichBrowser\Constants\Flag;
+
+DeviceModels::$S30PLUS_MODELS = [
+    '215'                                       => [ 'Nokia', '215' ],
+    '220'                                       => [ 'Nokia', '220' ],
+    '222'                                       => [ 'Nokia', '222' ],
+    '225'                                       => [ 'Nokia', '225' ],
+    '230'                                       => [ 'Nokia', '230' ]
+];

+ 135 - 0
Qii/Library/Third/data/models-s40.php

@@ -0,0 +1,135 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$S40_MODELS = [
+    'C1-01!'                                    => [ 'Nokia', 'C1-01' ],
+    'C1-02!'                                    => [ 'Nokia', 'C1-02' ],
+    'C1-03!'                                    => [ 'Nokia', 'C1-03' ],
+    'C2-00!'                                    => [ 'Nokia', 'C2-00' ],
+    'C2-01!'                                    => [ 'Nokia', 'C2-01' ],
+    'C2-02!'                                    => [ 'Nokia', 'C2-02' ],
+    'C2-03!'                                    => [ 'Nokia', 'C2-03' ],
+    'C2-05!'                                    => [ 'Nokia', 'C2-05' ],
+    'C2-06!'                                    => [ 'Nokia', 'C2-06' ],
+    'C3-00!'                                    => [ 'Nokia', 'C3-00' ],
+    'C3-01!'                                    => [ 'Nokia', 'C3-01' ],
+    'X2-00!'                                    => [ 'Nokia', 'X2-00' ],
+    'X2-01!'                                    => [ 'Nokia', 'X2-01' ],
+    'X2-02!'                                    => [ 'Nokia', 'X2-02' ],
+    'X2-03!'                                    => [ 'Nokia', 'X2-03' ],
+    'X2-05!'                                    => [ 'Nokia', 'X2-05' ],
+    'X3-00!'                                    => [ 'Nokia', 'X3-00' ],
+    'X3-02!'                                    => [ 'Nokia', 'X3-02' ],
+    '109'                                       => [ 'Nokia', '109' ],
+    '110'                                       => [ 'Nokia', '110' ],
+    '111'                                       => [ 'Nokia', '111' ],
+    '111.1'                                     => [ 'Nokia', '111' ],
+    '112'                                       => [ 'Nokia', '112' ],
+    '114'                                       => [ 'Nokia', '114' ],
+    '200'                                       => [ 'Nokia', 'Asha 200' ],
+    '201'                                       => [ 'Nokia', 'Asha 201' ],
+    '202'                                       => [ 'Nokia', 'Asha 202' ],
+    '203'                                       => [ 'Nokia', 'Asha 203' ],
+    '205'                                       => [ 'Nokia', 'Asha 205' ],
+    '205.1'                                     => [ 'Nokia', 'Asha 205' ],
+    '205.3'                                     => [ 'Nokia', 'Asha 205' ],
+    '206'                                       => [ 'Nokia', 'Asha 206' ],
+    '206.1'                                     => [ 'Nokia', 'Asha 206' ],
+    '208'                                       => [ 'Nokia', '208' ],
+    '208.1'                                     => [ 'Nokia', '208' ],
+    '208.2'                                     => [ 'Nokia', '208' ],
+    '208.3'                                     => [ 'Nokia', '208' ],
+    '208.4'                                     => [ 'Nokia', '208' ],
+    '210'                                       => [ 'Nokia', 'Asha 210' ],
+    '210.2'                                     => [ 'Nokia', 'Asha 210' ],
+    '210.3'                                     => [ 'Nokia', 'Asha 210' ],
+    '210.4'                                     => [ 'Nokia', 'Asha 210' ],
+    '210.5'                                     => [ 'Nokia', 'Asha 210' ],
+    '300'                                       => [ 'Nokia', 'Asha 300' ],
+    '301'                                       => [ 'Nokia', '301' ],
+    '301.1'                                     => [ 'Nokia', '301' ],
+    '302'                                       => [ 'Nokia', 'Asha 302' ],
+    '303'                                       => [ 'Nokia', 'Asha 303' ],
+    '305'                                       => [ 'Nokia', 'Asha 305' ],
+    '306'                                       => [ 'Nokia', 'Asha 306' ],
+    '308'                                       => [ 'Nokia', 'Asha 308' ],
+    '309'                                       => [ 'Nokia', 'Asha 309' ],
+    '310'                                       => [ 'Nokia', 'Asha 310' ],
+    '311'                                       => [ 'Nokia', 'Asha 311' ],
+    '515'                                       => [ 'Nokia', '515' ],
+    '515.2'                                     => [ 'Nokia', '515' ],
+    '1682c'                                     => [ 'Nokia', '1682 classic' ],
+    '2055'                                      => [ 'Nokia', 'Asha 2055' ],
+    '2060'                                      => [ 'Nokia', '2060' ],                 // Same as Asha 206
+    '2220s!'                                    => [ 'Nokia', '2220 slide' ],
+    '2320c!'                                    => [ 'Nokia', '2320 classic' ],
+    '2322c!'                                    => [ 'Nokia', '2322 classic' ],
+    '2323c!'                                    => [ 'Nokia', '2323 classic' ],
+    '2330c!'                                    => [ 'Nokia', '2330 classic' ],
+    '2600c!'                                    => [ 'Nokia', '2600 classic' ],
+    '2680s!'                                    => [ 'Nokia', '2680 slide' ],
+    '2690'                                      => [ 'Nokia', '2690' ],
+    '2692'                                      => [ 'Nokia', '2692' ],
+    '2700c!'                                    => [ 'Nokia', '2700 classic' ],
+    '2710c'                                     => [ 'Nokia', '2710' ],
+    '2710c-2'                                   => [ 'Nokia', '2710' ],
+    '2720a!'                                    => [ 'Nokia', '2720 fold' ],
+    '2730c!'                                    => [ 'Nokia', '2730 classic' ],
+    '3020'                                      => [ 'Nokia', '3020' ],
+    '3109c'                                     => [ 'Nokia', '3109 classic' ],
+    '3110c'                                     => [ 'Nokia', '3110 Evolve' ],
+    '3120c'                                     => [ 'Nokia', '3120 classic' ],
+    '3120classic'                               => [ 'Nokia', '3120 classic' ],
+    '3208c'                                     => [ 'Nokia', '3208 classic' ],
+    '3500c'                                     => [ 'Nokia', '3500 classic' ],
+    '3555b'                                     => [ 'Nokia', '3555' ],
+    '3600s'                                     => [ 'Nokia', '3600 slide' ],
+    '3610a'                                     => [ 'Nokia', '3610 fold' ],
+    '3710fold'                                  => [ 'Nokia', '3710 fold' ],
+    '3720c'                                     => [ 'Nokia', '3720 classic' ],
+    '5000!'                                     => [ 'Nokia', '5000' ],
+    '5130!'                                     => [ 'Nokia', '5130 XpressMusic' ],
+    '5130c!'                                    => [ 'Nokia', '5130 classic' ],
+    '5132'                                      => [ 'Nokia', '5132 XpressMusic' ],
+    '5200!'                                     => [ 'Nokia', '5200' ],
+    '5220!'                                     => [ 'Nokia', '5220 XpressMusic' ],
+    '5300!'                                     => [ 'Nokia', '5300 XpressMusic' ],
+    '5310!'                                     => [ 'Nokia', '5310 XpressMusic' ],
+    '5330'                                      => [ 'Nokia', '5330 Mobile TV Edition' ],
+    '5330-1d'                                   => [ 'Nokia', '5330 Mobile TV Edition' ],
+    '5610d!'                                    => [ 'Nokia', '5610 XpressMusic' ],
+    '6070!'                                     => [ 'Nokia', '6070' ],
+    '6208c'                                     => [ 'Nokia', '6208 classic' ],
+    '6212c'                                     => [ 'Nokia', '6212 classic' ],
+    '6260s!'                                    => [ 'Nokia', '6260 slide' ],
+    '6230i!'                                    => [ 'Nokia', '6230i' ],
+    '6233'                                      => [ 'Nokia', '6233' ],
+    '6234'                                      => [ 'Nokia', '6234' ],
+    '6263!'                                     => [ 'Nokia', '6263' ],
+    '6280'                                      => [ 'Nokia', '6280' ],
+    '6300'                                      => [ 'Nokia', '6300' ],
+    '6300i'                                     => [ 'Nokia', '6300i' ],
+    '6301'                                      => [ 'Nokia', '6301' ],
+    '6303c'                                     => [ 'Nokia', '6303 classic' ],
+    '6303classic'                               => [ 'Nokia', '6303 classic' ],
+    '6303iclassic'                              => [ 'Nokia', '6303i classic' ],
+    '6303ci'                                    => [ 'Nokia', '6303i classic' ],
+    '6350'                                      => [ 'Nokia', '6350' ],
+    '6500s!'                                    => [ 'Nokia', '6500 slide' ],
+    '6600f!'                                    => [ 'Nokia', '6600 fold' ],
+    '6600s!'                                    => [ 'Nokia', '6600 slide' ],
+    '6600i!'                                    => [ 'Nokia', '6600i slide' ],
+    '6700c!'                                    => [ 'Nokia', '6700 classic' ],
+    '6750c'                                     => [ 'Nokia', '6750 Mural' ],
+    '7070!'                                     => [ 'Nokia', '7070 Prism' ],
+    '7100s!'                                    => [ 'Nokia', '7100 Supernova' ],
+    '7210s!'                                    => [ 'Nokia', '7210 Supernova' ],
+    '7210Supernova!'                            => [ 'Nokia', '7210 Supernova' ],
+    '7230!'                                     => [ 'Nokia', '7230' ],
+    '7310c!'                                    => [ 'Nokia', '7310 Supernova' ],
+    '7500'                                      => [ 'Nokia', '7500 Prism' ],
+    '7510Supernova!'                            => [ 'Nokia', '7510 Supernova' ],
+    '7610Supernova!'                            => [ 'Nokia', '7610 Supernova' ],
+    '8800!'                                     => [ 'Nokia', '8800 Arte' ]
+];

+ 182 - 0
Qii/Library/Third/data/models-symbian.php

@@ -0,0 +1,182 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+use WhichBrowser\Constants\Flag;
+
+DeviceModels::$SYMBIAN_MODELS = [
+    'BenQ P30'                                  => [ 'BenQ', 'P30', 'flag' => Flag::UIQ ],
+    'BenQ P31'                                  => [ 'BenQ', 'P31', 'flag' => Flag::UIQ ],
+    'RIZR-Z8'                                   => [ 'Motorola', 'RIZR Z8', 'flag' => Flag::UIQ ],
+    'RIZR-Z10'                                  => [ 'Motorola', 'RIZR Z10', 'flag' => Flag::UIQ ],
+    'A920'                                      => [ 'Motorola', 'A920', 'flag' => Flag::UIQ ],
+    'A925'                                      => [ 'Motorola', 'A925', 'flag' => Flag::UIQ ],
+    'A1000'                                     => [ 'Motorola', 'A1000', 'flag' => Flag::UIQ ],
+    'M1000'                                     => [ 'Motorola', 'M1000', 'flag' => Flag::UIQ, 'carrier' => 'DoCoMo' ],
+    'G700'                                      => [ 'Sony Ericsson', 'G700', 'flag' => Flag::UIQ ],
+    'G900'                                      => [ 'Sony Ericsson', 'G900', 'flag' => Flag::UIQ ],
+    'M600i'                                     => [ 'Sony Ericsson', 'M600', 'flag' => Flag::UIQ ],
+    'P910i'                                     => [ 'Sony Ericsson', 'P910', 'flag' => Flag::UIQ ],
+    'P990i'                                     => [ 'Sony Ericsson', 'P990', 'flag' => Flag::UIQ ],
+    'P1i'                                       => [ 'Sony Ericsson', 'P1', 'flag' => Flag::UIQ ],
+    'W950i'                                     => [ 'Sony Ericsson', 'W950', 'flag' => Flag::UIQ ],
+    'W960i'                                     => [ 'Sony Ericsson', 'W960', 'flag' => Flag::UIQ ],
+
+    'LG KS10'                                   => [ 'LG', 'KS10 Joy', 'flag' => Flag::S60 ],
+    'LGKT610'                                   => [ 'LG', 'KT610', 'flag' => Flag::S60 ],
+    'LGKT615'                                   => [ 'LG', 'KT615', 'flag' => Flag::S60 ],
+    'C5-00!'                                    => [ 'Nokia', 'C5-00', 'flag' => Flag::S60 ],
+    'C5-01'                                     => [ 'Nokia', 'C5-01', 'flag' => Flag::S60 ],
+    'C5-03!'                                    => [ 'Nokia', 'C5-03', 'flag' => Flag::S60 ],
+    'C5-04'                                     => [ 'Nokia', 'C5-04', 'flag' => Flag::S60 ],
+    'C5-05'                                     => [ 'Nokia', 'C5-05', 'flag' => Flag::S60 ],
+    'C5-06'                                     => [ 'Nokia', 'C5-06', 'flag' => Flag::S60 ],
+    'C6-00!'                                    => [ 'Nokia', 'C6-00', 'flag' => Flag::S60 ],
+    'C6-01!'                                    => [ 'Nokia', 'C6-01', 'flag' => Flag::S60 ],
+    'C7-00!'                                    => [ 'Nokia', 'C7-00', 'flag' => Flag::S60 ],
+    'E5-00!'                                    => [ 'Nokia', 'E5-00', 'flag' => Flag::S60 ],
+    'E6'                                        => [ 'Nokia', 'E6-00', 'flag' => Flag::S60 ],
+    'E6-00'                                     => [ 'Nokia', 'E6-00', 'flag' => Flag::S60 ],
+    'E7-00'                                     => [ 'Nokia', 'E7-00', 'flag' => Flag::S60 ],
+    'N8-00'                                     => [ 'Nokia', 'N8-00', 'flag' => Flag::S60 ],
+    'T7-00'                                     => [ 'Nokia', 'T7-00', 'flag' => Flag::S60 ],
+    'X5-00'                                     => [ 'Nokia', 'X5-00', 'flag' => Flag::S60 ],
+    'X5-01'                                     => [ 'Nokia', 'X5-01', 'flag' => Flag::S60 ],
+    'X6-00!'                                    => [ 'Nokia', 'X6-00', 'flag' => Flag::S60 ],
+    'X7-00!'                                    => [ 'Nokia', 'X7-00', 'flag' => Flag::S60 ],
+    'N-Gage'                                    => [ 'Nokia', 'N-Gage', 'flag' => Flag::S60 ],
+    'N-GageQD'                                  => [ 'Nokia', 'N-Gage QD', 'flag' => Flag::S60 ],
+    'E50(-[1-9])?$!'                            => [ 'Nokia', 'E50', 'flag' => Flag::S60 ],
+    'E51(-[1-9])?$!'                            => [ 'Nokia', 'E51', 'flag' => Flag::S60 ],
+    'E52(-[1-9])?$!'                            => [ 'Nokia', 'E52', 'flag' => Flag::S60 ],
+    'E55(-[1-9])?$!'                            => [ 'Nokia', 'E55', 'flag' => Flag::S60 ],
+    'E60(-[1-9])?$!'                            => [ 'Nokia', 'E60', 'flag' => Flag::S60 ],
+    'E61i!'                                     => [ 'Nokia', 'E61i', 'flag' => Flag::S60 ],
+    'E61(-[1-9])?$!'                            => [ 'Nokia', 'E61', 'flag' => Flag::S60 ],
+    'E62(-[1-9])?$!'                            => [ 'Nokia', 'E62', 'flag' => Flag::S60 ],
+    'E63(-[1-9])?$!'                            => [ 'Nokia', 'E63', 'flag' => Flag::S60 ],
+    'E65(-[1-9])?$!'                            => [ 'Nokia', 'E65', 'flag' => Flag::S60 ],
+    'E66(-[1-9])?$!'                            => [ 'Nokia', 'E66', 'flag' => Flag::S60 ],
+    'E70(-[1-9])?$!'                            => [ 'Nokia', 'E70', 'flag' => Flag::S60 ],
+    'E71x'                                      => [ 'Nokia', 'E71x', 'flag' => Flag::S60 ],
+    'E71(-[1-9])?$!'                            => [ 'Nokia', 'E71', 'flag' => Flag::S60 ],
+    'E72(-[1-9])?$!'                            => [ 'Nokia', 'E72', 'flag' => Flag::S60 ],
+    'E73(-[1-9])?$!'                            => [ 'Nokia', 'E73 Mode', 'flag' => Flag::S60 ],
+    'E75(-[1-9])?$!'                            => [ 'Nokia', 'E75', 'flag' => Flag::S60 ],
+    'E90(-[1-9])?$!'                            => [ 'Nokia', 'E90 Communicator', 'flag' => Flag::S60 ],
+    'E-90-1'                                    => [ 'Nokia', 'E90 Communicator', 'flag' => Flag::S60 ],
+    'N70(-[1-9])?$!'                            => [ 'Nokia', 'N70', 'flag' => Flag::S60 ],
+    'N71(-[1-9])?$!'                            => [ 'Nokia', 'N71', 'flag' => Flag::S60 ],
+    'N72(-[1-9])?$!'                            => [ 'Nokia', 'N72', 'flag' => Flag::S60 ],
+    'N73(-[1-9])?$!'                            => [ 'Nokia', 'N73', 'flag' => Flag::S60 ],
+    'N75(-[1-9])?$!'                            => [ 'Nokia', 'N75', 'flag' => Flag::S60 ],
+    'N76(-[1-9])?$!'                            => [ 'Nokia', 'N76', 'flag' => Flag::S60 ],
+    'N77(-[1-9])?$!'                            => [ 'Nokia', 'N77', 'flag' => Flag::S60 ],
+    'N78(-[1-9])?$!'                            => [ 'Nokia', 'N78', 'flag' => Flag::S60 ],
+    'N79(-[1-9])?$!'                            => [ 'Nokia', 'N79', 'flag' => Flag::S60 ],
+    'N80(-[1-9])?$!'                            => [ 'Nokia', 'N80', 'flag' => Flag::S60 ],
+    'N81(-[1-9])?$!'                            => [ 'Nokia', 'N81', 'flag' => Flag::S60 ],
+    'Nokia N81'                                 => [ 'Nokia', 'N81', 'flag' => Flag::S60 ],
+    'Nokia N81 8GB'                             => [ 'Nokia', 'N81 8GB', 'flag' => Flag::S60 ],
+    'N82(-[1-9])?$!'                            => [ 'Nokia', 'N82', 'flag' => Flag::S60 ],
+    'N85(-[1-9])?$!'                            => [ 'Nokia', 'N85', 'flag' => Flag::S60 ],
+    'N86(-[1-9])?$!'                            => [ 'Nokia', 'N86 8MP', 'flag' => Flag::S60 ],
+    'N86 ?8MP$!'                                => [ 'Nokia', 'N86 8MP', 'flag' => Flag::S60 ],
+    'N90(-[1-9])?$!'                            => [ 'Nokia', 'N90', 'flag' => Flag::S60 ],
+    'N91(-[1-9])?$!'                            => [ 'Nokia', 'N91', 'flag' => Flag::S60 ],
+    'N92(-[1-9])?$!'                            => [ 'Nokia', 'N92', 'flag' => Flag::S60 ],
+    'N93(-[1-9])?$!'                            => [ 'Nokia', 'N93', 'flag' => Flag::S60 ],
+    'N93i'                                      => [ 'Nokia', 'N93i', 'flag' => Flag::S60 ],
+    'N95(-[1-9])?$!'                            => [ 'Nokia', 'N95', 'flag' => Flag::S60 ],
+    'N95[ -]8GB(-[1-9])?!'                      => [ 'Nokia', 'N95 8GB', 'flag' => Flag::S60 ],
+    'N96(-[1-9])?$!'                            => [ 'Nokia', 'N96', 'flag' => Flag::S60 ],
+    'N97(-[1-3])?$!'                            => [ 'Nokia', 'N97', 'flag' => Flag::S60 ],
+    'N97i'                                      => [ 'Nokia', 'N97', 'flag' => Flag::S60 ],
+    'N97(-[4-5])?$!'                            => [ 'Nokia', 'N97 Mini', 'flag' => Flag::S60 ],
+    'N97 ?mini!'                                => [ 'Nokia', 'N97 Mini', 'flag' => Flag::S60 ],
+    '500'                                       => [ 'Nokia', '500', 'flag' => Flag::S60 ],
+    '600'                                       => [ 'Nokia', '600', 'flag' => Flag::S60 ],
+    '603'                                       => [ 'Nokia', '603', 'flag' => Flag::S60 ],
+    '700'                                       => [ 'Nokia', '700', 'flag' => Flag::S60 ],
+    '701'                                       => [ 'Nokia', '701', 'flag' => Flag::S60 ],
+    '702T'                                      => [ 'Nokia', '702T', 'flag' => Flag::S60 ],
+    '801T'                                      => [ 'Nokia', '801T', 'flag' => Flag::S60 ],
+    '808'                                       => [ 'Nokia', '808 PureView', 'flag' => Flag::S60 ],
+    '808PureView'                               => [ 'Nokia', '808 PureView', 'flag' => Flag::S60 ],
+    '808 PureView'                              => [ 'Nokia', '808 PureView', 'flag' => Flag::S60 ],
+    '3230'                                      => [ 'Nokia', '3230', 'flag' => Flag::S60 ],
+    '3250'                                      => [ 'Nokia', '3250', 'flag' => Flag::S60 ],
+    '3650'                                      => [ 'Nokia', '3650', 'flag' => Flag::S60 ],
+    '3660'                                      => [ 'Nokia', '3660', 'flag' => Flag::S60 ],
+    '5228'                                      => [ 'Nokia', '5228', 'flag' => Flag::S60 ],
+    '5233!'                                     => [ 'Nokia', '5228', 'flag' => Flag::S60 ],                     // The 5233 is known as 5228
+    'N5233!'                                    => [ 'Nokia', '5228', 'flag' => Flag::S60 ],                     // The 5233 is known as 5228
+    '5230!'                                     => [ 'Nokia', '5230', 'flag' => Flag::S60 ],
+    '5232'                                      => [ 'Nokia', '5232', 'flag' => Flag::S60 ],
+    '5235!'                                     => [ 'Nokia', '5235 Ovi Music Unlimited', 'flag' => Flag::S60 ],
+    '5236'                                      => [ 'Nokia', '5236', 'flag' => Flag::S60 ],
+    '5238'                                      => [ 'Nokia', '5238', 'flag' => Flag::S60 ],
+    '5250'                                      => [ 'Nokia', '5250', 'flag' => Flag::S60 ],
+    '5320!'                                     => [ 'Nokia', '5320 XpressMusic', 'flag' => Flag::S60 ],
+    '5500d!'                                    => [ 'Nokia', '5500 Sport', 'flag' => Flag::S60 ],
+    '5530!'                                     => [ 'Nokia', '5530 XpressMusic', 'flag' => Flag::S60 ],
+    '5630!'                                     => [ 'Nokia', '5630 XpressMusic', 'flag' => Flag::S60 ],
+    '5700!'                                     => [ 'Nokia', '5700 XpressMusic', 'flag' => Flag::S60 ],
+    '5730!'                                     => [ 'Nokia', '5730 XpressMusic', 'flag' => Flag::S60 ],
+    '5800!'                                     => [ 'Nokia', '5800 XpressMusic', 'flag' => Flag::S60 ],
+    '6110Navigator'                             => [ 'Nokia', '6110 Navigator', 'flag' => Flag::S60 ],
+    '6120c!'                                    => [ 'Nokia', '6120 classic', 'flag' => Flag::S60 ],
+    '6121c!'                                    => [ 'Nokia', '6121 classic', 'flag' => Flag::S60 ],
+    '6122c!'                                    => [ 'Nokia', '6124 classic', 'flag' => Flag::S60 ],             // The 6122 is known as 6124
+    '6124c'                                     => [ 'Nokia', '6124 classic', 'flag' => Flag::S60 ],
+    '6210 ?Navigator!'                          => [ 'Nokia', '6210 Navigator', 'flag' => Flag::S60 ],
+    '6220c!'                                    => [ 'Nokia', '6220 classic', 'flag' => Flag::S60 ],
+    '6260'                                      => [ 'Nokia', '6260', 'flag' => Flag::S60 ],
+    '6290!'                                     => [ 'Nokia', '6290', 'flag' => Flag::S60 ],
+    '6600'                                      => [ 'Nokia', '6600', 'flag' => Flag::S60 ],
+    '6630'                                      => [ 'Nokia', '6630', 'flag' => Flag::S60 ],
+    '6650d!'                                    => [ 'Nokia', '6650 fold', 'flag' => Flag::S60 ],
+    '6670'                                      => [ 'Nokia', '6670', 'flag' => Flag::S60 ],
+    '6680'                                      => [ 'Nokia', '6680', 'flag' => Flag::S60 ],
+    '6681'                                      => [ 'Nokia', '6681', 'flag' => Flag::S60 ],
+    '6700s'                                     => [ 'Nokia', '6700 slide', 'flag' => Flag::S60 ],
+    '6700s-1c'                                  => [ 'Nokia', '6700 slide', 'flag' => Flag::S60 ],
+    '6708'                                      => [ 'Nokia', '6708', 'flag' => Flag::UIQ ],
+    '6710s'                                     => [ 'Nokia', '6710 Navigator', 'flag' => Flag::S60 ],
+    '6720c!'                                    => [ 'Nokia', '6720 classic', 'flag' => Flag::S60 ],
+    '6730c!'                                    => [ 'Nokia', '6730 classic', 'flag' => Flag::S60 ],
+    '6760s!'                                    => [ 'Nokia', '6760 slide', 'flag' => Flag::S60 ],
+    '6788'                                      => [ 'Nokia', '6788', 'flag' => Flag::S60 ],
+    '6788i'                                     => [ 'Nokia', '6788i', 'flag' => Flag::S60 ],
+    '6790s-1b!'                                 => [ 'Nokia', '6790 Surge', 'flag' => Flag::S60 ],
+    '6790s-1c!'                                 => [ 'Nokia', '6790 slide', 'flag' => Flag::S60 ],
+    '7610'                                      => [ 'Nokia', '7610', 'flag' => Flag::S60 ],
+    '7650'                                      => [ 'Nokia', '7650', 'flag' => Flag::S60 ],
+    '7660'                                      => [ 'Nokia', '7660', 'flag' => Flag::S60 ],
+    'Oro'                                       => [ 'Nokia', 'Oro', 'flag' => Flag::S60 ],
+    'Panasonic-X700'                            => [ 'Panasonic', 'X700', 'flag' => Flag::S60 ],
+    'Panasonic-X800'                            => [ 'Panasonic', 'X800', 'flag' => Flag::S60 ],
+    'I7710'                                     => [ 'Samsung', 'GT-I7710', 'flag' => Flag::S60 ],
+    'I8510'                                     => [ 'Samsung', 'INNOV8', 'flag' => Flag::S60 ],
+    'I8910'                                     => [ 'Samsung', 'Omnia HD', 'flag' => Flag::S60 ],
+    'SGH-D720'                                  => [ 'Samsung', 'D720', 'flag' => Flag::S60 ],
+    'SGH-D728'                                  => [ 'Samsung', 'D728', 'flag' => Flag::S60 ],
+    'SGH-D730'                                  => [ 'Samsung', 'D730', 'flag' => Flag::S60 ],
+    'SGH-i400!'                                 => [ 'Samsung', 'i400', 'flag' => Flag::S60 ],
+    'SGH-i408!'                                 => [ 'Samsung', 'i408', 'flag' => Flag::S60 ],
+    'SGH-i450!'                                 => [ 'Samsung', 'i450', 'flag' => Flag::S60 ],
+    'SGH-i455!'                                 => [ 'Samsung', 'i455', 'flag' => Flag::S60 ],
+    'SGH-i458!'                                 => [ 'Samsung', 'i458', 'flag' => Flag::S60 ],
+    'SGH-i520!'                                 => [ 'Samsung', 'i520', 'flag' => Flag::S60 ],
+    'SGH-i550!'                                 => [ 'Samsung', 'i550', 'flag' => Flag::S60 ],
+    'SGH-i560!'                                 => [ 'Samsung', 'i560', 'flag' => Flag::S60 ],
+    'SGH-i568!'                                 => [ 'Samsung', 'i568', 'flag' => Flag::S60 ],
+    'SGH-i570!'                                 => [ 'Samsung', 'i570', 'flag' => Flag::S60 ],
+    'SGH-G810'                                  => [ 'Samsung', 'G810', 'flag' => Flag::S60 ],
+    'U'                                         => [ 'Sony Ericsson', 'Satio', 'flag' => Flag::S60 ],
+    '(?i)U1(a|i|iv)?$!'                         => [ 'Sony Ericsson', 'Satio', 'flag' => Flag::S60 ],
+    '(?i)U5(a|i|iv)?$!'                         => [ 'Sony Ericsson', 'Vivaz', 'flag' => Flag::S60 ],
+    '(?i)U8(a|i)?$!'                            => [ 'Sony Ericsson', 'Vivaz Pro', 'flag' => Flag::S60 ],
+    'ConstellationT'                            => [ 'Vertu', 'Constellation T', 'flag' => Flag::S60 ],
+    'ConstellationQuest'                        => [ 'Vertu', 'Constellation Quest', 'flag' => Flag::S60 ],
+];

+ 52 - 0
Qii/Library/Third/data/models-tizen.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+use WhichBrowser\Constants\DeviceType;
+
+DeviceModels::$TIZEN_MODELS = [
+    'Baltic'                                    => [ 'Samsung', '"Baltic"' ],
+    'SM-HIGGS'                                  => [ 'Samsung', '"Higgs"' ],
+    'KIRAN'                                     => [ 'Samsung', 'Z1' ],
+    'GT-I8800!'                                 => [ 'Samsung', '"Melius"' ],
+    'GT-I8805!'                                 => [ 'Samsung', '"Redwood"' ],
+    'GT-I9500!'                                 => [ 'Samsung', 'GT-I9500 prototype' ],
+    'SGH-N099'                                  => [ 'Samsung', 'SGH-N099 prototype' ],
+    '(ARMV7 )?SM-Z9005!'                        => [ 'Samsung', 'SM-Z9005 prototype' ],
+    'Mobile-RD-PQ'                              => [ 'Samsung', 'RD-PQ prototype' ],
+    'TM1'                                       => [ 'Samsung', 'TM1 prototype' ],
+    'SM-Z130!'                                  => [ 'Samsung', 'Z1' ],
+    'TIZEN SM-Z130!'                            => [ 'Samsung', 'Z1' ],
+    'SM-Z200!'                                  => [ 'Samsung', 'Z2' ],
+    'SM-Z300!'                                  => [ 'Samsung', 'Z3' ],
+    'TIZEN SM-Z300!'                            => [ 'Samsung', 'Z3' ],
+    'SM-Z500!'                                  => [ 'Samsung', 'SM-Z500' ],
+    'SM-Z700!'                                  => [ 'Samsung', 'SM-Z700' ],
+    'SM-Z900!'                                  => [ 'Samsung', 'Z' ],
+    'SM-Z910!'                                  => [ 'Samsung', 'Z' ],
+    'Z3 Z910F'                                  => [ 'Samsung', 'Z' ],
+    'SEC SC-001'                                => [ 'Samsung', 'SC-001 prototype' ],
+    'SEC SC-03F'                                => [ 'Samsung', 'ZeQ' ],                        // Unreleased version for DoCoMo
+    'SC-03F'                                    => [ 'Samsung', 'ZeQ' ],                        // Unreleased version for DoCoMo
+
+    'SM-G870F0'                                 => [ 'Samsung', 'Galaxy S5 Active' ],
+
+    'SM-R720!'                                  => [ 'Samsung', 'Gear S2', DeviceType::WATCH ],
+    'SM-R730!'                                  => [ 'Samsung', 'Gear S2', DeviceType::WATCH ],
+    'SM-R750!'                                  => [ 'Samsung', 'Gear S', DeviceType::WATCH ],
+    'SM-R760!'                                  => [ 'Samsung', 'Gear S3', DeviceType::WATCH ],
+    'SM-R765!'                                  => [ 'Samsung', 'Gear S3', DeviceType::WATCH ],
+
+    'NX300'                                     => [ 'Samsung', 'NX300', DeviceType::CAMERA ],
+
+    'FamilyHub'                                 => [ 'Samsung', 'Family Hub', DeviceType::APPLIANCE ],
+
+    'hawkp'                                     => [ 'Samsung', '"Hawkp"', DeviceType::TELEVISION ],
+
+    'xu3'                                       => [ 'Hardkernel', 'ODROID-XU3 developer board' ],
+
+    'sdk'                                       => [ null, null, DeviceType::EMULATOR ],
+    'Emulator'                                  => [ null, null, DeviceType::EMULATOR ],
+    'Mobile-Emulator'                           => [ null, null, DeviceType::EMULATOR ],
+    'TIZEN Emulator'                            => [ null, null, DeviceType::EMULATOR ],
+];

+ 46 - 0
Qii/Library/Third/data/models-touchwiz.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+DeviceModels::$TOUCHWIZ_MODELS = [
+    'GT-B5310!'                                 => [ 'Samsung', 'Corby Pro' ],
+    'GT-B3410'                                  => [ 'Samsung', 'Star Qwerty' ],
+    'GT-B7722'                                  => [ 'Samsung', 'Star Duos' ],
+    'GT-C3262'                                  => [ 'Samsung', 'Champ Neo Duos' ],
+    'GT-C33(00|03)!'                            => [ 'Samsung', 'Champ' ],
+    'GT-C3312R'                                 => [ 'Samsung', 'Rex 60' ],
+    'GT-C3312!'                                 => [ 'Samsung', 'Champ Deluxe Duos' ],
+    'GT-C3330'                                  => [ 'Samsung', 'Champ 2' ],
+    'GT-C6712'                                  => [ 'Samsung', 'Star II Duos' ],
+    'GT-E2652!'                                 => [ 'Samsung', 'Champ Duos' ],
+    'GT-I6230!'                                 => [ 'Samsung', 'Star TV' ],
+    'GT-I6712!'                                 => [ 'Samsung', 'Duos TV' ],
+    'GT-M3710'                                  => [ 'Samsung', 'Corby Beat' ],
+    'GT-M5650'                                  => [ 'Samsung', 'Lindy' ],
+    'GT-S3370!'                                 => [ 'Samsung', 'Corby 3G' ],
+    'GT-S36(50|53)!'                            => [ 'Samsung', 'Corby' ],
+    'GT-S3770!'                                 => [ 'Samsung', 'Champ 3G' ],
+    'GT-S38(00|02)!'                            => [ 'Samsung', 'Rex 70' ],
+    'GT-S3850'                                  => [ 'Samsung', 'Corby II' ],
+    'GT-S5220'                                  => [ 'Samsung', 'Star 3' ],
+    'GT-S5222R'                                 => [ 'Samsung', 'Rex 80' ],
+    'GT-S5222'                                  => [ 'Samsung', 'Star 3 Duos' ],
+    'GT-S52(30|33)!'                            => [ 'Samsung', 'Star' ],
+    'GT-S5260P'                                 => [ 'Samsung', 'Player City' ],
+    'GT-S52(60|63)!'                            => [ 'Samsung', 'Star II' ],
+    'GT-S5292R'                                 => [ 'Samsung', 'Rex 90' ],
+    'GT-S5292'                                  => [ 'Samsung', 'Star Deluxe Duos' ],
+    'GT-S5560!'                                 => [ 'Samsung', 'Marvel' ],
+    'GT-S5600'                                  => [ 'Samsung', 'Preston' ],
+    'GT-S5603'                                  => [ 'Samsung', 'Star 3G' ],
+    'GT-S5620!'                                 => [ 'Samsung', 'Monte' ],
+    'GT-S5680'                                  => [ 'Samsung', 'GT-S5680' ],
+    'GT-S7550'                                  => [ 'Samsung', 'Blue Earth' ],
+    'S80(00|03)!'                               => [ 'Samsung', 'Jet' ],
+    'GT-S8000c'                                 => [ 'Samsung', 'Jet' ],
+    'GT-S8003'                                  => [ 'Samsung', 'Jet' ],
+    'SGH-A597'                                  => [ 'Samsung', 'Eternity II' ],
+    'SGH-F480'                                  => [ 'Samsung', 'Tocco' ],
+    'SGH-F480I'                                 => [ 'Samsung', 'Tocco' ],
+    'SGH-T528g'                                 => [ 'Samsung', 'Straight Talk' ]
+];

+ 322 - 0
Qii/Library/Third/data/models-wm.php

@@ -0,0 +1,322 @@
+<?php
+
+namespace WhichBrowser\Data;
+
+use WhichBrowser\Constants\DeviceType;
+
+DeviceModels::$WM_MODELS = [
+    'DX900'                                     => [ 'Acer', 'Tempo DX900' ],
+    'E100'                                      => [ 'Acer', 'beTouch E100' ],
+    'F900'                                      => [ 'Acer', 'Tempo F900' ],
+    'S200'                                      => [ 'Acer', 'neoTouch S200' ],
+    'P400'                                      => [ 'Acer', 'neoTouch P400' ],
+    '-GalaxyII'                                 => [ 'Asus', 'Galaxy II' ],
+    '-GalaxyMini'                               => [ 'Asus', 'Galaxy Mini' ],
+    'M530w!'                                    => [ 'Asus', 'M530w' ],
+    'M930!'                                     => [ 'Asus', 'M930' ],
+    '-P525!'                                    => [ 'Asus', 'P525' ],
+    '-P526!'                                    => [ 'Asus', 'P526' ],
+    '-P527!'                                    => [ 'Asus', 'P527' ],
+    'P550'                                      => [ 'Asus', 'P550' ],
+    '-P552w!'                                   => [ 'Asus', 'P552w' ],
+    '-P552!'                                    => [ 'Asus', 'P552' ],
+    '-P565!'                                    => [ 'Asus', 'P565' ],
+    '-P735!'                                    => [ 'Asus', 'P735' ],
+    'P750'                                      => [ 'Asus', 'P750' ],
+    'Bird T900'                                 => [ 'Bird', 'T900' ],
+    'Coolpad F800'                              => [ 'Coolpad', 'F800' ],
+    'Datalogic Memor'                           => [ 'Datalogic', 'Memor' ],
+    'Dopod838Pro'                               => [ 'Dopod', '838 Pro' ],
+    'CHT 9100!'                                 => [ 'Dopod', 'CHT 9100' ],
+    'DopodD810'                                 => [ 'Dopod', 'D810' ],
+    'dopod-S900c'                               => [ 'Dopod', 'S900' ],
+    'T5388'                                     => [ 'Dopod', 'T5388' ],
+    'dopodT5588'                                => [ 'Dopod', 'T5588' ],
+    'dopodT8388'                                => [ 'Dopod', 'T8388' ],
+    'dopodT8588'                                => [ 'Dopod', 'T8588' ],
+    'garmin-asus-Nuvifone-M10'                  => [ 'Garmin-Asus', 'Nuvifone M10' ],
+    'Nuvifone-M10'                              => [ 'Garmin-Asus', 'Nuvifone M10' ],
+    'Nuvifone-M20'                              => [ 'Garmin-Asus', 'Nuvifone M20' ],
+    'GIGABYTE-MS800'                            => [ 'Gigabyte', 'GSmart MS800' ],
+    'HP iPAQ 510'                               => [ 'HP', 'iPAQ 510' ],
+    'HPiPAQ510!'                                => [ 'HP', 'iPAQ 510' ],
+    'HPiPAQ610'                                 => [ 'HP', 'iPAQ 610' ],
+    'HPiPAQ910!'                                => [ 'HP', 'iPAQ 910' ],
+    'HP iPAQ h6300'                             => [ 'HP', 'iPAQ h6300' ],
+    'HP iPAQ hw6500!'                           => [ 'HP', 'iPAQ hw6500' ],
+    'HPiPAQhw6900!'                             => [ 'HP', 'iPAQ hw6900' ],
+    'HPiPAQrw6800!'                             => [ 'HP', 'iPAQ rw6800' ],
+    'HPiPAQrw6815!'                             => [ 'HP', 'iPAQ rw6815' ],
+    'HPiPAQDataMessenger!'                      => [ 'HP', 'iPAQ Data Messenger' ],
+    'HPiPAQVoiceMessenger!'                     => [ 'HP', 'iPAQ Voice Messenger' ],
+    'HPiPAQGlisten'                             => [ 'HP', 'iPAQ Glisten' ],
+    'HP KB1'                                    => [ 'HP', 'iPAQ Glisten' ],
+    'HTC8500'                                   => [ 'HTC', '8500' ],
+    'HTC P3300'                                 => [ 'HTC', 'P3300' ],
+    'HTC love'                                  => [ 'HTC', 'P3350' ],
+    'HTC P3350'                                 => [ 'HTC', 'P3350' ],
+    'HTC P3400!'                                => [ 'HTC', 'P3400' ],
+    'HTC P3450!'                                => [ 'HTC', 'P3450' ],
+    'P4350!'                                    => [ 'HTC', 'P3450' ],
+    'HTC HERALD'                                => [ 'HTC', 'P3450' ],
+    'HTC P6300'                                 => [ 'HTC', 'P6300' ],
+    'HTC P6500'                                 => [ 'HTC', 'P6500' ],
+    'HTC X7500'                                 => [ 'HTC', 'Advantage' ],
+    'HTC X7510'                                 => [ 'HTC', 'Advantage' ],
+    '(HTC )?HD mini!'                           => [ 'HTC', 'HD mini' ],
+    '.*T5555!'                                  => [ 'HTC', 'HD mini' ],
+    '(HTC )?HD2!'                               => [ 'HTC', 'HD2' ],
+    '.*T8585!'                                  => [ 'HTC', 'HD2' ],
+    'HTC T8290'                                 => [ 'HTC', 'MAX 4G' ],
+    'HTC MAX 4G'                                => [ 'HTC', 'MAX 4G' ],
+    'HTC MTeoR'                                 => [ 'HTC', 'MTeoR' ],
+    'P3470!'                                    => [ 'HTC', 'Pharos' ],
+    'HTC Prophet'                               => [ 'HTC', 'Prophet' ],
+    'HTC Snap!'                                 => [ 'HTC', 'S511 Snap' ],
+    '.*S521!'                                   => [ 'HTC', 'S511 Snap' ],
+    'HTC Maple S520'                            => [ 'HTC', 'S520 Maple' ],
+    'HTC S620!'                                 => [ 'HTC', 'S620 Excalibur' ],
+    'HTC Excalibur'                             => [ 'HTC', 'S620 Excalibur' ],
+    'HTC S630'                                  => [ 'HTC', 'S630 Cavelier' ],
+    'HTC S710'                                  => [ 'HTC', 'S710 Vox' ],
+    'HTC S730'                                  => [ 'HTC', 'S730 Wings' ],
+    'HTC S740'                                  => [ 'HTC', 'S740 Rose' ],
+    'HTC Touch'                                 => [ 'HTC', 'Touch' ],
+    'HTC Elf'                                   => [ 'HTC', 'Touch' ],
+    'HTC 6900'                                  => [ 'HTC', 'Touch' ],
+    'HTC6900'                                   => [ 'HTC', 'Touch' ],
+    'HTC6900-MR1'                               => [ 'HTC', 'Touch' ],
+    'P3450'                                     => [ 'HTC', 'Touch' ],
+    'HTC TouchDual'                             => [ 'HTC', 'Touch' ],
+    'HTC Touch 3G!'                             => [ 'HTC', 'Touch 3G' ],
+    'HTC Jade'                                  => [ 'HTC', 'Touch 3G' ],
+    'HTC Mega!'                                 => [ 'HTC', 'Touch 2' ],
+    'HTC Touch2!'                               => [ 'HTC', 'Touch 2' ],
+    '.*T33(20|33|35)!'                          => [ 'HTC', 'Touch 2' ],
+    'P3650'                                     => [ 'HTC', 'Touch Cruise' ],
+    'P3650t'                                    => [ 'HTC', 'Touch Cruise' ],
+    'HTC Touch Cruise!'                         => [ 'HTC', 'Touch Cruise' ],
+    'HTC P3650'                                 => [ 'HTC', 'Touch Cruise' ],                                 
+    'HTC P3651'                                 => [ 'HTC', 'Touch Cruise' ],
+    'HTC Polaris'                               => [ 'HTC', 'Touch Cruise' ],
+    'HTC Touch Diamond2!'                       => [ 'HTC', 'Touch Diamond 2' ],
+    '.*T5353!'                                  => [ 'HTC', 'Touch Diamond 2' ],
+    'HTC Touch Diamond!'                        => [ 'HTC', 'Touch Diamond' ],
+    '.*P3700!'                                  => [ 'HTC', 'Touch Diamond' ],
+    'HTC Diamond'                               => [ 'HTC', 'Touch Diamond' ],
+    'HTC P3701'                                 => [ 'HTC', 'Touch Diamond' ],
+    'HTC P5500'                                 => [ 'HTC', 'Touch Dual' ],
+    'HTC P5310!'                                => [ 'HTC', 'Touch Dual' ],
+    'HTC Touch HD2!'                            => [ 'HTC', 'Touch HD2' ],
+    '.*T8585!'                                  => [ 'HTC', 'Touch HD2' ],
+    'HTC Touch HD!'                             => [ 'HTC', 'Touch HD' ],
+    '.*T82(82|83)!'                             => [ 'HTC', 'Touch HD' ],
+    'HTC Touch Pro2!'                           => [ 'HTC', 'Touch Pro 2' ],
+    '.*T73(73|80)!'                             => [ 'HTC', 'Touch Pro 2' ],
+    'HTC Touch Pro!'                            => [ 'HTC', 'Touch Pro' ],
+    '.*T7272!'                                  => [ 'HTC', 'Touch Pro' ],
+    'HTC P4600'                                 => [ 'HTC', 'Touch Pro' ],
+    'HTC Raphael'                               => [ 'HTC', 'Touch Pro' ],
+    'HTC Touch Viva!'                           => [ 'HTC', 'Touch Viva' ],
+    '.*T2223!'                                  => [ 'HTC', 'Touch Viva' ],
+    'P3600!'                                    => [ 'HTC', 'Trinity' ],
+    'HTC Trinity'                               => [ 'HTC', 'Trinity' ],
+    'HTC P3600'                                 => [ 'HTC', 'Trinity' ],
+    'HTC P3600i'                                => [ 'HTC', 'Trinity' ],
+    'HTC v3600'                                 => [ 'HTC', 'Trinity' ],
+    'HTC TyTN II'                               => [ 'HTC', 'TyTN II' ],
+    'P4550'                                     => [ 'HTC', 'TyTN II' ],
+    'HTC Kaiser'                                => [ 'HTC', 'TyTN II' ],
+    'HTC TyTN!'                                 => [ 'HTC', 'TyTN' ],
+    'HTC Mercury'                               => [ 'HTC', 'TyTN' ],
+    'T9188'                                     => [ 'HTC', 'T9188' ],
+    'T9199'                                     => [ 'HTC', 'T9199' ],
+    'HTC wizard'                                => [ 'HTC', 'Wizard' ],
+    'i-mate JAMA'                               => [ 'i-mate', 'JAMA' ],
+    'i-mate JAMAQ'                              => [ 'i-mate', 'JAMAQ' ],
+    'i-mate JAMin'                              => [ 'i-mate', 'JAMin' ],
+    'i-mate JASJAM'                             => [ 'i-mate', 'JASJAM' ],
+    'i-mate JAQ'                                => [ 'i-mate', 'JAQ' ],
+    'i-mate JAQ3'                               => [ 'i-mate', 'JAQ3' ],
+    'i-mate K-JAM'                              => [ 'i-mate', 'K-JAM' ],
+    'i-mate PDAL'                               => [ 'i-mate', 'PDAL' ],
+    'i-mate 6150'                               => [ 'i-mate', 'Ultimate 6150' ],
+    'i-mate 8150!'                              => [ 'i-mate', 'Ultimate 8150' ],
+    'i-mate 8502'                               => [ 'i-mate', 'Ultimate 8502' ],
+    'i-mate 9502!'                              => [ 'i-mate', 'Ultimate 9502' ],
+    'W366'                                      => [ 'K-Touch', 'W366' ],
+    'K-Touch W366!'                             => [ 'K-Touch', 'W366' ],
+    'Kyocera-E4000'                             => [ 'Kyocera', 'Solo E4000' ],
+    'Lenovo ET860'                              => [ 'Lenovo', 'ET860' ],
+    'LENOVO-ET980'                              => [ 'Lenovo', 'ET980' ],
+    'LG-GM730!'                                 => [ 'LG', 'Eigen GM730' ],
+    'GM730'                                     => [ 'LG', 'Eigen GM730' ],
+    'LG-GM750!'                                 => [ 'LG', 'Layla GM750' ],
+    'GM750Q'                                    => [ 'LG', 'Layla GM750' ],
+    'LG-GW550!'                                 => [ 'LG', 'GW550' ],
+    'GW550'                                     => [ 'LG', 'GW550' ],
+    'GW825'                                     => [ 'LG', 'IQ GW825' ],
+    'LG-KS20'                                   => [ 'LG', 'KS20' ],
+    'LG-MS25'                                   => [ 'LG', 'MS25' ],
+    'LGE VS750'                                 => [ 'LG', 'Fathom VS750' ],
+    'A3100'                                     => [ 'Motorola', 'A3100' ],
+    'A3300c'                                    => [ 'Motorola', 'A3300c' ],
+    'A4500!'                                    => [ 'Motorola', 'A4500' ],
+    'ES405B!'                                   => [ 'Motorola', 'ES405 Enterprise Smartphone' ],
+    'MC45!'                                     => [ 'Motorola', 'MC45 Mobile Computer' ],
+    'MC659B!'                                   => [ 'Motorola', 'MC65 Wireless Rugged Mobile Computer' ],
+    'Q-UMTS'                                    => [ 'Motorola', 'Q' ],
+    'Q8'                                        => [ 'Motorola', 'MOTO Q8' ],
+    'Q9'                                        => [ 'Motorola', 'MOTO Q9' ],
+    'Sprint:MotoQ9c'                            => [ 'Motorola', 'MOTO Q9c' ],
+    'Q9c!'                                      => [ 'Motorola', 'MOTO Q9c' ],
+    'Q9m!'                                      => [ 'Motorola', 'MOTO Q9m' ],
+    'VIP12!'                                    => [ 'Motorola', 'VIP 1200', DeviceType::TELEVISION ],
+    'H-21'                                      => [ 'Opticom', 'H-21' ],
+    'Palm500!'                                  => [ 'Palm', 'Treo 500v' ],
+    'Palm750'                                   => [ 'Palm', 'Treo 750' ],
+    'Treo800w'                                  => [ 'Palm', 'Treo 800w' ],
+    'Palm850!'                                  => [ 'Palm', 'Treo Pro' ],
+    'Palm Treo850e'                             => [ 'Palm', 'Treo Pro' ],
+    'Sprint Treo850e'                           => [ 'Palm', 'Treo Pro' ],
+    'PANTECH-C810'                              => [ 'Pantech', 'Duo C810' ],
+    'GT-B5722'                                  => [ 'Samsung', 'B5722' ],
+    'GT-B6520'                                  => [ 'Samsung', 'B6520 OmniaPRO 5' ],
+    'GT-B7300'                                  => [ 'Samsung', 'B7300 OmniaLITE' ],
+    'GT-B7320!'                                 => [ 'Samsung', 'B7320 OmniaPRO' ],
+    'GT-B7330!'                                 => [ 'Samsung', 'B7330 OmniaPRO' ],
+    'GT-B7350'                                  => [ 'Samsung', 'B7350 OmniaPRO 4' ],
+    'GT-B7610'                                  => [ 'Samsung', 'B7610 OmniaPRO' ],
+    'GT-C6625'                                  => [ 'Samsung', 'C6625 Valencia' ],
+    'C6625'                                     => [ 'Samsung', 'C6625 Valencia' ],
+    'GT-I8000!'                                 => [ 'Samsung', 'I8000 Omnia II' ],
+    'SCH-M490'                                  => [ 'Samsung', 'M490 T*OMNIA' ],
+    'SCH-M710'                                  => [ 'Samsung', 'M710 T*OMNIA II' ],
+    'SCH-M715'                                  => [ 'Samsung', 'M715 T*OMNIA II' ],
+    'SPH-M7200'                                 => [ 'Samsung', 'M7200 OMNIA POP' ],
+    'SPH-M7350'                                 => [ 'Samsung', 'M7350 OZ OMNIA' ],
+    'SPH-M8400'                                 => [ 'Samsung', 'M8400 Show OMNIA' ],
+    'SCH-i220!'                                 => [ 'Samsung', 'i220 Code' ],
+    'SCH-i225!'                                 => [ 'Samsung', 'i225 Exec' ],
+    'SPHI325!'                                  => [ 'Samsung', 'i325 Ace' ],
+    'SGH-i600!'                                 => [ 'Samsung', 'i600' ],
+    'SGH-i601!'                                 => [ 'Samsung', 'i601' ],
+    'SGH-I607'                                  => [ 'Samsung', 'i607 BlackJack' ],
+    'SGH-i608!'                                 => [ 'Samsung', 'i608' ],
+    'SGH-I617'                                  => [ 'Samsung', 'i617 BlackJack II' ],
+    'SGH-I637'                                  => [ 'Samsung', 'i637 Jack' ],
+    'SGH-i640!'                                 => [ 'Samsung', 'i640' ],
+    'SGH-i718'                                  => [ 'Samsung', 'i718' ],
+    'SGH-i718plus'                              => [ 'Samsung', 'i718 Plus' ],
+    'SGH-i728'                                  => [ 'Samsung', 'i728' ],
+    'SCH-i760!'                                 => [ 'Samsung', 'i760' ],
+    'SCH-i770!'                                 => [ 'Samsung', 'i770 Saga' ],
+    'SGH-i780!'                                 => [ 'Samsung', 'i780 Mirage' ],
+    'SGH-i900!'                                 => [ 'Samsung', 'i900 Omnia' ],
+    'SGH-i908E'                                 => [ 'Samsung', 'i908' ],
+    'SCHI910!'                                  => [ 'Samsung', 'i910 Omnia' ],
+    'SCH-i920'                                  => [ 'Samsung', 'i920 Omnia II' ],
+    'SIE-SX66'                                  => [ 'Siemens', 'SX66' ],
+    'M1i'                                       => [ 'Sony Ericsson', 'Aspen' ],
+    'X1'                                        => [ 'Sony Ericsson', 'Xperia X1' ],
+    'X1[ia]!'                                   => [ 'Sony Ericsson', 'Xperia X1' ],
+    'X2'                                        => [ 'Sony Ericsson', 'Xperia X2' ],
+    'X2[ia]!'                                   => [ 'Sony Ericsson', 'Xperia X2' ],
+    'Spice D1100'                               => [ 'Spice', 'D1100' ],
+    '(Toshiba[- ])?TG01!'                       => [ 'Toshiba', 'TG01' ],
+    'Velocity'                                  => [ 'Velocity', '111' ],
+    'ZTE E N72'                                 => [ 'ZTE', 'E N72' ],
+    'ZTE E X70'                                 => [ 'ZTE', 'E X70' ],
+
+
+
+    'sigmarion3'                                => [ 'NTT', 'sigmarionIII' ],
+
+    'o2 Xda comet'                              => [ 'O2', 'XDA Comet' ],
+    'Xda diamond'                               => [ 'O2', 'XDA Diamond' ],
+    'Xda neo'                                   => [ 'O2', 'XDA Neo' ],
+    'Xda nova'                                  => [ 'O2', 'XDA Nova' ],
+    'Xda orbit'                                 => [ 'O2', 'XDA Orbit' ],
+    'Xda terra'                                 => [ 'O2', 'XDA Terra' ],
+    'Xda trion'                                 => [ 'O2', 'XDA Trion' ],
+    'O2 Xda 2mini'                              => [ 'O2', 'XDA II mini' ],
+    'O2 Xda 2s'                                 => [ 'O2', 'XDA IIs' ],
+
+    'SPV E600'                                  => [ 'Orange', 'SPV E600' ],
+    'SPV E650'                                  => [ 'Orange', 'SPV E650' ],
+    'SPV M700'                                  => [ 'Orange', 'SPV M700' ],
+    'SPV M2000'                                 => [ 'Orange', 'SPV M2000' ],
+    'SPV M3100'                                 => [ 'Orange', 'SPV M3100' ],
+
+    'Alltel HTC PPC6800'                        => [ 'Alltel', 'PPC6800' ],
+    'Alltel HTC Touch'                          => [ 'HTC', 'Touch', 'carrier' => 'Alltel' ],
+    'Alltel HTC Touch Diamond'                  => [ 'HTC', 'Touch Diamond', 'carrier' => 'Alltel' ],
+
+    'Sprint S511'                               => [ 'Sprint', 'Snap' ],
+    'Sprint:SPH-ip830w'                         => [ 'Sprint', 'SPH-ip830w' ],
+    'Sprint:PPC6600-1'                          => [ 'Sprint', 'PPC6600' ],
+    'Sprint:PPC-6700'                           => [ 'Sprint', 'PPC6700' ],
+    'Sprint:PPC6800'                            => [ 'Sprint', 'PPC6800' ],
+    'Sprint PPC6850SP'                          => [ 'Sprint', 'PPC6850' ],
+    'HTCPPC6850!'                               => [ 'Sprint', 'PPC6850' ],
+    'PPC6850!'                                  => [ 'Sprint', 'PPC6850' ],
+    'Sprint MP6850SP'                           => [ 'Sprint', 'MP6850' ],
+    'Sprint MP6900SP'                           => [ 'Sprint', 'MP6900' ],
+    'Sprint MP6950SP'                           => [ 'Sprint', 'MP6950' ],
+
+    'Ameo!'                                     => [ 'T-Mobile', 'Ameo' ],
+    'T-Mobile Atlas'                            => [ 'T-Mobile', 'Atlas' ],
+    'T-Mobile Dash'                             => [ 'T-Mobile', 'Dash' ],
+    'T-Mobile LEO'                              => [ 'T-Mobile', 'Leo' ],
+    'T-Mobile Cleopatra'                        => [ 'T-Mobile', 'Shadow II' ],
+    'MDA III!'                                  => [ 'T-Mobile', 'MDA III' ],
+    'MDA compact II!'                           => [ 'T-Mobile', 'MDA Compact II' ],
+    'MDA compact!'                              => [ 'T-Mobile', 'MDA Compact' ],
+    'MDA Pro!'                                  => [ 'T-Mobile', 'MDA Pro' ],
+    'MDA Touch!'                                => [ 'T-Mobile', 'MDA Touch' ],
+    'MDA Vario!'                                => [ 'T-Mobile', 'MDA Vario' ],
+
+    'XV6175!'                                   => [ 'Verizon', 'Ozone XV6175' ],
+    'XV6875!'                                   => [ 'Verizon', 'Touch Pro2 XV6875' ],
+    'XV6900'                                    => [ 'Verizon', 'Touch XV6900' ],
+    'XV6975'                                    => [ 'Verizon', 'Imagio XV6975' ],
+
+    'SFR v3650!'                                => [ 'Vodafone', 'Polaris' ],
+    'v1415'                                     => [ 'Vodafone', 'Vox' ],
+    'v1240'                                     => [ 'Vodafone', 'VDA II' ],
+    '1210'                                      => [ 'Vodafone', 'VDA IV' ],
+    'v1210'                                     => [ 'Vodafone', 'VDA IV' ],
+    'HTC VDA V'                                 => [ 'Vodafone', 'VDA V' ],
+    'v1640'                                     => [ 'Vodafone', 'VPA IV' ],
+    'VPA Touch'                                 => [ 'Vodafone', 'VPA Touch' ],
+    'HTC v1510'                                 => [ 'Vodafone', 'VPA Compact GPS' ],
+    'HTC VPACompactIV'                          => [ 'Vodafone', 'VPA Compact IV' ],
+
+
+
+    'WS003SH'                                   => [ 'Sharp', 'W-ZERO3 WS003SH', 'carrier' => 'Willcom' ],
+    'WS004SH'                                   => [ 'Sharp', 'W-ZERO3 WS004SH', 'carrier' => 'Willcom' ],
+    'WS007SH'                                   => [ 'Sharp', 'W-ZERO3 [es] WS007SH', 'carrier' => 'Willcom' ],
+    'WS011SH'                                   => [ 'Sharp', 'Advanced / W-ZERO3 [es] WS011SH', 'carrier' => 'Willcom' ],
+    'WS020SH'                                   => [ 'Sharp', 'WILLCOM 03 WS020SH', 'carrier' => 'Willcom' ],
+    'WS027SH'                                   => [ 'Sharp', 'HYBRID W-ZERO3 WS027SH', 'carrier' => 'Willcom' ],
+    'S01SH'                                     => [ 'Sharp', 'EM·ONE S01SH', 'carrier' => 'EMOBILE' ],
+    'S01SH2'                                    => [ 'Sharp', 'EM·ONE alpha S01SH2', 'carrier' => 'EMOBILE' ],
+    'T-01A!'                                    => [ 'Toshiba', 'T-01A', 'carrier' => 'DoCoMo' ],
+    'T-01B!'                                    => [ 'Toshiba', 'dynapocket T-01B', 'carrier' => 'DoCoMo' ],
+    'X01T'                                      => [ 'Toshiba', 'G900 X01T', 'carrier' => 'Softbank' ],
+    'X02T!'                                     => [ 'Toshiba', 'dynapocket X02T', 'carrier' => 'Softbank' ],
+    'KDDI-HT01'                                 => [ 'HTC', 'TOUCH PRO HT-01A', 'carrier' => 'au' ],
+    'HT01A'                                     => [ 'HTC', 'TOUCH PRO HT-01A', 'carrier' => 'au' ],
+    'S11HT'                                     => [ 'HTC', 'EMONSTER S11HT', 'carrier' => 'EMOBILE' ],
+    'S12HT'                                     => [ 'HTC', 'EMONSTER lite S12HT', 'carrier' => 'EMOBILE' ],
+    'S21HT'                                     => [ 'HTC', 'Touch Diamond S21HT', 'carrier' => 'EMOBILE' ],
+    'S22HT'                                     => [ 'HTC', 'Dual Diamond S22HT', 'carrier' => 'EMOBILE' ],
+    'X01HT'                                     => [ 'HTC', 'TyTN X01HT', 'carrier' => 'Softbank' ],
+    'X02HT'                                     => [ 'HTC', 'S630 X02HT', 'carrier' => 'Softbank' ],
+    'X03HT'                                     => [ 'HTC', 'S730 X03HT', 'carrier' => 'Softbank' ],
+    'X04HT'                                     => [ 'HTC', 'TOUCH DIAMOND X04HT', 'carrier' => 'Softbank' ],
+    'X05HT'                                     => [ 'HTC', 'TOUCH PRO X05HT', 'carrier' => 'Softbank' ],
+    'SC-01B'                                    => [ 'Samsung', 'SC-01B', 'carrier' => 'DoCoMo' ],
+    'X01SC'                                     => [ 'Samsung', 'OMNIA Pro X01SC', 'carrier' => 'Softbank' ],
+];

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません