1<?php
2
3/**
4 * Device Detector - The Universal Device Detection library for parsing User Agents
5 *
6 * @link https://matomo.org
7 *
8 * @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
9 */
10
11declare(strict_types=1);
12
13namespace DeviceDetector\Parser\Device;
14
15use DeviceDetector\Parser\AbstractParser;
16
17/**
18 * Class AbstractDeviceParser
19 *
20 * Abstract class for all device parsers
21 */
22abstract class AbstractDeviceParser extends AbstractParser
23{
24    /**
25     * @var ?int
26     */
27    protected $deviceType = null;
28
29    /**
30     * @var string
31     */
32    protected $model = '';
33
34    /**
35     * @var string
36     */
37    protected $brand = '';
38
39    public const DEVICE_TYPE_DESKTOP              = 0;
40    public const DEVICE_TYPE_SMARTPHONE           = 1;
41    public const DEVICE_TYPE_TABLET               = 2;
42    public const DEVICE_TYPE_FEATURE_PHONE        = 3;
43    public const DEVICE_TYPE_CONSOLE              = 4;
44    public const DEVICE_TYPE_TV                   = 5; // including set top boxes, blu-ray players,...
45    public const DEVICE_TYPE_CAR_BROWSER          = 6;
46    public const DEVICE_TYPE_SMART_DISPLAY        = 7;
47    public const DEVICE_TYPE_CAMERA               = 8;
48    public const DEVICE_TYPE_PORTABLE_MEDIA_PAYER = 9;
49    public const DEVICE_TYPE_PHABLET              = 10;
50    public const DEVICE_TYPE_SMART_SPEAKER        = 11;
51    public const DEVICE_TYPE_WEARABLE             = 12; // including set watches, headsets
52    public const DEVICE_TYPE_PERIPHERAL           = 13; // including portable terminal, portable projector
53
54    /**
55     * Detectable device types
56     *
57     * @var array
58     */
59    protected static $deviceTypes = [
60        'desktop'               => self::DEVICE_TYPE_DESKTOP,
61        'smartphone'            => self::DEVICE_TYPE_SMARTPHONE,
62        'tablet'                => self::DEVICE_TYPE_TABLET,
63        'feature phone'         => self::DEVICE_TYPE_FEATURE_PHONE,
64        'console'               => self::DEVICE_TYPE_CONSOLE,
65        'tv'                    => self::DEVICE_TYPE_TV,
66        'car browser'           => self::DEVICE_TYPE_CAR_BROWSER,
67        'smart display'         => self::DEVICE_TYPE_SMART_DISPLAY,
68        'camera'                => self::DEVICE_TYPE_CAMERA,
69        'portable media player' => self::DEVICE_TYPE_PORTABLE_MEDIA_PAYER,
70        'phablet'               => self::DEVICE_TYPE_PHABLET,
71        'smart speaker'         => self::DEVICE_TYPE_SMART_SPEAKER,
72        'wearable'              => self::DEVICE_TYPE_WEARABLE,
73        'peripheral'            => self::DEVICE_TYPE_PERIPHERAL,
74    ];
75
76    /**
77     * Known device brands
78     *
79     * Note: Before using a new brand in on of the regex files, it needs to be added here
80     *
81     * @var array
82     */
83    public static $deviceBrands = [
84        '5E'  => '2E',
85        '5IV' => '5IVE',
86        '2F'  => 'F2 Mobile',
87        '3Q'  => '3Q',
88        'J7'  => '7 Mobile',
89        '2Q'  => '3GNET',
90        '4G'  => '4Good',
91        '27'  => '3GO',
92        '04'  => '4ife',
93        '36'  => '360',
94        '88'  => '8848',
95        '10M' => '10moons',
96        '41'  => 'A1',
97        'AK1' => 'A&K',
98        '00'  => 'Accent',
99        'ACC' => 'Accesstyle',
100        'AE'  => 'Ace',
101        'AC'  => 'Acer',
102        'ACL' => 'Aceline',
103        'ACP' => 'Acepad',
104        '3K'  => 'Acteck',
105        'ACT' => 'actiMirror',
106        'A9'  => 'Advan',
107        'AD'  => 'Advance',
108        'ADV' => 'Advantage Air',
109        '76'  => 'Adronix',
110        'ADR' => 'Adreamer',
111        'AF'  => 'AfriOne',
112        'FY'  => 'AFFIX',
113        'A3'  => 'AGM',
114        'AEE' => 'AEEZO',
115        'J0'  => 'AG Mobile',
116        'AJI' => 'Ajib',
117        'AZ'  => 'Ainol',
118        'AIR' => 'Airis',
119        'AI'  => 'Airness',
120        'ARP' => 'Airpha',
121        'AT'  => 'Airties',
122        '7U'  => 'Airtel',
123        'AIT' => 'AirTouch',
124        'U0'  => 'AIRON',
125        '0A'  => 'AIS',
126        'AW'  => 'Aiwa',
127        '85'  => 'Aiuto',
128        'U7'  => 'AIDATA',
129        'AL1' => 'AileTV',
130        'AK'  => 'Akai',
131        'Q3'  => 'AKIRA',
132        '1A'  => 'Alba',
133        'AL'  => 'Alcatel',
134        'AL0' => 'Alienware',
135        '20'  => 'Alcor',
136        'XY'  => 'Alps',
137        'XYA' => 'XY Auto',
138        'AAU' => 'AAUW',
139        '7L'  => 'ALDI NORD',
140        '6L'  => 'ALDI SÜD',
141        '3L'  => 'Alfawise',
142        '4A'  => 'Aligator',
143        'ALS' => 'All Star',
144        'AA'  => 'AllCall',
145        '3A'  => 'AllDocube',
146        'ALL' => 'allente',
147        'A2'  => 'Allview',
148        'ALI' => 'ALLINmobile',
149        'A7'  => 'Allwinner',
150        'ALP' => 'alpsmart',
151        'A1'  => 'Altech UEC',
152        '66'  => 'Altice',
153        'ALM' => 'Altimo',
154        'A5'  => 'altron',
155        'ALB' => 'Altibox',
156        'ALT' => 'Altus',
157        'KN'  => 'Amazon',
158        'AMZ' => 'Amazon Basics',
159        'AMA' => 'AMA',
160        'AG'  => 'AMGOO',
161        '9A'  => 'Amigoo',
162        'AO'  => 'Amoi',
163        '3J'  => 'Amino',
164        '54'  => 'AMCV',
165        '60'  => 'Andowl',
166        'ANX' => 'ANXONIT',
167        'ANL' => 'ANCEL',
168        'ANC' => 'ANBERNIC',
169        'AND' => 'andersson',
170        '6J'  => 'Angelcare',
171        'ANG' => 'AngelTech',
172        '7A'  => 'Anry',
173        'A0'  => 'ANS',
174        '74'  => 'Anker',
175        '3N'  => 'Aoson',
176        'O8'  => 'AOC',
177        'J2'  => 'AOYODKG',
178        '55'  => 'AOpen',
179        'RW'  => 'Aoro',
180        '9Y'  => 'Aocos',
181        'AOW' => 'Aocwei',
182        'AP'  => 'Apple',
183        'APS' => 'ApoloSign',
184        'ARC' => 'Arçelik',
185        'AR'  => 'Archos',
186        'AB'  => 'Arian Space',
187        'ARI' => 'Arival',
188        'A6'  => 'Ark',
189        '5A'  => 'ArmPhone',
190        'AN'  => 'Arnova',
191        'AS'  => 'ARRIS',
192        'AQ'  => 'Aspera',
193        'HJ'  => 'Aquarius',
194        '40'  => 'Artel',
195        '21'  => 'Artizlee',
196        '59'  => 'ArtLine',
197        '8A'  => 'Asano',
198        '90'  => 'Asanzo',
199        '1U'  => 'Astro (UA)',
200        'AST' => 'astro (MY)',
201        'A4'  => 'Ask',
202        'A8'  => 'Assistant',
203        'ASS' => 'ASSE',
204        'AU'  => 'Asus',
205        '6A'  => 'AT&T',
206        'ATH' => 'Athesi',
207        'ATE' => 'Atlantic Electrics',
208        '5Q'  => 'Atmaca Elektronik',
209        'YH'  => 'ATMAN',
210        'ATM' => 'ATMPC',
211        '2A'  => 'Atom',
212        'AT1' => 'Atozee',
213        'ATO' => 'ATOL',
214        'Z2'  => 'Atvio',
215        'ATI' => 'Attila',
216        'ATU' => 'Atouch',
217        'AX'  => 'Audiovox',
218        'AJ'  => 'AURIS',
219        'YZ'  => 'Autan',
220        'AUP' => 'AUPO',
221        'ZA'  => 'Avenzo',
222        'AH'  => 'AVH',
223        'AV'  => 'Avvio',
224        'AVA' => 'Avaya',
225        'AXE' => 'AXEN',
226        'AY'  => 'Axxion',
227        'AXX' => 'AXXA',
228        'AYA' => 'AYA',
229        'YR'  => 'AYYA',
230        'XA'  => 'Axioo',
231        'AM'  => 'Azumi Mobile',
232        'AZE' => 'Azeyou',
233        'AZU' => 'Azupik',
234        'AZO' => 'AZOM',
235        'WW'  => 'Awow',
236        'AWO' => 'AWOX',
237        'XU'  => 'AUX',
238        'BAC' => 'Backcell',
239        'BFF' => 'BAFF',
240        'BO'  => 'BangOlufsen',
241        'BN'  => 'Barnes & Noble',
242        'BAR' => 'BARTEC',
243        'BAS' => 'BASE',
244        'BAU' => 'BAUHN',
245        'BB'  => 'BBK',
246        '0B'  => 'BB Mobile',
247        'B6'  => 'BDF',
248        'QD'  => 'BDQ',
249        '8Z'  => 'BDsharing',
250        'BEF' => 'Beafon',
251        'BE'  => 'Becker',
252        'B5'  => 'Beeline',
253        'B0'  => 'Beelink',
254        'BL'  => 'Beetel',
255        'BEK' => 'Beko',
256        '2X'  => 'Benco',
257        'BQ'  => 'BenQ',
258        'BQL' => 'Bqeel',
259        'BS'  => 'BenQ-Siemens',
260        '4Y'  => 'Benzo',
261        'XJ'  => 'Benesse',
262        'BEN' => 'BenWee',
263        'YB'  => 'Beista',
264        'BY'  => 'BS Mobile',
265        'BZ'  => 'Bezkam',
266        'BEL' => 'Bell',
267        '9B'  => 'Bellphone',
268        '63'  => 'Beyond',
269        'BG'  => 'BGH',
270        '6B'  => 'Bigben',
271        'B8'  => 'BIHEE',
272        '1B'  => 'Billion',
273        'BA'  => 'BilimLand',
274        'BIL' => 'Billow',
275        'BH'  => 'BioRugged',
276        'BI'  => 'Bird',
277        'BT'  => 'Bitel',
278        'B7'  => 'Bitmore',
279        'ZB'  => 'Bittium',
280        'BIE' => 'Biegedy',
281        'BK'  => 'Bkav',
282        '5B'  => 'Black Bear',
283        'BLK' => 'Black Box',
284        'BF'  => 'Black Fox',
285        'BPC' => 'Blackpcs',
286        'BLP' => 'Blackphone',
287        'BLT' => 'Blackton',
288        'B2'  => 'Blackview',
289        '2Y'  => 'b2m',
290        'BP'  => 'Blaupunkt',
291        'BU'  => 'Blu',
292        'BUS' => 'BluSlate',
293        'BUZ' => 'BuzzTV',
294        'B3'  => 'Bluboo',
295        '2B'  => 'Bluedot',
296        'BD'  => 'Bluegood',
297        'LB'  => 'Bluewave',
298        'J8'  => 'Bluebird',
299        'BSS' => 'BlueSky',
300        '7B'  => 'Blloc',
301        'UB'  => 'Bleck',
302        'Q2'  => 'Blow',
303        'BLI' => 'BLISS',
304        'BM'  => 'Bmobile',
305        'Y5'  => 'BMAX',
306        'BMX' => 'BMXC',
307        'B9'  => 'Bobarry',
308        'B4'  => 'bogo',
309        'BOL' => 'Bolva',
310        'BW'  => 'Boway',
311        'BOO' => 'Boost',
312        'BOK' => 'Bookeen',
313        'BOT' => 'Botech',
314        'BX'  => 'bq',
315        '8B'  => 'Brandt',
316        'BRA' => 'BrandCode',
317        'BV'  => 'Bravis',
318        'BRV' => 'BRAVE',
319        'BRG' => 'Brigmton',
320        'BR'  => 'Brondi',
321        'XF'  => 'BROR',
322        'BJ'  => 'BrightSign',
323        'B1'  => 'Bush',
324        '4Q'  => 'Bundy',
325        'Y8'  => 'Bubblegum',
326        'BMW' => 'BMW',
327        'BYJ' => 'BYJU\'S',
328        'BYY' => 'BYYBUO',
329        'BYD' => 'BYD',
330        'C9'  => 'CAGI',
331        'CAD' => 'CADENA',
332        'CAI' => 'Caixun',
333        'CT'  => 'Capitel',
334        'GRD' => 'G-Guard',
335        'G3'  => 'CG Mobile',
336        '37'  => 'CGV',
337        'CP'  => 'Captiva',
338        'CPD' => 'CPDEVICE',
339        'CF'  => 'Carrefour',
340        'CA1' => 'Carbon Mobile',
341        'CS'  => 'Casio',
342        'R4'  => 'Casper',
343        'CA'  => 'Cat',
344        'BC'  => 'Camfone',
345        'CJ'  => 'Cavion',
346        'CNM' => 'Canaima',
347        'CAN' => 'Canal+',
348        '4D'  => 'Canal Digital',
349        'CNG' => 'Canguro',
350        'CNT' => 'CCIT',
351        'CEC' => 'Cecotec',
352        'CEP' => 'CEPTER',
353        'CEI' => 'Ceibal',
354        '02'  => 'Cell-C',
355        'CEL' => 'Cellacom',
356        '34'  => 'CellAllure',
357        '7C'  => 'Celcus',
358        'CE'  => 'Celkon',
359        'CG'  => 'Cellution',
360        '62'  => 'Centric',
361        'CEN' => 'CENTEK',
362        'C2'  => 'Changhong',
363        'CHA' => 'Chainway',
364        'CHG' => 'ChiliGreen',
365        'CH'  => 'Cherry Mobile',
366        'C3'  => 'China Mobile',
367        'U9'  => 'China Telecom',
368        'CI'  => 'Chico Mobile',
369        'CHC' => 'CHCNAV',
370        'CIA' => 'C Idea',
371        'CIP' => 'CipherLab',
372        'CIT' => 'Citycall',
373        '1C'  => 'Chuwi',
374        'L8'  => 'Clarmin',
375        '25'  => 'Claresta',
376        'CLA' => 'CLAYTON',
377        'CLT' => 'Clovertek',
378        '1J'  => 'Cloud',
379        'CD'  => 'Cloudfone',
380        '6C'  => 'Cloudpad',
381        'C0'  => 'Clout',
382        'CN'  => 'CnM',
383        'CY'  => 'Coby Kyros',
384        'XC'  => 'Cobalt',
385        'C6'  => 'Comio',
386        'COM' => 'CommScope',
387        'CL'  => 'Compal',
388        'CQ'  => 'Compaq',
389        'C7'  => 'ComTrade Tesla',
390        '7Z'  => 'COMPUMAX',
391        'C8'  => 'Concord',
392        'CC'  => 'ConCorde',
393        'C5'  => 'Condor',
394        'C5M' => 'C5 Mobile',
395        'COE' => 'Cogeco',
396        '4C'  => 'Conquest',
397        'COG' => 'CONSUNG',
398        '3C'  => 'Contixo',
399        '8C'  => 'Connex',
400        '53'  => 'Connectce',
401        'CON' => 'Conceptum',
402        'CED' => 'Continental Edison',
403        '9C'  => 'Colors',
404        'COL' => 'COLORROOM',
405        'CAA' => 'coocaa',
406        'CO'  => 'Coolpad',
407        'COO' => 'Coopers',
408        'CDE' => 'COOD-E',
409        '4R'  => 'CORN',
410        '1O'  => 'Cosmote',
411        'CW'  => 'Cowon',
412        '75'  => 'Covia',
413        'QG'  => 'COYOTE',
414        'CKK' => 'CKK Mobile',
415        'YW'  => 'ClearPHONE',
416        '33'  => 'Clementoni',
417        'CR'  => 'CreNova',
418        'CX'  => 'Crescent',
419        'CRE' => 'Crestron',
420        'CK'  => 'Cricket',
421        'CM'  => 'Crius Mea',
422        'CMF' => 'CMF',
423        '0C'  => 'Crony',
424        'C1'  => 'Crosscall',
425        '4W'  => 'Crown',
426        'CTR' => 'Ctroniq',
427        'CU'  => 'Cube',
428        'CB'  => 'CUBOT',
429        'CUI' => 'Cuiud',
430        'CUL' => 'Cultraview',
431        'CV'  => 'CVTE',
432        'CWO' => 'Cwowdefu',
433        'CX0' => 'CX',
434        'C4'  => 'Cyrus',
435        'D5'  => 'Daewoo',
436        'DA'  => 'Danew',
437        'DAN' => 'Dany',
438        'DA1' => 'DangcapHD',
439        'DAR' => 'Daria',
440        'DT'  => 'Datang',
441        'D7'  => 'Datawind',
442        '7D'  => 'Datamini',
443        '6D'  => 'Datalogic',
444        'D1'  => 'Datsun',
445        'DZ'  => 'Dazen',
446        'DAS' => 'DASS',
447        'DAW' => 'Dawlance',
448        'DB'  => 'Dbtel',
449        'DBP' => 'DbPhone',
450        'DCO' => 'Dcode',
451        'DL'  => 'Dell',
452        'DL0' => 'DL',
453        'DE'  => 'Denver',
454        'DS'  => 'Desay',
455        'DSD' => 'DSDevices',
456        'DSI' => 'DSIC',
457        'DW'  => 'DeWalt',
458        'DX'  => 'DEXP',
459        'DEY' => 'DEYI',
460        'DEN' => 'Denali',
461        'DEA' => 'DEALDIG',
462        'DNK' => 'Denka',
463        '8D'  => 'DF',
464        'DGT' => 'DGTEC',
465        'DG'  => 'Dialog',
466        'DIA' => 'DIALN',
467        'DI'  => 'Dicam',
468        'D4'  => 'Digi',
469        'D3'  => 'Digicel',
470        'DDG' => 'Digidragon',
471        'DH'  => 'Digihome',
472        'DD'  => 'Digiland',
473        'DIJ' => 'DIJITSU',
474        'DIG' => 'Digit4G',
475        'DIC' => 'DIGICOM',
476        'Q0'  => 'DIGIFORS',
477        'DIK' => 'DIKOM',
478        'DQ'  => 'DISH',
479        'DIS' => 'Disney',
480        '9D'  => 'Ditecma',
481        'D2'  => 'Digma',
482        '1D'  => 'Diva',
483        'DIV' => 'DiverMax',
484        'D6'  => 'Divisat',
485        'DIO' => 'DIORA',
486        'DIF' => 'Diofox',
487        'X6'  => 'DIXON',
488        'DIM' => 'DIMO',
489        '5D'  => 'DING DING',
490        'DIN' => 'Dinax',
491        'DNA' => 'Dinalink',
492        'DM'  => 'DMM',
493        'DMO' => 'DMOAO',
494        'DN'  => 'DNS',
495        'DC'  => 'DoCoMo',
496        'DF'  => 'Doffler',
497        'D9'  => 'Dolamee',
498        'DO'  => 'Doogee',
499        'D0'  => 'Doopro',
500        'DV'  => 'Doov',
501        'DOM' => 'Dom.ru',
502        'DP'  => 'Dopod',
503        'DPA' => 'DPA',
504        'JQ'  => 'Doppio',
505        'DR'  => 'Doro',
506        'DOR' => 'Dora',
507        'ZD'  => 'DORLAND',
508        'DRO' => 'Droidlogic',
509        'D8'  => 'Droxio',
510        'DJ'  => 'Dragon Touch',
511        'DRA' => 'DRAGON',
512        'DY'  => 'Dreamgate',
513        'DRE' => 'DreamTab',
514        'DR1' => 'DreamStar',
515        'DTA' => 'Dtac',
516        'DU'  => 'Dune HD',
517        'DUO' => 'DuoTV',
518        'UD'  => 'DUNNS Mobile',
519        'DUU' => 'Duubee',
520        'DUR' => 'Durabook',
521        'DUD' => 'DUDU AUTO',
522        'DYO' => 'Dyon',
523        'DYM' => 'Dykemann',
524        'DTE' => 'D-Tech',
525        'DLI' => 'D-Link',
526        'ENO' => 'eNOVA',
527        'IN2' => 'iNOVA',
528        'IN3' => 'inovo',
529        'INH' => 'Inhon',
530        'IND' => 'Indurama',
531        'EB'  => 'E-Boda',
532        'EJ'  => 'Engel',
533        'ENA' => 'ENACOM',
534        'END' => 'ENDURO',
535        'ENI' => 'ENIE',
536        '2E'  => 'E-Ceros',
537        'E8'  => 'E-tel',
538        'ETH' => 'E-TACHI',
539        'EAS' => 'EAS Electric',
540        'EP'  => 'Easypix',
541        'EQ'  => 'Eagle',
542        'EGS' => 'EagleSoar',
543        'EA'  => 'EBEST',
544        'YC'  => 'EBEN',
545        'E4'  => 'Echo Mobiles',
546        'EQ1' => 'Equator',
547        'ES'  => 'ECS',
548        '35'  => 'ECON',
549        'ECC' => 'ECOO',
550        'ZZ'  => 'ecom',
551        'ECS' => 'EcoStar',
552        'EDE' => 'Edenwood',
553        'E6'  => 'EE',
554        'GW'  => 'EGL',
555        'EGO' => 'EGOTEK',
556        'EFT' => 'EFT',
557        'EK'  => 'EKO',
558        'EY'  => 'Einstein',
559        'EM'  => 'Eks Mobility',
560        'UE'  => 'Ematic',
561        'EMR' => 'Emporia',
562        '4K'  => 'EKT',
563        'EKI' => 'EKINOX',
564        '7E'  => 'ELARI',
565        '03'  => 'Electroneum',
566        'Z8'  => 'ELECTRONIA',
567        'ELG' => 'ELE-GATE',
568        'EL1' => 'Elecson',
569        'ELK' => 'Elektroland',
570        'L0'  => 'Element',
571        'EG'  => 'Elenberg',
572        'EL'  => 'Elephone',
573        'JE'  => 'Elekta',
574        'ELE' => 'Elevate',
575        'ELS' => 'Elista',
576        'ELT' => 'elit',
577        '4E'  => 'Eltex',
578        'ELM' => 'Elong Mobile',
579        'ED'  => 'Energizer',
580        'E1'  => 'Energy Sistem',
581        '3E'  => 'Enot',
582        'ENT' => 'Entity',
583        'ENV' => 'Envizen',
584        '8E'  => 'Epik One',
585        'EPK' => 'Epic',
586        'XP'  => 'Epson',
587        'EPH' => 'Ephone',
588        'E7'  => 'Ergo',
589        'EC'  => 'Ericsson',
590        '05'  => 'Erisson',
591        'ER'  => 'Ericy',
592        'EE'  => 'Essential',
593        'E2'  => 'Essentielb',
594        '6E'  => 'eSTAR',
595        'ETO' => 'ETOE',
596        'EN'  => 'Eton',
597        'ET'  => 'eTouch',
598        '1E'  => 'Etuline',
599        'EHL' => 'Ehlel',
600        'EU'  => 'Eurostar',
601        '4J'  => 'Eurocase',
602        'EUR' => 'EUROLUX',
603        'EUD' => 'Eudora',
604        'E9'  => 'Evercoss',
605        'EV'  => 'Evertek',
606        'EVE' => 'Everest',
607        'EV1' => 'Everex',
608        'EVR' => 'Everis',
609        'EVF' => 'Everfine',
610        'E3'  => 'Evolio',
611        'EO'  => 'Evolveo',
612        '0Q'  => 'Evoo',
613        '5U'  => 'EVPAD',
614        'EVV' => 'evvoli',
615        'E0'  => 'EvroMedia',
616        'XE'  => 'ExMobile',
617        '4Z'  => 'Exmart',
618        'EH'  => 'EXO',
619        'EX'  => 'Explay',
620        'EXP' => 'Express LUCK',
621        'E5'  => 'Extrem',
622        'EXL' => 'ExtraLink',
623        'EF'  => 'EXCEED',
624        'QE'  => 'EWIS',
625        'EI'  => 'Ezio',
626        'EZ'  => 'Ezze',
627        'UF'  => 'EYU',
628        'EYE' => 'Eyemoo',
629        'UE1' => 'UE',
630        '5F'  => 'F150',
631        'FPS' => 'F+',
632        'F6'  => 'Facebook',
633        'FAC' => 'Facetel',
634        'FA1' => 'Facime',
635        'FA'  => 'Fairphone',
636        'FM'  => 'Famoco',
637        'FAM' => 'Famous',
638        '17'  => 'FarEasTone',
639        '9R'  => 'FaRao Pro',
640        'FAR' => 'Farassoo',
641        'FB'  => 'Fantec',
642        'FE'  => 'Fengxiang',
643        'FEN' => 'Fenoti',
644        'F7'  => 'Fero',
645        '67'  => 'FEONAL',
646        'FI'  => 'FiGO',
647        'J9'  => 'FiGi',
648        'FIG' => 'Figgers',
649        'F9'  => 'FiiO',
650        'F1'  => 'FinePower',
651        'FX'  => 'Finlux',
652        'F3'  => 'FireFly Mobile',
653        'F8'  => 'FISE',
654        'FIS' => 'Fision',
655        'FIT' => 'FITCO',
656        'FLM' => 'Filimo',
657        'FIL' => 'FILIX',
658        'FIN' => 'FINIX',
659        'FL'  => 'Fly',
660        'QC'  => 'FLYCAT',
661        'FLY' => 'FLYCOAY',
662        'FLU' => 'Fluo',
663        'FN'  => 'FNB',
664        'FOB' => 'Fobem',
665        'FD'  => 'Fondi',
666        '0F'  => 'Fourel',
667        '44'  => 'Four Mobile',
668        'F0'  => 'Fonos',
669        'F0N' => 'FONTEL',
670        'F2'  => 'FORME',
671        'FRM' => 'Formovie',
672        'F5'  => 'Formuler',
673        'FR'  => 'Forstar',
674        'RF'  => 'Fortis',
675        'FRT' => 'FortuneShip',
676        'FO'  => 'Foxconn',
677        'FOD' => 'FoxxD',
678        'FJ'  => 'FOODO',
679        'FOS' => 'FOSSiBOT',
680        'FRE' => 'free',
681        'FT'  => 'Freetel',
682        'FTH' => 'FRESH',
683        'FEY' => 'FreeYond',
684        'FRU' => 'Frunsi',
685        'F4'  => 'F&U',
686        '1F'  => 'FMT',
687        'FPT' => 'FPT',
688        'FG'  => 'Fuego',
689        'FUJ' => 'FUJICOM',
690        'FU'  => 'Fujitsu',
691        '4F'  => 'Funai',
692        '5J'  => 'Fusion5',
693        'FF'  => 'Future Mobile Technology',
694        'FFF' => 'FFF SmartLife',
695        'FW'  => 'FNF',
696        'FXT' => 'Fxtec',
697        'GT'  => 'G-TiDE',
698        'G9'  => 'G-Touch',
699        'GFO' => 'Gfone',
700        'GTM' => 'GTMEDIA',
701        'GTX' => 'GTX',
702        'GDL' => 'GDL',
703        '0G'  => 'GFive',
704        'GM'  => 'Garmin-Asus',
705        'GA'  => 'Gateway',
706        '99'  => 'Galaxy Innovations',
707        'GA1' => 'Galactic',
708        'GAT' => 'Galatec',
709        'GAM' => 'Gamma',
710        'GAZ' => 'Gazer',
711        'GAL' => 'Gazal',
712        'GEA' => 'Geanee',
713        'GEN' => 'Geant',
714        'GD'  => 'Gemini',
715        'GN'  => 'General Mobile',
716        '2G'  => 'Genesis',
717        'GEP' => 'Geo Phone',
718        'G2'  => 'GEOFOX',
719        'GE'  => 'Geotel',
720        'Q4'  => 'Geotex',
721        'GEO' => 'GEOZON',
722        'GNO' => 'Getnord',
723        'GER' => 'Gear Mobile',
724        'GH'  => 'Ghia',
725        '2C'  => 'Ghong',
726        'GJ'  => 'Ghost',
727        'GG'  => 'Gigabyte',
728        'GS'  => 'Gigaset',
729        'GZ'  => 'Ginzzu',
730        '1G'  => 'Gini',
731        'GI'  => 'Gionee',
732        'GIR' => 'GIRASOLE',
733        'G4'  => 'Globex',
734        'GLB' => 'Globmall',
735        'GME' => 'GlocalMe',
736        '38'  => 'GLONYX',
737        'U6'  => 'Glofiish',
738        'GLO' => 'Glory Star',
739        'GNE' => 'GN Electronics',
740        'G7'  => 'GoGEN',
741        'GC'  => 'GOCLEVER',
742        '5G'  => 'Gocomma',
743        'GB'  => 'Gol Mobile',
744        'GL'  => 'Goly',
745        'GOL' => 'GoldMaster',
746        'GOS' => 'GoldStar',
747        'GOB' => 'GOLDBERG',
748        'GX'  => 'GLX',
749        'G5'  => 'Gome',
750        'G1'  => 'GoMobile',
751        'GO'  => 'Google',
752        'G0'  => 'Goophone',
753        '6G'  => 'Gooweel',
754        'GOO' => 'GOODTEL',
755        'GO1' => 'GOtv',
756        'GPL' => 'G-PLUS',
757        '8G'  => 'Gplus',
758        'GR'  => 'Gradiente',
759        'GRE' => 'Graetz',
760        'GP'  => 'Grape',
761        'G6'  => 'Gree',
762        'GRA' => 'Great Asia',
763        '3G'  => 'Greentel',
764        'GRO' => 'Green Orange',
765        'GRL' => 'Green Lion',
766        'GR1' => 'GroBerwert',
767        'GF'  => 'Gretel',
768        '82'  => 'Gresso',
769        'GRB' => 'Grünberg',
770        'GU'  => 'Grundig',
771        'GV'  => 'Gtel',
772        'CUO' => 'Guophone',
773        'CUD' => 'CUD',
774        'GVC' => 'GVC Pro',
775        'H13' => 'H133',
776        '9Z'  => 'H96',
777        'HF'  => 'Hafury',
778        '9F'  => 'HAOVM',
779        'HAQ' => 'HAOQIN',
780        'HA'  => 'Haier',
781        'HEC' => 'HEC',
782        'XH'  => 'Haipai',
783        'XHU' => 'Haixu',
784        'HAN' => 'Handheld',
785        'HE'  => 'HannSpree',
786        'HNS' => 'Hanseatic',
787        'HA2' => 'Hanson',
788        'HK'  => 'Hardkernel',
789        'HAR' => 'Harper',
790        'HA1' => 'Hartens',
791        'HS'  => 'Hasee',
792        '8H'  => 'Hamlet',
793        'HAM' => 'Hammer',
794        'HAT' => 'Hathway',
795        'HAV' => 'HAVIT',
796        'HEM' => 'Hemilton',
797        'H6'  => 'Helio',
798        'HQ'  => 'HERO',
799        'ZH'  => 'Hezire',
800        'HEX' => 'HexaByte',
801        'HEW' => 'HeadWolf',
802        'HEI' => 'Heimat',
803        'HL'  => 'Hi-Level',
804        '3H'  => 'Hi',
805        'HIB' => 'Hiberg',
806        'HBY' => 'HiBy',
807        'HIH' => 'HiHi',
808        'HIK' => 'HiKing',
809        'H2'  => 'Highscreen',
810        'Q1'  => 'High Q',
811        'HI1' => 'HIGH1ONE',
812        'HIG' => 'HiGrace',
813        '1H'  => 'Hipstreet',
814        'HIR' => 'Hiremco',
815        'HI'  => 'Hisense',
816        'HIP' => 'HIPER',
817        'HC'  => 'Hitachi',
818        'H8'  => 'Hitech',
819        'W3'  => 'HiMax',
820        '8X'  => 'Hi Nova',
821        'HLL' => 'HLLO',
822        'HKC' => 'HKC',
823        'HMD' => 'HMD',
824        '8W'  => 'HKPro',
825        'HOF' => 'HOFER',
826        'HOC' => 'hoco',
827        'H1'  => 'Hoffmann',
828        'HOM' => 'Homatics',
829        'H0'  => 'Hometech',
830        'HLB' => 'HOLLEBERG',
831        'HM'  => 'Homtom',
832        'HM1' => 'HOMII',
833        'HOP' => 'Hopeland',
834        'HZ'  => 'Hoozo',
835        'HOR' => 'Horion',
836        'H7'  => 'Horizon',
837        '4H'  => 'Horizont',
838        'HO'  => 'Hosin',
839        'H3'  => 'Hotel',
840        'HV'  => 'Hotwav',
841        'U8'  => 'Hot Pepper',
842        'HOT' => 'HOTACK',
843        'JH'  => 'HOTREALS',
844        'HW'  => 'How',
845        'WH'  => 'Honeywell',
846        'HON' => 'HongTop',
847        'HOG' => 'HONKUAHG',
848        'HP'  => 'HP',
849        'HDC' => 'HDC',
850        'HT'  => 'HTC',
851        'QZ'  => 'Huagan',
852        'HD'  => 'Huadoo',
853        'HG'  => 'Huavi',
854        'HU'  => 'Huawei',
855        'HX'  => 'Humax',
856        'HUM' => 'Humanware',
857        'HME' => 'HUMElab',
858        'HR'  => 'Hurricane',
859        'H5'  => 'Huskee',
860        'HUG' => 'Hugerock',
861        'HY'  => 'Hyrican',
862        'HN'  => 'Hyundai',
863        '7H'  => 'Hyve',
864        'HYT' => 'Hytera',
865        'HYK' => 'Hykker',
866        'HYA' => 'Hyatta',
867        'IKL' => 'I KALL',
868        '3I'  => 'i-Cherry',
869        'IJ'  => 'i-Joy',
870        'IM'  => 'i-mate',
871        'IO'  => 'i-mobile',
872        'INN' => 'I-INN',
873        'IPL' => 'I-Plus',
874        'OF'  => 'iOutdoor',
875        'IB'  => 'iBall',
876        'IY'  => 'iBerry',
877        '7I'  => 'iBrit',
878        'IBO' => 'ibowin',
879        'I2'  => 'IconBIT',
880        'ING' => 'Icone Gold',
881        'IC'  => 'iDroid',
882        'IDI' => 'iDino',
883        '6Z'  => 'iData',
884        'IDC' => 'IDC',
885        'IG'  => 'iGet',
886        'IHL' => 'iHome Life',
887        'IH'  => 'iHunt',
888        'IA'  => 'Ikea',
889        'IYO' => 'iYou',
890        '8I'  => 'IKU Mobile',
891        '2K'  => 'IKI Mobile',
892        'IK'  => 'iKoMo',
893        '58'  => 'iKon',
894        '588' => 'iKonia',
895        'I7'  => 'iLA',
896        '2I'  => 'iLife',
897        '1I'  => 'iMars',
898        'IMI' => 'iMI',
899        'U4'  => 'iMan',
900        'ILE' => 'iLepo',
901        'IL'  => 'IMO Mobile',
902        'IMA' => 'Imaq',
903        'IM1' => 'Imose',
904        'I3'  => 'Impression',
905        'FC'  => 'INCAR',
906        '2H'  => 'Inch',
907        '6I'  => 'Inco',
908        'INK' => 'Inka',
909        'IW'  => 'iNew',
910        'IF'  => 'Infinix',
911        'INF' => 'Infiniton',
912        'IPR' => 'InfinityPro',
913        'I0'  => 'InFocus',
914        'IN1' => 'InFone',
915        'II'  => 'Inkti',
916        'MIR' => 'Infomir',
917        '81'  => 'InfoKit',
918        'I5'  => 'InnJoo',
919        '26'  => 'Innos',
920        'IN'  => 'Innostream',
921        'I4'  => 'Inoi',
922        'INO' => 'iNo Mobile',
923        'IQ'  => 'INQ',
924        'QN'  => 'iQ&T',
925        'IS'  => 'Insignia',
926        'YI'  => 'INSYS',
927        'IT'  => 'Intek',
928        'INT' => 'Intel',
929        'IX'  => 'Intex',
930        'IV'  => 'Inverto',
931        '32'  => 'Invens',
932        '4I'  => 'Invin',
933        'IFT' => 'iFIT',
934        'INA' => 'iNavi',
935        'I1'  => 'iOcean',
936        'IMU' => 'iMuz',
937        'IP'  => 'iPro',
938        'X9'  => 'iPEGTOP',
939        '8Q'  => 'IQM',
940        'Q8'  => 'IRA',
941        'I6'  => 'Irbis',
942        '5I'  => 'Iris',
943        'IRE' => 'iReplace',
944        'IR'  => 'iRola',
945        'IU'  => 'iRulu',
946        'IRO' => 'iRobot',
947        '9I'  => 'iSWAG',
948        '9J'  => 'iSafe Mobile',
949        'IST' => 'iStar',
950        '86'  => 'IT',
951        'IZ'  => 'iTel',
952        '0I'  => 'iTruck',
953        'I8'  => 'iVA',
954        'IE'  => 'iView',
955        '0J'  => 'iVooMi',
956        'UI'  => 'ivvi',
957        'QW'  => 'iWaylink',
958        'I9'  => 'iZotron',
959        'IXT' => 'iXTech',
960        'IOT' => 'IOTWE',
961        'JA'  => 'JAY-Tech',
962        'JAM' => 'Jambo',
963        'KJ'  => 'Jiake',
964        'JD'  => 'Jedi',
965        'JEE' => 'Jeep',
966        'J6'  => 'Jeka',
967        'JF'  => 'JFone',
968        'JI'  => 'Jiayu',
969        'JG'  => 'Jinga',
970        'JIN' => 'Jin Tu',
971        'JX'  => 'Jio',
972        'VJ'  => 'Jivi',
973        'JK'  => 'JKL',
974        'JR1' => 'JREN',
975        'JO'  => 'Jolla',
976        'JP'  => 'Joy',
977        'JOY' => 'JoySurf',
978        'UJ'  => 'Juniper Systems',
979        'J5'  => 'Just5',
980        'JUS' => 'JUSYEA',
981        '7J'  => 'Jumper',
982        'JPA' => 'JPay',
983        'JV'  => 'JVC',
984        'JXD' => 'JXD',
985        'JS'  => 'Jesy',
986        'KT'  => 'K-Touch',
987        'KLT' => 'K-Lite',
988        'K4'  => 'Kaan',
989        'K7'  => 'Kaiomy',
990        'KL'  => 'Kalley',
991        'K6'  => 'Kanji',
992        'KA'  => 'Karbonn',
993        'K5'  => 'KATV1',
994        'KAP' => 'Kapsys',
995        'K0'  => 'Kata',
996        'KZ'  => 'Kazam',
997        '9K'  => 'Kazuna',
998        'KD'  => 'KDDI',
999        'KHA' => 'Khadas',
1000        'KS'  => 'Kempler & Strauss',
1001        'K3'  => 'Keneksi',
1002        'KHI' => 'KENSHI',
1003        'KNW' => 'KENWOOD',
1004        'KX'  => 'Kenxinda',
1005        'KEN' => 'Kenbo',
1006        'KND' => 'Kendo',
1007        'KZG' => 'KZG',
1008        'K1'  => 'Kiano',
1009        'KID' => 'kidiby',
1010        '5W'  => 'Kingbox',
1011        'KI'  => 'Kingsun',
1012        'KIS' => 'Kinstone',
1013        'KF'  => 'KINGZONE',
1014        'KIN' => 'Kingstar',
1015        '46'  => 'Kiowa',
1016        'KV'  => 'Kivi',
1017        '64'  => 'Kvant',
1018        'KVA' => 'KVADRA',
1019        '0K'  => 'Klipad',
1020        'KNM' => 'KN Mobile',
1021        'KC'  => 'Kocaso',
1022        'KK'  => 'Kodak',
1023        'KG'  => 'Kogan',
1024        'KGT' => 'KGTEL',
1025        'KM'  => 'Komu',
1026        'KMC' => 'KMC',
1027        'KO'  => 'Konka',
1028        'KW'  => 'Konrow',
1029        'KB'  => 'Koobee',
1030        '7K'  => 'Koolnee',
1031        'K9'  => 'Kooper',
1032        'KP'  => 'KOPO',
1033        'KR'  => 'Koridy',
1034        'XK'  => 'Koslam',
1035        'K2'  => 'KRONO',
1036        'KRX' => 'Korax',
1037        'KE'  => 'Krüger&Matz',
1038        '5K'  => 'KREZ',
1039        'WK'  => 'KRIP',
1040        'KRA' => 'Kraft',
1041        'KH'  => 'KT-Tech',
1042        'KTC' => 'KTC',
1043        'Z6'  => 'KUBO',
1044        'KUG' => 'KuGou',
1045        'K8'  => 'Kuliao',
1046        '8K'  => 'Kult',
1047        'KU'  => 'Kumai',
1048        '6K'  => 'Kurio',
1049        'KYD' => 'Kydos',
1050        'KY'  => 'Kyocera',
1051        'KQ'  => 'Kyowon',
1052        '1K'  => 'Kzen',
1053        'LQ'  => 'LAIQ',
1054        'L6'  => 'Land Rover',
1055        'L2'  => 'Landvo',
1056        'LA'  => 'Lanix',
1057        'LA1' => 'Lanin',
1058        'LK'  => 'Lark',
1059        'Z3'  => 'Laurus',
1060        'LEC' => 'Lectrus',
1061        'LAS' => 'Laser',
1062        'LV'  => 'Lava',
1063        'LVI' => 'Lville',
1064        'LC'  => 'LCT',
1065        'L5'  => 'Leagoo',
1066        'U3'  => 'Leben',
1067        'LEB' => 'LeBest',
1068        'LD'  => 'Ledstar',
1069        'LEE' => 'Leelbox',
1070        'L1'  => 'LeEco',
1071        '4B'  => 'Leff',
1072        'LEG' => 'Legend',
1073        'L4'  => 'Lemhoov',
1074        'W9'  => 'LEMFO',
1075        'LEM' => 'Lemco',
1076        'LN'  => 'Lenco',
1077        'LE'  => 'Lenovo',
1078        'LT'  => 'Leotec',
1079        'LP'  => 'Le Pan',
1080        'ZJ'  => 'Leke',
1081        'L7'  => 'Lephone',
1082        'LZ'  => 'Lesia',
1083        'L3'  => 'Lexand',
1084        'LX'  => 'Lexibook',
1085        'LG'  => 'LG',
1086        '39'  => 'Liberton',
1087        '5L'  => 'Linsar',
1088        'LIN' => 'Linsay',
1089        'LF'  => 'Lifemaxx',
1090        'LI'  => 'Lingwin',
1091        'LIB' => 'Lingbo',
1092        'LIM' => 'Lime',
1093        'LJ'  => 'L-Max',
1094        'LW'  => 'Linnex',
1095        'JJ'  => 'Listo',
1096        'LNM' => 'LNMBBS',
1097        'LO'  => 'Loewe',
1098        'LNG' => 'LongTV',
1099        'YL'  => 'Loview',
1100        'LOV' => 'Lovme',
1101        'LGN' => 'LOGAN',
1102        '1L'  => 'Logic',
1103        'LH'  => 'Logic Instrument',
1104        'LM'  => 'Logicom',
1105        'LOG' => 'Logik',
1106        'LGT' => 'Logitech',
1107        'GY'  => 'LOKMAT',
1108        'LPX' => 'LPX-G',
1109        '0L'  => 'Lumigon',
1110        'LU'  => 'Lumus',
1111        'LUM' => 'Lumitel',
1112        'L9'  => 'Luna',
1113        'LNN' => 'LUNNEN',
1114        'LUO' => 'LUO',
1115        'LR'  => 'Luxor',
1116        'LY'  => 'LYF',
1117        'LL'  => 'Leader Phone',
1118        'LTL' => 'LYOTECH LABS',
1119        'QL'  => 'LT Mobile',
1120        'LW1' => 'LW',
1121        'MQ'  => 'M.T.T.',
1122        'MN'  => 'M4tel',
1123        'XM'  => 'Macoox',
1124        '92'  => 'MAC AUDIO',
1125        'MJ'  => 'Majestic',
1126        'FQ'  => 'Mafe',
1127        'MAG' => 'MAG',
1128        'MA2' => 'MAGCH',
1129        '6Y'  => 'Magicsee',
1130        'MA4' => 'Magenta',
1131        '23'  => 'Magnus',
1132        'NH'  => 'Manhattan',
1133        'MAN' => 'Mango',
1134        '5M'  => 'Mann',
1135        'MA'  => 'Manta Multimedia',
1136        'Z0'  => 'Mantra',
1137        'J4'  => 'Mara',
1138        'MAR' => 'Marshal',
1139        '8Y'  => 'Massgo',
1140        'MA1' => 'Mascom',
1141        '2M'  => 'Masstel',
1142        '3X'  => 'Mastertech',
1143        'MAS' => 'Master-G',
1144        '50'  => 'Matrix',
1145        'MAT' => 'Matco Tools',
1146        '7M'  => 'Maxcom',
1147        '7M1' => 'Maxfone',
1148        'ZM'  => 'Maximus',
1149        '6X'  => 'Maxtron',
1150        '0D'  => 'MAXVI',
1151        'MAX' => 'Maxwell',
1152        'XZ'  => 'MAXX',
1153        'MW'  => 'Maxwest',
1154        'M0'  => 'Maze',
1155        'YM'  => 'Maze Speed',
1156        '87'  => 'Malata',
1157        'MAU' => 'Maunfeld',
1158        'MCL' => 'McLaut',
1159        '28'  => 'MBOX',
1160        'FK'  => 'MBI',
1161        'MBK' => 'MBK',
1162        '3D'  => 'MDC Store',
1163        '1Y'  => 'MDTV',
1164        '09'  => 'meanIT',
1165        'M3'  => 'Mecer',
1166        'M3M' => 'M3 Mobile',
1167        '0M'  => 'Mecool',
1168        'MEC' => 'MECHEN',
1169        'MEM' => 'MeMobile',
1170        'MC'  => 'Mediacom',
1171        'MD'  => 'Medion',
1172        'M2'  => 'MEEG',
1173        'MEG' => 'MEGA VISION',
1174        'MCA' => 'Megacable',
1175        'MP'  => 'MegaFon',
1176        'MGX' => 'MEGAMAX',
1177        'X0'  => 'mPhone',
1178        '3M'  => 'Meitu',
1179        'M1'  => 'Meizu',
1180        '0E'  => 'Melrose',
1181        'MU'  => 'Memup',
1182        'ME'  => 'Metz',
1183        'MEO' => 'MEO',
1184        'MX'  => 'MEU',
1185        'MES' => 'MESWAO',
1186        'MI'  => 'MicroMax',
1187        'MIP' => 'mipo',
1188        'MS'  => 'Microsoft',
1189        '6Q'  => 'Microtech',
1190        'MIG' => 'Mightier',
1191        '1X'  => 'Minix',
1192        'OM'  => 'Mintt',
1193        'MIN' => 'Mint',
1194        'MO'  => 'Mio',
1195        'MOD' => 'Moondrop',
1196        'MOR' => 'MORTAL',
1197        'X7'  => 'Mione',
1198        'M7'  => 'Miray',
1199        'MIT' => 'Mitchell & Brown',
1200        '8M'  => 'Mito',
1201        'MT'  => 'Mitsubishi',
1202        '0Y'  => 'Mitsui',
1203        'M5'  => 'MIXC',
1204        '2D'  => 'MIVO',
1205        '1Z'  => 'MiXzo',
1206        'MIW' => 'MIWANG',
1207        'ML'  => 'MLLED',
1208        'LS'  => 'MLS',
1209        'MLA' => 'MLAB',
1210        '5H'  => 'MMI',
1211        '4M'  => 'Mobicel',
1212        'M6'  => 'Mobiistar',
1213        'MOK' => 'Mobile Kingdom',
1214        'MH'  => 'Mobiola',
1215        'MB'  => 'Mobistel',
1216        'ID'  => 'MobiIoT',
1217        '6W'  => 'MobiWire',
1218        '9M'  => 'Mobo',
1219        'MOB' => 'Mobell',
1220        'MVO' => 'Mobvoi',
1221        'M4'  => 'Modecom',
1222        'MEP' => 'Mode Mobile',
1223        'MF'  => 'Mofut',
1224        'MR'  => 'Motorola',
1225        'MTS' => 'Motorola Solutions',
1226        'MIV' => 'Motiv',
1227        'MV'  => 'Movic',
1228        'MOV' => 'Movitel',
1229        'MO1' => 'MOVISUN',
1230        'MOS' => 'Mosimosi',
1231        'MOX' => 'Moxee',
1232        'MM'  => 'Mpman',
1233        'MZ'  => 'MSI',
1234        '3R'  => 'MStar',
1235        'M9'  => 'MTC',
1236        'N4'  => 'MTN',
1237        '72'  => 'M-Tech',
1238        '9H'  => 'M-Horse',
1239        'MKP' => 'M-KOPA',
1240        'MLB' => 'multibox',
1241        '1R'  => 'Multilaser',
1242        'MPS' => 'MultiPOS',
1243        'MLT' => 'MULTYNET',
1244        '1M'  => 'MYFON',
1245        'MY1' => 'myPhone (PL)',
1246        'MY'  => 'MyPhone (PH)',
1247        '51'  => 'Myros',
1248        'M8'  => 'Myria',
1249        '6M'  => 'Mystery',
1250        '3T'  => 'MyTab',
1251        'MG'  => 'MyWigo',
1252        'J3'  => 'Mymaga',
1253        'MYM' => 'MyMobile',
1254        '07'  => 'MyGica',
1255        'MYG' => 'MygPad',
1256        'MWA' => 'MwalimuPlus',
1257        'NEO' => 'neoCore',
1258        'NER' => 'Neoregent',
1259        '08'  => 'Nabi',
1260        'N7'  => 'National',
1261        'NC'  => 'Navcity',
1262        '6N'  => 'Navitech',
1263        '7V'  => 'Navitel',
1264        'N3'  => 'Navon',
1265        '7R'  => 'NavRoad',
1266        'NAB' => 'NABO',
1267        'NAS' => 'NASCO',
1268        'NP'  => 'Naomi Phone',
1269        'NAN' => 'Nanho',
1270        'NE'  => 'NEC',
1271        'NDP' => 'Nedaphone',
1272        '8N'  => 'Necnot',
1273        'NF'  => 'Neffos',
1274        '9X'  => 'Neo',
1275        'NEK' => 'NEKO',
1276        '1N'  => 'Neomi',
1277        '7Q'  => 'Neon IQ',
1278        '8F'  => 'Neolix',
1279        'NES' => 'Nesons',
1280        'NET' => 'NetBox',
1281        'NWT' => 'NETWIT',
1282        'NA'  => 'Netgear',
1283        'NEM' => 'Netmak',
1284        'NU'  => 'NeuImage',
1285        'NEU' => 'NeuTab',
1286        'NEV' => 'NEVIR',
1287        'NW'  => 'Newgen',
1288        'N9'  => 'Newland',
1289        '0N'  => 'Newman',
1290        'NS'  => 'NewsMy',
1291        'ND'  => 'Newsday',
1292        'HB'  => 'New Balance',
1293        'BRI' => 'New Bridge',
1294        'NEW' => 'Newal',
1295        'XB'  => 'NEXBOX',
1296        'NX'  => 'Nexian',
1297        '7X'  => 'Nexa',
1298        '7XR' => 'Nexar',
1299        'N8'  => 'NEXON',
1300        'N2'  => 'Nextbit',
1301        'NT'  => 'NextBook',
1302        'NTT' => 'NTT West',
1303        '4N'  => 'NextTab',
1304        'NEX' => 'NEXT',
1305        'NST' => 'Next & NextStar',
1306        'NJO' => 'nJoy',
1307        'NG'  => 'NGM',
1308        'NZ'  => 'NG Optics',
1309        'NZP' => 'NGpon',
1310        'NN'  => 'Nikon',
1311        'NIL' => 'NILAIT',
1312        'NI'  => 'Nintendo',
1313        'NIN' => 'NINETEC',
1314        'NI1' => 'NINETOLOGY',
1315        'N5'  => 'NOA',
1316        'N1'  => 'Noain',
1317        'N6'  => 'Nobby',
1318        'NOC' => 'Novacom',
1319        'NOS' => 'NoviSea',
1320        'NO2' => 'NOVIS',
1321        'NOV' => 'Novey',
1322        'NO1' => 'NOVO',
1323        '57'  => 'Nubia',
1324        'JN'  => 'NOBUX',
1325        'NB'  => 'Noblex',
1326        'OG'  => 'NOGA',
1327        'NK'  => 'Nokia',
1328        'NM'  => 'Nomi',
1329        '2N'  => 'Nomu',
1330        '6H'  => 'Noontec',
1331        'NR'  => 'Nordmende',
1332        'NRD' => 'Nordfrost',
1333        'NOR' => 'NORMANDE',
1334        '7N'  => 'NorthTech',
1335        'NOT' => 'Nothing',
1336        '5N'  => 'Nos',
1337        'NO'  => 'Nous',
1338        'NQ'  => 'Novex',
1339        'NOD' => 'noDROPOUT',
1340        'NJ'  => 'NuAns',
1341        'NL'  => 'NUU Mobile',
1342        'N0'  => 'Nuvo',
1343        'NUV' => 'NuVision',
1344        'NV'  => 'Nvidia',
1345        'NY'  => 'NYX Mobile',
1346        'NON' => 'N-one',
1347        'O3'  => 'O+',
1348        'OT'  => 'O2',
1349        'O7'  => 'Oale',
1350        'OC'  => 'OASYS',
1351        'OB'  => 'Obi',
1352        'OBR' => 'Ober',
1353        'OQ'  => 'Meta',
1354        'O1'  => 'Odys',
1355        'ODP' => 'Odotpad',
1356        'O9'  => 'ok.',
1357        'OKA' => 'Okapi',
1358        'OA'  => 'Okapia',
1359        'OKI' => 'Oking',
1360        'OLA' => 'Olax',
1361        'OLK' => 'Olkya',
1362        'OLY' => 'Olympia',
1363        'OCE' => 'OCEANIC',
1364        'OLT' => 'OLTO',
1365        'OJ'  => 'Ookee',
1366        'OD'  => 'Onda',
1367        'ON'  => 'OnePlus',
1368        'ONC' => 'OneClick',
1369        'ONL' => 'OneLern',
1370        'OAN' => 'Oangcc',
1371        'OX'  => 'Onix',
1372        'OIN' => 'Onida',
1373        '3O'  => 'ONYX BOOX',
1374        'O4'  => 'ONN',
1375        '9Q'  => 'Onkyo',
1376        'ONV' => 'ONVO',
1377        'OOR' => 'Ooredoo',
1378        '2O'  => 'OpelMobile',
1379        'OH'  => 'Openbox',
1380        '7Y'  => 'Obabox',
1381        'OP'  => 'OPPO',
1382        'OO'  => 'Opsson',
1383        'OPT' => 'Optoma',
1384        'OPH' => 'Ophone',
1385        'OR'  => 'Orange',
1386        'ORP' => 'Orange Pi',
1387        'ORA' => 'Orava',
1388        'O5'  => 'Orbic',
1389        'Y6'  => 'Orbita',
1390        'ORB' => 'Orbsmart',
1391        'OS'  => 'Ordissimo',
1392        '8O'  => 'Orion',
1393        'OTT' => 'OTTO',
1394        'OK'  => 'Ouki',
1395        '0O'  => 'OINOM',
1396        'OIL' => 'Oilsky',
1397        'QK'  => 'OKWU',
1398        'QQ'  => 'OMIX',
1399        '56'  => 'OKSI',
1400        'OE'  => 'Oukitel',
1401        'OU'  => 'OUYA',
1402        'JB'  => 'OUJIA',
1403        'OV'  => 'Overmax',
1404        '30'  => 'Ovvi',
1405        'O2'  => 'Owwo',
1406        'OSC' => 'OSCAL',
1407        'OXT' => 'OX TAB',
1408        'OY'  => 'Oysters',
1409        'QF'  => 'OYSIN',
1410        'O6'  => 'Oyyu',
1411        'OZ'  => 'OzoneHD',
1412        'OLL' => 'Ollee',
1413        '7P'  => 'P-UP',
1414        'PRA' => 'Pacific Research Alliance',
1415        'PAG' => 'PAGRAER',
1416        'PAD' => 'Padpro',
1417        'YP'  => 'Paladin',
1418        'PM'  => 'Palm',
1419        'PN'  => 'Panacom',
1420        'PA'  => 'Panasonic',
1421        'PNV' => 'Panavox',
1422        'PT'  => 'Pantech',
1423        'PAN' => 'Pano',
1424        'PND' => 'Panodic',
1425        'PA1' => 'Panoramic',
1426        'PLT' => 'Platoon',
1427        'PLD' => 'PLDT',
1428        '94'  => 'Packard Bell',
1429        'H9'  => 'Parrot Mobile',
1430        'PAR' => 'Partner Mobile',
1431        'PAP' => 'PAPYRE',
1432        'PB'  => 'PCBOX',
1433        'PCS' => 'PC Smart',
1434        'PC'  => 'PCD',
1435        'PD'  => 'PCD Argentina',
1436        'PE'  => 'PEAQ',
1437        'PEN' => 'Penta',
1438        'PG'  => 'Pentagram',
1439        'PQ'  => 'Pendoo',
1440        '93'  => 'Perfeo',
1441        '8J'  => 'Pelitt',
1442        '1P'  => 'Phicomm',
1443        '4P'  => 'Philco',
1444        'PH'  => 'Philips',
1445        '5P'  => 'Phonemax',
1446        'PO'  => 'phoneOne',
1447        'PI'  => 'Pioneer',
1448        'PIC' => 'Pioneer Computers',
1449        'PJ'  => 'PiPO',
1450        '8P'  => 'Pixelphone',
1451        '9O'  => 'Pixela',
1452        'PX'  => 'Pixus',
1453        'PIX' => 'PIXPRO',
1454        'QP'  => 'Pico',
1455        'PIR' => 'PIRANHA',
1456        'PIN' => 'PINE',
1457        '9P'  => 'Planet Computers',
1458        'PLA' => 'Play Now',
1459        'PY'  => 'Ployer',
1460        'P4'  => 'Plum',
1461        'PLU' => 'PlusStyle',
1462        '22'  => 'Pluzz',
1463        'P8'  => 'PocketBook',
1464        '0P'  => 'POCO',
1465        'FH'  => 'Point Mobile',
1466        'PV'  => 'Point of View',
1467        'PVB' => 'PVBox',
1468        'PL'  => 'Polaroid',
1469        'Q6'  => 'Polar',
1470        '97'  => 'PolarLine',
1471        'PP'  => 'PolyPad',
1472        'P5'  => 'Polytron',
1473        'P2'  => 'Pomp',
1474        'P0'  => 'Poppox',
1475        '0X'  => 'POPTEL',
1476        'PS'  => 'Positivo',
1477        '3P'  => 'Positivo BGH',
1478        '3F'  => 'Porsche',
1479        'PRT' => 'Portfolio',
1480        'PPD' => 'PPDS',
1481        'P3'  => 'PPTV',
1482        'FP'  => 'Premio',
1483        'PR1' => 'Premier',
1484        'PR'  => 'Prestigio',
1485        'P9'  => 'Primepad',
1486        'PRM' => 'PRIME',
1487        '6P'  => 'Primux',
1488        '2P'  => 'Prixton',
1489        'PRI' => 'Pritom',
1490        'PRP' => 'PRISM+',
1491        'PF'  => 'PROFiLO',
1492        'P6'  => 'Proline',
1493        '5O'  => 'Prology',
1494        'P1'  => 'ProScan',
1495        'PRO' => 'PROSONIC',
1496        'P7'  => 'Protruly',
1497        'R0'  => 'ProVision',
1498        '7O'  => 'Polestar',
1499        'PU'  => 'PULID',
1500        'UP'  => 'Purism',
1501        'PUN' => 'Punos',
1502        'QFX' => 'QFX',
1503        'Q7'  => 'Q-Box',
1504        'QH'  => 'Q-Touch',
1505        'QB'  => 'Q.Bell',
1506        'QI'  => 'Qilive',
1507        'QIN' => 'QIN',
1508        'QIW' => 'Qiuwoky',
1509        'QM'  => 'QMobile',
1510        'QT'  => 'Qtek',
1511        'Q9'  => 'QTECH',
1512        'QA'  => 'Quantum',
1513        'QUE' => 'Quest',
1514        'QUA' => 'Quatro',
1515        'QU'  => 'Quechua',
1516        'QUI' => 'Quipus',
1517        'QO'  => 'Qumo',
1518        'UQ'  => 'Qubo',
1519        'QUP' => 'Qupi',
1520        'YQ'  => 'QLink',
1521        'QY'  => 'Qnet Mobile',
1522        'WJ'  => 'Qware',
1523        'QWT' => 'QWATT',
1524        'R2'  => 'R-TV',
1525        'R3D' => 'R3Di',
1526        'RA'  => 'Ramos',
1527        '0R'  => 'Raspberry',
1528        'R9'  => 'Ravoz',
1529        'RZ'  => 'Razer',
1530        'RAZ' => 'RAZZ',
1531        '95'  => 'Rakuten',
1532        'RAY' => 'Raylandz',
1533        'RC'  => 'RCA Tablets',
1534        'RCT' => 'RCT',
1535        '2R'  => 'Reach',
1536        'RLX' => 'Realix',
1537        'REL' => 'RelNAT',
1538        'RE4' => 'Relndoo',
1539        'RB'  => 'Readboy',
1540        'RE'  => 'Realme',
1541        'RE1' => 'Redbean',
1542        'R8'  => 'RED',
1543        'RDX' => 'RED-X',
1544        'REW' => 'Redway',
1545        '6F'  => 'Redfox',
1546        'RE2' => 'RedLine',
1547        'RD'  => 'Reeder',
1548        'Z9'  => 'REGAL',
1549        'RH'  => 'Remdun',
1550        'RP'  => 'Revo',
1551        'REV' => 'Revomovil',
1552        '8R'  => 'Retroid Pocket',
1553        'REN' => 'Renova',
1554        'RE3' => 'RENSO',
1555        'REP' => 'rephone',
1556        'RHI' => 'Rhino',
1557        'RIC' => 'Ricoh',
1558        'RI'  => 'Rikomagic',
1559        'RM'  => 'RIM',
1560        'RN'  => 'Rinno',
1561        'RNB' => 'Ringing Bells',
1562        'RX'  => 'Ritmix',
1563        'R7'  => 'Ritzviva',
1564        'RV'  => 'Riviera',
1565        '6R'  => 'Rivo',
1566        'RIZ' => 'Rizzen',
1567        'RR'  => 'Roadrover',
1568        'QR'  => 'ROADMAX',
1569        'ROH' => 'ROCH',
1570        'ROC' => 'Roam Cat',
1571        'ROT' => 'Rocket',
1572        'R1'  => 'Rokit',
1573        'ROI' => 'ROiK',
1574        'RK'  => 'Roku',
1575        'R3'  => 'Rombica',
1576        'RUA' => 'Romsat',
1577        'R5'  => 'Ross&Moor',
1578        'RO'  => 'Rover',
1579        'R6'  => 'RoverPad',
1580        'RQ'  => 'RoyQueen',
1581        'RJ'  => 'Royole',
1582        'RT'  => 'RT Project',
1583        'RTK' => 'RTK',
1584        'RG'  => 'RugGear',
1585        'RUG' => 'Ruggex',
1586        'RUT' => 'RuggeTech',
1587        'RU'  => 'Runbo',
1588        'RUP' => 'Rupa',
1589        'RL'  => 'Ruio',
1590        'RY'  => 'Ryte',
1591        'X5'  => 'Saba',
1592        '8L'  => 'S-TELL',
1593        '8L1' => 'S-Color',
1594        '4O'  => 'S2Tel',
1595        '89'  => 'Seatel',
1596        'SEW' => 'Sewoo',
1597        'SE1' => 'SEEWO',
1598        'SEN' => 'SENNA',
1599        'SER' => 'SERVO',
1600        'Y7'  => 'Saiet',
1601        'SLF' => 'SAILF',
1602        'X1'  => 'Safaricom',
1603        'SG'  => 'Sagem',
1604        'SAG' => 'Sagemcom',
1605        '4L'  => 'Salora',
1606        'SA'  => 'Samsung',
1607        'SAT' => 'Samtech',
1608        'SAM' => 'Samtron',
1609        'SAB' => 'Sambox',
1610        'SNA' => 'SNAMI',
1611        'S0'  => 'Sanei',
1612        '12'  => 'Sansui',
1613        'SAK' => 'Sankey',
1614        'SQ'  => 'Santin',
1615        'SY'  => 'Sanyo',
1616        'SAN' => 'SANY',
1617        'S9'  => 'Savio',
1618        'Y4'  => 'TCL SCBC',
1619        'SCH' => 'SCHAUB LORENZ',
1620        'CZ'  => 'Schneider',
1621        'SHO' => 'SCHONTECH',
1622        'SCO' => 'Scosmos',
1623        'SC1' => 'Scoole',
1624        'ZG'  => 'Schok',
1625        'G8'  => 'SEG',
1626        'SEX' => 'SEHMAX',
1627        'SD'  => 'Sega',
1628        '0U'  => 'Selecline',
1629        '9G'  => 'Selenga',
1630        'SV'  => 'Selevision',
1631        'SL'  => 'Selfix',
1632        '0S'  => 'SEMP TCL',
1633        'S1'  => 'Sencor',
1634        'SNM' => 'Sencrom',
1635        'SN'  => 'Sendo',
1636        '01'  => 'Senkatel',
1637        'S6'  => 'Senseit',
1638        'EW'  => 'Senwa',
1639        '24'  => 'Seeken',
1640        'SEB' => 'SEBBE',
1641        '61'  => 'Seuic',
1642        'SX'  => 'SFR',
1643        'SGI' => 'SGIN',
1644        'SH'  => 'Sharp',
1645        'JU'  => 'Shanling',
1646        '7S'  => 'Shift Phones',
1647        '78'  => 'Shivaki',
1648        'RS'  => 'Shtrikh-M',
1649        '3S'  => 'Shuttle',
1650        '13'  => 'Sico',
1651        'SI'  => 'Siemens',
1652        '1S'  => 'Sigma',
1653        '70'  => 'Silelis',
1654        'SJ'  => 'Silent Circle',
1655        'SIL' => 'Silva Schneider',
1656        '10'  => 'Simbans',
1657        '98'  => 'Simply',
1658        'SIM' => 'simfer',
1659        '52'  => 'Singtech',
1660        'SIN' => 'SINGER',
1661        '31'  => 'Siragon',
1662        'SIS' => 'Siswoo',
1663        '83'  => 'Sirin Labs',
1664        '5Z'  => 'SK Broadband',
1665        'GK'  => 'SKG',
1666        'SW'  => 'Sky',
1667        'SK'  => 'Skyworth',
1668        'SKY' => 'Skyline',
1669        'SK1' => 'SkyStream',
1670        'SKT' => 'Skytech',
1671        'SKK' => 'SKK Mobile',
1672        '14'  => 'Smadl',
1673        '19'  => 'Smailo',
1674        'SR'  => 'Smart Electronic',
1675        'SMA' => 'Smart Kassel',
1676        'STE' => 'Smart Tech',
1677        '49'  => 'Smart',
1678        '47'  => 'SmartBook',
1679        '3B'  => 'Smartab',
1680        '80'  => 'SMARTEC',
1681        'SM1' => 'Smartex',
1682        'SC'  => 'Smartfren',
1683        'S7'  => 'Smartisan',
1684        'SMU' => 'SMUX',
1685        'SMT' => 'SMT Telecom',
1686        'JR'  => 'Sylvania',
1687        'SYH' => 'SYH',
1688        '3Y'  => 'Smarty',
1689        'HH'  => 'Smooth Mobile',
1690        '1Q'  => 'Smotreshka',
1691        'SF'  => 'Softbank',
1692        '9L'  => 'SOLE',
1693        'JL'  => 'SOLO',
1694        'SOS' => 'SOSH',
1695        'SOD' => 'Soda',
1696        'SOL' => 'Solas',
1697        '16'  => 'Solone',
1698        'OI'  => 'Sonim',
1699        'SVE' => 'Sveon',
1700        'SO'  => 'Sony',
1701        'SE'  => 'Sony Ericsson',
1702        'X2'  => 'Soundmax',
1703        'SUL' => 'SoulLink',
1704        '8S'  => 'Soyes',
1705        '77'  => 'SONOS',
1706        '68'  => 'Soho Style',
1707        'SOB' => 'SobieTech',
1708        'SOW' => 'SOWLY',
1709        'PK'  => 'Spark',
1710        'SPX' => 'Sparx',
1711        'FS'  => 'SPC',
1712        '6S'  => 'Spectrum',
1713        '43'  => 'Spectralink',
1714        'SP'  => 'Spice',
1715        'SPD' => 'Spider',
1716        '84'  => 'Sprint',
1717        'SPU' => 'SPURT',
1718        'QS'  => 'SQOOL',
1719        'S4'  => 'Star',
1720        'OL'  => 'Starlight',
1721        'STA' => 'Star-Light',
1722        '18'  => 'Starmobile',
1723        '2S'  => 'Starway',
1724        '45'  => 'Starwind',
1725        'SB'  => 'STF Mobile',
1726        'S8'  => 'STK',
1727        'GQ'  => 'STG Telecom',
1728        'S2'  => 'Stonex',
1729        'ST'  => 'Storex',
1730        'STR' => 'Stream',
1731        '71'  => 'StrawBerry',
1732        '96'  => 'STRONG',
1733        '69'  => 'Stylo',
1734        'STI' => 'Stilevs',
1735        '9S'  => 'Sugar',
1736        'SUR' => 'Surge',
1737        'SUF' => 'Surfans',
1738        '06'  => 'Subor',
1739        'SUT' => 'SULPICE TV',
1740        'SZ'  => 'Sumvision',
1741        '0H'  => 'Sunstech',
1742        'S3'  => 'SunVan',
1743        '5S'  => 'Sunvell',
1744        '5Y'  => 'Sunny',
1745        'W8'  => 'SUNWIND',
1746        'SBX' => 'SuperBOX',
1747        'SBM' => 'Supermax',
1748        'SBR' => 'Sber',
1749        'SGE' => 'Super General',
1750        'SU'  => 'SuperSonic',
1751        '79'  => 'SuperTab',
1752        'STV' => 'SuperTV',
1753        'S5'  => 'Supra',
1754        'SUP' => 'Supraim',
1755        'ZS'  => 'Suzuki',
1756        '2J'  => 'Sunmi',
1757        'SUN' => 'Sunmax',
1758        '0W'  => 'Swipe',
1759        'SWI' => 'Switel',
1760        'SS'  => 'SWISSMOBILITY',
1761        '1W'  => 'Swisstone',
1762        'SWO' => 'SWOFY',
1763        'SSK' => 'SSKY',
1764        'SYC' => 'Syco',
1765        'SM'  => 'Symphony',
1766        '4S'  => 'Syrox',
1767        'SYS' => 'System76',
1768        'TM'  => 'T-Mobile',
1769        'T96' => 'T96',
1770        'TAD' => 'TADAAM',
1771        'TK'  => 'Takara',
1772        '73'  => 'Tambo',
1773        '9N'  => 'Tanix',
1774        'U5'  => 'Taiga System',
1775        'TAL' => 'Talius',
1776        '7G'  => 'TAG Tech',
1777        'TLB' => 'TALBERG',
1778        'TAU' => 'TAUBE',
1779        'T5'  => 'TB Touch',
1780        'TC'  => 'TCL',
1781        'T0'  => 'TD Systems',
1782        'YY'  => 'TD Tech',
1783        'H4'  => 'Technicolor',
1784        'TEA' => 'TeachTouch',
1785        'Z5'  => 'Technika',
1786        'TE1' => 'TechSmart',
1787        'TX'  => 'TechniSat',
1788        'TT'  => 'TechnoTrend',
1789        'TTS' => 'TECHNOSAT',
1790        'TM1' => 'Temigereev',
1791        'TP'  => 'TechPad',
1792        'TPS' => 'TPS',
1793        '9E'  => 'Techwood',
1794        '7F'  => 'Technopc',
1795        'TCH' => 'Techstorm',
1796        'T7'  => 'Teclast',
1797        'TB'  => 'Tecno Mobile',
1798        'TEC' => 'TecToy',
1799        '91'  => 'TEENO',
1800        'TLK' => 'Telkom',
1801        '2L'  => 'Tele2',
1802        'TL'  => 'Telefunken',
1803        'TG'  => 'Telego',
1804        'T2'  => 'Telenor',
1805        'TE'  => 'Telit',
1806        '65'  => 'Telia',
1807        'TLY' => 'Telly',
1808        'TEL' => 'Telma',
1809        'PW'  => 'Telpo',
1810        'TLS' => 'TeloSystems',
1811        'TER' => 'Teracube',
1812        'TD'  => 'Tesco',
1813        'TA'  => 'Tesla',
1814        '9T'  => 'Tetratab',
1815        'TET' => 'TETC',
1816        'TZ'  => 'teXet',
1817        '29'  => 'Teknosa',
1818        'JZ'  => 'TJC',
1819        'TJD' => 'TJD',
1820        'JC'  => 'TENPLUS',
1821        'T4'  => 'ThL',
1822        'TN'  => 'Thomson',
1823        'O0'  => 'Thuraya',
1824        'TI'  => 'TIANYU',
1825        'JY'  => 'Tigers',
1826        '8T'  => 'Time2',
1827        'TQ'  => 'Timovi',
1828        'TIM' => 'TIMvision',
1829        '2T'  => 'Tinai',
1830        'TF'  => 'Tinmo',
1831        'TH'  => 'TiPhone',
1832        'YV'  => 'TiVo',
1833        'TIV' => 'Tivax',
1834        'TIB' => 'Tibuta',
1835        'Y3'  => 'TOKYO',
1836        'TOX' => 'TOX',
1837        'T1'  => 'Tolino',
1838        '0T'  => 'Tone',
1839        'TY'  => 'Tooky',
1840        'TYD' => 'TYD',
1841        'TOO' => 'TOOGO',
1842        'TPT' => 'Top-Tech',
1843        'T9'  => 'Top House',
1844        'DK'  => 'Topelotek',
1845        '42'  => 'Topway',
1846        'TO'  => 'Toplux',
1847        'TOD' => 'TOPDON',
1848        'TOP' => 'TopDevice',
1849        'TO2' => 'TOPSHOWS',
1850        '7T'  => 'Torex',
1851        'TOR' => 'Torque',
1852        'TRN' => 'TORNADO',
1853        '6O'  => 'TOSCIDO',
1854        'TO1' => 'Topsion',
1855        'TS'  => 'Toshiba',
1856        'T8'  => 'Touchmate',
1857        'TOU' => 'Touch Plus',
1858        '5R'  => 'Transpeed',
1859        'T6'  => 'TrekStor',
1860        'TRP' => 'Trecfone',
1861        'T3'  => 'Trevi',
1862        'TRI' => 'TriaPlay',
1863        'TJ'  => 'Trifone',
1864        'Q5'  => 'Trident',
1865        'TRB' => 'Trimble',
1866        '4T'  => 'Tronsmart',
1867        '11'  => 'True',
1868        'JT'  => 'True Slim',
1869        'J1'  => 'Trio',
1870        'TRC' => 'Tricolor',
1871        'THT' => 'Tsinghua Tongfang',
1872        '5C'  => 'TTEC',
1873        'TTF' => 'TTfone',
1874        'TTK' => 'TTK-TV',
1875        'TU'  => 'Tunisie Telecom',
1876        '1T'  => 'Turbo',
1877        'TR'  => 'Turbo-X',
1878        '5X'  => 'TurboPad',
1879        '5T'  => 'TurboKids',
1880        'UR'  => 'Turkcell',
1881        '4U'  => 'TuCEL',
1882        'TUV' => 'Tuvio',
1883        'TUC' => 'TUCSON',
1884        '2U'  => 'Türk Telekom',
1885        'TV'  => 'TVC',
1886        'TVP' => 'TV+',
1887        'TW'  => 'TWM',
1888        'Z1'  => 'TWZ',
1889        '6T'  => 'Twoe',
1890        'TWN' => 'TwinMOS',
1891        '15'  => 'Tymes',
1892        'UC'  => 'U.S. Cellular',
1893        'UD1' => 'UD',
1894        'UGI' => 'UGINE',
1895        'UG'  => 'Ugoos',
1896        'U1'  => 'Uhans',
1897        'UH'  => 'Uhappy',
1898        'UL'  => 'Ulefone',
1899        'UA'  => 'Umax',
1900        'UM'  => 'UMIDIGI',
1901        'UM2' => 'Umiio',
1902        'UNT' => 'Unitech',
1903        'UZ'  => 'Unihertz',
1904        '3Z'  => 'UZ Mobile',
1905        'UX'  => 'Unimax',
1906        'UNQ' => 'Uniqcell',
1907        'US'  => 'Uniscope',
1908        'UNI' => 'Unistrong',
1909        'U2'  => 'UNIWA',
1910        'UND' => 'Uniden',
1911        'UNE' => 'UNITED',
1912        'UGR' => 'United Group',
1913        'UO'  => 'Unnecto',
1914        'UNN' => 'Unnion Technologies',
1915        'UNP' => 'UnoPhone',
1916        'UU'  => 'Unonu',
1917        'UN'  => 'Unowhy',
1918        'UY'  => 'UNNO',
1919        'UOO' => 'UOOGOU',
1920        'UNB' => 'Unblock Tech',
1921        'UK'  => 'UTOK',
1922        '3U'  => 'IUNI',
1923        'UT'  => 'UTStarcom',
1924        '6U'  => 'UTime',
1925        '9U'  => 'Urovo',
1926        'UW'  => 'U-Magic',
1927        '5V'  => 'VAIO',
1928        'WV'  => 'VAVA',
1929        'VA'  => 'Vastking',
1930        'VP'  => 'Vargo',
1931        'VC'  => 'Vankyo',
1932        'VAL' => 'VALEM',
1933        'VA2' => 'VALE',
1934        'VAT' => 'VALTECH',
1935        'VAN' => 'VANGUARD',
1936        'VAW' => 'VANWIN',
1937        'VB'  => 'VC',
1938        'VEI' => 'Veidoo',
1939        'VN'  => 'Venso',
1940        'VNP' => 'VNPT Technology',
1941        'VEN' => 'Venstar',
1942        'UV'  => 'Venturer',
1943        'VQ'  => 'Vega',
1944        'WC'  => 'VEON',
1945        '4V'  => 'Verico',
1946        'V4'  => 'Verizon',
1947        'VR'  => 'Vernee',
1948        'VX'  => 'Vertex',
1949        'VE'  => 'Vertu',
1950        'VET' => 'VETAS',
1951        'VL'  => 'Verykool',
1952        'QV'  => 'Verssed',
1953        'VER' => 'Versus',
1954        'V8'  => 'Vesta',
1955        'VEK' => 'Vekta',
1956        'VT'  => 'Vestel',
1957        '48'  => 'Vexia',
1958        'V6'  => 'VGO TEL',
1959        'QJ'  => 'VDVD',
1960        'VIC' => 'Victurio',
1961        'VD'  => 'Videocon',
1962        'VW'  => 'Videoweb',
1963        'VS'  => 'ViewSonic',
1964        'VIE' => 'Viendo',
1965        'VIK' => 'VIKUSHA',
1966        'V7'  => 'Vinga',
1967        'V7T' => 'V7',
1968        'V3'  => 'Vinsoc',
1969        'XD'  => 'Vinabox',
1970        'FV'  => 'Vios',
1971        '0V'  => 'Vipro',
1972        'ZV'  => 'Virzo',
1973        'VIP' => 'Viper',
1974        'VI'  => 'Vitelcom',
1975        'VIB' => 'ViBox',
1976        '8V'  => 'Viumee',
1977        'V5'  => 'Vivax',
1978        'VIV' => 'VIVIMAGE',
1979        'VI2' => 'VIVIBright',
1980        'VV'  => 'Vivo',
1981        '6V'  => 'VIWA',
1982        'VII' => 'VIIPOO',
1983        'VID' => 'VIDA',
1984        'VZ'  => 'Vizio',
1985        'VIZ' => 'Vizmo',
1986        'VIT' => 'Vityaz',
1987        '9V'  => 'Vision Touch',
1988        'VIS' => 'Vision Technology',
1989        'VST' => 'Visitech',
1990        'VIL' => 'Visual Land',
1991        'VI1' => 'VILLAON',
1992        'VIM' => 'VIMOQ',
1993        'VK'  => 'VK Mobile',
1994        'JM'  => 'v-mobile',
1995        'VHO' => 'V-HOPE',
1996        'VHM' => 'V-HOME',
1997        'VGE' => 'V-Gen',
1998        'V0'  => 'VKworld',
1999        'VM'  => 'Vodacom',
2000        'VOC' => 'VOCAL',
2001        'VF'  => 'Vodafone',
2002        '7W'  => 'VOGA',
2003        'V2'  => 'Vonino',
2004        '1V'  => 'Vontar',
2005        'VG'  => 'Vorago',
2006        '2V'  => 'Vorke',
2007        '8U'  => 'Vorcom',
2008        'JW'  => 'Vortex',
2009        'VRX' => 'VORTEX (RO)',
2010        'VOR' => 'Vormor',
2011        'V1'  => 'Voto',
2012        'Z7'  => 'VOX',
2013        'VO'  => 'Voxtel',
2014        'VY'  => 'Voyo',
2015        'VOL' => 'Völfen',
2016        'VO1' => 'Volt',
2017        'VOP' => 'Volla',
2018        'V02' => 'VOLIA',
2019        'VH'  => 'Vsmart',
2020        'V9'  => 'Vsun',
2021        'VU'  => 'Vulcan',
2022        '3V'  => 'VVETIME',
2023        'ZC'  => 'VUCATIMES',
2024        'VO2' => 'VOLKANO',
2025        'VUE' => 'Vue Micro',
2026        'WAK' => 'Walker',
2027        'WA'  => 'Walton',
2028        'WAF' => 'WAF',
2029        'WAO' => 'W&O',
2030        'WLT' => 'Waltham',
2031        'WAL' => 'Waltter',
2032        'WAI' => 'Wainyok',
2033        'WHI' => 'White Mobile',
2034        'WHO' => 'Whoop',
2035        'WBL' => 'We. by Loewe.',
2036        'WCP' => 'WeChip',
2037        'WM'  => 'Weimei',
2038        'WM1' => 'Weiimi',
2039        'WE'  => 'WellcoM',
2040        'W6'  => 'WELLINGTON',
2041        'WD'  => 'Western Digital',
2042        'WST' => 'Weston',
2043        'WT'  => 'Westpoint',
2044        'WAN' => 'Wanmukang',
2045        'WA1' => 'WANSA',
2046        'WY'  => 'Wexler',
2047        '3W'  => 'WE',
2048        'WEC' => 'Wecool',
2049        'WEE' => 'Weelikeit',
2050        'WP'  => 'Wieppo',
2051        'W2'  => 'Wigor',
2052        'WI'  => 'Wiko',
2053        'WF'  => 'Wileyfox',
2054        'WLR' => 'WildRed',
2055        'WS'  => 'Winds',
2056        'WN'  => 'Wink',
2057        '9W'  => 'Winmax',
2058        'W5'  => 'Winnovo',
2059        'WU'  => 'Wintouch',
2060        'WIS' => 'Winstar',
2061        'W0'  => 'Wiseasy',
2062        '2W'  => 'Wizz',
2063        'W4'  => 'WIWA',
2064        'WIZ' => 'WizarPos',
2065        'WL'  => 'Wolder',
2066        'WG'  => 'Wolfgang',
2067        'WQ'  => 'Wolki',
2068        'WON' => 'WONDER',
2069        'WO'  => 'Wonu',
2070        'W1'  => 'Woo',
2071        'WR'  => 'Wortmann',
2072        'WX'  => 'Woxter',
2073        'WOZ' => 'WOZIFAN',
2074        'XQ'  => 'X-AGE',
2075        'XEL' => 'XElectron',
2076        'X3'  => 'X-BO',
2077        'XBI' => 'XB',
2078        'XMO' => 'X-Mobile',
2079        'XT'  => 'X-TIGI',
2080        'XV'  => 'X-View',
2081        'X4'  => 'X.Vision',
2082        'X88' => 'X88',
2083        'X96' => 'X96',
2084        '96Q' => 'X96Q',
2085        'A95' => 'A95X',
2086        'XG'  => 'Xgody',
2087        'XGE' => 'XGEM',
2088        'QX'  => 'XGIMI',
2089        'XL'  => 'Xiaolajiao',
2090        'XI'  => 'Xiaomi',
2091        'XW'  => 'Xiaodu',
2092        'XN'  => 'Xion',
2093        'XO'  => 'Xolo',
2094        'XR'  => 'Xoro',
2095        'XPP' => 'XPPen',
2096        'XRL' => 'XREAL',
2097        'XS'  => 'Xshitou',
2098        'XSM' => 'Xsmart',
2099        '4X'  => 'Xtouch',
2100        'X8'  => 'Xtratech',
2101        'XCR' => 'Xcruiser',
2102        'XCO' => 'XCOM',
2103        'XCL' => 'Xcell',
2104        'XWA' => 'Xwave',
2105        'YD'  => 'Yandex',
2106        'YA'  => 'Yarvik',
2107        'Y2'  => 'Yes',
2108        'YES' => 'Yestel',
2109        'YE'  => 'Yezz',
2110        'YG'  => 'YEPEN',
2111        'YEL' => 'YELLYOUTH',
2112        'YK'  => 'Yoka TV',
2113        'YO'  => 'Yota',
2114        'YOU' => 'Youin',
2115        'YO1' => 'Youwei',
2116        'YOO' => 'Yooz',
2117        'YT'  => 'Ytone',
2118        'Y9'  => 'YOTOPT',
2119        'Y1'  => 'Yu',
2120        'YF'  => 'YU Fly',
2121        'Y0'  => 'YUHO',
2122        'YN'  => 'Yuno',
2123        'YUN' => 'YUNDOO',
2124        'YUS' => 'YunSong',
2125        'YUM' => 'YUMKEM',
2126        'YU'  => 'Yuandao',
2127        'YS'  => 'Yusun',
2128        'YJ'  => 'YASIN',
2129        'YX'  => 'Yxtel',
2130        '0Z'  => 'Zatec',
2131        '2Z'  => 'Zaith',
2132        'ZAM' => 'Zamolxe',
2133        'ZZB' => 'ZZB',
2134        'ZEA' => 'Zealot',
2135        'PZ'  => 'Zebra',
2136        'ZE1' => 'Zeblaze',
2137        'ZE'  => 'Zeemi',
2138        'WZ'  => 'Zeeker',
2139        'ZN'  => 'Zen',
2140        'ZK'  => 'Zenek',
2141        'ZL'  => 'Zentality',
2142        'ZF'  => 'Zfiner',
2143        'ZI'  => 'Zidoo',
2144        'FZ'  => 'ZIFRO',
2145        'ZIF' => 'ZIFFLER',
2146        'ZIO' => 'ZIOVO',
2147        'ZX'  => 'Ziox',
2148        'ZIK' => 'ZIK',
2149        'ZKI' => 'Z-Kai',
2150        'ZIG' => 'Zigo',
2151        'ZIN' => 'Zinox',
2152        'ZO'  => 'Zonda',
2153        'ZW'  => 'Zonko',
2154        'ZP'  => 'Zopo',
2155        'ZOO' => 'ZoomSmart',
2156        'ZO1' => 'Zoom',
2157        'ZT'  => 'ZTE',
2158        'ZU'  => 'Zuum',
2159        'ZY'  => 'Zync',
2160        'ZR'  => 'Zyrex',
2161        'ZQ'  => 'ZYQ',
2162        'Z4'  => 'ZH&K',
2163        'OW'  => 'öwn',
2164        'WBF' => 'Webfleet',
2165        'WSS' => 'WS',
2166        // legacy brands, might be removed in future versions
2167        'WB'  => 'Web TV',
2168        'XX'  => 'Unknown',
2169    ];
2170
2171    /**
2172     * Mapping formFactor types to parser device types
2173     * (not sort array the array priority result device type)
2174     * @var array
2175     */
2176    protected static $clientHintFormFactorsMapping = [
2177        'automotive' => self::DEVICE_TYPE_CAR_BROWSER,
2178        'xr'         => self::DEVICE_TYPE_WEARABLE,
2179        'watch'      => self::DEVICE_TYPE_WEARABLE,
2180        'mobile'     => self::DEVICE_TYPE_SMARTPHONE,
2181        'tablet'     => self::DEVICE_TYPE_TABLET,
2182        'desktop'    => self::DEVICE_TYPE_DESKTOP,
2183        'eink'       => self::DEVICE_TYPE_TABLET,
2184    ];
2185
2186    /**
2187     * Returns the device type represented by one of the DEVICE_TYPE_* constants
2188     *
2189     * @return int|null
2190     */
2191    public function getDeviceType(): ?int
2192    {
2193        return $this->deviceType;
2194    }
2195
2196    /**
2197     * Returns available device types
2198     *
2199     * @see $deviceTypes
2200     *
2201     * @return array
2202     */
2203    public static function getAvailableDeviceTypes(): array
2204    {
2205        return self::$deviceTypes;
2206    }
2207
2208    /**
2209     * Returns names of all available device types
2210     *
2211     * @return array
2212     */
2213    public static function getAvailableDeviceTypeNames(): array
2214    {
2215        return \array_keys(self::$deviceTypes);
2216    }
2217
2218    /**
2219     * Returns the name of the given device type
2220     *
2221     * @param int $deviceType one of the DEVICE_TYPE_* constants
2222     *
2223     * @return string
2224     */
2225    public static function getDeviceName(int $deviceType): string
2226    {
2227        $deviceName = \array_search($deviceType, self::$deviceTypes);
2228
2229        if (\is_string($deviceName)) {
2230            return $deviceName;
2231        }
2232
2233        return '';
2234    }
2235
2236    /**
2237     * Returns the detected device model
2238     *
2239     * @return string
2240     */
2241    public function getModel(): string
2242    {
2243        return $this->model;
2244    }
2245
2246    /**
2247     * Returns the detected device brand
2248     *
2249     * @return string
2250     */
2251    public function getBrand(): string
2252    {
2253        return $this->brand;
2254    }
2255
2256    /**
2257     * Returns the full brand name for the given short name
2258     *
2259     * @param string $brandId short brand name
2260     *
2261     * @return string
2262     */
2263    public static function getFullName(string $brandId): string
2264    {
2265        if (\array_key_exists($brandId, self::$deviceBrands)) {
2266            return self::$deviceBrands[$brandId];
2267        }
2268
2269        return '';
2270    }
2271
2272    /**
2273     * Returns the brand short code for the given name
2274     *
2275     * @param string $brand brand name
2276     *
2277     * @return string
2278     *
2279     * @deprecated since 4.0 - short codes might be removed in next major release
2280     */
2281    public static function getShortCode(string $brand): string
2282    {
2283        return (string) \array_search($brand, self::$deviceBrands) ?: '';
2284    }
2285
2286    /**
2287     * Sets the useragent to be parsed
2288     *
2289     * @param string $userAgent
2290     */
2291    public function setUserAgent(string $userAgent): void
2292    {
2293        $this->reset();
2294        parent::setUserAgent($userAgent);
2295    }
2296
2297    /**
2298     * @inheritdoc
2299     */
2300    public function parse(): ?array
2301    {
2302        $resultClientHint = $this->parseClientHints();
2303        $deviceModel      = $resultClientHint['model'] ?? '';
2304
2305        $this->restoreUserAgentFromClientHints();
2306
2307        if ('' === $deviceModel && $this->hasUserAgentClientHintsFragment()) {
2308            return $this->getResult();
2309        }
2310
2311        if ('' === $deviceModel && $this->hasDesktopFragment()) {
2312            return $this->getResult();
2313        }
2314
2315        $brand   = '';
2316        $regexes = $this->getRegexes();
2317
2318        foreach ($regexes as $brand => $regex) {
2319            $matches = $this->matchUserAgent($regex['regex']);
2320
2321            if ($matches) {
2322                break;
2323            }
2324        }
2325
2326        if (empty($matches)) {
2327            $this->deviceType = $resultClientHint['deviceType'] ?? null;
2328
2329            return $resultClientHint;
2330        }
2331
2332        if ('Unknown' !== $brand) {
2333            if (!\in_array($brand, self::$deviceBrands)) {
2334                // This Exception should never be thrown. If so a defined brand name is missing in $deviceBrands
2335                throw new \Exception(\sprintf(
2336                    "The brand with name '%s' should be listed in deviceBrands array. Tried to parse user agent: %s",
2337                    $brand,
2338                    $this->userAgent
2339                )); // @codeCoverageIgnore
2340            }
2341
2342            $this->brand = (string) $brand;
2343        }
2344
2345        if (isset($regex['device']) && \array_key_exists($regex['device'], self::$deviceTypes)) {
2346            $this->deviceType = self::$deviceTypes[$regex['device']];
2347        }
2348
2349        $this->model = '';
2350
2351        if (isset($regex['model'])) {
2352            $this->model = $this->buildModel($regex['model'], $matches);
2353        }
2354
2355        if (isset($regex['models'])) {
2356            $modelRegex = '';
2357
2358            foreach ($regex['models'] as $modelRegex) {
2359                $modelMatches = $this->matchUserAgent($modelRegex['regex']);
2360
2361                if ($modelMatches) {
2362                    break;
2363                }
2364            }
2365
2366            if (empty($modelMatches)) {
2367                return $this->getResult();
2368            }
2369
2370            $this->model = $this->buildModel($modelRegex['model'], $modelMatches);
2371
2372            if (isset($modelRegex['brand']) && \in_array($modelRegex['brand'], self::$deviceBrands)) {
2373                $this->brand = (string) $modelRegex['brand'];
2374            }
2375
2376            if (isset($modelRegex['device']) && \array_key_exists($modelRegex['device'], self::$deviceTypes)) {
2377                $this->deviceType = self::$deviceTypes[$modelRegex['device']];
2378            }
2379        }
2380
2381        return $this->getResult();
2382    }
2383
2384    /**
2385     * @param string $model
2386     * @param array  $matches
2387     *
2388     * @return string
2389     */
2390    protected function buildModel(string $model, array $matches): string
2391    {
2392        $model = $this->buildByMatch($model, $matches);
2393
2394        $model = \str_replace('_', ' ', $model);
2395
2396        $model = \preg_replace('/ TD$/i', '', $model);
2397
2398        if ('Build' === $model || empty($model)) {
2399            return '';
2400        }
2401
2402        return \trim($model);
2403    }
2404
2405    /**
2406     * @return array|null
2407     */
2408    protected function parseClientHints(): ?array
2409    {
2410        if ($this->clientHints && $this->clientHints->getModel()) {
2411            $detectedDeviceType = null;
2412            $formFactors        = $this->clientHints->getFormFactors();
2413
2414            foreach (self::$clientHintFormFactorsMapping as $formFactor => $deviceType) {
2415                if (\in_array($formFactor, $formFactors)) {
2416                    $detectedDeviceType = $deviceType;
2417
2418                    break;
2419                }
2420            }
2421
2422            return [
2423                'deviceType' => $detectedDeviceType,
2424                'model'      => $this->clientHints->getModel(),
2425                'brand'      => '',
2426            ];
2427        }
2428
2429        return null;
2430    }
2431
2432    /**
2433     * Resets the stored values
2434     */
2435    protected function reset(): void
2436    {
2437        $this->deviceType = null;
2438        $this->model      = '';
2439        $this->brand      = '';
2440    }
2441
2442    /**
2443     * @return array
2444     */
2445    protected function getResult(): array
2446    {
2447        return [
2448            'deviceType' => $this->deviceType,
2449            'model'      => $this->model,
2450            'brand'      => $this->brand,
2451        ];
2452    }
2453}
2454