Вход Регистрация
Файл: vendor/whichbrowser/parser/src/Analyser/Header/Useragent/Device/Mobile.php
Строк: 1037
<?php

namespace WhichBrowserAnalyserHeaderUseragentDevice;

use 
WhichBrowserConstants;
use 
WhichBrowserData;
use 
WhichBrowserModelFamily;
use 
WhichBrowserModelVersion;

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 ConstantsDeviceType::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' => ]);

            switch (
$match[1]) {
                case 
'One':
                    
$this->data->device->manufacturer 'Microsoft';
                    
$this->data->device->model 'Kin ONE';
                    
$this->data->device->identified |= ConstantsId::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 |= ConstantsId::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 DataDeviceModels::cleanup($match[1]);
            
$this->data->device->identifier $match[0];
            
$this->data->device->identified |= ConstantsId::PATTERN;
            
$this->data->device->generic false;
            
$this->data->device->type ConstantsDeviceType::MOBILE;

            if (!(
$this->data->device->identified ConstantsId::MATCH_UA)) {
                
$device DataDeviceModels::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 ConstantsId::MATCH_UA)) {
                
$device DataDeviceModels::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 ConstantsId::MATCH_UA)) {
                
$device DataDeviceModels::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)) {
            if (
$match[1] === 'Browser') {
                return;
            }

            
$this->data->device->manufacturer 'Samsung';
            
$this->data->device->model DataDeviceModels::cleanup($match[1]);
            
$this->data->device->identifier $match[0];
            
$this->data->device->identified |= ConstantsId::PATTERN;
            
$this->data->device->generic false;
            
$this->data->device->type ConstantsDeviceType::MOBILE;

            if (
$this->data->isOS('Bada')) {
                
$device DataDeviceModels::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 DataDeviceModels::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 DataDeviceModels::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 DataDeviceModels::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 DataDeviceModels::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 ConstantsId::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|GT-|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|VSUN|Wynncom|Xiaomi|YUANDA|Zen|Ziox|ZTE|WAP)/ui'$ua)) {
            return;
        }

        
$this->data->device->identifyModel('/T-Mobile[_ ]([^/;]+)/u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'T-Mobile'
        
]);

        
$this->data->device->identifyModel('/Danger hiptop ([0-9.]+)/u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Danger',
            
'model'         => 'Hiptop'
        
]);

        
$this->data->device->identifyModel('/HP(iPAQ[0-9A-Za-z]+)//u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'HP'
        
]);

        
$this->data->device->identifyModel('/Acer[_-]?([^s/_]*)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Acer'
        
]);

        
$this->data->device->identifyModel('/Amoi[ -]([^s/_]*)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Amoi'
        
]);

        
$this->data->device->identifyModel('/AIRNESS-([^/]*)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Airness'
        
]);

        
$this->data->device->identifyModel('/ASUS-([^/]*)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Asus'
        
]);

        
$this->data->device->identifyModel('/BenQ[ -]([^/]*)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'BenQ'
        
]);

        
$this->data->device->identifyModel('/ maui ([a-z0-9]+)/u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'BenQ',
            
'model'         => function ($model) {
                return 
'Maui ' strtoupper($model);
            }
        ]);

        
$this->data->device->identifyModel('/ALCATEL[_-]([^/]*)/ui'$ua, [
            
'type'          => ConstantsDeviceType::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'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Bird'
        
]);

        
$this->data->device->identifyModel('/(?:YL-|YuLong-)?COOLPAD([^s]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Coolpad'
        
]);

        
$this->data->device->identifyModel('/CELKON.([^s]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Celkon'
        
]);

        
$this->data->device->identifyModel('/Coship ([^s]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Coship'
        
]);

        
$this->data->device->identifyModel('/Cricket-([^s]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Cricket'
        
]);

        
$this->data->device->identifyModel('/DESAY[ _]([^s]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'DESAY'
        
]);

        
$this->data->device->identifyModel('/Diamond_([^s]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Diamond'
        
]);

        
$this->data->device->identifyModel('/dopod[-_]?([^s]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Dopod'
        
]);

        
$this->data->device->identifyModel('/^Ericsson([^/]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Ericsson'
        
]);

        
$this->data->device->identifyModel('/^(R[0-9]{3,3}) [0-9.]+ WAP/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Ericsson'
        
]);

        
$this->data->device->identifyModel('/FLY_]?([^s/]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Fly'
        
]);

        
$this->data->device->identifyModel('/GIONEE[-_ ]([^s/;]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Gionee'
        
]);

        
$this->data->device->identifyModel('/GIONEE([A-Z0-9]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Gionee'
        
]);

        
$this->data->device->identifyModel('/HIKe_([^s]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'HIKe'
        
]);

        
$this->data->device->identifyModel('/HAIER-([A-Z][0-9]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Haier'
        
]);

        
$this->data->device->identifyModel('/Hisense[ -](?:HS-)?([^s]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Hisense'
        
]);

        
$this->data->device->identifyModel('/HS-([^s]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Hisense'
        
]);

        
$this->data->device->identifyModel('/HTC[s_-]?([^s/();][^/();]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'HTC'
        
]);

        
$this->data->device->identifyModel('/(?:HTC_)?([A-Z0-9_]+_T[0-9]{4,4})/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'HTC'
        
]);

        
$this->data->device->identifyModel('/HUAWEI[s_-]?([^/)()]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Huawei'
        
]);

        
$this->data->device->identifyModel('/Karbonn ([a-z0-9]+(?: ?Star| ?Plus|+)?)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Karbonn'
        
]);

        
$this->data->device->identifyModel('/KWC-([^s/]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Kyocera'
        
]);

        
$this->data->device->identifyModel('/KONKA[-_]?([^s]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Konka'
        
]);

        
$this->data->device->identifyModel('/TIANYU-KTOUCH/([^/]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'K-Touch'
        
]);

        
$this->data->device->identifyModel('/K-Touch_?([^/]*)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'K-Touch'
        
]);

        
$this->data->device->identifyModel('/Lenovo[_-]?([^/]*)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Lenovo'
        
]);

        
$this->data->device->identifyModel('/Lephone_([^/]*)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Lephone'
        
]);

        
$this->data->device->identifyModel('/LGE?([A-Z]{2,2}[0-9]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'LG'
        
]);

        
$this->data->device->identifyModel('/LGE?(?:/|-|_)([^s)-[/]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'LG'
        
]);

        
$this->data->device->identifyModel('/LGE? ?([A-Z]*[0-9]+[A-Z]?)/u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'LG'
        
]);

        
$this->data->device->identifyModel('/Micromax([^)]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Micromax'
        
]);

        
$this->data->device->identifyModel('/^MOTO-?([^/_]+)/u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Motorola'
        
]);

        
$this->data->device->identifyModel('/MOT-([^/_.]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Motorola'
        
]);

        
$this->data->device->identifyModel('/Motorola-([^s]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Motorola',
            
'model'         => function ($model) {
                return 
strtoupper($model);
            }
        ]);

        
$this->data->device->identifyModel('/Motorola[_ ]([^/_;)]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Motorola'
        
]);

        
$this->data->device->identifyModel('/Moto([^/s_;r][^/s_;]*)/u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Motorola'
        
]);

        
$this->data->device->identifyModel('/Nexian([^/_]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Nexian'
        
]);

        
$this->data->device->identifyModel('/NEC-([^/_]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'NEC'
        
]);

        
$this->data->device->identifyModel('/NGM_([^/_]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'NGM'
        
]);

        
$this->data->device->identifyModel('/OPPO_([^/_]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Oppo'
        
]);

        
$this->data->device->identifyModel('/Panasonic-([^/_]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Panasonic'
        
]);

        
$this->data->device->identifyModel('/Pantech[-_]?([^/_]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Pantech'
        
]);

        
$this->data->device->identifyModel('/Philips ?([A-Z]?[0-9@]+[a-z]?)/u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Philips'
        
]);

        
$this->data->device->identifyModel('/PHILIPS-([a-zA-Z0-9@]+(?: [0-9]+)?)/u'$ua, [
            
'type'          => ConstantsDeviceType::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'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Sagem'
        
]);

        
$this->data->device->identifyModel('/Sanyo-([A-Z0-9]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Sanyo'
        
]);

        
$this->data->device->identifyModel('/sam-([A-Z][0-9]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Samsung'
        
]);

        
$this->data->device->identifyModel('/SEC-(SGH[A-Z][0-9]+)/u'$ua, [
            
'type'          => ConstantsDeviceType::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'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Samsung'
        
]);

        
$this->data->device->identifyModel('/(GT-[A-Z][0-9]+[A-Z]?)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Samsung'
        
]);

        
$this->data->device->identifyModel('/(?:Siemens |SIE-)([A-Z]+[0-9]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Siemens'
        
]);

        
$this->data->device->identifyModel('/SIE-([0-9]{4,4}|[A-Z]{4,4})/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Siemens'
        
]);

        
$this->data->device->identifyModel('/Sony ([A-Z0-9-]+)/u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Sony'
        
]);

        
$this->data->device->identifyModel('/SE([A-Z][0-9]+[a-z])/u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Sony Ericsson'
        
]);

        
$this->data->device->identifyModel('/sony-ericsson ([A-Z][0-9]+[a-z])/u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Sony Ericsson'
        
]);

        
$this->data->device->identifyModel('/SonyE?ricsson ?([^/);]+)/iu'$ua, [
            
'type'          => ConstantsDeviceType::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'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Sharp'
        
]);

        
$this->data->device->identifyModel('/Spices([^s]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Spice'
        
]);

        
$this->data->device->identifyModel('/Spices?([A-Z][0-9]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Spice'
        
]);

        
$this->data->device->identifyModel('/Tecno([^/]*)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Tecno'
        
]);

        
$this->data->device->identifyModel('/T-smart_([^/]*)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'T-smart'
        
]);

        
$this->data->device->identifyModel('/TCL[-_ ]([^/;)]*)/ui'$ua, [
            
'manufacturer'  => 'TCL'
        
]);

        
$this->data->device->identifyModel('/Tiphone ([^/]*)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'TiPhone'
        
]);

        
$this->data->device->identifyModel('/Toshiba[-/]([^/-]*)/u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Toshiba'
        
]);

        
$this->data->device->identifyModel('/UTStar(?:com)?-([^s./;]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'UTStarcom'
        
]);


        
$this->data->device->identifyModel('/vk-(vk[0-9]+)/u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'VK Mobile',
            
'model'         => function ($model) {
                return 
strtoupper($model);
            }
        ]);

        
$this->data->device->identifyModel('/Videocon[-_ /]([A-Z0-9.]+)/iu'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Videocon'
        
]);

        
$this->data->device->identifyModel('/Vodafone(?:[ _-]Chat)?[ _-]?([0-9]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Vodafone'
        
]);

        
$this->data->device->identifyModel('/Vodafone/[0-9.]+/(v[0-9]+)[^/]*//u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Vodafone'
        
]);

        
$this->data->device->identifyModel('/^VSUN([0-9]+[A-Z]?)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Vsun'
        
]);

        
$this->data->device->identifyModel('/Wynncom[-s]([A-Z0-9s]++?)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Wynncom'
        
]);

        
$this->data->device->identifyModel('/^YUANDA([0-9]+[A-Z]?)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Yuanda'
        
]);

        
$this->data->device->identifyModel('/^ZEN[_s]([A-Z0-9s+]+)*?[s_]?($|/|-|;|Dorado|MAUI|WAP|R2AE|Q03C)/uiU'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Zen'
        
]);

        
$this->data->device->identifyModel('/^(?:Ziox[_s])?Ziox[_s](ZX?[0-9]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'manufacturer'  => 'Ziox'
        
]);

        
$this->data->device->identifyModel('/ZTE[-_s]?([^s/();,]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::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'      => ConstantsDeviceType::MOBILE,
                
'model'     => $model,
                
'carrier'   => $carrier
            
]);

            if (
array_key_exists($manufacturer$ids)) {
                
$this->data->device->manufacturer $ids[$manufacturer];
            }

            
$this->data->device->identified |= ConstantsId::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 ConstantsFlag::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'      => ConstantsDeviceType::MOBILE,
                
'model'     => $model,
                
'carrier'   => 'au'
            
]);

            if (
array_key_exists($manufacturer$ids)) {
                
$this->data->device->manufacturer $ids[$manufacturer];
            }

            
$this->data->device->identified |= ConstantsId::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'      => ConstantsDeviceType::MOBILE,
                    
'model'     => $model,
                    
'carrier'   => 'au'
                
]);

                if (
array_key_exists($manufacturer$ids)) {
                    
$this->data->device->manufacturer $ids[$manufacturer];

                    
$device DataDeviceModels::identify('kddi'$model);
                    if (
$device->identified) {
                        
$device->identified |= $this->data->device->identified;
                        
$device->carrier 'au';
                        
$this->data->device $device;
                    }
                }

                
$this->data->device->identified |= ConstantsId::PATTERN;
                return;
            }
        }


        
/* Finally identify it based on carrier */

        
$this->data->device->identifyModel('/(([A-Z]+[0-9]+[A-Z])[^;]*; ?FOMA/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'carrier'       => 'DoCoMo'
        
]);

        
$this->data->device->identifyModel('/(FOMA ([^;]+)+;/u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'carrier'       => 'DoCoMo'
        
]);

        
$this->data->device->identifyModel('/DoCoMo/[0-9].0[/s]([0-9A-Z]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'carrier'       => 'DoCoMo'
        
]);

        
$this->data->device->identifyModel('/NTTDoCoMo ([0-9A-Z]+)/ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'carrier'       => 'DoCoMo'
        
]);

        
$this->data->device->identifyModel('/J-PHONE/[^/]+/([^/_]+)/u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'carrier'       => 'Softbank'
        
]);

        
$this->data->device->identifyModel('/SoftBank/[^/]+/([^/]+)//u'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'carrier'       => 'Softbank'
        
]);

        
$this->data->device->identifyModel('/Vodafone/[0-9.]+/V([0-9]+[A-Z]+)[^/]*//ui'$ua, [
            
'type'          => ConstantsDeviceType::MOBILE,
            
'carrier'       => 'Softbank'
        
]);

        
$this->data->device->identifyModel('/(KDDI-[^s).;]{4,})/ui'$ua, [
            
'type'          => ConstantsDeviceType::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 ConstantsId::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 ConstantsId::MATCH_UA) {
                return;
            }
        }
    }

    private function 
identifyBasedOnIdentifier()
    {
        if (
$this->data->device->identified ConstantsId::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 ConstantsId::MATCH_UA) {
                return;
            }
        }

        foreach (
$ids as $i => $id) {
            
$this->identifyBasedOnId($id);

            if (
$this->data->device->identified ConstantsId::MATCH_UA) {
                return;
            }
        }
    }

    private function 
identifyBasedOnIdUsingOs($id)
    {
        switch (
$this->data->os->getFamily()) {
            case 
'Android':
                
$device DataDeviceModels::identify('android'$id);
                if (
$device->identified) {
                    
$device->identified |= $this->data->device->identified;
                    
$this->data->device $device;
                }
                break;

            case 
'Brew':
                
$device DataDeviceModels::identify('brew'$id);
                if (
$device->identified) {
                    
$device->identified |= $this->data->device->identified;
                    
$this->data->device $device;
                }
                break;

            case 
'Symbian':
                
$device DataDeviceModels::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 DataDeviceModels::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 DataDeviceModels::identify('feature'$id);
                if (
$device->identified) {
                    
$device->identified |= $this->data->device->identified;
                    
$this->data->device $device;
                }
                break;
        }
    }

    private function 
identifyBasedOnId($id)
    {
        if (
$this->data->device->type != 'mobile') {
            return;
        }

        if (!(
$this->data->device->identified ConstantsId::MATCH_UA)) {
            
$device DataDeviceModels::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 ConstantsId::MATCH_UA)) {
            
$device DataDeviceModels::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 ConstantsId::MATCH_UA)) {
            
$device DataDeviceModels::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 ConstantsId::MATCH_UA)) {
            
$device DataDeviceModels::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 ConstantsId::MATCH_UA)) {
            
$device DataDeviceModels::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 ConstantsId::MATCH_UA)) {
            
$device DataDeviceModels::identify('feature'$id);
            if (
$device->identified) {
                
$device->identified |= $this->data->device->identified;
                
$this->data->device $device;
            }
        }
    }
}
Онлайн: 0
Реклама