Plugin Directory

Changeset 2033061


Ignore:
Timestamp:
02/18/2019 09:15:28 AM (7 years ago)
Author:
iqbalbary
Message:

Update Plugin

Location:
mobile-redirect-plus-lite/trunk
Files:
3 added
6 edited

Legend:

Unmodified
Added
Removed
  • mobile-redirect-plus-lite/trunk/includes/Mobile_Detect.php

    r1184365 r2033061  
    22/**
    33 * Mobile Detect Library
    4  * =====================
    5  *
    64 * Motto: "Every business should have a mobile detection script to detect mobile readers"
    75 *
     
    97 * It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.
    108 *
    11  * @author      Current authors: Serban Ghita <serbanghita@gmail.com>
    12  *                               Nick Ilyin <nick.ilyin@gmail.com>
     9 * Homepage: http://mobiledetect.net
     10 * GitHub: https://github.com/serbanghita/Mobile-Detect
     11 * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md
     12 * CONTRIBUTING: https://github.com/serbanghita/Mobile-Detect/blob/master/docs/CONTRIBUTING.md
     13 * KNOWN LIMITATIONS: https://github.com/serbanghita/Mobile-Detect/blob/master/docs/KNOWN_LIMITATIONS.md
     14 * EXAMPLES: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples
    1315 *
    14  *              Original author: Victor Stanciu <vic.stanciu@gmail.com>
     16 * @license https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt MIT License
     17 * @author  Serban Ghita <serbanghita@gmail.com>
     18 * @author  Nick Ilyin <nick.ilyin@gmail.com>
     19 * Original author: Victor Stanciu <vic.stanciu@gmail.com>
    1520 *
    16  * @license     Code and contributions have 'MIT License'
    17  *              More details: https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt
    18  *
    19  * @link        Homepage:     http://mobiledetect.net
    20  *              GitHub Repo:  https://github.com/serbanghita/Mobile-Detect
    21  *              Google Code:  http://code.google.com/p/php-mobile-detect/
    22  *              README:       https://github.com/serbanghita/Mobile-Detect/blob/master/README.md
    23  *              HOWTO:        https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples
    24  *
    25  * @version     2.8.15
     21 * @version 2.8.33
    2622 */
    27 
    2823class Mobile_Detect_Plus_Lite
    2924{
     
    6762     * Stores the version number of the current release.
    6863     */
    69     const VERSION                   = '2.8.15';
     64    const VERSION                   = '2.8.33';
    7065
    7166    /**
     
    113108     * The matches extracted from the regex expression.
    114109     * This is good for debug.
     110     *
    115111     * @var string
    116112     */
     
    170166        'iPhone'        => '\biPhone\b|\biPod\b', // |\biTunes
    171167        'BlackBerry'    => 'BlackBerry|\bBB10\b|rim[0-9]+',
    172         'HTC'           => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m',
     168        'HTC'           => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m|Android [0-9.]+; Pixel',
    173169        'Nexus'         => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6',
    174170        // @todo: Is 'Dell Streak' a tablet or a phone? ;)
    175         'Dell'          => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b',
    176         'Motorola'      => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\bMoto E\b',
    177         'Samsung'       => 'Samsung|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205',
    178         'LG'            => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)',
     171        'Dell'          => 'Dell[;]? (Streak|Aero|Venue|Venue Pro|Flash|Smoke|Mini 3iX)|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b',
     172        'Motorola'      => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\bMoto E\b|XT1068|XT1092|XT1052',
     173        'Samsung'       => '\bSamsung\b|SM-G950F|SM-G955F|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C|SM-A310F|GT-I9190|SM-J500FN|SM-G903F|SM-J330F',
     174        'LG'            => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323|M257)',
    179175        'Sony'          => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533',
    180176        'Asus'          => 'Asus.*Galaxy|PadFone.*Mobile',
     177        'NokiaLumia'    => 'Lumia [0-9]{3,4}',
    181178        // http://www.micromaxinfo.com/mobiles/smartphones
    182179        // Added because the codes might conflict with Acer Tablets.
     
    191188        'Fly'           => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250',
    192189        // http://fr.wikomobile.com
    193         'Wiko'          => 'KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM',
     190        'Wiko'          => 'KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM',
    194191        'iMobile'        => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)',
    195192        // Added simvalley mobile just for fun. They have some interesting devices.
     
    200197        'Wolfgang'      => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q',
    201198        'Alcatel'       => 'Alcatel',
    202         'Nintendo' => 'Nintendo 3DS',
     199        'Nintendo'      => 'Nintendo (3DS|Switch)',
    203200        // http://en.wikipedia.org/wiki/Amoi
    204201        'Amoi'          => 'Amoi',
    205202        // http://en.wikipedia.org/wiki/INQ
    206203        'INQ'           => 'INQ',
     204        'OnePlus'       => 'ONEPLUS',
    207205        // @Tapatalk is a mobile app; http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039
    208206        'GenericPhone'  => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser',
     
    215213     */
    216214    protected static $tabletDevices = array(
    217         'iPad'              => 'iPad|iPad.*Mobile', // @todo: check for mobile friendly emails topic.
    218         'NexusTablet'       => 'Android.*Nexus[\s]+(7|9|10)|^.*Android.*Nexus(?:(?!Mobile).)*$',
    219         'SamsungTablet'     => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone.
     215        // @todo: check for mobile friendly emails topic.
     216        'iPad'              => 'iPad|iPad.*Mobile',
     217        // Removed |^.*Android.*Nexus(?!(?:Mobile).)*$
     218        // @see #442
     219        // @todo Merge NexusTablet into GoogleTablet.
     220        'NexusTablet'       => 'Android.*Nexus[\s]+(7|9|10)',
     221        // https://en.wikipedia.org/wiki/Pixel_C
     222        'GoogleTablet'           => 'Android.*Pixel C',
     223        'SamsungTablet'     => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y?|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y|SM-T585|SM-T285|SM-T825|SM-W708|SM-T835', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone.
    220224        // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html
    221         'Kindle'            => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI)\b',
     225        'Kindle'            => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\b|Android.*Silk/[0-9.]+ like Chrome/[0-9.]+ (?!Mobile)',
    222226        // Only the Surface tablets with Windows RT are considered mobile.
    223227        // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx
     
    227231        // Watch out for PadFone, see #132.
    228232        // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/
    229         'AsusTablet'        => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K017 |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C',
     233        'AsusTablet'        => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\bP027\b|\bP024\b|\bP00C\b',
    230234        'BlackBerryTablet'  => 'PlayBook|RIM Tablet',
    231235        'HTCtablet'         => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410',
     
    237241        // http://www.acer.de/ac/de/DE/content/models/tablets/
    238242        // Can conflict with Micromax and Motorola phones codes.
    239         'AcerTablet'        => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b|\bA3-A11\b',
     243        'AcerTablet'        => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b|\bA3-A11\b|\bA3-A20\b|\bA3-A30',
    240244        // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/
    241245        // http://us.toshiba.com/tablets/tablet-finder
     
    247251        'FujitsuTablet'     => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b',
    248252        // Prestigio Tablets http://www.prestigio.com/support
    249         'PrestigioTablet'   => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD',
     253        'PrestigioTablet'   => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002',
    250254        // http://support.lenovo.com/en_GB/downloads/default.page?#
    251         'LenovoTablet'      => 'Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)',
     255        'LenovoTablet'      => 'Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)|TB-X103F|TB-X304F|TB-X304L|TB-8703F|Tab2A7-10F|TB2-X30L',
    252256        // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets
    253257        'DellTablet'        => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7',
     
    255259        'YarvikTablet'      => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b',
    256260        'MedionTablet'      => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB',
    257         'ArnovaTablet'      => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2',
     261        'ArnovaTablet'      => '97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2',
    258262        // http://www.intenso.de/kategorie_en.php?kategorie=33
    259263        // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate
     
    267271        'AllViewTablet'           => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)',
    268272        // http://wiki.archosfans.com/index.php?title=Main_Page
    269         'ArchosTablet'      => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b',
     273        // @note Rewrite the regex format after we add more UAs.
     274        'ArchosTablet'      => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b',
    270275        // http://www.ainol.com/plugin.php?identifier=ainol&module=product
    271276        'AinolTablet'       => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark',
     277        'NokiaLumiaTablet'  => 'Lumia 2520',
    272278        // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER
    273279        // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser
    274280        // http://www.sony.jp/support/tablet/
    275         'SonyTablet'        => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612',
     281        'SonyTablet'        => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP641|SGP612|SOT31|SGP771|SGP611|SGP612|SGP712',
    276282        // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8
    277283        'PhilipsTablet'     => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b',
     
    281287        'CobyTablet'        => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010',
    282288        // http://www.match.net.cn/products.asp
    283         'MIDTablet'         => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733',
     289        'MIDTablet'         => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10',
    284290        // http://www.msi.com/support
    285291        // @todo Research the Windows Tablets.
     
    297303        'FlyTablet'         => 'IQ310|Fly Vision',
    298304        // http://www.bqreaders.com/gb/tablets-prices-sale.html
    299         'bqTablet'          => '(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris E10)|Maxwell.*Lite|Maxwell.*Plus',
     305        'bqTablet'          => 'Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris ([E|M]10|M8))|Maxwell.*Lite|Maxwell.*Plus',
    300306        // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290
    301307        // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets)
    302         'HuaweiTablet'      => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim',
     308        'HuaweiTablet'      => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim|M2-A01L|BAH-L09|BAH-W09',
    303309        // Nec or Medias Tab
    304310        'NecTablet'         => '\bN-06D|\bN-08D',
     
    332338        'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1',
    333339        // http://www.galapad.net/product.html
    334         'GalapadTablet'     => 'Android.*\bG1\b',
     340        'GalapadTablet'     => 'Android.*\bG1\b(?!\))',
    335341        // http://www.micromaxinfo.com/tablet/funbook
    336342        'MicromaxTablet'    => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b',
     
    356362        // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/
    357363        // @todo: add more tests.
    358         'OvermaxTablet'     => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)',
     364        'OvermaxTablet'     => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)|Qualcore 1027',
    359365        // http://hclmetablet.com/India/index.php
    360366        'HCLTablet'         => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync',
     
    381387        'StorexTablet'  => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab',
    382388        // Generic Vodafone tablets.
    383         'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7',
     389        'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497',
    384390        // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb
    385391        // Aka: http://www.essentielb.fr/
     
    400406        'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)',
    401407        // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1
    402         'TecnoTablet' => 'TECNO P9',
     408        'TecnoTablet' => 'TECNO P9|TECNO DP8D',
    403409        // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3
    404         'JXDTablet' => 'Android.*\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b',
     410        'JXDTablet' => 'Android.* \b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b',
    405411        // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/
    406412        'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)',
     
    412418        // http://www1.viewsonic.com/products/computing/tablets/
    413419        'ViewsonicTablet'   => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a',
     420        // https://www.verizonwireless.com/tablets/verizon/
     421        'VerizonTablet' => 'QTAQZ3|QTAIR7|QTAQTZ3|QTASUN1|QTASUN2|QTAXIA1',
    414422        // http://www.odys.de/web/internet-tablet_en.html
    415423        'OdysTablet'        => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10',
     
    421429        'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi',
    422430        // Onda - http://www.onda-tablet.com/buy-android-onda.html?dir=desc&limit=all&order=price
    423         'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+',
     431        'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+|V10 \b4G\b',
    424432        'JaytechTablet'     => 'TPC-PA762',
    425433        'BlaupunktTablet'   => 'Endeavour 800NG|Endeavour 1010',
     
    433441        // @todo http://www.lavamobiles.com/tablets-data-cards
    434442        'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b',
     443        // http://www.breezetablet.com/
     444        'AocTablet' => 'MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712',
     445        // http://www.mpmaneurope.com/en/products/internet-tablets-14/android-tablets-14/
     446        'MpmanTablet' => 'MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\bMPG7\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010',
    435447        // https://www.celkonmobiles.com/?_a=categoryphones&sid=2
    436448        'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b',
    437449        // http://www.wolderelectronics.com/productos/manuales-y-guias-rapidas/categoria-2-miTab
    438450        'WolderTablet' => 'miTab \b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\b',
     451        'MediacomTablet' => 'M-MPI10C3G|M-SP10EG|M-SP10EGP|M-SP10HXAH|M-SP7HXAH|M-SP10HXBH|M-SP8HXAH|M-SP8MXA',
    439452        // http://www.mi.com/en
    440453        'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b',
     
    442455        'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One',
    443456        // http://navroad.com/products/produkty/tablety/
     457        // http://navroad.com/products/produkty/tablety/
    444458        'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI',
     459        // http://leader-online.com/new_site/product-category/tablets/
     460        // http://www.leader-online.net.au/List/Tablet
     461        'LeaderTablet' => 'TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100',
    445462        // http://www.datawind.com/ubislate/
    446463        'UbislateTablet' => 'UbiSlate[\s]?7C',
    447464        // http://www.pocketbook-int.com/ru/support
    448465        'PocketBookTablet' => 'Pocketbook',
     466        // http://www.kocaso.com/product_tablet.html
     467        'KocasoTablet' => '\b(TB-1207)\b',
     468        // http://global.hisense.com/product/asia/tablet/Sero7/201412/t20141215_91832.htm
     469        'HisenseTablet' => '\b(F5281|E2371)\b',
    449470        // http://www.tesco.com/direct/hudl/
    450         'Hudl'              => 'Hudl HT7S3',
     471        'Hudl'              => 'Hudl HT7S3|Hudl 2',
    451472        // http://www.telstra.com.au/home-phone/thub-2/
    452473        'TelstraTablet'     => 'T-Hub2',
    453         'GenericTablet'     => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bJolla\b'
     474        'GenericTablet'     => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bTP750\b|\bQTAQZ3\b|WVT101|TM1088|KT107'
    454475    );
    455476
     
    470491        // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx
    471492        // http://msdn.microsoft.com/library/ms537503.aspx
    472         'WindowsPhoneOS'   => 'Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;',
    473         'iOS'               => '\biPhone.*Mobile|\biPod|\biPad',
     493        // https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx
     494        'WindowsPhoneOS'   => 'Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;',
     495        'iOS'               => '\biPhone.*Mobile|\biPod|\biPad|AppleCoreMedia',
    474496        // http://en.wikipedia.org/wiki/MeeGo
    475497        // @todo: research MeeGo in UAs
     
    487509     * List of mobile User Agents.
    488510     *
     511     * IMPORTANT: This is a list of only mobile browsers.
     512     * Mobile Detect 2.x supports only mobile browsers,
     513     * it was never designed to detect all browsers.
     514     * The change will come in 2017 in the 3.x release for PHP7.
     515     *
    489516     * @var array
    490517     */
    491518    protected static $browsers = array(
     519        //'Vivaldi'         => 'Vivaldi',
    492520        // @reference: https://developers.google.com/chrome/mobile/docs/user-agent
    493521        'Chrome'          => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?',
    494522        'Dolfin'          => '\bDolfin\b',
    495         'Opera'           => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+',
     523        'Opera'           => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+$|Coast/[0-9.]+',
    496524        'Skyfire'         => 'Skyfire',
     525        'Edge'             => 'Mobile Safari/[.0-9]* Edge',
    497526        'IE'              => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+
    498         'Firefox'         => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile',
     527        'Firefox'         => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS',
    499528        'Bolt'            => 'bolt',
    500529        'TeaShark'        => 'teashark',
     
    504533        // http://en.wikipedia.org/wiki/Midori_(web_browser)
    505534        //'Midori'          => 'midori',
    506         'Tizen'           => 'Tizen',
     535        //'Tizen'           => 'Tizen',
     536        'WeChat'          => '\bMicroMessenger\b',
    507537        'UCBrowser'       => 'UC.*Browser|UCWEB',
    508538        'baiduboxapp'     => 'baiduboxapp',
     
    521551        // http://en.wikipedia.org/wiki/Vision_Mobile_Browser
    522552        'GenericBrowser'  => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger',
     553        // @reference: https://en.wikipedia.org/wiki/Pale_Moon_(web_browser)
     554        'PaleMoon'        => 'Android.*PaleMoon|Mobile.*PaleMoon',
    523555    );
    524556
     
    533565        // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011
    534566        // https://developers.facebook.com/docs/sharing/best-practices
    535         'Bot'         => 'Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor',
     567        'Bot'         => 'Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom',
    536568        'MobileBot'   => 'Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2',
    537569        'DesktopMode' => 'WPDesktop',
     
    539571        'WebKit'      => '(webkit)[ /]([\w.]+)',
    540572        // @todo: Include JXD consoles.
    541         'Console'     => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b',
     573        'Console'     => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|Nintendo Switch|PLAYSTATION|Xbox)\b',
    542574        'Watch'       => 'SM-V700',
    543575    );
     
    588620        'Coast'         => array('Coast/[VER]'),
    589621        'Dolfin'        => 'Dolfin/[VER]',
    590         // @reference: https://developer.mozilla.org/en-US/docs/User_Agent_Strings_Reference
    591         'Firefox'       => 'Firefox/[VER]',
     622        // @reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox
     623        'Firefox'       => array('Firefox/[VER]', 'FxiOS/[VER]'),
    592624        'Fennec'        => 'Fennec/[VER]',
    593625        // http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx
    594626        // https://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx
     627        'Edge' => 'Edge/[VER]',
    595628        'IE'      => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'Trident/[0-9.]+;.*rv:[VER]'),
    596629        // http://en.wikipedia.org/wiki/NetFront
     
    600633        'Opera Mini'    => 'Opera Mini/[VER]',
    601634        'Opera Mobi'    => 'Version/[VER]',
    602         'UC Browser'    => 'UC Browser[VER]',
     635        'UCBrowser'    => array( 'UCWEB[VER]', 'UC.*Browser/[VER]' ),
    603636        'MQQBrowser'    => 'MQQBrowser/[VER]',
    604637        'MicroMessenger' => 'MicroMessenger/[VER]',
    605638        'baiduboxapp'   => 'baiduboxapp/[VER]',
    606639        'baidubrowser'  => 'baidubrowser/[VER]',
     640        'SamsungBrowser' => 'SamsungBrowser/[VER]',
    607641        'Iron'          => 'Iron/[VER]',
    608642        // @note: Safari 7534.48.3 is actually Version 5.1.
     
    612646        'Tizen'         => 'Tizen/[VER]',
    613647        'Webkit'        => 'webkit[ /][VER]',
     648        'PaleMoon'         => 'PaleMoon/[VER]',
    614649
    615650        // Engine
     
    617652        'Trident'       => 'Trident/[VER]',
    618653        'Presto'        => 'Presto/[VER]',
     654        'Goanna'           => 'Goanna/[VER]',
    619655
    620656        // OS
     
    668704     *
    669705     * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract
    670      *                           the headers. The default null is left for backwards compatibilty.
     706     *                           the headers. The default null is left for backwards compatibility.
    671707     */
    672708    public function setHttpHeaders($httpHeaders = null)
     
    749785    }
    750786
    751    
     787
    752788    /**
    753789     * Set CloudFront headers
    754790     * http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-device
    755      * 
     791     *
    756792     * @param array $cfHeaders List of HTTP headers
    757793     *
     
    791827
    792828    /**
     829     * @param string $userAgent
     830     * @return string
     831     */
     832    private function prepareUserAgent($userAgent) {
     833        $userAgent = trim($userAgent);
     834        $userAgent = substr($userAgent, 0, 500);
     835        return $userAgent;
     836    }
     837
     838    /**
    793839     * Set the User-Agent to be used.
    794840     *
     
    803849
    804850        if (false === empty($userAgent)) {
    805             return $this->userAgent = $userAgent;
     851            return $this->userAgent = $this->prepareUserAgent($userAgent);
    806852        } else {
    807853            $this->userAgent = null;
     
    813859
    814860            if (!empty($this->userAgent)) {
    815                 return $this->userAgent = trim($this->userAgent);
     861                return $this->userAgent = $this->prepareUserAgent($this->userAgent);
    816862            }
    817863        }
     
    10701116    /**
    10711117     * Search for a certain key in the rules array.
    1072      * If the key is found the try to match the corresponding
     1118     * If the key is found then try to match the corresponding
    10731119     * regex against the User-Agent.
    10741120     *
  • mobile-redirect-plus-lite/trunk/includes/settings.php

    r1184365 r2033061  
    11<?php
    2 
    32add_action( 'admin_menu', 'mobi_redirect_menu_lite' );
    43function mobi_redirect_menu_lite(){
     
    87        ?>
    98        <div class="wrap">
    10             <h2>WP Mobile Redirect Options</h2>
    11             <form action="options.php" method="POST" style="float: left; min-width: 800px;">
     9            <h2><?php _e('WP Mobile Redirect Options','mobiplus-lite');?></h2>
     10            <form action="options.php" method="POST" class="mprl-form">
    1211                <?php settings_fields( 'mobi-setting-group-lite' ); ?>
    1312                <?php do_settings_sections( 'mobi-redirect-plus-lite' ); ?>
    1413                <?php submit_button( ); ?>
    1514            </form>
    16             <div style="float: left; max-width: 250px;">
    17                 <a href="http://bitly.com/redirect-plus"><?php echo '<img style="margin-top: 20px;" src="' . plugins_url( 'images/banner.jpg', __FILE__ ) . '" > '; ?></a>
    18                 <a href="http://bitly.com/redirect-plus"><?php echo '<img style="max-width: 250px; margin-top: 10px;" src="' . plugins_url( 'images/banner2.jpg', __FILE__ ) . '" > '; ?></a>
     15            <div class="mprl-premium">
     16                <a href="https://goo.gl/mCo9LJ"><?php echo '<img class="mprl-premium-1" src="' . plugins_url( 'images/banner.jpg', __FILE__ ) . '" > '; ?></a>
     17                <a href="https://goo.gl/mCo9LJ"><?php echo '<img class="mprl-premium-2" src="' . plugins_url( 'images/banner2.jpg', __FILE__ ) . '" > '; ?></a>
    1918            </div>
    2019            <br/><br/>
     
    2625function mobi_redirect_init_lite(){
    2726    register_setting( 'mobi-setting-group-lite', 'mobi-setting-lite' );
    28     add_settings_section( 'section-main-lite', 'Main Settings', 'main_setting_callback_lite', 'mobi-redirect-plus-lite' );
    29     add_settings_field( 'mobi-plus-lite', 'Redirect To Mobile', 'redirect_mobile_callback_lite', 'mobi-redirect-plus-lite', 'section-main-lite' );
    30     add_settings_field( 'mobi-link-lite', 'Mobile Website Link', 'mobile_link_callback_lite', 'mobi-redirect-plus-lite', 'section-main-lite' );
    31     add_settings_field( 'mobi-tablet-lite', 'Exclude Tablets Redirect', 'redirect_tablet_callback_lite', 'mobi-redirect-plus-lite', 'section-main-lite' );
    32     add_settings_field( 'mobi-back-main-lite', 'Back to full version website', 'redirect_back_main_lite', 'mobi-redirect-plus-lite', 'section-main-lite' );
     27    add_settings_section( 'section-main-lite', __('Main Settings','mobiplus-lite'), 'main_setting_callback_lite', 'mobi-redirect-plus-lite' );
     28    add_settings_field( 'mobi-plus-lite', __('Redirect To Mobile','mobiplus-lite'), 'redirect_mobile_callback_lite', 'mobi-redirect-plus-lite', 'section-main-lite' );
     29    add_settings_field( 'mobi-specific-page-lite', __('Redirect page','mobiplus-lite'), 'redirect_specific_page_lite', 'mobi-redirect-plus-lite', 'section-main-lite' );
     30    add_settings_field( 'mobi-link-lite', __('Mobile Website Link','mobiplus-lite'), 'mobile_link_callback_lite', 'mobi-redirect-plus-lite', 'section-main-lite' );
     31    add_settings_field( 'mobi-tablet-lite', __('Exclude Tablets Redirect','mobiplus-lite'), 'redirect_tablet_callback_lite', 'mobi-redirect-plus-lite', 'section-main-lite' );
     32    add_settings_field( 'mobi-back-main-lite', __('Back to full version website','mobiplus-lite'), 'redirect_back_main_lite', 'mobi-redirect-plus-lite', 'section-main-lite' );
    3333   
    3434
    3535    function main_setting_callback_lite(){
    36         echo 'Active Radio button to enable/disable mobile redirection. Then enter your mobile site URL in the field below';
     36        _e('Active Radio button to enable/disable mobile redirection. Then enter your mobile site URL in the field below','mobiplus-lite');
    3737    }
     38
    3839    function redirect_mobile_callback_lite(){
    3940        $setting = (array)get_option('mobi-setting-lite');?>
    40         <input type="radio" name="mobi-setting-lite[redirect]" value="yes" <?php checked('yes', $setting['redirect']); ?> />Active
    41         <input type="radio" name="mobi-setting-lite[redirect]" value="no" <?php checked('no', $setting['redirect']); ?> />Inactive
     41        <input type="radio" name="mobi-setting-lite[redirect]" value="yes" <?php checked('yes', $setting['redirect']); ?> /><?php _e('Active','mobiplus-lite');?>
     42        <input type="radio" name="mobi-setting-lite[redirect]" value="no" <?php checked('no', $setting['redirect']); ?> /><?php _e('Inactive','mobiplus-lite');?>
    4243        <?php
    4344    }
     
    4647        $link = esc_attr( $setting['link'] );
    4748        echo "<input type='text' class='regular-text' name='mobi-setting-lite[link]' value='$link' />";
    48         echo '<p class="description">Enter mobile site URL like &nbsp; http://m.google.com</p>';
     49        echo '<p class="description">'._('Enter mobile site URL like &nbsp; http://m.google.com','mobiplus-lite').'</p>';
    4950    }
    5051
    5152    function redirect_tablet_callback_lite(){
    5253        $setting = (array)get_option('mobi-setting-lite');?>
    53         <input type="radio" name="mobi-setting-lite[redirect_tab]" value="yes" <?php checked('yes', $setting['redirect_tab']); ?> />Yes
    54         <input type="radio" name="mobi-setting-lite[redirect_tab]" value="no" <?php checked('no', $setting['redirect_tab']); ?> />No
     54        <input type="radio" name="mobi-setting-lite[redirect_tab]" value="yes" <?php checked('yes', $setting['redirect_tab']); ?> /><?php _e('Yes','mobiplus-lite');?>
     55        <input type="radio" name="mobi-setting-lite[redirect_tab]" value="no" <?php checked('no', $setting['redirect_tab']); ?> /><?php _e('No','mobiplus-lite');?>
    5556        <?php
    56         echo '<p class="description">If you want to stop redirection for Tablet then check yes (default is no)</p>';
     57        echo '<p class="description">'._('If you want to stop redirection for Tablet then check yes (default is no)','mobiplus-lite').'</p>';
    5758    }
     59   
     60    //Redirect Page Option 
     61    function redirect_specific_page_lite(){
     62        $setting = (array)get_option('mobi-setting-lite');
     63        @$relink = esc_attr( $setting['redirect_page'] );
     64        if($relink === 'no'){
     65            $specific_class = 'mprl-specific-page';
     66        }else{
     67            $specific_class = '';
     68        }
     69        ?>
     70        <input type="radio" onclick="javascript:yesnoCheck();" id="yesCheck" name="mobi-setting-lite[redirect_page]" value="yes" <?php checked('yes', @$setting['redirect_page']); ?> /><?php _e('Full Website','mobiplus-lite');?>
     71        <input type="radio" onclick="javascript:yesnoCheck();" id="noCheck" name="mobi-setting-lite[redirect_page]" value="no" <?php checked('no', @$setting['redirect_page']); ?> /><?php _e('Specific Page','mobiplus-lite');?>
     72        <input type='text' class='regular-text mprl-none <?php echo $specific_class;?>' id="spacific-page" name='mobi-setting-lite[specific_page]' value='<?php echo @$setting['specific_page'];?>' />
     73        <?php
     74        echo '<p class="description spefic-desc">'.__('Option for redirecting your Full website or A specific page. If you choose specific page, please add the page URL in the field','mobiplus-lite').'</p>';
     75    }
     76
    5877    //full version website
    5978    function redirect_back_main_lite(){
    60         echo "<div style='background:#408CEA;color:#FFFFFF;font-weight:bold;min-height:21px;padding:3px 5px;width:338px;'>";
     79        echo "<div class='mprl-site-back'>";
    6180        echo get_site_url();
    6281        echo "/?main=true</div>";
    63         echo '<p class="description">Place this link in mobile website for Redirect back mobile visitor to main website</p>';
     82        echo '<p class="description">'.__('Place this link in mobile website for Redirect back mobile visitor to main website','mobiplus-lite').'</p>';
    6483    }
    6584
  • mobile-redirect-plus-lite/trunk/mobi.php

    r1184365 r2033061  
    44Plugin URI: http://wordpress.org/plugins/mobile-redirect-plus-lite/
    55Description: Detect mobile device and redirect to mobile optimize website. You can also choose whether or not to redirect tablets by enabling or disabling the option. This plugin also gives you the ability to redirect back for viewing full version website.
    6 Version: 2.5
     6Version: 2.6
    77Author: Iqbal Bary <contact@iqbalbary.com>
    88Author URI: http://iqbalbary.com
     
    1111require_once 'includes/settings.php';
    1212
    13 add_action('init', 'mobi_plus_redirect_lite');
    14 function mobi_plus_redirect_lite() {
    15     //call the script
    16     require_once 'includes/Mobile_Detect.php';
    17     $detect_lite = new Mobile_Detect_Plus_Lite;
     13if ( ! function_exists( 'mobi_plus_redirect_lite' ) ){
     14    function mobi_plus_redirect_lite() {
     15        //textdomain
     16        load_plugin_textdomain( 'mobiplus-lite', false, dirname(plugin_basename(__FILE__)). '/languages/' );
     17        //call the script
     18        require_once 'includes/Mobile_Detect.php';
     19        $detect_lite = new Mobile_Detect_Plus_Lite;
    1820
    19     //Get all option for Redirect setting
    20     $red_plus_lite = (array)get_option('mobi-setting-lite');
     21        //Get all option for Redirect setting
     22        $red_plus_lite = (array)get_option('mobi-setting-lite');
    2123
    22     //Check the session
    23     $session_check_lite = $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    24     if(substr_count($session_check_lite, 'main=true')>0){
    25         setcookie('fullsite','true');
    26         return;
    27     }
     24        //Check the session
     25        $session_check_lite = $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
     26        if(substr_count($session_check_lite, 'main=true')>0){
     27            setcookie('fullsite','true');
     28            return;
     29        }
    2830
    29     //Check and Redirect
    30     if(!isset($_COOKIE['fullsite']) && $red_plus_lite['redirect'] === 'yes'){
    31         //Check Tablet
    32         if($detect_lite->isTablet()){
    33             if($red_plus_lite['redirect_tab'] === 'yes'){
    34                 return;
    35             }else{
     31        //Check Specific Page
     32        $check_url_lite = str_replace('http://', '', $session_check_lite);
     33        $check_url_lite = str_replace('https://', '', $check_url_lite);
     34        $check_url_lite = str_replace('www.', '', $check_url_lite);
     35
     36        @$specific_page_lite = str_replace('http://', '', $red_plus_lite['specific_page']);
     37        @$specific_page_lite = str_replace('https://', '', $specific_page_lite);
     38        @$specific_page_lite = str_replace('www.', '', $specific_page_lite);
     39
     40        if(@$red_plus_lite['redirect_page'] === 'no' && $check_url_lite != $specific_page_lite ){
     41            return;
     42        }
     43
     44        //Check and Redirect
     45        if(!isset($_COOKIE['fullsite']) && $red_plus_lite['redirect'] === 'yes'){
     46            //Check Tablet
     47            if($detect_lite->isTablet()){
     48                if($red_plus_lite['redirect_tab'] === 'yes'){
     49                    return;
     50                }else{
     51                    $link_redirect_lite = $red_plus_lite['link'];
     52                    wp_redirect( $link_redirect_lite, 302 );
     53                    exit();
     54                }
     55            }
     56
     57            //Check mobile
     58            if($detect_lite->isMobile()){
    3659                $link_redirect_lite = $red_plus_lite['link'];
    3760                wp_redirect( $link_redirect_lite, 302 );
    38                 exit();
     61                exit(); 
    3962            }
    4063        }
     64    }
    4165
    42         //Check mobile
    43         if($detect_lite->isMobile()){
    44             $link_redirect_lite = $red_plus_lite['link'];
    45             wp_redirect( $link_redirect_lite, 302 );
    46             exit();
    47         }
    48     }
     66    add_action('init', 'mobi_plus_redirect_lite');
    4967}
     68
     69
     70function mobile_plus_redirect_lite_scripts($hook) {
     71    if ( 'settings_page_mobile-redirect-plus-lite' != $hook ) {
     72        return;
     73    }
     74    wp_enqueue_style('mobile_plus_redirect_lite', plugins_url('includes/mobile-plus-redirect-lite.css', __FILE__));
     75    wp_enqueue_script( 'mobile_plus_redirect_lite_script', plugins_url('includes/mobile-plus-redirect-lite.js', __FILE__));
     76}
     77add_action( 'admin_enqueue_scripts', 'mobile_plus_redirect_lite_scripts' );
  • mobile-redirect-plus-lite/trunk/readme.txt

    r1184365 r2033061  
    33Plugin Name: WP Mobile Redirect
    44Plugin URI: http://iqbalbary.com/item/wp-redirect/
    5 Tags: redirect, mobile redirect, tablet redirect, wp mobile, android redirect, iphone redirect, ipad redirect, wordpress mobile
     5Tags: redirect, mobile redirect, tablet redirect, android redirect, iphone redirect
    66Author URI: http://iqbalbary.com
    77Author: Iqbal Bary
    88Requires at least: 3.0.1
    9 Tested up to: 4.2.2
    10 Stable tag: 2.5
     9Tested up to: 5.0.3
     10Stable tag: 2.6
    1111License: GPLv2 or later
    1212License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    1616== Description ==
    1717
    18 Detect mobile device and redirect to mobile optimize website. You can also choose whether or not to redirect tablets by enabling or disabling the check-box option. This plugin also gives you the ability to redirect back for viewing full version website. Place a link "http://example.com/?main=true" in your mobile website for that.
     18Detect mobile device and redirect to mobile optimize website. You can also choose whether or not to redirect tablets by enabling or disabling the check-box option.
     19
     20This plugin also gives you the ability to redirect back for viewing full version website. Place a link `http://example.com/?main=true` in your mobile website for that.
     21
     22= Features =
     23* Redirect Full website to mobile optimized website
     24* Redirect One Specific page to mobile optimzed website
     25* Redirect within same WordPress website
     26* Exclude or include Tablets redirection
     27* Google recommended 302 redirects
     28* Option to view full site for your mobile user.
    1929
    2030== Installation ==
     
    2939== Frequently Asked Questions ==
    3040
     41= I activated the plugin and nothing happened? =
     42Please setup the mobile redirect setting first and it will redirect mobile users.
     43
     44= I setup the settings but still not working? =
     45It might be a caching issue. Please clear your cache and try again. If still not working, please contact us for suppport.
     46
     47= I have mobile page within same WordPress site. Is it possible to redirect within my WordPress site? =
     48Yes, you can redirect within same WordPress site but for that you have to select `specific page` as 'Redirect page' and `Mobile Website Link` link will be your destination page.
     49
     50= How can I give my users the option to view the full site =
     51Please place this link `http://yourdomain.com/?main=true` on your mobile page and your visitor can check full website via this link.
     52
    3153
    3254== Screenshots ==
     
    3658== Changelog ==
    3759
     60= 2.6 =
     61* Bug Fix & Script Update
    3862= 2.5 =
    3963* Bug Fix
Note: See TracChangeset for help on using the changeset viewer.