From 7d513966a095d07021b3ed192821a842b96fcfd7 Mon Sep 17 00:00:00 2001 From: Sarthak Srinivas Date: Tue, 6 Sep 2016 17:53:42 -0400 Subject: [PATCH 01/17] Fix bug with test examples --- dist/argon.js | 1455 +++++++++++++++++++++++++++++---------------- dist/argon.min.js | 2 +- test/index.html | 2 +- 3 files changed, 940 insertions(+), 519 deletions(-) diff --git a/dist/argon.js b/dist/argon.js index 23ab4f4..78a6ca6 100644 --- a/dist/argon.js +++ b/dist/argon.js @@ -2691,531 +2691,952 @@ var define = $__System.amdDefine; })); })(); -$__System.registerDynamic("8", [], true, function($__require, exports, module) { - ; - var define, - global = this || self, - GLOBAL = global; - (function(define, undefined) { - define(function() { - 'use strict'; - var impl = {}; - impl.mobileDetectRules = { - "phones": { - "iPhone": "\\biPhone\\b|\\biPod\\b", - "BlackBerry": "BlackBerry|\\bBB10\\b|rim[0-9]+", - "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", - "Nexus": "Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6", - "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", - "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", - "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|SM-G9350", - "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)", - "Sony": "SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533", - "Asus": "Asus.*Galaxy|PadFone.*Mobile", - "Micromax": "Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b", - "Palm": "PalmSource|Palm", - "Vertu": "Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature", - "Pantech": "PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790", - "Fly": "IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250", - "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", - "iMobile": "i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)", - "SimValley": "\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b", - "Wolfgang": "AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q", - "Alcatel": "Alcatel", - "Nintendo": "Nintendo 3DS", - "Amoi": "Amoi", - "INQ": "INQ", - "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" - }, - "tablets": { - "iPad": "iPad|iPad.*Mobile", - "NexusTablet": "Android.*Nexus[\\s]+(7|9|10)", - "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-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", - "Kindle": "Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI)\\b", - "SurfaceTablet": "Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)", - "HPTablet": "HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10", - "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", - "BlackBerryTablet": "PlayBook|RIM Tablet", - "HTCtablet": "HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410", - "MotorolaTablet": "xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617", - "NookTablet": "Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2", - "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", - "ToshibaTablet": "Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO", - "LGTablet": "\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b", - "FujitsuTablet": "Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b", - "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", - "LenovoTablet": "Lenovo TAB|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|)", - "DellTablet": "Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7", - "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", - "MedionTablet": "Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB", - "ArnovaTablet": "AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2", - "IntensoTablet": "INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004", - "IRUTablet": "M702pro", - "MegafonTablet": "MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b", - "EbodaTablet": "E-Boda (Supreme|Impresspeed|Izzycomm|Essential)", - "AllViewTablet": "Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)", - "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", - "AinolTablet": "NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark", - "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|SOT31", - "PhilipsTablet": "\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b", - "CubeTablet": "Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT", - "CobyTablet": "MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010", - "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", - "MSITablet": "MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b", - "SMiTTablet": "Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)", - "RockChipTablet": "Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A", - "FlyTablet": "IQ310|Fly Vision", - "bqTablet": "Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris E10)|Maxwell.*Lite|Maxwell.*Plus", - "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", - "NecTablet": "\\bN-06D|\\bN-08D", - "PantechTablet": "Pantech.*P4100", - "BronchoTablet": "Broncho.*(N701|N708|N802|a710)", - "VersusTablet": "TOUCHPAD.*[78910]|\\bTOUCHTAB\\b", - "ZyncTablet": "z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900", - "PositivoTablet": "TB07STA|TB10STA|TB07FTA|TB10FTA", - "NabiTablet": "Android.*\\bNabi", - "KoboTablet": "Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build", - "DanewTablet": "DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b", - "TexetTablet": "NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE", - "PlaystationTablet": "Playstation.*(Portable|Vita)", - "TrekstorTablet": "ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab", - "PyleAudioTablet": "\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b", - "AdvanTablet": "Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b ", - "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", - "GalapadTablet": "Android.*\\bG1\\b", - "MicromaxTablet": "Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b", - "KarbonnTablet": "Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b", - "AllFineTablet": "Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide", - "PROSCANTablet": "\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b", - "YONESTablet": "BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026", - "ChangJiaTablet": "TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503", - "GUTablet": "TX-A1301|TX-M9002|Q702|kf026", - "PointOfViewTablet": "TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10", - "OvermaxTablet": "OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)", - "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", - "DPSTablet": "DPS Dream 9|DPS Dual 7", - "VistureTablet": "V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10", - "CrestaTablet": "CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989", - "MediatekTablet": "\\bMT8125|MT8389|MT8135|MT8377\\b", - "ConcordeTablet": "Concorde([ ]+)?Tab|ConCorde ReadMan", - "GoCleverTablet": "GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042", - "ModecomTablet": "FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003", - "VoninoTablet": "\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b", - "ECSTablet": "V07OT2|TM105A|S10OT1|TR10CS1", - "StorexTablet": "eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab", - "VodafoneTablet": "SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7", - "EssentielBTablet": "Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2", - "RossMoorTablet": "RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711", - "iMobileTablet": "i-mobile i-note", - "TolinoTablet": "tolino tab [0-9.]+|tolino shine", - "AudioSonicTablet": "\\bC-22Q|T7-QC|T-17B|T-17P\\b", - "AMPETablet": "Android.* A78 ", - "SkkTablet": "Android.* (SKYPAD|PHOENIX|CYCLOPS)", - "TecnoTablet": "TECNO P9", - "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", - "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)", - "FX2Tablet": "FX2 PAD7|FX2 PAD10", - "XoroTablet": "KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151", - "ViewsonicTablet": "ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a", - "OdysTablet": "LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10", - "CaptivaTablet": "CAPTIVA PAD", - "IconbitTablet": "NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S", - "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", - "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]+", - "JaytechTablet": "TPC-PA762", - "BlaupunktTablet": "Endeavour 800NG|Endeavour 1010", - "DigmaTablet": "\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b", - "EvolioTablet": "ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b", - "LavaTablet": "QPAD E704|\\bIvoryS\\b|E-TAB IVORY|\\bE-TAB\\b", - "AocTablet": "MW0811|MW0812|MW0922|MTK8382", - "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", - "CelkonTablet": "CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b", - "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", - "MiTablet": "\\bMI PAD\\b|\\bHM NOTE 1W\\b", - "NibiruTablet": "Nibiru M1|Nibiru Jupiter One", - "NexoTablet": "NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI", - "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", - "UbislateTablet": "UbiSlate[\\s]?7C", - "PocketBookTablet": "Pocketbook", - "Hudl": "Hudl HT7S3|Hudl 2", - "TelstraTablet": "T-Hub2", - "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|\\bTP750\\b" - }, - "oss": { - "AndroidOS": "Android", - "BlackBerryOS": "blackberry|\\bBB10\\b|rim tablet os", - "PalmOS": "PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino", - "SymbianOS": "Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b", - "WindowsMobileOS": "Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;", - "WindowsPhoneOS": "Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;", - "iOS": "\\biPhone.*Mobile|\\biPod|\\biPad", - "MeeGoOS": "MeeGo", - "MaemoOS": "Maemo", - "JavaOS": "J2ME\/|\\bMIDP\\b|\\bCLDC\\b", - "webOS": "webOS|hpwOS", - "badaOS": "\\bBada\\b", - "BREWOS": "BREW" - }, - "uas": { - "Chrome": "\\bCrMo\\b|CriOS|Android.*Chrome\/[.0-9]* (Mobile)?", - "Dolfin": "\\bDolfin\\b", - "Opera": "Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\/[0-9.]+|Coast\/[0-9.]+", - "Skyfire": "Skyfire", - "IE": "IEMobile|MSIEMobile", - "Firefox": "fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile", - "Bolt": "bolt", - "TeaShark": "teashark", - "Blazer": "Blazer", - "Safari": "Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari", - "Tizen": "Tizen", - "UCBrowser": "UC.*Browser|UCWEB", - "baiduboxapp": "baiduboxapp", - "baidubrowser": "baidubrowser", - "DiigoBrowser": "DiigoBrowser", - "Puffin": "Puffin", - "Mercury": "\\bMercury\\b", - "ObigoBrowser": "Obigo", - "NetFront": "NF-Browser", - "GenericBrowser": "NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger" - }, - "props": { - "Mobile": "Mobile\/[VER]", - "Build": "Build\/[VER]", - "Version": "Version\/[VER]", - "VendorID": "VendorID\/[VER]", - "iPad": "iPad.*CPU[a-z ]+[VER]", - "iPhone": "iPhone.*CPU[a-z ]+[VER]", - "iPod": "iPod.*CPU[a-z ]+[VER]", - "Kindle": "Kindle\/[VER]", - "Chrome": ["Chrome\/[VER]", "CriOS\/[VER]", "CrMo\/[VER]"], - "Coast": ["Coast\/[VER]"], - "Dolfin": "Dolfin\/[VER]", - "Firefox": "Firefox\/[VER]", - "Fennec": "Fennec\/[VER]", - "IE": ["IEMobile\/[VER];", "IEMobile [VER]", "MSIE [VER];", "Trident\/[0-9.]+;.*rv:[VER]"], - "NetFront": "NetFront\/[VER]", - "NokiaBrowser": "NokiaBrowser\/[VER]", - "Opera": [" OPR\/[VER]", "Opera Mini\/[VER]", "Version\/[VER]"], - "Opera Mini": "Opera Mini\/[VER]", - "Opera Mobi": "Version\/[VER]", - "UC Browser": "UC Browser[VER]", - "MQQBrowser": "MQQBrowser\/[VER]", - "MicroMessenger": "MicroMessenger\/[VER]", - "baiduboxapp": "baiduboxapp\/[VER]", - "baidubrowser": "baidubrowser\/[VER]", - "Iron": "Iron\/[VER]", - "Safari": ["Version\/[VER]", "Safari\/[VER]"], - "Skyfire": "Skyfire\/[VER]", - "Tizen": "Tizen\/[VER]", - "Webkit": "webkit[ \/][VER]", - "Gecko": "Gecko\/[VER]", - "Trident": "Trident\/[VER]", - "Presto": "Presto\/[VER]", - "iOS": " \\bi?OS\\b [VER][ ;]{1}", - "Android": "Android [VER]", - "BlackBerry": ["BlackBerry[\\w]+\/[VER]", "BlackBerry.*Version\/[VER]", "Version\/[VER]"], - "BREW": "BREW [VER]", - "Java": "Java\/[VER]", - "Windows Phone OS": ["Windows Phone OS [VER]", "Windows Phone [VER]"], - "Windows Phone": "Windows Phone [VER]", - "Windows CE": "Windows CE\/[VER]", - "Windows NT": "Windows NT [VER]", - "Symbian": ["SymbianOS\/[VER]", "Symbian\/[VER]"], - "webOS": ["webOS\/[VER]", "hpwOS\/[VER];"] - }, - "utils": { - "Bot": "Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom", - "MobileBot": "Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker\/M1A1-R2D2", - "DesktopMode": "WPDesktop", - "TV": "SonyDTV|HbbTV", - "WebKit": "(webkit)[ \/]([\\w.]+)", - "Console": "\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\\b", - "Watch": "SM-V700" - } - }; - impl.detectMobileBrowsers = { - fullPattern: /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i, - shortPattern: /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i, - tabletPattern: /android|ipad|playbook|silk/i - }; - var hasOwnProp = Object.prototype.hasOwnProperty, - isArray; - impl.FALLBACK_PHONE = 'UnknownPhone'; - impl.FALLBACK_TABLET = 'UnknownTablet'; - impl.FALLBACK_MOBILE = 'UnknownMobile'; - isArray = ('isArray' in Array) ? Array.isArray : function(value) { - return Object.prototype.toString.call(value) === '[object Array]'; - }; - function equalIC(a, b) { - return a != null && b != null && a.toLowerCase() === b.toLowerCase(); - } - function containsIC(array, value) { - var valueLC, - i, - len = array.length; - if (!len || !value) { - return false; - } - valueLC = value.toLowerCase(); - for (i = 0; i < len; ++i) { - if (valueLC === array[i].toLowerCase()) { - return true; - } - } - return false; - } - function convertPropsToRegExp(object) { - for (var key in object) { - if (hasOwnProp.call(object, key)) { - object[key] = new RegExp(object[key], 'i'); - } - } - } - (function init() { - var key, - values, - value, - i, - len, - verPos, - mobileDetectRules = impl.mobileDetectRules; - for (key in mobileDetectRules.props) { - if (hasOwnProp.call(mobileDetectRules.props, key)) { - values = mobileDetectRules.props[key]; - if (!isArray(values)) { - values = [values]; +$__System.registerDynamic("8", [], true, function ($__require, exports, module) { + var define, + global = this || self, + GLOBAL = global; + // THIS FILE IS GENERATED - DO NOT EDIT! + /*global module:false, define:false*/ + + (function (define, undefined) { + define(function () { + 'use strict'; + + var impl = {}; + + impl.mobileDetectRules = { + "phones": { + "iPhone": "\\biPhone\\b|\\biPod\\b", + "BlackBerry": "BlackBerry|\\bBB10\\b|rim[0-9]+", + "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", + "Nexus": "Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6", + "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", + "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", + "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|SM-G9350", + "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)", + "Sony": "SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533", + "Asus": "Asus.*Galaxy|PadFone.*Mobile", + "Micromax": "Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b", + "Palm": "PalmSource|Palm", + "Vertu": "Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature", + "Pantech": "PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790", + "Fly": "IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250", + "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", + "iMobile": "i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)", + "SimValley": "\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b", + "Wolfgang": "AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q", + "Alcatel": "Alcatel", + "Nintendo": "Nintendo 3DS", + "Amoi": "Amoi", + "INQ": "INQ", + "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" + }, + "tablets": { + "iPad": "iPad|iPad.*Mobile", + "NexusTablet": "Android.*Nexus[\\s]+(7|9|10)", + "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-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", + "Kindle": "Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI)\\b", + "SurfaceTablet": "Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)", + "HPTablet": "HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10", + "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", + "BlackBerryTablet": "PlayBook|RIM Tablet", + "HTCtablet": "HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410", + "MotorolaTablet": "xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617", + "NookTablet": "Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2", + "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", + "ToshibaTablet": "Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO", + "LGTablet": "\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b", + "FujitsuTablet": "Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b", + "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", + "LenovoTablet": "Lenovo TAB|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|)", + "DellTablet": "Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7", + "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", + "MedionTablet": "Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB", + "ArnovaTablet": "AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2", + "IntensoTablet": "INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004", + "IRUTablet": "M702pro", + "MegafonTablet": "MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b", + "EbodaTablet": "E-Boda (Supreme|Impresspeed|Izzycomm|Essential)", + "AllViewTablet": "Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)", + "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", + "AinolTablet": "NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark", + "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|SOT31", + "PhilipsTablet": "\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b", + "CubeTablet": "Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT", + "CobyTablet": "MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010", + "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", + "MSITablet": "MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b", + "SMiTTablet": "Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)", + "RockChipTablet": "Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A", + "FlyTablet": "IQ310|Fly Vision", + "bqTablet": "Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris E10)|Maxwell.*Lite|Maxwell.*Plus", + "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", + "NecTablet": "\\bN-06D|\\bN-08D", + "PantechTablet": "Pantech.*P4100", + "BronchoTablet": "Broncho.*(N701|N708|N802|a710)", + "VersusTablet": "TOUCHPAD.*[78910]|\\bTOUCHTAB\\b", + "ZyncTablet": "z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900", + "PositivoTablet": "TB07STA|TB10STA|TB07FTA|TB10FTA", + "NabiTablet": "Android.*\\bNabi", + "KoboTablet": "Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build", + "DanewTablet": "DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b", + "TexetTablet": "NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE", + "PlaystationTablet": "Playstation.*(Portable|Vita)", + "TrekstorTablet": "ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab", + "PyleAudioTablet": "\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b", + "AdvanTablet": "Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b ", + "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", + "GalapadTablet": "Android.*\\bG1\\b", + "MicromaxTablet": "Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b", + "KarbonnTablet": "Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b", + "AllFineTablet": "Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide", + "PROSCANTablet": "\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b", + "YONESTablet": "BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026", + "ChangJiaTablet": "TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503", + "GUTablet": "TX-A1301|TX-M9002|Q702|kf026", + "PointOfViewTablet": "TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10", + "OvermaxTablet": "OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)", + "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", + "DPSTablet": "DPS Dream 9|DPS Dual 7", + "VistureTablet": "V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10", + "CrestaTablet": "CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989", + "MediatekTablet": "\\bMT8125|MT8389|MT8135|MT8377\\b", + "ConcordeTablet": "Concorde([ ]+)?Tab|ConCorde ReadMan", + "GoCleverTablet": "GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042", + "ModecomTablet": "FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003", + "VoninoTablet": "\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b", + "ECSTablet": "V07OT2|TM105A|S10OT1|TR10CS1", + "StorexTablet": "eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab", + "VodafoneTablet": "SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7", + "EssentielBTablet": "Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2", + "RossMoorTablet": "RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711", + "iMobileTablet": "i-mobile i-note", + "TolinoTablet": "tolino tab [0-9.]+|tolino shine", + "AudioSonicTablet": "\\bC-22Q|T7-QC|T-17B|T-17P\\b", + "AMPETablet": "Android.* A78 ", + "SkkTablet": "Android.* (SKYPAD|PHOENIX|CYCLOPS)", + "TecnoTablet": "TECNO P9", + "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", + "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)", + "FX2Tablet": "FX2 PAD7|FX2 PAD10", + "XoroTablet": "KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151", + "ViewsonicTablet": "ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a", + "OdysTablet": "LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10", + "CaptivaTablet": "CAPTIVA PAD", + "IconbitTablet": "NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S", + "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", + "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]+", + "JaytechTablet": "TPC-PA762", + "BlaupunktTablet": "Endeavour 800NG|Endeavour 1010", + "DigmaTablet": "\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b", + "EvolioTablet": "ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b", + "LavaTablet": "QPAD E704|\\bIvoryS\\b|E-TAB IVORY|\\bE-TAB\\b", + "AocTablet": "MW0811|MW0812|MW0922|MTK8382", + "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", + "CelkonTablet": "CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b", + "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", + "MiTablet": "\\bMI PAD\\b|\\bHM NOTE 1W\\b", + "NibiruTablet": "Nibiru M1|Nibiru Jupiter One", + "NexoTablet": "NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI", + "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", + "UbislateTablet": "UbiSlate[\\s]?7C", + "PocketBookTablet": "Pocketbook", + "Hudl": "Hudl HT7S3|Hudl 2", + "TelstraTablet": "T-Hub2", + "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|\\bTP750\\b" + }, + "oss": { + "AndroidOS": "Android", + "BlackBerryOS": "blackberry|\\bBB10\\b|rim tablet os", + "PalmOS": "PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino", + "SymbianOS": "Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b", + "WindowsMobileOS": "Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;", + "WindowsPhoneOS": "Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;", + "iOS": "\\biPhone.*Mobile|\\biPod|\\biPad", + "MeeGoOS": "MeeGo", + "MaemoOS": "Maemo", + "JavaOS": "J2ME\/|\\bMIDP\\b|\\bCLDC\\b", + "webOS": "webOS|hpwOS", + "badaOS": "\\bBada\\b", + "BREWOS": "BREW" + }, + "uas": { + "Chrome": "\\bCrMo\\b|CriOS|Android.*Chrome\/[.0-9]* (Mobile)?", + "Dolfin": "\\bDolfin\\b", + "Opera": "Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\/[0-9.]+|Coast\/[0-9.]+", + "Skyfire": "Skyfire", + "IE": "IEMobile|MSIEMobile", + "Firefox": "fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile", + "Bolt": "bolt", + "TeaShark": "teashark", + "Blazer": "Blazer", + "Safari": "Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari", + "Tizen": "Tizen", + "UCBrowser": "UC.*Browser|UCWEB", + "baiduboxapp": "baiduboxapp", + "baidubrowser": "baidubrowser", + "DiigoBrowser": "DiigoBrowser", + "Puffin": "Puffin", + "Mercury": "\\bMercury\\b", + "ObigoBrowser": "Obigo", + "NetFront": "NF-Browser", + "GenericBrowser": "NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger" + }, + "props": { + "Mobile": "Mobile\/[VER]", + "Build": "Build\/[VER]", + "Version": "Version\/[VER]", + "VendorID": "VendorID\/[VER]", + "iPad": "iPad.*CPU[a-z ]+[VER]", + "iPhone": "iPhone.*CPU[a-z ]+[VER]", + "iPod": "iPod.*CPU[a-z ]+[VER]", + "Kindle": "Kindle\/[VER]", + "Chrome": ["Chrome\/[VER]", "CriOS\/[VER]", "CrMo\/[VER]"], + "Coast": ["Coast\/[VER]"], + "Dolfin": "Dolfin\/[VER]", + "Firefox": "Firefox\/[VER]", + "Fennec": "Fennec\/[VER]", + "IE": ["IEMobile\/[VER];", "IEMobile [VER]", "MSIE [VER];", "Trident\/[0-9.]+;.*rv:[VER]"], + "NetFront": "NetFront\/[VER]", + "NokiaBrowser": "NokiaBrowser\/[VER]", + "Opera": [" OPR\/[VER]", "Opera Mini\/[VER]", "Version\/[VER]"], + "Opera Mini": "Opera Mini\/[VER]", + "Opera Mobi": "Version\/[VER]", + "UC Browser": "UC Browser[VER]", + "MQQBrowser": "MQQBrowser\/[VER]", + "MicroMessenger": "MicroMessenger\/[VER]", + "baiduboxapp": "baiduboxapp\/[VER]", + "baidubrowser": "baidubrowser\/[VER]", + "Iron": "Iron\/[VER]", + "Safari": ["Version\/[VER]", "Safari\/[VER]"], + "Skyfire": "Skyfire\/[VER]", + "Tizen": "Tizen\/[VER]", + "Webkit": "webkit[ \/][VER]", + "Gecko": "Gecko\/[VER]", + "Trident": "Trident\/[VER]", + "Presto": "Presto\/[VER]", + "iOS": " \\bi?OS\\b [VER][ ;]{1}", + "Android": "Android [VER]", + "BlackBerry": ["BlackBerry[\\w]+\/[VER]", "BlackBerry.*Version\/[VER]", "Version\/[VER]"], + "BREW": "BREW [VER]", + "Java": "Java\/[VER]", + "Windows Phone OS": ["Windows Phone OS [VER]", "Windows Phone [VER]"], + "Windows Phone": "Windows Phone [VER]", + "Windows CE": "Windows CE\/[VER]", + "Windows NT": "Windows NT [VER]", + "Symbian": ["SymbianOS\/[VER]", "Symbian\/[VER]"], + "webOS": ["webOS\/[VER]", "hpwOS\/[VER];"] + }, + "utils": { + "Bot": "Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom", + "MobileBot": "Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker\/M1A1-R2D2", + "DesktopMode": "WPDesktop", + "TV": "SonyDTV|HbbTV", + "WebKit": "(webkit)[ \/]([\\w.]+)", + "Console": "\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\\b", + "Watch": "SM-V700" + } + }; + + // following patterns come from http://detectmobilebrowsers.com/ + impl.detectMobileBrowsers = { + fullPattern: /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i, + shortPattern: /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i, + tabletPattern: /android|ipad|playbook|silk/i + }; + + var hasOwnProp = Object.prototype.hasOwnProperty, + isArray; + + impl.FALLBACK_PHONE = 'UnknownPhone'; + impl.FALLBACK_TABLET = 'UnknownTablet'; + impl.FALLBACK_MOBILE = 'UnknownMobile'; + + isArray = 'isArray' in Array ? Array.isArray : function (value) { + return Object.prototype.toString.call(value) === '[object Array]'; + }; + + function equalIC(a, b) { + return a != null && b != null && a.toLowerCase() === b.toLowerCase(); } - len = values.length; - for (i = 0; i < len; ++i) { - value = values[i]; - verPos = value.indexOf('[VER]'); - if (verPos >= 0) { - value = value.substring(0, verPos) + '([\\w._\\+]+)' + value.substring(verPos + 5); - } - values[i] = new RegExp(value, 'i'); + + function containsIC(array, value) { + var valueLC, + i, + len = array.length; + if (!len || !value) { + return false; + } + valueLC = value.toLowerCase(); + for (i = 0; i < len; ++i) { + if (valueLC === array[i].toLowerCase()) { + return true; + } + } + return false; } - mobileDetectRules.props[key] = values; - } - } - convertPropsToRegExp(mobileDetectRules.oss); - convertPropsToRegExp(mobileDetectRules.phones); - convertPropsToRegExp(mobileDetectRules.tablets); - convertPropsToRegExp(mobileDetectRules.uas); - convertPropsToRegExp(mobileDetectRules.utils); - mobileDetectRules.oss0 = { - WindowsPhoneOS: mobileDetectRules.oss.WindowsPhoneOS, - WindowsMobileOS: mobileDetectRules.oss.WindowsMobileOS - }; - }()); - impl.findMatch = function(rules, userAgent) { - for (var key in rules) { - if (hasOwnProp.call(rules, key)) { - if (rules[key].test(userAgent)) { - return key; + + function convertPropsToRegExp(object) { + for (var key in object) { + if (hasOwnProp.call(object, key)) { + object[key] = new RegExp(object[key], 'i'); + } + } } - } - } - return null; - }; - impl.findMatches = function(rules, userAgent) { - var result = []; - for (var key in rules) { - if (hasOwnProp.call(rules, key)) { - if (rules[key].test(userAgent)) { - result.push(key); + + (function init() { + var key, + values, + value, + i, + len, + verPos, + mobileDetectRules = impl.mobileDetectRules; + for (key in mobileDetectRules.props) { + if (hasOwnProp.call(mobileDetectRules.props, key)) { + values = mobileDetectRules.props[key]; + if (!isArray(values)) { + values = [values]; + } + len = values.length; + for (i = 0; i < len; ++i) { + value = values[i]; + verPos = value.indexOf('[VER]'); + if (verPos >= 0) { + value = value.substring(0, verPos) + '([\\w._\\+]+)' + value.substring(verPos + 5); + } + values[i] = new RegExp(value, 'i'); + } + mobileDetectRules.props[key] = values; + } + } + convertPropsToRegExp(mobileDetectRules.oss); + convertPropsToRegExp(mobileDetectRules.phones); + convertPropsToRegExp(mobileDetectRules.tablets); + convertPropsToRegExp(mobileDetectRules.uas); + convertPropsToRegExp(mobileDetectRules.utils); + + // copy some patterns to oss0 which are tested first (see issue#15) + mobileDetectRules.oss0 = { + WindowsPhoneOS: mobileDetectRules.oss.WindowsPhoneOS, + WindowsMobileOS: mobileDetectRules.oss.WindowsMobileOS + }; + })(); + + /** + * Test userAgent string against a set of rules and find the first matched key. + * @param {Object} rules (key is String, value is RegExp) + * @param {String} userAgent the navigator.userAgent (or HTTP-Header 'User-Agent'). + * @returns {String|null} the matched key if found, otherwise null + * @private + */ + impl.findMatch = function (rules, userAgent) { + for (var key in rules) { + if (hasOwnProp.call(rules, key)) { + if (rules[key].test(userAgent)) { + return key; + } + } + } + return null; + }; + + /** + * Test userAgent string against a set of rules and return an array of matched keys. + * @param {Object} rules (key is String, value is RegExp) + * @param {String} userAgent the navigator.userAgent (or HTTP-Header 'User-Agent'). + * @returns {Array} an array of matched keys, may be empty when there is no match, but not null + * @private + */ + impl.findMatches = function (rules, userAgent) { + var result = []; + for (var key in rules) { + if (hasOwnProp.call(rules, key)) { + if (rules[key].test(userAgent)) { + result.push(key); + } + } + } + return result; + }; + + /** + * Check the version of the given property in the User-Agent. + * + * @param {String} propertyName + * @param {String} userAgent + * @return {String} version or null if version not found + * @private + */ + impl.getVersionStr = function (propertyName, userAgent) { + var props = impl.mobileDetectRules.props, + patterns, + i, + len, + match; + if (hasOwnProp.call(props, propertyName)) { + patterns = props[propertyName]; + len = patterns.length; + for (i = 0; i < len; ++i) { + match = patterns[i].exec(userAgent); + if (match !== null) { + return match[1]; + } + } + } + return null; + }; + + /** + * Check the version of the given property in the User-Agent. + * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31) + * + * @param {String} propertyName + * @param {String} userAgent + * @return {Number} version or NaN if version not found + * @private + */ + impl.getVersion = function (propertyName, userAgent) { + var version = impl.getVersionStr(propertyName, userAgent); + return version ? impl.prepareVersionNo(version) : NaN; + }; + + /** + * Prepare the version number. + * + * @param {String} version + * @return {Number} the version number as a floating number + * @private + */ + impl.prepareVersionNo = function (version) { + var numbers; + + numbers = version.split(/[a-z._ \/\-]/i); + if (numbers.length === 1) { + version = numbers[0]; + } + if (numbers.length > 1) { + version = numbers[0] + '.'; + numbers.shift(); + version += numbers.join(''); + } + return Number(version); + }; + + impl.isMobileFallback = function (userAgent) { + return impl.detectMobileBrowsers.fullPattern.test(userAgent) || impl.detectMobileBrowsers.shortPattern.test(userAgent.substr(0, 4)); + }; + + impl.isTabletFallback = function (userAgent) { + return impl.detectMobileBrowsers.tabletPattern.test(userAgent); + }; + + impl.prepareDetectionCache = function (cache, userAgent, maxPhoneWidth) { + if (cache.mobile !== undefined) { + return; + } + var phone, tablet, phoneSized; + + // first check for stronger tablet rules, then phone (see issue#5) + tablet = impl.findMatch(impl.mobileDetectRules.tablets, userAgent); + if (tablet) { + cache.mobile = cache.tablet = tablet; + cache.phone = null; + return; // unambiguously identified as tablet + } + + phone = impl.findMatch(impl.mobileDetectRules.phones, userAgent); + if (phone) { + cache.mobile = cache.phone = phone; + cache.tablet = null; + return; // unambiguously identified as phone + } + + // our rules haven't found a match -> try more general fallback rules + if (impl.isMobileFallback(userAgent)) { + phoneSized = MobileDetect.isPhoneSized(maxPhoneWidth); + if (phoneSized === undefined) { + cache.mobile = impl.FALLBACK_MOBILE; + cache.tablet = cache.phone = null; + } else if (phoneSized) { + cache.mobile = cache.phone = impl.FALLBACK_PHONE; + cache.tablet = null; + } else { + cache.mobile = cache.tablet = impl.FALLBACK_TABLET; + cache.phone = null; + } + } else if (impl.isTabletFallback(userAgent)) { + cache.mobile = cache.tablet = impl.FALLBACK_TABLET; + cache.phone = null; + } else { + // not mobile at all! + cache.mobile = cache.tablet = cache.phone = null; + } + }; + + // t is a reference to a MobileDetect instance + impl.mobileGrade = function (t) { + // impl note: + // To keep in sync w/ Mobile_Detect.php easily, the following code is tightly aligned to the PHP version. + // When changes are made in Mobile_Detect.php, copy this method and replace: + // $this-> / t. + // self::MOBILE_GRADE_(.) / '$1' + // , self::VERSION_TYPE_FLOAT / (nothing) + // isIOS() / os('iOS') + // [reg] / (nothing) <-- jsdelivr complaining about unescaped unicode character U+00AE + var $isMobile = t.mobile() !== null; + + if ( + // Apple iOS 3.2-5.1 - Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3), iPad 3 (5.1), original iPhone (3.1), iPhone 3 (3.2), 3GS (4.3), 4 (4.3 / 5.0), and 4S (5.1) + t.os('iOS') && t.version('iPad') >= 4.3 || t.os('iOS') && t.version('iPhone') >= 3.1 || t.os('iOS') && t.version('iPod') >= 3.1 || + + // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5) + // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM + // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices + // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7 + t.version('Android') > 2.1 && t.is('Webkit') || + + // Windows Phone 7-7.5 - Tested on the HTC Surround (7.0) HTC Trophy (7.5), LG-E900 (7.5), Nokia Lumia 800 + t.version('Windows Phone OS') >= 7.0 || + + // Blackberry 7 - Tested on BlackBerry Torch 9810 + // Blackberry 6.0 - Tested on the Torch 9800 and Style 9670 + t.is('BlackBerry') && t.version('BlackBerry') >= 6.0 || + // Blackberry Playbook (1.0-2.0) - Tested on PlayBook + t.match('Playbook.*Tablet') || + + // Palm WebOS (1.4-2.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0) + t.version('webOS') >= 1.4 && t.match('Palm|Pre|Pixi') || + // Palm WebOS 3.0 - Tested on HP TouchPad + t.match('hp.*TouchPad') || + + // Firefox Mobile (12 Beta) - Tested on Android 2.3 device + t.is('Firefox') && t.version('Firefox') >= 12 || + + // Chrome for Android - Tested on Android 4.0, 4.1 device + t.is('Chrome') && t.is('AndroidOS') && t.version('Android') >= 4.0 || + + // Skyfire 4.1 - Tested on Android 2.3 device + t.is('Skyfire') && t.version('Skyfire') >= 4.1 && t.is('AndroidOS') && t.version('Android') >= 2.3 || + + // Opera Mobile 11.5-12: Tested on Android 2.3 + t.is('Opera') && t.version('Opera Mobi') > 11 && t.is('AndroidOS') || + + // Meego 1.2 - Tested on Nokia 950 and N9 + t.is('MeeGoOS') || + + // Tizen (pre-release) - Tested on early hardware + t.is('Tizen') || + + // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser + // @todo: more tests here! + t.is('Dolfin') && t.version('Bada') >= 2.0 || + + // UC Browser - Tested on Android 2.3 device + (t.is('UC Browser') || t.is('Dolfin')) && t.version('Android') >= 2.3 || + + // Kindle 3 and Fire - Tested on the built-in WebKit browser for each + t.match('Kindle Fire') || t.is('Kindle') && t.version('Kindle') >= 3.0 || + + // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet + t.is('AndroidOS') && t.is('NookTablet') || + + // Chrome Desktop 11-21 - Tested on OS X 10.7 and Windows 7 + t.version('Chrome') >= 11 && !$isMobile || + + // Safari Desktop 4-5 - Tested on OS X 10.7 and Windows 7 + t.version('Safari') >= 5.0 && !$isMobile || + + // Firefox Desktop 4-13 - Tested on OS X 10.7 and Windows 7 + t.version('Firefox') >= 4.0 && !$isMobile || + + // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7 + t.version('MSIE') >= 7.0 && !$isMobile || + + // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7 + // @reference: http://my.opera.com/community/openweb/idopera/ + t.version('Opera') >= 10 && !$isMobile) { + return 'A'; + } + + if (t.os('iOS') && t.version('iPad') < 4.3 || t.os('iOS') && t.version('iPhone') < 3.1 || t.os('iOS') && t.version('iPod') < 3.1 || + + // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770 + t.is('Blackberry') && t.version('BlackBerry') >= 5 && t.version('BlackBerry') < 6 || + + //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3 + t.version('Opera Mini') >= 5.0 && t.version('Opera Mini') <= 6.5 && (t.version('Android') >= 2.3 || t.is('iOS')) || + + // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1) + t.match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') || + + // @todo: report this (tested on Nokia N71) + t.version('Opera Mobi') >= 11 && t.is('SymbianOS')) { + return 'B'; + } + + if ( + // Blackberry 4.x - Tested on the Curve 8330 + t.version('BlackBerry') < 5.0 || + // Windows Mobile - Tested on the HTC Leo (WinMo 5.2) + t.match('MSIEMobile|Windows CE.*Mobile') || t.version('Windows Mobile') <= 5.2) { + return 'C'; + } + + //All older smartphone platforms and featurephones - Any device that doesn't support media queries + //will receive the basic, C grade experience. + return 'C'; + }; + + impl.detectOS = function (ua) { + return impl.findMatch(impl.mobileDetectRules.oss0, ua) || impl.findMatch(impl.mobileDetectRules.oss, ua); + }; + + impl.getDeviceSmallerSide = function () { + return window.screen.width < window.screen.height ? window.screen.width : window.screen.height; + }; + + /** + * Constructor for MobileDetect object. + *
+ * Such an object will keep a reference to the given user-agent string and cache most of the detect queries.
+ *
+ * Find information how to download and install: + * github.com/hgoebl/mobile-detect.js/ + *
+ * + * @example
+             *     var md = new MobileDetect(window.navigator.userAgent);
+             *     if (md.mobile()) {
+             *         location.href = (md.mobileGrade() === 'A') ? '/mobile/' : '/lynx/';
+             *     }
+             * 
+ * + * @param {string} userAgent typically taken from window.navigator.userAgent or http_header['User-Agent'] + * @param {number} [maxPhoneWidth=600] only for browsers specify a value for the maximum + * width of smallest device side (in logical "CSS" pixels) until a device detected as mobile will be handled + * as phone. + * This is only used in cases where the device cannot be classified as phone or tablet.
+ * See Declaring Tablet Layouts + * for Android.
+ * If you provide a value < 0, then this "fuzzy" check is disabled. + * @constructor + * @global + */ + function MobileDetect(userAgent, maxPhoneWidth) { + this.ua = userAgent || ''; + this._cache = {}; + //600dp is typical 7" tablet minimum width + this.maxPhoneWidth = maxPhoneWidth || 600; } - } - } - return result; - }; - impl.getVersionStr = function(propertyName, userAgent) { - var props = impl.mobileDetectRules.props, - patterns, - i, - len, - match; - if (hasOwnProp.call(props, propertyName)) { - patterns = props[propertyName]; - len = patterns.length; - for (i = 0; i < len; ++i) { - match = patterns[i].exec(userAgent); - if (match !== null) { - return match[1]; + + MobileDetect.prototype = { + constructor: MobileDetect, + + /** + * Returns the detected phone or tablet type or null if it is not a mobile device. + *
+ * For a list of possible return values see {@link MobileDetect#phone} and {@link MobileDetect#tablet}.
+ *
+ * If the device is not detected by the regular expressions from Mobile-Detect, a test is made against + * the patterns of detectmobilebrowsers.com. If this test + * is positive, a value of UnknownPhone, UnknownTablet or + * UnknownMobile is returned.
+ * When used in browser, the decision whether phone or tablet is made based on screen.width/height.
+ *
+ * When used server-side (node.js), there is no way to tell the difference between UnknownTablet + * and UnknownMobile, so you will get UnknownMobile here.
+ * Be aware that since v1.0.0 in this special case you will get UnknownMobile only for: + * {@link MobileDetect#mobile}, not for {@link MobileDetect#phone} and {@link MobileDetect#tablet}. + * In versions before v1.0.0 all 3 methods returned UnknownMobile which was tedious to use. + *
+ * In most cases you will use the return value just as a boolean. + * + * @returns {String} the key for the phone family or tablet family, e.g. "Nexus". + * @function MobileDetect#mobile + */ + mobile: function () { + impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth); + return this._cache.mobile; + }, + + /** + * Returns the detected phone type/family string or null. + *
+ * The returned tablet (family or producer) is one of following keys:
+ *
iPhone, BlackBerry, HTC, Nexus, Dell, Motorola, Samsung, LG, Sony, Asus, + * Micromax, Palm, Vertu, Pantech, Fly, Wiko, iMobile, SimValley, Wolfgang, + * Alcatel, Nintendo, Amoi, INQ, GenericPhone
+ *
+ * If the device is not detected by the regular expressions from Mobile-Detect, a test is made against + * the patterns of detectmobilebrowsers.com. If this test + * is positive, a value of UnknownPhone or UnknownMobile is returned.
+ * When used in browser, the decision whether phone or tablet is made based on screen.width/height.
+ *
+ * When used server-side (node.js), there is no way to tell the difference between UnknownTablet + * and UnknownMobile, so you will get null here, while {@link MobileDetect#mobile} + * will return UnknownMobile.
+ * Be aware that since v1.0.0 in this special case you will get UnknownMobile only for: + * {@link MobileDetect#mobile}, not for {@link MobileDetect#phone} and {@link MobileDetect#tablet}. + * In versions before v1.0.0 all 3 methods returned UnknownMobile which was tedious to use. + *
+ * In most cases you will use the return value just as a boolean. + * + * @returns {String} the key of the phone family or producer, e.g. "iPhone" + * @function MobileDetect#phone + */ + phone: function () { + impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth); + return this._cache.phone; + }, + + /** + * Returns the detected tablet type/family string or null. + *
+ * The returned tablet (family or producer) is one of following keys:
+ *
iPad, NexusTablet, SamsungTablet, Kindle, SurfaceTablet, HPTablet, AsusTablet, + * BlackBerryTablet, HTCtablet, MotorolaTablet, NookTablet, AcerTablet, + * ToshibaTablet, LGTablet, FujitsuTablet, PrestigioTablet, LenovoTablet, + * DellTablet, YarvikTablet, MedionTablet, ArnovaTablet, IntensoTablet, IRUTablet, + * MegafonTablet, EbodaTablet, AllViewTablet, ArchosTablet, AinolTablet, + * SonyTablet, PhilipsTablet, CubeTablet, CobyTablet, MIDTablet, MSITablet, + * SMiTTablet, RockChipTablet, FlyTablet, bqTablet, HuaweiTablet, NecTablet, + * PantechTablet, BronchoTablet, VersusTablet, ZyncTablet, PositivoTablet, + * NabiTablet, KoboTablet, DanewTablet, TexetTablet, PlaystationTablet, + * TrekstorTablet, PyleAudioTablet, AdvanTablet, DanyTechTablet, GalapadTablet, + * MicromaxTablet, KarbonnTablet, AllFineTablet, PROSCANTablet, YONESTablet, + * ChangJiaTablet, GUTablet, PointOfViewTablet, OvermaxTablet, HCLTablet, + * DPSTablet, VistureTablet, CrestaTablet, MediatekTablet, ConcordeTablet, + * GoCleverTablet, ModecomTablet, VoninoTablet, ECSTablet, StorexTablet, + * VodafoneTablet, EssentielBTablet, RossMoorTablet, iMobileTablet, TolinoTablet, + * AudioSonicTablet, AMPETablet, SkkTablet, TecnoTablet, JXDTablet, iJoyTablet, + * FX2Tablet, XoroTablet, ViewsonicTablet, OdysTablet, CaptivaTablet, + * IconbitTablet, TeclastTablet, OndaTablet, JaytechTablet, BlaupunktTablet, + * DigmaTablet, EvolioTablet, LavaTablet, AocTablet, MpmanTablet, CelkonTablet, + * WolderTablet, MiTablet, NibiruTablet, NexoTablet, LeaderTablet, UbislateTablet, + * PocketBookTablet, Hudl, TelstraTablet, GenericTablet
+ *
+ * If the device is not detected by the regular expressions from Mobile-Detect, a test is made against + * the patterns of detectmobilebrowsers.com. If this test + * is positive, a value of UnknownTablet or UnknownMobile is returned.
+ * When used in browser, the decision whether phone or tablet is made based on screen.width/height.
+ *
+ * When used server-side (node.js), there is no way to tell the difference between UnknownTablet + * and UnknownMobile, so you will get null here, while {@link MobileDetect#mobile} + * will return UnknownMobile.
+ * Be aware that since v1.0.0 in this special case you will get UnknownMobile only for: + * {@link MobileDetect#mobile}, not for {@link MobileDetect#phone} and {@link MobileDetect#tablet}. + * In versions before v1.0.0 all 3 methods returned UnknownMobile which was tedious to use. + *
+ * In most cases you will use the return value just as a boolean. + * + * @returns {String} the key of the tablet family or producer, e.g. "SamsungTablet" + * @function MobileDetect#tablet + */ + tablet: function () { + impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth); + return this._cache.tablet; + }, + + /** + * Returns the (first) detected user-agent string or null. + *
+ * The returned user-agent is one of following keys:
+ *
Chrome, Dolfin, Opera, Skyfire, IE, Firefox, Bolt, TeaShark, Blazer, Safari, + * Tizen, UCBrowser, baiduboxapp, baidubrowser, DiigoBrowser, Puffin, Mercury, + * ObigoBrowser, NetFront, GenericBrowser
+ *
+ * In most cases calling {@link MobileDetect#userAgent} will be sufficient. But there are rare + * cases where a mobile device pretends to be more than one particular browser. You can get the + * list of all matches with {@link MobileDetect#userAgents} or check for a particular value by + * providing one of the defined keys as first argument to {@link MobileDetect#is}. + * + * @returns {String} the key for the detected user-agent or null + * @function MobileDetect#userAgent + */ + userAgent: function () { + if (this._cache.userAgent === undefined) { + this._cache.userAgent = impl.findMatch(impl.mobileDetectRules.uas, this.ua); + } + return this._cache.userAgent; + }, + + /** + * Returns all detected user-agent strings. + *
+ * The array is empty or contains one or more of following keys:
+ *
Chrome, Dolfin, Opera, Skyfire, IE, Firefox, Bolt, TeaShark, Blazer, Safari, + * Tizen, UCBrowser, baiduboxapp, baidubrowser, DiigoBrowser, Puffin, Mercury, + * ObigoBrowser, NetFront, GenericBrowser
+ *
+ * In most cases calling {@link MobileDetect#userAgent} will be sufficient. But there are rare + * cases where a mobile device pretends to be more than one particular browser. You can get the + * list of all matches with {@link MobileDetect#userAgents} or check for a particular value by + * providing one of the defined keys as first argument to {@link MobileDetect#is}. + * + * @returns {Array} the array of detected user-agent keys or [] + * @function MobileDetect#userAgents + */ + userAgents: function () { + if (this._cache.userAgents === undefined) { + this._cache.userAgents = impl.findMatches(impl.mobileDetectRules.uas, this.ua); + } + return this._cache.userAgents; + }, + + /** + * Returns the detected operating system string or null. + *
+ * The operating system is one of following keys:
+ *
AndroidOS, BlackBerryOS, PalmOS, SymbianOS, WindowsMobileOS, WindowsPhoneOS, + * iOS, MeeGoOS, MaemoOS, JavaOS, webOS, badaOS, BREWOS
+ * + * @returns {String} the key for the detected operating system. + * @function MobileDetect#os + */ + os: function () { + if (this._cache.os === undefined) { + this._cache.os = impl.detectOS(this.ua); + } + return this._cache.os; + }, + + /** + * Get the version (as Number) of the given property in the User-Agent. + *
+ * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31) + * + * @param {String} key a key defining a thing which has a version.
+ * You can use one of following keys:
+ *
Mobile, Build, Version, VendorID, iPad, iPhone, iPod, Kindle, Chrome, Coast, + * Dolfin, Firefox, Fennec, IE, NetFront, NokiaBrowser, Opera, Opera Mini, Opera + * Mobi, UC Browser, MQQBrowser, MicroMessenger, baiduboxapp, baidubrowser, Iron, + * Safari, Skyfire, Tizen, Webkit, Gecko, Trident, Presto, iOS, Android, + * BlackBerry, BREW, Java, Windows Phone OS, Windows Phone, Windows CE, Windows + * NT, Symbian, webOS
+ * + * @returns {Number} the version as float or NaN if User-Agent doesn't contain this version. + * Be careful when comparing this value with '==' operator! + * @function MobileDetect#version + */ + version: function (key) { + return impl.getVersion(key, this.ua); + }, + + /** + * Get the version (as String) of the given property in the User-Agent. + *
+ * + * @param {String} key a key defining a thing which has a version.
+ * You can use one of following keys:
+ *
Mobile, Build, Version, VendorID, iPad, iPhone, iPod, Kindle, Chrome, Coast, + * Dolfin, Firefox, Fennec, IE, NetFront, NokiaBrowser, Opera, Opera Mini, Opera + * Mobi, UC Browser, MQQBrowser, MicroMessenger, baiduboxapp, baidubrowser, Iron, + * Safari, Skyfire, Tizen, Webkit, Gecko, Trident, Presto, iOS, Android, + * BlackBerry, BREW, Java, Windows Phone OS, Windows Phone, Windows CE, Windows + * NT, Symbian, webOS
+ * + * @returns {String} the "raw" version as String or null if User-Agent doesn't contain this version. + * + * @function MobileDetect#versionStr + */ + versionStr: function (key) { + return impl.getVersionStr(key, this.ua); + }, + + /** + * Global test key against userAgent, os, phone, tablet and some other properties of userAgent string. + * + * @param {String} key the key (case-insensitive) of a userAgent, an operating system, phone or + * tablet family.
+ * For a complete list of possible values, see {@link MobileDetect#userAgent}, + * {@link MobileDetect#os}, {@link MobileDetect#phone}, {@link MobileDetect#tablet}.
+ * Additionally you have following keys:
+ *
Bot, MobileBot, DesktopMode, TV, WebKit, Console, Watch
+ * + * @returns {boolean} true when the given key is one of the defined keys of userAgent, os, phone, + * tablet or one of the listed additional keys, otherwise false + * @function MobileDetect#is + */ + is: function (key) { + return containsIC(this.userAgents(), key) || equalIC(key, this.os()) || equalIC(key, this.phone()) || equalIC(key, this.tablet()) || containsIC(impl.findMatches(impl.mobileDetectRules.utils, this.ua), key); + }, + + /** + * Do a quick test against navigator::userAgent. + * + * @param {String|RegExp} pattern the pattern, either as String or RegExp + * (a string will be converted to a case-insensitive RegExp). + * @returns {boolean} true when the pattern matches, otherwise false + * @function MobileDetect#match + */ + match: function (pattern) { + if (!(pattern instanceof RegExp)) { + pattern = new RegExp(pattern, 'i'); + } + return pattern.test(this.ua); + }, + + /** + * Checks whether the mobile device can be considered as phone regarding screen.width. + *
+ * Obviously this method makes sense in browser environments only (not for Node.js)! + * @param {number} [maxPhoneWidth] the maximum logical pixels (aka. CSS-pixels) to be considered as phone.
+ * The argument is optional and if not present or falsy, the value of the constructor is taken. + * @returns {boolean|undefined} undefined if screen size wasn't detectable, else true + * when screen.width is less or equal to maxPhoneWidth, otherwise false.
+ * Will always return undefined server-side. + */ + isPhoneSized: function (maxPhoneWidth) { + return MobileDetect.isPhoneSized(maxPhoneWidth || this.maxPhoneWidth); + }, + + /** + * Returns the mobile grade ('A', 'B', 'C'). + * + * @returns {String} one of the mobile grades ('A', 'B', 'C'). + * @function MobileDetect#mobileGrade + */ + mobileGrade: function () { + if (this._cache.grade === undefined) { + this._cache.grade = impl.mobileGrade(this); + } + return this._cache.grade; + } + }; + + // environment-dependent + if (typeof window !== 'undefined' && window.screen) { + MobileDetect.isPhoneSized = function (maxPhoneWidth) { + return maxPhoneWidth < 0 ? undefined : impl.getDeviceSmallerSide() <= maxPhoneWidth; + }; + } else { + MobileDetect.isPhoneSized = function () {}; } - } - } - return null; - }; - impl.getVersion = function(propertyName, userAgent) { - var version = impl.getVersionStr(propertyName, userAgent); - return version ? impl.prepareVersionNo(version) : NaN; - }; - impl.prepareVersionNo = function(version) { - var numbers; - numbers = version.split(/[a-z._ \/\-]/i); - if (numbers.length === 1) { - version = numbers[0]; - } - if (numbers.length > 1) { - version = numbers[0] + '.'; - numbers.shift(); - version += numbers.join(''); - } - return Number(version); - }; - impl.isMobileFallback = function(userAgent) { - return impl.detectMobileBrowsers.fullPattern.test(userAgent) || impl.detectMobileBrowsers.shortPattern.test(userAgent.substr(0, 4)); - }; - impl.isTabletFallback = function(userAgent) { - return impl.detectMobileBrowsers.tabletPattern.test(userAgent); - }; - impl.prepareDetectionCache = function(cache, userAgent, maxPhoneWidth) { - if (cache.mobile !== undefined) { - return; - } - var phone, - tablet, - phoneSized; - tablet = impl.findMatch(impl.mobileDetectRules.tablets, userAgent); - if (tablet) { - cache.mobile = cache.tablet = tablet; - cache.phone = null; - return; - } - phone = impl.findMatch(impl.mobileDetectRules.phones, userAgent); - if (phone) { - cache.mobile = cache.phone = phone; - cache.tablet = null; - return; - } - if (impl.isMobileFallback(userAgent)) { - phoneSized = MobileDetect.isPhoneSized(maxPhoneWidth); - if (phoneSized === undefined) { - cache.mobile = impl.FALLBACK_MOBILE; - cache.tablet = cache.phone = null; - } else if (phoneSized) { - cache.mobile = cache.phone = impl.FALLBACK_PHONE; - cache.tablet = null; - } else { - cache.mobile = cache.tablet = impl.FALLBACK_TABLET; - cache.phone = null; - } - } else if (impl.isTabletFallback(userAgent)) { - cache.mobile = cache.tablet = impl.FALLBACK_TABLET; - cache.phone = null; + + // should not be replaced by a completely new object - just overwrite existing methods + MobileDetect._impl = impl; + + return MobileDetect; + }); // end of call of define() + })(function (undefined) { + if (typeof module !== 'undefined' && module.exports) { + return function (factory) { + module.exports = factory(); + }; + } else if (typeof define === 'function' && define.amd) { + return define; + } else if (typeof window !== 'undefined') { + return function (factory) { + window.MobileDetect = factory(); + }; } else { - cache.mobile = cache.tablet = cache.phone = null; - } - }; - impl.mobileGrade = function(t) { - var $isMobile = t.mobile() !== null; - if (t.os('iOS') && t.version('iPad') >= 4.3 || t.os('iOS') && t.version('iPhone') >= 3.1 || t.os('iOS') && t.version('iPod') >= 3.1 || (t.version('Android') > 2.1 && t.is('Webkit')) || t.version('Windows Phone OS') >= 7.0 || t.is('BlackBerry') && t.version('BlackBerry') >= 6.0 || t.match('Playbook.*Tablet') || (t.version('webOS') >= 1.4 && t.match('Palm|Pre|Pixi')) || t.match('hp.*TouchPad') || (t.is('Firefox') && t.version('Firefox') >= 12) || (t.is('Chrome') && t.is('AndroidOS') && t.version('Android') >= 4.0) || (t.is('Skyfire') && t.version('Skyfire') >= 4.1 && t.is('AndroidOS') && t.version('Android') >= 2.3) || (t.is('Opera') && t.version('Opera Mobi') > 11 && t.is('AndroidOS')) || t.is('MeeGoOS') || t.is('Tizen') || t.is('Dolfin') && t.version('Bada') >= 2.0 || ((t.is('UC Browser') || t.is('Dolfin')) && t.version('Android') >= 2.3) || (t.match('Kindle Fire') || t.is('Kindle') && t.version('Kindle') >= 3.0) || t.is('AndroidOS') && t.is('NookTablet') || t.version('Chrome') >= 11 && !$isMobile || t.version('Safari') >= 5.0 && !$isMobile || t.version('Firefox') >= 4.0 && !$isMobile || t.version('MSIE') >= 7.0 && !$isMobile || t.version('Opera') >= 10 && !$isMobile) { - return 'A'; - } - if (t.os('iOS') && t.version('iPad') < 4.3 || t.os('iOS') && t.version('iPhone') < 3.1 || t.os('iOS') && t.version('iPod') < 3.1 || t.is('Blackberry') && t.version('BlackBerry') >= 5 && t.version('BlackBerry') < 6 || (t.version('Opera Mini') >= 5.0 && t.version('Opera Mini') <= 6.5 && (t.version('Android') >= 2.3 || t.is('iOS'))) || t.match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') || t.version('Opera Mobi') >= 11 && t.is('SymbianOS')) { - return 'B'; - } - if (t.version('BlackBerry') < 5.0 || t.match('MSIEMobile|Windows CE.*Mobile') || t.version('Windows Mobile') <= 5.2) { - return 'C'; - } - return 'C'; - }; - impl.detectOS = function(ua) { - return impl.findMatch(impl.mobileDetectRules.oss0, ua) || impl.findMatch(impl.mobileDetectRules.oss, ua); - }; - impl.getDeviceSmallerSide = function() { - return window.screen.width < window.screen.height ? window.screen.width : window.screen.height; - }; - function MobileDetect(userAgent, maxPhoneWidth) { - this.ua = userAgent || ''; - this._cache = {}; - this.maxPhoneWidth = maxPhoneWidth || 600; - } - MobileDetect.prototype = { - constructor: MobileDetect, - mobile: function() { - impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth); - return this._cache.mobile; - }, - phone: function() { - impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth); - return this._cache.phone; - }, - tablet: function() { - impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth); - return this._cache.tablet; - }, - userAgent: function() { - if (this._cache.userAgent === undefined) { - this._cache.userAgent = impl.findMatch(impl.mobileDetectRules.uas, this.ua); - } - return this._cache.userAgent; - }, - userAgents: function() { - if (this._cache.userAgents === undefined) { - this._cache.userAgents = impl.findMatches(impl.mobileDetectRules.uas, this.ua); - } - return this._cache.userAgents; - }, - os: function() { - if (this._cache.os === undefined) { - this._cache.os = impl.detectOS(this.ua); - } - return this._cache.os; - }, - version: function(key) { - return impl.getVersion(key, this.ua); - }, - versionStr: function(key) { - return impl.getVersionStr(key, this.ua); - }, - is: function(key) { - return containsIC(this.userAgents(), key) || equalIC(key, this.os()) || equalIC(key, this.phone()) || equalIC(key, this.tablet()) || containsIC(impl.findMatches(impl.mobileDetectRules.utils, this.ua), key); - }, - match: function(pattern) { - if (!(pattern instanceof RegExp)) { - pattern = new RegExp(pattern, 'i'); - } - return pattern.test(this.ua); - }, - isPhoneSized: function(maxPhoneWidth) { - return MobileDetect.isPhoneSized(maxPhoneWidth || this.maxPhoneWidth); - }, - mobileGrade: function() { - if (this._cache.grade === undefined) { - this._cache.grade = impl.mobileGrade(this); - } - return this._cache.grade; + // please file a bug if you get this error! + throw new Error('unknown environment'); } - }; - if (typeof window !== 'undefined' && window.screen) { - MobileDetect.isPhoneSized = function(maxPhoneWidth) { - return maxPhoneWidth < 0 ? undefined : impl.getDeviceSmallerSide() <= maxPhoneWidth; - }; - } else { - MobileDetect.isPhoneSized = function() {}; - } - MobileDetect._impl = impl; - return MobileDetect; - }); - })((function(undefined) { - if (typeof module !== 'undefined' && module.exports) { - return function(factory) { - module.exports = factory(); - }; - } else if (typeof define === 'function' && define.amd) { - return define; - } else if (typeof window !== 'undefined') { - return function(factory) { - window.MobileDetect = factory(); - }; - } else { - throw new Error('unknown environment'); - } - })()); - return module.exports; + }()); + return module.exports; }); - $__System.register('9', ['c', 'a', 'b', '8'], function (exports_1, context_1) { "use strict"; diff --git a/dist/argon.min.js b/dist/argon.min.js index b8d5d8d..5504505 100644 --- a/dist/argon.min.js +++ b/dist/argon.min.js @@ -1,6 +1,6 @@ !function(e){function t(e,t,i){return 4===arguments.length?r.apply(this,arguments):void n(e,{declarative:!0,deps:t,declare:i})}function r(e,t,r,i){n(e,{declarative:!1,deps:t,executingRequire:r,execute:i})}function n(e,t){t.name=e,e in v||(v[e]=t),t.normalizedDeps=t.deps}function i(e,t){if(t[e.groupIndex]=t[e.groupIndex]||[],-1==p.call(t[e.groupIndex],e)){t[e.groupIndex].push(e);for(var r=0,n=e.normalizedDeps.length;n>r;r++){var a=e.normalizedDeps[r],o=v[a];if(o&&!o.evaluated){var s=e.groupIndex+(o.declarative!=e.declarative);if(void 0===o.groupIndex||o.groupIndex=0;a--){for(var o=r[a],u=0;ua;a++){var s=r.importers[a];if(!s.locked)for(var u=0;ua;a++){var f,c=t.normalizedDeps[a],l=v[c],d=y[c];d?f=d.exports:l&&!l.declarative?f=l.esModule:l?(s(l),d=l.module,f=d.exports):f=h(c),d&&d.importers?(d.importers.push(r),r.dependencies.push(d)):r.dependencies.push(null),r.setters[a]&&r.setters[a](f)}}}function u(e){var t,r=v[e];if(r)r.declarative?d(e,[]):r.evaluated||f(r),t=r.module.exports;else if(t=h(e),!t)throw new Error("Unable to load dependency "+e+".");return(!r||r.declarative)&&t&&t.__useDefault?t["default"]:t}function f(t){if(!t.module){var r={},n=t.module={exports:r,id:t.name};if(!t.executingRequire)for(var i=0,a=t.normalizedDeps.length;a>i;i++){var o=t.normalizedDeps[i],s=v[o];s&&f(s)}t.evaluated=!0;var l=t.execute.call(e,function(e){for(var r=0,n=t.deps.length;n>r;r++)if(t.deps[r]==e)return u(t.normalizedDeps[r]);throw new TypeError("Module "+e+" not declared as a dependency.")},r,n);l&&(n.exports=l),r=n.exports,r&&r.__esModule?t.esModule=r:t.esModule=c(r)}}function c(t){var r={};if(("object"==typeof t||"function"==typeof t)&&t!==e)if(m)for(var n in t)"default"!==n&&l(r,t,n);else{var i=t&&t.hasOwnProperty;for(var n in t)"default"===n||i&&!t.hasOwnProperty(n)||(r[n]=t[n])}return r["default"]=t,w(r,"__useDefault",{value:!0}),r}function l(e,t,r){try{var n;(n=Object.getOwnPropertyDescriptor(t,r))&&w(e,r,n)}catch(n){return e[r]=t[r],!1}}function d(t,r){var n=v[t];if(n&&!n.evaluated&&n.declarative){r.push(t);for(var i=0,a=n.normalizedDeps.length;a>i;i++){var o=n.normalizedDeps[i];-1==p.call(r,o)&&(v[o]?d(o,r):h(o))}n.evaluated||(n.evaluated=!0,n.module.execute.call(e))}}function h(e){if(S[e])return S[e];if("@node/"==e.substr(0,6))return S[e]=c(g(e.substr(6)));var t=v[e];if(!t)throw"Module "+e+" not present.";return a(e),d(e,[]),v[e]=void 0,t.declarative&&w(t.module.exports,"__esModule",{value:!0}),S[e]=t.declarative?t.module.exports:t.esModule}var v={},p=Array.prototype.indexOf||function(e){for(var t=0,r=this.length;r>t;t++)if(this[t]===e)return t;return-1},m=!0;try{Object.getOwnPropertyDescriptor({a:0},"a")}catch(e){m=!1}var w;!function(){try{Object.defineProperty({},"a",{})&&(w=Object.defineProperty)}catch(e){w=function(e,t,r){try{e[t]=r.value||r.get.call(e)}catch(e){}}}}();var y={},g="undefined"!=typeof System&&System._nodeRequire||"undefined"!=typeof require&&require.resolve&&"undefined"!=typeof process&&require,S={"@empty":{}};return function(e,n,i,a){return function(o){o(function(o){for(var s={_nodeRequire:g,register:t,registerDynamic:r,get:h,set:function(e,t){S[e]=t},newModule:function(e){return e}},u=0;u1)for(var u=1;ut;t++)if(this[t]===e)return t;return-1},s=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/gm,u="(?:^|[^$_a-zA-Z\\xA0-\\uFFFF.])",f="\\s*\\(\\s*(\"([^\"]+)\"|'([^']+)')\\s*\\)",c=/\(([^\)]*)\)/,l=/^\s+|\s+$/g,d={};i.amd={};var h={isBundle:!1,anonDefine:null};a.amdDefine=i,a.amdRequire=n}("undefined"!=typeof self?self:global);(function(){var t=e.amdDefine;t("2",["exports","3"],function(e,t){"use strict";Number.isNaN=Number.isNaN||function(e){return e!==e};Number.isFinite=Number.isFinite||function(e){return typeof e==="number"&&isFinite(e)};if(!String.prototype.endsWith){String.prototype.endsWith=function(e,t){var r=this.toString();if(typeof t!=="number"||!isFinite(t)||Math.floor(t)!==t||t>r.length){t=r.length}t-=e.length;var n=r.indexOf(e,t);return n!==-1&&n===t}}if(!String.prototype.startsWith){String.prototype.startsWith=function(e,t){t=t||0;return this.substr(t,e.length)===e}}if(!Array.from){Array.from=function(){var e=Object.prototype.toString;var t=function t(r){return typeof r==="function"||e.call(r)==="[object Function]"};var r=function e(t){var r=Number(t);if(isNaN(r)){return 0}if(r===0||!isFinite(r)){return r}return(r>0?1:-1)*Math.floor(Math.abs(r))};var n=Math.pow(2,53)-1;var i=function e(t){var i=r(t);return Math.min(Math.max(i,0),n)};return function e(r){var n=this;var a=Object(r);if(r==null){throw new TypeError("Array.from requires an array-like object - not null or undefined")}var o=arguments.length>1?arguments[1]:void undefined;var s;if(typeof o!=="undefined"){if(!t(o)){throw new TypeError("Array.from: when provided, the second argument must be a function")}if(arguments.length>2){s=arguments[2]}}var u=i(a.length);var f=t(n)?Object(new n(u)):new Array(u);var c=0;var l;while(c>>0;var n=arguments[1];var i;for(var a=0;a>>0;var n=arguments[1];var i;for(var a=0;a=0){i=n}else{i=r+n;if(i<0){i=0}}var a;while(i= 0x80 (not a basic code point)","invalid-input":"Invalid input"},b=f-c,T=Math.floor,_=String.fromCharCode,E;function M(e){throw new RangeError(S[e])}function P(e,t){var r=e.length;var n=[];while(r--){n[r]=t(e[r])}return n}function A(e,t){var r=e.split("@");var n="";if(r.length>1){n=r[0]+"@";e=r[1]}e=e.replace(g,".");var i=e.split(".");var a=P(i,t).join(".");return n+a}function C(e){var t=[],r=0,n=e.length,i,a;while(r=55296&&i<=56319&&r65535){e-=65536;t+=_(e>>>10&1023|55296);e=56320|e&1023}t+=_(e);return t}).join("")}function x(e){if(e-48<10){return e-22}if(e-65<26){return e-65}if(e-97<26){return e-97}return f}function R(e,t){return e+22+75*(e<26)-((t!=0)<<5)}function O(e,t,r){var n=0;e=r?T(e/h):e>>1;e+=T(e/t);for(;e>b*l>>1;n+=f){e=T(e/b)}return T(n+(b+1)*e/(e+d))}function D(e){var t=[],r=e.length,n,i=0,a=p,o=v,s,d,h,w,y,g,S,b,_;s=e.lastIndexOf(m);if(s<0){s=0}for(d=0;d=128){M("not-basic")}t.push(e.charCodeAt(d))}for(h=s>0?s+1:0;h=r){M("invalid-input")}S=x(e.charCodeAt(h++));if(S>=f||S>T((u-i)/y)){M("overflow")}i+=S*y;b=g<=o?c:g>=o+l?l:g-o;if(ST(u/_)){M("overflow")}y*=_}n=t.length+1;o=O(i-w,n,w==0);if(T(i/n)>u-a){M("overflow")}a+=T(i/n);i%=n;t.splice(i++,0,a)}return I(t)}function q(e){var t,r,n,i,a,o,s,d,h,w,y,g=[],S,b,E,P;e=C(e);S=e.length;t=p;r=0;a=v;for(o=0;o=t&&yT((u-r)/b)){M("overflow")}r+=(s-t)*b;t=s;for(o=0;ou){M("overflow")}if(y==t){for(d=r,h=f;;h+=f){w=h<=a?c:h>=a+l?l:h-a;if(d1){o.splice(0,1)}else{break}}r[s]=o.join("")}var f=-1;var c=0;var l=0;var d=-1;var h=false;for(s=0;sc){f=d;c=l}}}else{if(r[s]==="0"){h=true;d=s;l=1}}}if(l>c){f=d;c=l}if(c>1){r.splice(f,c,"")}n=r.length;var v="";if(r[0]===""){v=":"}for(s=0;s=e.length-1){return false}var n=e.lastIndexOf(".",t-1);if(n<=0||n>=t-1){return false}var i=r.list[e.slice(t+1)];if(!i){return false}return i.indexOf(" "+e.slice(n+1,t)+" ")>=0},is:function(e){var t=e.lastIndexOf(".");if(t<=0||t>=e.length-1){return false}var n=e.lastIndexOf(".",t-1);if(n>=0){return false}var i=r.list[e.slice(t+1)];if(!i){return false}return i.indexOf(" "+e.slice(0,t)+" ")>=0},get:function(e){var t=e.lastIndexOf(".");if(t<=0||t>=e.length-1){return null}var n=e.lastIndexOf(".",t-1);if(n<=0||n>=t-1){return null}var i=r.list[e.slice(t+1)];if(!i){return null}if(i.indexOf(" "+e.slice(n+1,t)+" ")<0){return null}return e.slice(n+1)},noConflict:function(){if(e.SecondLevelDomains===this){e.SecondLevelDomains=t}return this}};return r})})();(function(){var i=e.amdDefine;(function(e,a){"use strict";if(typeof r==="object"){n.exports=a(t("./punycode"),t("./IPv6"),t("./SecondLevelDomains"))}else if(typeof i==="function"&&i.amd){i("7",["4","5","6"],a)}else{e.URI=a(e.punycode,e.IPv6,e.SecondLevelDomains,e)}})(this,function(e,t,r,n){"use strict";var i=n&&n.URI;function a(e,t){var r=arguments.length>=1;var n=arguments.length>=2;if(!(this instanceof a)){if(r){if(n){return new a(e,t)}return new a(e)}return new a}if(e===undefined){if(r){throw new TypeError("undefined is not a valid argument for URI")}if(typeof location!=="undefined"){e=location.href+""}else{e=""}}this.href(e);if(t!==undefined){return this.absoluteTo(t)}return this}a.version="1.18.1";var o=a.prototype;var s=Object.prototype.hasOwnProperty;function u(e){return e.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function f(e){if(e===undefined){return"Undefined"}return String(Object.prototype.toString.call(e)).slice(8,-1)}function c(e){return f(e)==="Array"}function l(e,t){var r={};var n,i;if(f(t)==="RegExp"){r=null}else if(c(t)){for(n=0,i=t.length;n]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi;a.findUri={start:/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,end:/[\s\r\n]|$/,trim:/[`!()\[\]{};:'".,<>?«»“”„‘’]+$/};a.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"};a.invalid_hostname_characters=/[^a-zA-Z0-9\.-]/;a.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src",audio:"src",video:"src"};a.getDomAttribute=function(e){if(!e||!e.nodeName){return undefined}var t=e.nodeName.toLowerCase();if(t==="input"&&e.type!=="image"){return undefined}return a.domAttributes[t]};function p(e){return escape(e)}function m(e){return encodeURIComponent(e).replace(/[!'()*]/g,p).replace(/\*/g,"%2A")}a.encode=m;a.decode=decodeURIComponent;a.iso8859=function(){a.encode=escape;a.decode=unescape};a.unicode=function(){a.encode=m;a.decode=decodeURIComponent};a.characters={pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/gi,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/gi,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}},urnpath:{encode:{expression:/%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/gi,map:{"%21":"!","%24":"$","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"=","%40":"@"}},decode:{expression:/[\/\?#:]/g,map:{"/":"%2F","?":"%3F","#":"%23",":":"%3A"}}}};a.encodeQuery=function(e,t){var r=a.encode(e+"");if(t===undefined){t=a.escapeQuerySpace}return t?r.replace(/%20/g,"+"):r};a.decodeQuery=function(e,t){e+="";if(t===undefined){t=a.escapeQuerySpace}try{return a.decode(t?e.replace(/\+/g,"%20"):e)}catch(t){return e}};var w={encode:"encode",decode:"decode"};var y;var g=function(e,t){return function(r){try{return a[t](r+"").replace(a.characters[e][t].expression,function(r){return a.characters[e][t].map[r]})}catch(e){return r}}};for(y in w){a[y+"PathSegment"]=g("pathname",w[y]);a[y+"UrnPathSegment"]=g("urnpath",w[y])}var S=function(e,t,r){return function(n){var i;if(!r){i=a[t]}else{i=function(e){return a[t](a[r](e))}}var o=(n+"").split(e);for(var s=0,u=o.length;s-1){t.fragment=e.substring(r+1)||null;e=e.substring(0,r)}r=e.indexOf("?");if(r>-1){t.query=e.substring(r+1)||null;e=e.substring(0,r)}if(e.substring(0,2)==="//"){t.protocol=null;e=e.substring(2);e=a.parseAuthority(e,t)}else{r=e.indexOf(":");if(r>-1){t.protocol=e.substring(0,r)||null;if(t.protocol&&!t.protocol.match(a.protocol_expression)){t.protocol=undefined}else if(e.substring(r+1,r+3)==="//"){e=e.substring(r+3);e=a.parseAuthority(e,t)}else{e=e.substring(r+1);t.urn=true}}}t.path=e;return t};a.parseHost=function(e,t){e=e.replace(/\\/g,"/");var r=e.indexOf("/");var n;var i;if(r===-1){r=e.length}if(e.charAt(0)==="["){n=e.indexOf("]");t.hostname=e.substring(1,n)||null;t.port=e.substring(n+2,r)||null;if(t.port==="/"){t.port=null}}else{var a=e.indexOf(":");var o=e.indexOf("/");var s=e.indexOf(":",a+1);if(s!==-1&&(o===-1||s-1?r:e.length-1);var i;if(n>-1&&(r===-1||n=0){s=s.substring(0,c)+"([\\w._\\+]+)"+s.substring(c+5)}a[u]=new RegExp(s,"i")}l.props[i]=a}}o(l.oss);o(l.phones);o(l.tablets);o(l.uas);o(l.utils);l.oss0={WindowsPhoneOS:l.oss.WindowsPhoneOS,WindowsMobileOS:l.oss.WindowsMobileOS}})();e.findMatch=function(e,t){for(var n in e){if(r.call(e,n)){if(e[n].test(t)){return n}}}return null};e.findMatches=function(e,t){var n=[];for(var i in e){if(r.call(e,i)){if(e[i].test(t)){n.push(i)}}}return n};e.getVersionStr=function(t,n){var i=e.mobileDetectRules.props,a,o,s,u;if(r.call(i,t)){a=i[t];s=a.length;for(o=0;o1){e=t[0]+".";t.shift();e+=t.join("")}return Number(e)};e.isMobileFallback=function(t){return e.detectMobileBrowsers.fullPattern.test(t)||e.detectMobileBrowsers.shortPattern.test(t.substr(0,4))};e.isTabletFallback=function(t){return e.detectMobileBrowsers.tabletPattern.test(t)};e.prepareDetectionCache=function(r,n,i){if(r.mobile!==t){return}var a,o,u;o=e.findMatch(e.mobileDetectRules.tablets,n);if(o){r.mobile=r.tablet=o;r.phone=null;return}a=e.findMatch(e.mobileDetectRules.phones,n);if(a){r.mobile=r.phone=a;r.tablet=null;return}if(e.isMobileFallback(n)){u=s.isPhoneSized(i);if(u===t){r.mobile=e.FALLBACK_MOBILE;r.tablet=r.phone=null}else if(u){r.mobile=r.phone=e.FALLBACK_PHONE;r.tablet=null}else{r.mobile=r.tablet=e.FALLBACK_TABLET;r.phone=null}}else if(e.isTabletFallback(n)){r.mobile=r.tablet=e.FALLBACK_TABLET;r.phone=null}else{r.mobile=r.tablet=r.phone=null}};e.mobileGrade=function(e){var t=e.mobile()!==null;if(e.os("iOS")&&e.version("iPad")>=4.3||e.os("iOS")&&e.version("iPhone")>=3.1||e.os("iOS")&&e.version("iPod")>=3.1||e.version("Android")>2.1&&e.is("Webkit")||e.version("Windows Phone OS")>=7||e.is("BlackBerry")&&e.version("BlackBerry")>=6||e.match("Playbook.*Tablet")||e.version("webOS")>=1.4&&e.match("Palm|Pre|Pixi")||e.match("hp.*TouchPad")||e.is("Firefox")&&e.version("Firefox")>=12||e.is("Chrome")&&e.is("AndroidOS")&&e.version("Android")>=4||e.is("Skyfire")&&e.version("Skyfire")>=4.1&&e.is("AndroidOS")&&e.version("Android")>=2.3||e.is("Opera")&&e.version("Opera Mobi")>11&&e.is("AndroidOS")||e.is("MeeGoOS")||e.is("Tizen")||e.is("Dolfin")&&e.version("Bada")>=2||(e.is("UC Browser")||e.is("Dolfin"))&&e.version("Android")>=2.3||(e.match("Kindle Fire")||e.is("Kindle")&&e.version("Kindle")>=3)||e.is("AndroidOS")&&e.is("NookTablet")||e.version("Chrome")>=11&&!t||e.version("Safari")>=5&&!t||e.version("Firefox")>=4&&!t||e.version("MSIE")>=7&&!t||e.version("Opera")>=10&&!t){return"A"}if(e.os("iOS")&&e.version("iPad")<4.3||e.os("iOS")&&e.version("iPhone")<3.1||e.os("iOS")&&e.version("iPod")<3.1||e.is("Blackberry")&&e.version("BlackBerry")>=5&&e.version("BlackBerry")<6||e.version("Opera Mini")>=5&&e.version("Opera Mini")<=6.5&&(e.version("Android")>=2.3||e.is("iOS"))||e.match("NokiaN8|NokiaC7|N97.*Series60|Symbian/3")||e.version("Opera Mobi")>=11&&e.is("SymbianOS")){return"B"}if(e.version("BlackBerry")<5||e.match("MSIEMobile|Windows CE.*Mobile")||e.version("Windows Mobile")<=5.2){return"C"}return"C"};e.detectOS=function(t){return e.findMatch(e.mobileDetectRules.oss0,t)||e.findMatch(e.mobileDetectRules.oss,t)};e.getDeviceSmallerSide=function(){return window.screen.width=0;s--)if(o=e[s])a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a;return i>3&&a&&Object.defineProperty(t,r,a),a};var i,a,o,s;var u;return{setters:[function(e){i=e},function(e){a=e},function(e){o=e},function(e){s=e}],execute:function(){u=function(){function e(e){this.locationUpdatesEnabled=true;this.orientationUpdatesEnabled=true;this.geolocationEntity=new a.Entity({id:"ar.device.geolocation",name:"Device Geolocation"});this.orientationEntity=new a.Entity({id:"ar.device.orientation",name:"Device Orientation"});this.entity=new a.Entity({id:"ar.device",name:"Device"});this.displayEntity=new a.Entity({id:"ar.device.display",name:"Device Display",position:new a.ConstantPositionProperty(a.Cartesian3.ZERO,this.entity),orientation:new a.ConstantProperty(a.Quaternion.IDENTITY)});this._scratchCartesian=new a.Cartesian3;this._scratchQuaternion1=new a.Quaternion;this._scratchQuaternion2=new a.Quaternion;this._x90Rot=a.Quaternion.fromAxisAngle(a.Cartesian3.UNIT_X,a.CesiumMath.PI_OVER_TWO);this._headingDrift=0;e.wellKnownReferenceFrames.add(this.geolocationEntity);e.wellKnownReferenceFrames.add(this.orientationEntity);e.wellKnownReferenceFrames.add(this.entity);e.wellKnownReferenceFrames.add(this.displayEntity);if(typeof navigator!=="undefined"){this._mobileDetect=new s.default(navigator.userAgent)}}e.prototype.onIdle=function(){if(typeof navigator==="undefined")return;if(a.defined(this._geolocationWatchId)){navigator.geolocation.clearWatch(this._geolocationWatchId);this._geolocationWatchId=undefined}if(a.defined(this._deviceorientationListener)){window.removeEventListener("deviceorientation",this._deviceorientationListener);this._deviceorientationListener=undefined;this._alphaOffset=undefined}};e.prototype.onUpdate=function(){var e=this;if(typeof navigator!=="undefined"){var t=this.displayEntity.orientation;var r=a.Quaternion.fromAxisAngle(a.Cartesian3.UNIT_Z,(-window.orientation||0)*a.CesiumMath.RADIANS_PER_DEGREE,this._scratchQuaternion1);if(this._mobileDetect&&!this._mobileDetect.mobile()){r=a.Quaternion.multiply(this._x90Rot,r,r)}t.setValue(r);if(!a.defined(this._geolocationWatchId)&&this.locationUpdatesEnabled){this._geolocationWatchId=navigator.geolocation.watchPosition(function(t){if(e.geolocationEntity.position instanceof a.SampledPositionProperty===false){var r=new a.SampledPositionProperty(a.ReferenceFrame.FIXED);r.forwardExtrapolationType=a.ExtrapolationType.HOLD;r.backwardExtrapolationType=a.ExtrapolationType.HOLD;r.maxNumSamples=10;e.geolocationEntity.position=r}var n=a.JulianDate.fromDate(new Date(t.timestamp));var i=a.Cartesian3.fromDegrees(t.coords.longitude,t.coords.latitude,t.coords.altitude||0,undefined,e._scratchCartesian);e.geolocationEntity.position.addSample(n,i);if(e.geolocationEntity.orientation instanceof a.ConstantProperty===false){e.geolocationEntity.orientation=new a.ConstantProperty}var o=a.Transforms.headingPitchRollQuaternion(i,0,0,0,undefined,e._scratchQuaternion1);e.geolocationEntity.orientation.setValue(o)},function(e){console.error(e)},{enableHighAccuracy:true})}else if(a.defined(this._geolocationWatchId)&&!this.locationUpdatesEnabled){navigator.geolocation.clearWatch(this._geolocationWatchId);this._geolocationWatchId=undefined}if(!a.defined(this._deviceorientationListener)&&this.orientationUpdatesEnabled){this._deviceorientationListener=function(t){var r=t.alpha;if(!a.defined(r)){return}if(t.absolute){e._alphaOffset=0}var n=t["webkitCompassHeading"];var i=+t["webkitCompassAccuracy"];if((!a.defined(e._alphaOffset)||Math.abs(e._headingDrift)>5)&&a.defined(n)&&i>=0&&i<50&&n>=0){if(!a.defined(e._alphaOffset)){e._alphaOffset=-n}else{e._alphaOffset-=e._headingDrift}}var o=e._alphaOffset||-n||0;var s=a.CesiumMath.RADIANS_PER_DEGREE*(t.alpha+o);var u=a.CesiumMath.RADIANS_PER_DEGREE*t.beta;var f=a.CesiumMath.RADIANS_PER_DEGREE*t.gamma;var c=a.Quaternion.fromAxisAngle(a.Cartesian3.UNIT_Z,s,e._scratchQuaternion1);var l=a.Quaternion.fromAxisAngle(a.Cartesian3.UNIT_X,u,e._scratchQuaternion2);var d=a.Quaternion.multiply(c,l,e._scratchQuaternion1);var h=a.Quaternion.fromAxisAngle(a.Cartesian3.UNIT_Y,f,e._scratchQuaternion2);var v=a.Quaternion.multiply(d,h,d);if(e.orientationEntity.position instanceof a.ConstantPositionProperty==false){e.orientationEntity.position=new a.ConstantPositionProperty(a.Cartesian3.ZERO,e.geolocationEntity)}if(e.orientationEntity.orientation instanceof a.ConstantProperty==false){e.orientationEntity.orientation=new a.ConstantProperty}e.orientationEntity.orientation.setValue(v);if(e.entity.position instanceof a.ConstantPositionProperty==false){e.entity.position=new a.ConstantPositionProperty(a.Cartesian3.ZERO,e.orientationEntity)}if(e.entity.orientation instanceof a.ConstantProperty==false){e.entity.orientation=new a.ConstantProperty(a.Quaternion.IDENTITY)}};window.addEventListener("deviceorientation",this._deviceorientationListener)}else if(a.defined(this._deviceorientationListener)&&!this.orientationUpdatesEnabled){window.removeEventListener("deviceorientation",this._deviceorientationListener);this._deviceorientationListener=undefined}}};e.prototype.update=function(){var e=this;if(a.defined(this._idleTimeoutId))clearTimeout(this._idleTimeoutId);this._idleTimeoutId=setTimeout(function(){e.onIdle()},2e3);this.onUpdate()};e=n([i.inject(o.ContextService)],e); +Kindle:"Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI)\\b",SurfaceTablet:"Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)",HPTablet:"HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10",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",BlackBerryTablet:"PlayBook|RIM Tablet",HTCtablet:"HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410",MotorolaTablet:"xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617",NookTablet:"Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2",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",ToshibaTablet:"Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO",LGTablet:"\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b",FujitsuTablet:"Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b",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",LenovoTablet:"Lenovo TAB|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|)",DellTablet:"Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7",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",MedionTablet:"Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB",ArnovaTablet:"AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2",IntensoTablet:"INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004",IRUTablet:"M702pro",MegafonTablet:"MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b",EbodaTablet:"E-Boda (Supreme|Impresspeed|Izzycomm|Essential)",AllViewTablet:"Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)",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",AinolTablet:"NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark",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|SOT31",PhilipsTablet:"\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b",CubeTablet:"Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT",CobyTablet:"MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010",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",MSITablet:"MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b",SMiTTablet:"Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)",RockChipTablet:"Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A",FlyTablet:"IQ310|Fly Vision",bqTablet:"Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris E10)|Maxwell.*Lite|Maxwell.*Plus",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",NecTablet:"\\bN-06D|\\bN-08D",PantechTablet:"Pantech.*P4100",BronchoTablet:"Broncho.*(N701|N708|N802|a710)",VersusTablet:"TOUCHPAD.*[78910]|\\bTOUCHTAB\\b",ZyncTablet:"z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900",PositivoTablet:"TB07STA|TB10STA|TB07FTA|TB10FTA",NabiTablet:"Android.*\\bNabi",KoboTablet:"Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build",DanewTablet:"DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b",TexetTablet:"NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE",PlaystationTablet:"Playstation.*(Portable|Vita)",TrekstorTablet:"ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab",PyleAudioTablet:"\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b",AdvanTablet:"Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b ",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",GalapadTablet:"Android.*\\bG1\\b",MicromaxTablet:"Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b",KarbonnTablet:"Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b",AllFineTablet:"Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide",PROSCANTablet:"\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b",YONESTablet:"BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026",ChangJiaTablet:"TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503",GUTablet:"TX-A1301|TX-M9002|Q702|kf026",PointOfViewTablet:"TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10",OvermaxTablet:"OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)",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",DPSTablet:"DPS Dream 9|DPS Dual 7",VistureTablet:"V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10",CrestaTablet:"CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989",MediatekTablet:"\\bMT8125|MT8389|MT8135|MT8377\\b",ConcordeTablet:"Concorde([ ]+)?Tab|ConCorde ReadMan",GoCleverTablet:"GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042",ModecomTablet:"FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003",VoninoTablet:"\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b",ECSTablet:"V07OT2|TM105A|S10OT1|TR10CS1",StorexTablet:"eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab",VodafoneTablet:"SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7",EssentielBTablet:"Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2",RossMoorTablet:"RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711",iMobileTablet:"i-mobile i-note",TolinoTablet:"tolino tab [0-9.]+|tolino shine",AudioSonicTablet:"\\bC-22Q|T7-QC|T-17B|T-17P\\b",AMPETablet:"Android.* A78 ",SkkTablet:"Android.* (SKYPAD|PHOENIX|CYCLOPS)",TecnoTablet:"TECNO P9",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",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)",FX2Tablet:"FX2 PAD7|FX2 PAD10",XoroTablet:"KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151",ViewsonicTablet:"ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a",OdysTablet:"LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10",CaptivaTablet:"CAPTIVA PAD",IconbitTablet:"NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S",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",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]+",JaytechTablet:"TPC-PA762",BlaupunktTablet:"Endeavour 800NG|Endeavour 1010",DigmaTablet:"\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b",EvolioTablet:"ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b",LavaTablet:"QPAD E704|\\bIvoryS\\b|E-TAB IVORY|\\bE-TAB\\b",AocTablet:"MW0811|MW0812|MW0922|MTK8382",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",CelkonTablet:"CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b",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",MiTablet:"\\bMI PAD\\b|\\bHM NOTE 1W\\b",NibiruTablet:"Nibiru M1|Nibiru Jupiter One",NexoTablet:"NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI",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",UbislateTablet:"UbiSlate[\\s]?7C",PocketBookTablet:"Pocketbook",Hudl:"Hudl HT7S3|Hudl 2",TelstraTablet:"T-Hub2",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|\\bTP750\\b"},oss:{AndroidOS:"Android",BlackBerryOS:"blackberry|\\bBB10\\b|rim tablet os",PalmOS:"PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino",SymbianOS:"Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b",WindowsMobileOS:"Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;",WindowsPhoneOS:"Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;",iOS:"\\biPhone.*Mobile|\\biPod|\\biPad",MeeGoOS:"MeeGo",MaemoOS:"Maemo",JavaOS:"J2ME/|\\bMIDP\\b|\\bCLDC\\b",webOS:"webOS|hpwOS",badaOS:"\\bBada\\b",BREWOS:"BREW"},uas:{Chrome:"\\bCrMo\\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?",Dolfin:"\\bDolfin\\b",Opera:"Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+",Skyfire:"Skyfire",IE:"IEMobile|MSIEMobile",Firefox:"fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile",Bolt:"bolt",TeaShark:"teashark",Blazer:"Blazer",Safari:"Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari",Tizen:"Tizen",UCBrowser:"UC.*Browser|UCWEB",baiduboxapp:"baiduboxapp",baidubrowser:"baidubrowser",DiigoBrowser:"DiigoBrowser",Puffin:"Puffin",Mercury:"\\bMercury\\b",ObigoBrowser:"Obigo",NetFront:"NF-Browser",GenericBrowser:"NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger"},props:{Mobile:"Mobile/[VER]",Build:"Build/[VER]",Version:"Version/[VER]",VendorID:"VendorID/[VER]",iPad:"iPad.*CPU[a-z ]+[VER]",iPhone:"iPhone.*CPU[a-z ]+[VER]",iPod:"iPod.*CPU[a-z ]+[VER]",Kindle:"Kindle/[VER]",Chrome:["Chrome/[VER]","CriOS/[VER]","CrMo/[VER]"],Coast:["Coast/[VER]"],Dolfin:"Dolfin/[VER]",Firefox:"Firefox/[VER]",Fennec:"Fennec/[VER]",IE:["IEMobile/[VER];","IEMobile [VER]","MSIE [VER];","Trident/[0-9.]+;.*rv:[VER]"],NetFront:"NetFront/[VER]",NokiaBrowser:"NokiaBrowser/[VER]",Opera:[" OPR/[VER]","Opera Mini/[VER]","Version/[VER]"],"Opera Mini":"Opera Mini/[VER]","Opera Mobi":"Version/[VER]","UC Browser":"UC Browser[VER]",MQQBrowser:"MQQBrowser/[VER]",MicroMessenger:"MicroMessenger/[VER]",baiduboxapp:"baiduboxapp/[VER]",baidubrowser:"baidubrowser/[VER]",Iron:"Iron/[VER]",Safari:["Version/[VER]","Safari/[VER]"],Skyfire:"Skyfire/[VER]",Tizen:"Tizen/[VER]",Webkit:"webkit[ /][VER]",Gecko:"Gecko/[VER]",Trident:"Trident/[VER]",Presto:"Presto/[VER]",iOS:" \\bi?OS\\b [VER][ ;]{1}",Android:"Android [VER]",BlackBerry:["BlackBerry[\\w]+/[VER]","BlackBerry.*Version/[VER]","Version/[VER]"],BREW:"BREW [VER]",Java:"Java/[VER]","Windows Phone OS":["Windows Phone OS [VER]","Windows Phone [VER]"],"Windows Phone":"Windows Phone [VER]","Windows CE":"Windows CE/[VER]","Windows NT":"Windows NT [VER]",Symbian:["SymbianOS/[VER]","Symbian/[VER]"],webOS:["webOS/[VER]","hpwOS/[VER];"]},utils:{Bot:"Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom",MobileBot:"Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2",DesktopMode:"WPDesktop",TV:"SonyDTV|HbbTV",WebKit:"(webkit)[ /]([\\w.]+)",Console:"\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\\b",Watch:"SM-V700"}};e.detectMobileBrowsers={fullPattern:/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i,shortPattern:/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i,tabletPattern:/android|ipad|playbook|silk/i};var r=Object.prototype.hasOwnProperty,n;e.FALLBACK_PHONE="UnknownPhone";e.FALLBACK_TABLET="UnknownTablet";e.FALLBACK_MOBILE="UnknownMobile";n="isArray"in Array?Array.isArray:function(e){return Object.prototype.toString.call(e)==="[object Array]"};function i(e,t){return e!=null&&t!=null&&e.toLowerCase()===t.toLowerCase()}function a(e,t){var r,n,i=e.length;if(!i||!t){return false}r=t.toLowerCase();for(n=0;n=0){s=s.substring(0,c)+"([\\w._\\+]+)"+s.substring(c+5)}a[u]=new RegExp(s,"i")}l.props[i]=a}}o(l.oss);o(l.phones);o(l.tablets);o(l.uas);o(l.utils);l.oss0={WindowsPhoneOS:l.oss.WindowsPhoneOS,WindowsMobileOS:l.oss.WindowsMobileOS}})();e.findMatch=function(e,t){for(var n in e){if(r.call(e,n)){if(e[n].test(t)){return n}}}return null};e.findMatches=function(e,t){var n=[];for(var i in e){if(r.call(e,i)){if(e[i].test(t)){n.push(i)}}}return n};e.getVersionStr=function(t,n){var i=e.mobileDetectRules.props,a,o,s,u;if(r.call(i,t)){a=i[t];s=a.length;for(o=0;o1){e=t[0]+".";t.shift();e+=t.join("")}return Number(e)};e.isMobileFallback=function(t){return e.detectMobileBrowsers.fullPattern.test(t)||e.detectMobileBrowsers.shortPattern.test(t.substr(0,4))};e.isTabletFallback=function(t){return e.detectMobileBrowsers.tabletPattern.test(t)};e.prepareDetectionCache=function(r,n,i){if(r.mobile!==t){return}var a,o,u;o=e.findMatch(e.mobileDetectRules.tablets,n);if(o){r.mobile=r.tablet=o;r.phone=null;return}a=e.findMatch(e.mobileDetectRules.phones,n);if(a){r.mobile=r.phone=a;r.tablet=null;return}if(e.isMobileFallback(n)){u=s.isPhoneSized(i);if(u===t){r.mobile=e.FALLBACK_MOBILE;r.tablet=r.phone=null}else if(u){r.mobile=r.phone=e.FALLBACK_PHONE;r.tablet=null}else{r.mobile=r.tablet=e.FALLBACK_TABLET;r.phone=null}}else if(e.isTabletFallback(n)){r.mobile=r.tablet=e.FALLBACK_TABLET;r.phone=null}else{r.mobile=r.tablet=r.phone=null}};e.mobileGrade=function(e){var t=e.mobile()!==null;if(e.os("iOS")&&e.version("iPad")>=4.3||e.os("iOS")&&e.version("iPhone")>=3.1||e.os("iOS")&&e.version("iPod")>=3.1||e.version("Android")>2.1&&e.is("Webkit")||e.version("Windows Phone OS")>=7||e.is("BlackBerry")&&e.version("BlackBerry")>=6||e.match("Playbook.*Tablet")||e.version("webOS")>=1.4&&e.match("Palm|Pre|Pixi")||e.match("hp.*TouchPad")||e.is("Firefox")&&e.version("Firefox")>=12||e.is("Chrome")&&e.is("AndroidOS")&&e.version("Android")>=4||e.is("Skyfire")&&e.version("Skyfire")>=4.1&&e.is("AndroidOS")&&e.version("Android")>=2.3||e.is("Opera")&&e.version("Opera Mobi")>11&&e.is("AndroidOS")||e.is("MeeGoOS")||e.is("Tizen")||e.is("Dolfin")&&e.version("Bada")>=2||(e.is("UC Browser")||e.is("Dolfin"))&&e.version("Android")>=2.3||e.match("Kindle Fire")||e.is("Kindle")&&e.version("Kindle")>=3||e.is("AndroidOS")&&e.is("NookTablet")||e.version("Chrome")>=11&&!t||e.version("Safari")>=5&&!t||e.version("Firefox")>=4&&!t||e.version("MSIE")>=7&&!t||e.version("Opera")>=10&&!t){return"A"}if(e.os("iOS")&&e.version("iPad")<4.3||e.os("iOS")&&e.version("iPhone")<3.1||e.os("iOS")&&e.version("iPod")<3.1||e.is("Blackberry")&&e.version("BlackBerry")>=5&&e.version("BlackBerry")<6||e.version("Opera Mini")>=5&&e.version("Opera Mini")<=6.5&&(e.version("Android")>=2.3||e.is("iOS"))||e.match("NokiaN8|NokiaC7|N97.*Series60|Symbian/3")||e.version("Opera Mobi")>=11&&e.is("SymbianOS")){return"B"}if(e.version("BlackBerry")<5||e.match("MSIEMobile|Windows CE.*Mobile")||e.version("Windows Mobile")<=5.2){return"C"}return"C"};e.detectOS=function(t){return e.findMatch(e.mobileDetectRules.oss0,t)||e.findMatch(e.mobileDetectRules.oss,t)};e.getDeviceSmallerSide=function(){return window.screen.width=0;s--)if(o=e[s])a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a;return i>3&&a&&Object.defineProperty(t,r,a),a};var i,a,o,s;var u;return{setters:[function(e){i=e},function(e){a=e},function(e){o=e},function(e){s=e}],execute:function(){u=function(){function e(e){this.locationUpdatesEnabled=true;this.orientationUpdatesEnabled=true;this.geolocationEntity=new a.Entity({id:"ar.device.geolocation",name:"Device Geolocation"});this.orientationEntity=new a.Entity({id:"ar.device.orientation",name:"Device Orientation"});this.entity=new a.Entity({id:"ar.device",name:"Device"});this.displayEntity=new a.Entity({id:"ar.device.display",name:"Device Display",position:new a.ConstantPositionProperty(a.Cartesian3.ZERO,this.entity),orientation:new a.ConstantProperty(a.Quaternion.IDENTITY)});this._scratchCartesian=new a.Cartesian3;this._scratchQuaternion1=new a.Quaternion;this._scratchQuaternion2=new a.Quaternion;this._x90Rot=a.Quaternion.fromAxisAngle(a.Cartesian3.UNIT_X,a.CesiumMath.PI_OVER_TWO);this._headingDrift=0;e.wellKnownReferenceFrames.add(this.geolocationEntity);e.wellKnownReferenceFrames.add(this.orientationEntity);e.wellKnownReferenceFrames.add(this.entity);e.wellKnownReferenceFrames.add(this.displayEntity);if(typeof navigator!=="undefined"){this._mobileDetect=new s.default(navigator.userAgent)}}e.prototype.onIdle=function(){if(typeof navigator==="undefined")return;if(a.defined(this._geolocationWatchId)){navigator.geolocation.clearWatch(this._geolocationWatchId);this._geolocationWatchId=undefined}if(a.defined(this._deviceorientationListener)){window.removeEventListener("deviceorientation",this._deviceorientationListener);this._deviceorientationListener=undefined;this._alphaOffset=undefined}};e.prototype.onUpdate=function(){var e=this;if(typeof navigator!=="undefined"){var t=this.displayEntity.orientation;var r=a.Quaternion.fromAxisAngle(a.Cartesian3.UNIT_Z,(-window.orientation||0)*a.CesiumMath.RADIANS_PER_DEGREE,this._scratchQuaternion1);if(this._mobileDetect&&!this._mobileDetect.mobile()){r=a.Quaternion.multiply(this._x90Rot,r,r)}t.setValue(r);if(!a.defined(this._geolocationWatchId)&&this.locationUpdatesEnabled){this._geolocationWatchId=navigator.geolocation.watchPosition(function(t){if(e.geolocationEntity.position instanceof a.SampledPositionProperty===false){var r=new a.SampledPositionProperty(a.ReferenceFrame.FIXED);r.forwardExtrapolationType=a.ExtrapolationType.HOLD;r.backwardExtrapolationType=a.ExtrapolationType.HOLD;r.maxNumSamples=10;e.geolocationEntity.position=r}var n=a.JulianDate.fromDate(new Date(t.timestamp));var i=a.Cartesian3.fromDegrees(t.coords.longitude,t.coords.latitude,t.coords.altitude||0,undefined,e._scratchCartesian);e.geolocationEntity.position.addSample(n,i);if(e.geolocationEntity.orientation instanceof a.ConstantProperty===false){e.geolocationEntity.orientation=new a.ConstantProperty}var o=a.Transforms.headingPitchRollQuaternion(i,0,0,0,undefined,e._scratchQuaternion1);e.geolocationEntity.orientation.setValue(o)},function(e){console.error(e)},{enableHighAccuracy:true})}else if(a.defined(this._geolocationWatchId)&&!this.locationUpdatesEnabled){navigator.geolocation.clearWatch(this._geolocationWatchId);this._geolocationWatchId=undefined}if(!a.defined(this._deviceorientationListener)&&this.orientationUpdatesEnabled){this._deviceorientationListener=function(t){var r=t.alpha;if(!a.defined(r)){return}if(t.absolute){e._alphaOffset=0}var n=t["webkitCompassHeading"];var i=+t["webkitCompassAccuracy"];if((!a.defined(e._alphaOffset)||Math.abs(e._headingDrift)>5)&&a.defined(n)&&i>=0&&i<50&&n>=0){if(!a.defined(e._alphaOffset)){e._alphaOffset=-n}else{e._alphaOffset-=e._headingDrift}}var o=e._alphaOffset||-n||0;var s=a.CesiumMath.RADIANS_PER_DEGREE*(t.alpha+o);var u=a.CesiumMath.RADIANS_PER_DEGREE*t.beta;var f=a.CesiumMath.RADIANS_PER_DEGREE*t.gamma;var c=a.Quaternion.fromAxisAngle(a.Cartesian3.UNIT_Z,s,e._scratchQuaternion1);var l=a.Quaternion.fromAxisAngle(a.Cartesian3.UNIT_X,u,e._scratchQuaternion2);var d=a.Quaternion.multiply(c,l,e._scratchQuaternion1);var h=a.Quaternion.fromAxisAngle(a.Cartesian3.UNIT_Y,f,e._scratchQuaternion2);var v=a.Quaternion.multiply(d,h,d);if(e.orientationEntity.position instanceof a.ConstantPositionProperty==false){e.orientationEntity.position=new a.ConstantPositionProperty(a.Cartesian3.ZERO,e.geolocationEntity)}if(e.orientationEntity.orientation instanceof a.ConstantProperty==false){e.orientationEntity.orientation=new a.ConstantProperty}e.orientationEntity.orientation.setValue(v);if(e.entity.position instanceof a.ConstantPositionProperty==false){e.entity.position=new a.ConstantPositionProperty(a.Cartesian3.ZERO,e.orientationEntity)}if(e.entity.orientation instanceof a.ConstantProperty==false){e.entity.orientation=new a.ConstantProperty(a.Quaternion.IDENTITY)}};window.addEventListener("deviceorientation",this._deviceorientationListener)}else if(a.defined(this._deviceorientationListener)&&!this.orientationUpdatesEnabled){window.removeEventListener("deviceorientation",this._deviceorientationListener);this._deviceorientationListener=undefined}}};e.prototype.update=function(){var e=this;if(a.defined(this._idleTimeoutId))clearTimeout(this._idleTimeoutId);this._idleTimeoutId=setTimeout(function(){e.onIdle()},2e3);this.onUpdate()};e=n([i.inject(o.ContextService)],e); return e}();e("DeviceService",u)}}});e.register("d",["a"],function(e,t){"use strict";var r=t&&t.id;var n;var i,a;function o(e){var t=Date.now();var r=Math.max(0,16-(t-a));var n=setTimeout(function(){e(t+r)},r);a=t+r;return n}return{setters:[function(e){n=e}],execute:function(){i=function(){function e(){this.frameNumbers=new WeakMap}e.prototype.requestFrame=function(e){var t=this;if(typeof requestAnimationFrame!=="undefined"&&typeof performance!=="undefined"){this.navigationStartDate=this.navigationStartDate||n.JulianDate.fromDate(new Date(performance.timing.navigationStart));requestAnimationFrame(function(r){var i=n.JulianDate.addSeconds(t.navigationStartDate,r/1e3,new n.JulianDate(0,0));e(i,t.getNextFrameNumber(e))})}else{o(function(r){var i=n.JulianDate.fromDate(new Date(r));e(i,t.getNextFrameNumber(e))})}};e.prototype.getNextFrameNumber=function(e){var t=this.frameNumbers.get(e)||0;this.frameNumbers.set(e,t+1);return t};return e}();e("TimerService",i);a=0}}});e.register("e",["c","f","10","9","d","11","12"],function(e,t){"use strict";var r=t&&t.id;var n=this&&this.__extends||function(e,t){for(var r in t)if(t.hasOwnProperty(r))e[r]=t[r];function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)};var i=this&&this.__decorate||function(e,t,r,n){var i=arguments.length,a=i<3?t:n===null?n=Object.getOwnPropertyDescriptor(t,r):n,o;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)if(o=e[s])a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a;return i>3&&a&&Object.defineProperty(t,r,a),a};var a,o,s,u,f,c,l;var d;return{setters:[function(e){a=e},function(e){o=e},function(e){s=e},function(e){u=e},function(e){f=e},function(e){c=e},function(e){l=e}],execute:function(){d=function(e){n(t,e);function t(t,r,n){e.call(this);this.sessionService=t;this.deviceService=r;this.timer=n;this.type="empty"}t.prototype.load=function(e,t){var r=this;var n=this.sessionService.addManagedSessionPort(e.uri);var i=this.sessionService.createSessionPort();var a=true;i.on["ar.context.update"]=function(){};i.connectEvent.addEventListener(function(){var e=function(t,n){if(a){r.deviceService.update();var o={time:t,index:n,eye:{pose:l.getSerializedEntityPose(r.deviceService.displayEntity,t)}};i.send("ar.reality.frameState",o);r.timer.requestFrame(e)}};r.timer.requestFrame(e)});i.closeEvent.addEventListener(function(){a=false});t(n);var s=this.sessionService.createSynchronousMessageChannel();n.open(s.port1,this.sessionService.configuration);i.open(s.port2,{role:o.Role.REALITY_VIEW})};t=i([a.inject(s.SessionService,u.DeviceService,f.TimerService)],t);return t}(c.RealityLoader);e("EmptyRealityLoader",d)}}});e.register("13",["c","14","10","12"],function(e,t){"use strict";var r=t&&t.id;var n=this&&this.__extends||function(e,t){for(var r in t)if(t.hasOwnProperty(r))e[r]=t[r];function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)};var i=this&&this.__decorate||function(e,t,r,n){var i=arguments.length,a=i<3?t:n===null?n=Object.getOwnPropertyDescriptor(t,r):n,o;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)if(o=e[s])a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a;return i>3&&a&&Object.defineProperty(t,r,a),a};var a,o,s,u;var f,c,l,d,h,v,p,m,w;return{setters:[function(e){a=e},function(e){o=e},function(e){s=e},function(e){u=e}],execute:function(){(function(e){e[e["SUCCESS"]=100]="SUCCESS";e[e["INIT_ERROR"]=-1]="INIT_ERROR";e[e["INIT_DEVICE_NOT_SUPPORTED"]=-2]="INIT_DEVICE_NOT_SUPPORTED";e[e["INIT_NO_CAMERA_ACCESS"]=-3]="INIT_NO_CAMERA_ACCESS";e[e["INIT_LICENSE_ERROR_MISSING_KEY"]=-4]="INIT_LICENSE_ERROR_MISSING_KEY";e[e["INIT_LICENSE_ERROR_INVALID_KEY"]=-5]="INIT_LICENSE_ERROR_INVALID_KEY";e[e["INIT_LICENSE_ERROR_NO_NETWORK_PERMANENT"]=-6]="INIT_LICENSE_ERROR_NO_NETWORK_PERMANENT";e[e["INIT_LICENSE_ERROR_NO_NETWORK_TRANSIENT"]=-7]="INIT_LICENSE_ERROR_NO_NETWORK_TRANSIENT";e[e["INIT_LICENSE_ERROR_CANCELED_KEY"]=-8]="INIT_LICENSE_ERROR_CANCELED_KEY";e[e["INIT_LICENSE_ERROR_PRODUCT_TYPE_MISMATCH"]=-9]="INIT_LICENSE_ERROR_PRODUCT_TYPE_MISMATCH";e[e["INIT_EXTERNAL_DEVICE_NOT_DETECTED"]=-10]="INIT_EXTERNAL_DEVICE_NOT_DETECTED"})(f||(f={}));e("VuforiaInitResult",f);(function(e){e[e["MaxSimultaneousImageTargets"]=0]="MaxSimultaneousImageTargets";e[e["MaxSimultaneousObjectTargets"]=1]="MaxSimultaneousObjectTargets";e[e["DelayedLoadingObjectDatasets"]=2]="DelayedLoadingObjectDatasets"})(c||(c={}));e("VuforiaHint",c);l=function(){function e(){this.stateUpdateEvent=new u.Event}return e}();e("VuforiaServiceDelegateBase",l);d=function(e){n(t,e);function t(){e.apply(this,arguments)}t.prototype.isAvailable=function(){return false};t.prototype.setHint=function(e,t){return true};t.prototype.decryptLicenseKey=function(e,t){return Promise.resolve(undefined)};t.prototype.init=function(e){return Promise.resolve(f.SUCCESS)};t.prototype.deinit=function(){};t.prototype.cameraDeviceInitAndStart=function(){return true};t.prototype.cameraDeviceSetFlashTorchMode=function(e){return true};t.prototype.objectTrackerInit=function(){return true};t.prototype.objectTrackerCreateDataSet=function(e){return""};t.prototype.objectTrackerDestroyDataSet=function(e){return true};t.prototype.objectTrackerActivateDataSet=function(e){return true};t.prototype.objectTrackerDeactivateDataSet=function(e){return true};t.prototype.dataSetFetch=function(e){return Promise.resolve(undefined)};t.prototype.dataSetLoad=function(e){return Promise.resolve()};return t}(l);e("VuforiaServiceDelegate",d);h=function(){function e(e,t,r){var n=this;this.sessionService=e;this.focusService=t;this.delegate=r;this._sessionSwitcherCommandQueue=new u.CommandQueue;this._sessionCommandQueue=new WeakMap;this._sessionInitOptions=new WeakMap;this._sessionInitPromise=new WeakMap;this._sessionIsInitialized=new WeakMap;this._sessionCreatedDataSets=new WeakMap;this._sessionActivatedDataSets=new WeakMap;if(e.isRealityManager){this._sessionSwitcherCommandQueue.errorEvent.addEventListener(function(e){n.sessionService.errorEvent.raiseEvent(e)});e.connectEvent.addEventListener(function(e){var t=new u.CommandQueue;t.errorEvent.addEventListener(function(t){n.sessionService.errorEvent.raiseEvent(t);e.sendError(t)});n._sessionCommandQueue.set(e,t);var i=new Set;n._sessionCreatedDataSets.set(e,i);var a=new Set;n._sessionActivatedDataSets.set(e,a);e.on["ar.vuforia.isAvailable"]=function(){return Promise.resolve({available:r.isAvailable()})};e.on["ar.vuforia.init"]=function(i){if(!r.isAvailable())throw new Error("Vuforia is not supported");if(n._sessionIsInitialized.get(e))throw new Error("Vuforia has already been initialized");if(!i.key&&!i.encryptedLicenseData)throw new Error("Expected `encryptedLicenseData` field. You can encrypt your Vuforia license key at http://docs.argonjs.io/start/vuforia-pgp-encryptor");var a=i.key?Promise.resolve(i.key):r.decryptLicenseKey(i.encryptedLicenseData,e);return a.then(function(r){n._sessionInitOptions.set(e,{key:r});var i=t.push(function(){return n._init(e).then(function(){n._sessionIsInitialized.set(e,true)})},n._controllingSession===e);if(n.focusService.getSession()===e){n._setControllingSession(e)}n._sessionInitPromise.set(e,i);return i})};e.on["ar.vuforia.objectTrackerCreateDataSet"]=function(a){var o=a.url;return t.push(function(){var e=r.objectTrackerCreateDataSet(o);if(e){i.add(e);return Promise.resolve({id:e})}throw new Error("Unable to create DataSet")},n._controllingSession===e)};e.on["ar.vuforia.objectTrackerActivateDataSet"]=function(i){var o=i.id;return t.push(function(){if(r.objectTrackerActivateDataSet(o)){a.add(o);e.send("ar.vuforia.objectTrackerActivateDataSetEvent",{id:o});return}throw new Error("Unable to activate DataSet ("+o+")")},n._controllingSession===e)};e.on["ar.vuforia.objectTrackerDeactivateDataSet"]=function(i){var o=i.id;return t.push(function(){if(r.objectTrackerDeactivateDataSet(o)){a.delete(o);e.send("ar.vuforia.objectTrackerDeactivateDataSetEvent",{id:o});return}throw new Error("Unable to deactivate DataSet ("+o+")")},n._controllingSession===e)};e.on["ar.vuforia.dataSetFetch"]=function(i){var a=i.id;return t.push(function(){return r.dataSetFetch(a)},n._controllingSession===e)};e.on["ar.vuforia.dataSetLoad"]=function(i){var a=i.id;return t.push(function(){return r.dataSetLoad(a)},n._controllingSession===e)};e.closeEvent.addEventListener(function(){if(n._controllingSession===e){t.clear();t.push(function(){n._cleanupSession(e);setTimeout(function(){n._ensureActiveSession()},2e3)},true)}else{n._cleanupSession(e)}})});t.sessionFocusEvent.addEventListener(function(e){var t=e.current;if(t&&n._sessionInitOptions.get(t)){n._setControllingSession(t)}})}}e.prototype.isAvailable=function(){return this.sessionService.manager.request("ar.vuforia.isAvailable").then(function(e){return e.available})};e.prototype.initWithUnencryptedKey=function(e,t){var r=this;if(!t)this.sessionService.ensureIsRealityManager();return this.sessionService.manager.request("ar.vuforia.init",e).then(function(){return new v(r.sessionService.manager)})};e.prototype.init=function(e){var t=this;if(!e.encryptedLicenseData||typeof e.encryptedLicenseData!=="string")throw new Error("options.encryptedLicenseData is required.");return this.sessionService.manager.request("ar.vuforia.init",e).then(function(){return new v(t.sessionService.manager)})};e.prototype._ensureActiveSession=function(){console.log("VuforiaService: Ensuring an active session is in control.");if(this._controllingSession&&this._controllingSession.isConnected)return;this._selectControllingSession()};e.prototype._selectControllingSession=function(){var e=this.focusService.getSession();if(e&&this._sessionInitOptions.get(e)){this._setControllingSession(e);return}for(var t=0,r=this.sessionService.managedSessions;t=0;s--)if(o=e[s])a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a;return i>3&&a&&Object.defineProperty(t,r,a),a};var a,o,s,u,f;var c;return{setters:[function(e){a=e},function(e){o=e},function(e){s=e},function(e){u=e},function(e){f=e}],execute:function(){c=function(e){n(t,e);function t(t,r){e.call(this);this.sessionService=t;this.vuforiaDelegate=r;this.type="live-video"}t.prototype.load=function(e,t){var r=this;var n=this.sessionService.addManagedSessionPort(e.uri);var i=this.sessionService.createSessionPort();i.on["ar.context.update"]=function(){};i.connectEvent.addEventListener(function(){var e=r.vuforiaDelegate.stateUpdateEvent.addEventListener(function(e){i.send("ar.reality.frameState",e)});r.vuforiaDelegate.videoEnabled=true;r.vuforiaDelegate.trackingEnabled=true;i.closeEvent.addEventListener(function(){e();r.vuforiaDelegate.videoEnabled=false;r.vuforiaDelegate.trackingEnabled=false})});t(n);var a=this.sessionService.createSynchronousMessageChannel();n.open(a.port1,this.sessionService.configuration);i.open(a.port2,{role:o.Role.REALITY_VIEW})};t=i([a.inject(s.SessionService,f.VuforiaServiceDelegate)],t);return t}(u.RealityLoader);e("LiveVideoRealityLoader",c)}}});e.register("b",["c","a","10","11","12"],function(e,t){"use strict";var r=t&&t.id;var n=this&&this.__decorate||function(e,t,r,n){var i=arguments.length,a=i<3?t:n===null?n=Object.getOwnPropertyDescriptor(t,r):n,o;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)if(o=e[s])a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a;return i>3&&a&&Object.defineProperty(t,r,a),a};var i,a,o,s,u;var f,c,l,d,h;function v(e){var t=e;return a.defined(t.id)?t.id:""+t}return{setters:[function(e){i=e},function(e){a=e},function(e){o=e},function(e){s=e},function(e){u=e}],execute:function(){(function(e){e[e["KNOWN"]=1]="KNOWN";e[e["FOUND"]=2]="FOUND";e[e["LOST"]=4]="LOST"})(f||(f={}));e("PoseStatus",f);c=new a.Cartesian3(0,0);l=new a.Quaternion(0,0);d=new a.Cartesian3(0,0);h=function(){function e(e,t){var r=this;this.sessionService=e;this.realityService=t;this.updateEvent=new u.Event;this.renderEvent=new u.Event;this.wellKnownReferenceFrames=new a.EntityCollection;this.subscribedEntities=new a.EntityCollection;this.entities=new a.CompositeEntityCollection;this.localOriginChangeEvent=new u.Event;this.user=new a.Entity({id:"ar.user",name:"user",position:new a.ConstantPositionProperty(undefined,a.ReferenceFrame.FIXED),orientation:new a.ConstantProperty(a.Quaternion.IDENTITY)});this.localOriginEastNorthUp=new a.Entity({id:"ar.localENU",name:"localOriginENU",position:new a.ConstantPositionProperty(undefined,a.ReferenceFrame.FIXED),orientation:new a.ConstantProperty(a.Quaternion.IDENTITY)});this.localOriginEastUpSouth=new a.Entity({id:"ar.localEUS",name:"localOriginEUS",position:new a.ConstantPositionProperty(a.Cartesian3.ZERO,this.localOriginEastNorthUp),orientation:new a.ConstantProperty(a.Quaternion.fromAxisAngle(a.Cartesian3.UNIT_X,Math.PI/2))});this.maxDeltaTime=1/3*1e3;this._frame={time:new a.JulianDate(0,0),systemTime:0,deltaTime:0};this._defaultReferenceFrame=this.localOriginEastNorthUp;this._entityPoseCache={};this._entityPoseMap=new Map;this._subscribedEntities=new WeakMap;this._updatingEntities=new Set;this._knownEntities=new Set;this.entities.addCollection(this.wellKnownReferenceFrames);this.entities.addCollection(this.subscribedEntities);this.subscribedEntities.add(this.user);if(this.sessionService.isRealityManager){this.realityService.frameEvent.addEventListener(function(e){r._update(e)});this.sessionService.connectEvent.addEventListener(function(e){r._subscribedEntities.set(e,new Set);e.on["ar.context.subscribe"]=function(t){var n=t.id;var i=r._subscribedEntities.get(e);if(i)i.add(n)}})}else{this.sessionService.manager.on["ar.context.update"]=function(e){r._update(e)}}}Object.defineProperty(e.prototype,"frame",{get:function(){if(!a.defined(this.serializedFrameState))throw new Error("A frame state has not yet been received");return this._frame},enumerable:true,configurable:true});Object.defineProperty(e.prototype,"serializedFrameState",{get:function(){return this._serializedState},enumerable:true,configurable:true});e.prototype.getTime=function(){return this.frame.time};e.prototype.setDefaultReferenceFrame=function(e){this._defaultReferenceFrame=e};e.prototype.getDefaultReferenceFrame=function(){return this._defaultReferenceFrame};e.prototype.subscribeToEntityById=function(e){this.sessionService.manager.send("ar.context.subscribe",{id:e});return this.subscribedEntities.getOrCreateEntity(e)};e.prototype.getEntityPose=function(e,t){if(t===void 0){t=this._defaultReferenceFrame}var r=this.getTime();var n=e.id+"@"+v(t);var i=this._entityPoseMap.get(n);if(!a.defined(i)){i={position:new a.Cartesian3,orientation:new a.Quaternion,time:a.JulianDate.clone(r),poseStatus:0};this._entityPoseMap.set(n,i)}else{a.JulianDate.clone(r,i.time)}var o=u.getEntityPositionInReferenceFrame(e,r,t,i.position);var s=u.getEntityOrientationInReferenceFrame(e,r,t,i.orientation);var c=o&&s;var l=0;var d=i.poseStatus;if(c){l|=f.KNOWN}if(c&&!(d&f.KNOWN)){l|=f.FOUND}else if(!c&&d&f.KNOWN){l|=f.LOST}i.poseStatus=l;return i};e.prototype.getCurrentEntityState=function(e,t){console.warn("getCurrentEntityState is deprecated. Use getEntityPose instead.");return this.getEntityPose(e,t)};e.prototype._update=function(e){var t=this;if(this.sessionService.isRealityManager){delete e.entities[this.user.id];this._entityPoseCache={};for(var r=0,n=this.sessionService.managedSessions;r25e6)){var o=this.localOriginEastNorthUp.position;var s=this.localOriginEastNorthUp.orientation;o.setValue(r,t);if(t===a.ReferenceFrame.FIXED){var f=a.Transforms.headingPitchRollQuaternion(r,0,0,0,undefined,l);s.setValue(f)}else{s.setValue(a.Quaternion.IDENTITY)}this.localOriginChangeEvent.raiseEvent(undefined)}};e.prototype._sendUpdateForSession=function(e,t){var r=this;var n={};for(var i in e.entities){n[i]=e.entities[i]}var o=this._subscribedEntities.get(t);o.forEach(function(t){r._addEntityAndAncestorsToPoseMap(n,t,e.time)});var s={reality:e.reality,index:e.index,time:e.time,view:e.view,entities:n,sendTime:a.JulianDate.now()};t.send("ar.context.update",s)};e.prototype._addEntityAndAncestorsToPoseMap=function(e,t,r){if(!a.defined(this._entityPoseCache[t])){var n=this.subscribedEntities.getById(t);if(!n)return;this._entityPoseCache[t]=u.getSerializedEntityPose(n,r);if(n.position&&n.position.referenceFrame instanceof a.Entity){var i=v(n.position.referenceFrame);this._addEntityAndAncestorsToPoseMap(e,i,r)}}e[t]=this._entityPoseCache[t]};e=n([i.inject(o.SessionService,s.RealityService)],e);return e}();e("ContextService",h)}}});e.register("14",["c","10","12"],function(e,t){"use strict";var r=t&&t.id;var n=this&&this.__decorate||function(e,t,r,n){var i=arguments.length,a=i<3?t:n===null?n=Object.getOwnPropertyDescriptor(t,r):n,o;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)if(o=e[s])a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a;return i>3&&a&&Object.defineProperty(t,r,a),a};var i,a,o;var s;return{setters:[function(e){i=e},function(e){a=e},function(e){o=e}],execute:function(){s=function(){function e(e){var t=this;this.sessionService=e;this.focusEvent=new o.Event;this.blurEvent=new o.Event;this._hasFocus=false;this._sessionFocusEvent=new o.Event;e.manager.on["ar.focus.state"]=function(e){t._setFocus(e.state)};if(e.isRealityManager){e.manager.connectEvent.addEventListener(function(){setTimeout(function(){if(!t._session)t.setSession(t.sessionService.manager)})})}}Object.defineProperty(e.prototype,"hasFocus",{get:function(){return this._hasFocus},enumerable:true,configurable:true});Object.defineProperty(e.prototype,"sessionFocusEvent",{get:function(){this.sessionService.ensureIsRealityManager();return this._sessionFocusEvent},enumerable:true,configurable:true});e.prototype.getSession=function(){this.sessionService.ensureIsRealityManager();return this._session};e.prototype.setSession=function(e){this.sessionService.ensureIsRealityManager();if(e&&!e.isConnected)throw new Error("Only a connected session can be granted focus");var t=this._session;if(t!==e){if(t)t.send("ar.focus.state",{state:false});if(e)e.send("ar.focus.state",{state:true});this._session=e;this.sessionFocusEvent.raiseEvent({previous:t,current:e})}};e.prototype.whenSessionHasFocus=function(e){var t=this;this.sessionService.ensureIsRealityManager();return new Promise(function(r){var n=t.sessionFocusEvent.addEventListener(function(t){var i=t.current;if(i===e){n();r()}})})};e.prototype._setFocus=function(e){if(this._hasFocus!==e){this._hasFocus=e;if(e){this.focusEvent.raiseEvent(undefined)}else{this.blurEvent.raiseEvent(undefined)}}};e=n([i.inject(a.SessionService)],e);return e}();e("FocusService",s)}}});(function(){var t=e.amdDefine;t("16",["exports","3"],function(e,t){"use strict";e.__esModule=true;var r=Object.assign||function(e){for(var t=1;t=a.length)break;u=a[s++]}else{s=a.next();if(s.done)break;u=s.value}var f=u;Object.defineProperty(i,f,{value:e[f],writable:true})}};return r?n(r):n}return r}function l(){return true}function d(){}function h(e){if(e===undefined){e={}}else if(typeof e==="function"){e={validate:e}}if(!e.validate){e.validate=l}if(!e.compose){e.compose=d}return e}function v(e){return function(t){var r=e(t);return r===true}}function p(e,t){return function(r){var n=t(r);if(n!==true){throw new Error(n||e+" was not correctly implemented.")}}}function m(e,t){t=h(t);var r=function r(n){var i=typeof n==="function"?n.prototype:n;t.compose(i);r.assert(i);Object.defineProperty(i,"protocol:"+e,{enumerable:false,configurable:false,writable:false,value:true})};r.validate=v(t.validate);r.assert=p(e,t.validate);return r}m.create=function(e,t){t=h(t);var r="protocol:"+e;var n=function r(n){var i=m(e,t);return n?i(n):i};n.decorates=function(e){return e[r]===true};n.validate=v(t.validate);n.assert=p(e,t.validate);return n}})})();(function(){var t=e.amdDefine;t("3",["exports"],function(e){"use strict";e.__esModule=true;e.AggregateError=t;e.initializePAL=a;function t(e,t,r){if(t){if(t.innerError&&r){return t}if(t.stack){e+="\n------------------------------------------------\ninner error: "+t.stack}}var n=new Error(e);if(t){n.innerError=t}return n}var r={};e.FEATURE=r;var n={noop:function e(){},eachModule:function e(){}};e.PLATFORM=n;n.global=function(){if(typeof self!=="undefined"){return self}if(typeof global!=="undefined"){return global}return new Function("return this")()}();var i={};e.DOM=i;function a(e){if(typeof Object.getPropertyDescriptor!=="function"){Object.getPropertyDescriptor=function(e,t){var r=Object.getOwnPropertyDescriptor(e,t);var n=Object.getPrototypeOf(e);while(typeof r==="undefined"&&n!==null){r=Object.getOwnPropertyDescriptor(n,t);n=Object.getPrototypeOf(n)}return r}}e(n,r,i)}})})();(function(){var t=e.amdDefine;t("c",["exports","16","3"],function(e,t,r){"use strict";e.__esModule=true;var n;var i=function(){function e(e,t){for(var r=0;r=0;s--)if(o=e[s])a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a;return i>3&&a&&Object.defineProperty(t,r,a),a};var a,o,s,u;var f,c,l,d,h,v,p,m;return{setters:[function(e){a=e},function(e){o=e},function(e){s=e},function(e){u=e}],execute:function(){f=function(){function e(t){var r=this;this.uri=t;this._connectEvent=new u.Event;this.closeEvent=new u.Event;this.errorEvent=new u.Event;this.on={};this._isOpened=false;this._isConnected=false;this._isClosed=false;this.on[e.OPEN]=function(e){if(!e)throw new Error("Session did not provide a configuration");if(r._isConnected)throw new Error("Session has already connected!");r.info=e;r._isConnected=true;r._connectEvent.raiseEvent(undefined)};this.on[e.CLOSE]=function(){r._isClosed=true;r._isConnected=false;if(r.messagePort&&r.messagePort.close)r.messagePort.close();r.closeEvent.raiseEvent(undefined)};this.on[e.ERROR]=function(e){var t=new Error("Session Error: "+e.message);if(e.stack)t["stack"]=e.stack;r.errorEvent.raiseEvent(t)};this.errorEvent.addEventListener(function(e){if(r.errorEvent.numberOfListeners===1)console.error(e)})}Object.defineProperty(e.prototype,"connectEvent",{get:function(){if(this._isConnected)throw new Error("The connectEvent only fires once and the session is already connected.");return this._connectEvent},enumerable:true,configurable:true});e.prototype.supportsProtocol=function(e,t){if(!this._isConnected)throw new Error("Session has not yet connected");var r=this.info.protocols;if(!r)return false;var n=false;var i=new Set;r.forEach(function(t){if(t.indexOf(e)!==-1){var r=+t.split("@v")[1]||0;i.add(r)}});if(t){if(Array.isArray(t)){t.forEach(function(e){if(i.has(e)){n=true}})}else{if(i.has(t)){n=true}}}else if(!t){n=true}return n};e.prototype.open=function(t,r){var n=this;if(this._isClosed)return;if(this._isOpened)throw new Error("Session can only be opened once");if(!r)throw new Error("Session options must be provided");this.messagePort=t;this._isOpened=true;this.messagePort.onmessage=function(e){if(n._isClosed)return;var t=e.data[0];var r=e.data[1];var i=e.data[2]||{};var a=e.data[3];var o=n.on[r];if(o&&!a){try{var s=o(i,e);if(s)console.warn("Handler for "+r+" returned an unexpected response")}catch(e){n.sendError(e);n.errorEvent.raiseEvent(e)}}else if(o){var s=new Promise(function(t){return t(o(i,e))});Promise.resolve(s).then(function(e){if(n._isClosed)return;n.send(r+":resolve:"+t,e)}).catch(function(e){if(n._isClosed)return;var i;if(typeof e==="string")i=e;else if(typeof e.message==="string")i=e.message;n.send(r+":reject:"+t,{reason:i})})}else{var u="Unable to handle message "+r;if(a){n.send(r+":reject:"+t,{reason:u})}else{n.sendError({message:u})}n.errorEvent.raiseEvent(new Error("No handlers are available for topic "+r))}};this.send(e.OPEN,r)};e.prototype.send=function(e,t){if(!this._isOpened)throw new Error("Session must be open to send messages");if(this._isClosed)return false;var r=a.createGuid();this.messagePort.postMessage([r,e,t]);return true};e.prototype.sendError=function(t){var r=t;if(r instanceof Error){r={message:r.message,stack:r["stack"]}}return this.send(e.ERROR,r)};e.prototype.request=function(e,t){var r=this;if(!this._isOpened||this._isClosed)throw new Error("Session must be open to make requests");var n=a.createGuid();var i=e+":resolve:"+n;var o=e+":reject:"+n;var s=new Promise(function(t,n){r.on[i]=function(e){delete r.on[i];delete r.on[o];t(e)};r.on[o]=function(t){delete r.on[i];delete r.on[o];console.warn("Request '"+e+"' rejected with reason:\n"+t.reason);n(new Error(t.reason))}});this.messagePort.postMessage([n,e,t||{},true]);return s};e.prototype.close=function(){if(this._isClosed)return;if(this._isOpened){this.send(e.CLOSE)}this._isClosed=true;this._isConnected=false;if(this.messagePort&&this.messagePort.close)this.messagePort.close();this.closeEvent.raiseEvent(undefined)};Object.defineProperty(e.prototype,"isConnected",{get:function(){return this._isConnected},enumerable:true,configurable:true});e.OPEN="ar.session.open";e.CLOSE="ar.session.close";e.ERROR="ar.session.error";return e}();e("SessionPort",f);c=function(){function e(){}e.prototype.create=function(e){return new f(e)};return e}();e("SessionPortFactory",c);l=function(){function e(){}return e}();e("ConnectService",l);d=function(){function e(e,t,r,n){var i=this;this.configuration=e;this.connectService=t;this.sessionPortFactory=r;this.messageChannelFactory=n;this.manager=this.createSessionPort("argon:manager");this.errorEvent=new u.Event;this._connectEvent=new u.Event;this._managedSessions=[];this.errorEvent.addEventListener(function(e){if(i.errorEvent.numberOfListeners===1)console.error(e)});this.manager.errorEvent.addEventListener(function(e){i.errorEvent.raiseEvent(e)});Object.freeze(this)}Object.defineProperty(e.prototype,"connectEvent",{get:function(){return this._connectEvent},enumerable:true,configurable:true});Object.defineProperty(e.prototype,"managedSessions",{get:function(){this.ensureIsRealityManager();return this._managedSessions},enumerable:true,configurable:true});e.prototype.connect=function(){if(this.connectService&&this.connectService.connect){this.connectService.connect(this)}else{console.warn("Argon: Unable to connect to a manager session; a connect service is not available")}};e.prototype.addManagedSessionPort=function(e){var t=this;this.ensureIsRealityManager();var r=this.sessionPortFactory.create(e);r.errorEvent.addEventListener(function(e){t.errorEvent.raiseEvent(e)});r.connectEvent.addEventListener(function(){t.managedSessions.push(r);t.connectEvent.raiseEvent(r)});r.closeEvent.addEventListener(function(){var e=t.managedSessions.indexOf(r);if(e>-1)t.managedSessions.splice(e,1)});return r};e.prototype.createSessionPort=function(e){return this.sessionPortFactory.create(e)};e.prototype.createMessageChannel=function(){return this.messageChannelFactory.create()};e.prototype.createSynchronousMessageChannel=function(){return this.messageChannelFactory.createSynchronous()};Object.defineProperty(e.prototype,"isRealityManager",{get:function(){return this.configuration.role===s.Role.REALITY_MANAGER||this.configuration.role===s.Role.MANAGER},enumerable:true,configurable:true});Object.defineProperty(e.prototype,"isRealityAugmenter",{get:function(){return this.configuration.role===s.Role.REALITY_AUGMENTOR||this.configuration.role===s.Role.APPLICATION},enumerable:true,configurable:true});Object.defineProperty(e.prototype,"isRealityView",{get:function(){return this.configuration.role===s.Role.REALITY_VIEW},enumerable:true,configurable:true});Object.defineProperty(e.prototype,"isManager",{get:function(){console.warn("Deprecated. Use isRealityManager()");return this.isManager},enumerable:true,configurable:true});Object.defineProperty(e.prototype,"isApplication",{get:function(){console.warn("Deprecated. Use isRealityAugmenter()");return this.isRealityAugmenter},enumerable:true,configurable:true});e.prototype.ensureIsRealityManager=function(){if(!this.isRealityManager)throw new Error("An reality-manager only API was accessed from a non reality-manager.")};e.prototype.ensureIsRealityView=function(){if(!this.isRealityView)throw new Error("An reality-view only API was accessed from a non reality-view.")};e.prototype.ensureNotRealityView=function(){if(this.isRealityView)throw new Error("An non-permitted API was accessed from a reality-view.")};e=i([o.inject("config",l,c,u.MessageChannelFactory)],e);return e}();e("SessionService",d);h=function(e){n(t,e);function t(){e.apply(this,arguments)}t.prototype.connect=function(e){var t=e.createSynchronousMessageChannel();var r=t.port1;t.port2.onmessage=function(e){t.port2.postMessage(e.data)};e.manager.connectEvent.addEventListener(function(){e.connectEvent.raiseEvent(e.manager)});e.manager.open(r,e.configuration)};return t}(l);e("LoopbackConnectService",h);v=function(e){n(t,e);function t(){e.apply(this,arguments)}t.isAvailable=function(){return typeof window!=="undefined"&&typeof window.parent!=="undefined"};t.prototype.connect=function(e){var t=e.createMessageChannel();window.parent.postMessage({type:"ARGON_SESSION"},"*",[t.port1]);e.manager.open(t.port2,e.configuration)};return t}(l);e("DOMConnectService",v);p=function(e){n(t,e);function t(){e.apply(this,arguments)}t.isAvailable=function(){return typeof window!=="undefined"&&!!window["__ARGON_DEBUG_PORT__"]};t.prototype.connect=function(e){var t=e.manager,r=e.configuration;t.open(window["__ARGON_DEBUG_PORT__"],r)};return t}(l);e("DebugConnectService",p);m=function(e){n(t,e);function t(){e.apply(this,arguments)}t.isAvailable=function(){return typeof window!=="undefined"&&window["webkit"]&&window["webkit"].messageHandlers};t.prototype.connect=function(e){var t=e.createSynchronousMessageChannel();t.port2.onmessage=function(e){webkit.messageHandlers.argon.postMessage(JSON.stringify(e.data))};window["__ARGON_PORT__"]=t.port2;e.manager.open(t.port1,e.configuration);window.addEventListener("beforeunload",function(){e.manager.close()})};return t}(l);e("WKWebViewConnectService",m)}}});e.register("11",["c","a","f","14","10","12"],function(e,t){"use strict";var r=t&&t.id;var n=this&&this.__decorate||function(e,t,r,n){var i=arguments.length,a=i<3?t:n===null?n=Object.getOwnPropertyDescriptor(t,r):n,o;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)if(o=e[s])a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a;return i>3&&a&&Object.defineProperty(t,r,a),a};var i,a,o,s,u,f;var c,l,d;return{setters:[function(e){i=e},function(e){a=e},function(e){o=e},function(e){s=e},function(e){u=e},function(e){f=e}],execute:function(){c=function(){function e(){}return e}();e("RealityLoader",c);(function(e){e[e["OTHER"]=0]="OTHER";e[e["START"]=1]="START";e[e["CHANGE"]=2]="CHANGE";e[e["END"]=3]="END"})(l||(l={}));e("RealityZoomState",l);d=function(){function e(e,t){var r=this;this.sessionService=e;this.focusService=t;this.realities=new Array;this.connectEvent=new f.Event;this._changeEvent=new f.Event;this._frameEvent=new f.Event;this.desiredRealityMap=new WeakMap;this.desiredRealityMapInverse=new WeakMap;this.sessionDesiredRealityChangeEvent=new f.Event;this._loaders=[];this._defaultFov=Math.PI/2;this._scratchFrustum=new a.PerspectiveFrustum;this._scratchArray=new Array;this._loadID=-1;if(e.isRealityManager){e.manager.connectEvent.addEventListener(function(){setTimeout(function(){if(r._loadID===-1)r._setNextReality(r.onSelectReality())})})}e.connectEvent.addEventListener(function(e){if(e.info.role!==o.Role.REALITY_VIEW){e.on["ar.reality.desired"]=function(t){var n=t.reality;var i=r.desiredRealityMap.get(e);console.log("Session set desired reality: "+JSON.stringify(n));if(n){if(n["type"]){var a=n["type"];n.uri=n.uri||"reality:"+a;if(a==="hosted")n.uri=n["url"];if(!n.title&&n["name"])n.title=n["name"]}if(r.isSupported(n)){r.desiredRealityMap.set(e,n);r.desiredRealityMapInverse.set(n,e)}else{e.sendError({message:'Reality of type "'+n.uri+'" is not available on this platform'});return}}else{r.desiredRealityMap.delete(e)}r._setNextReality(r.onSelectReality());r.sessionDesiredRealityChangeEvent.raiseEvent({session:e,previous:i,current:n})}}});e.manager.on["ar.reality.connect"]=function(e){var t=e.id;var n=r.sessionService.createSessionPort();var i=r.sessionService.createSynchronousMessageChannel();var a="ar.reality.message.route."+t;var o="ar.reality.message.send."+t;var s="ar.reality.close."+t;i.port1.onmessage=function(e){r.sessionService.manager.send(a,e.data)};r.sessionService.manager.on[o]=function(e){i.port1.postMessage(e)};r.sessionService.manager.on[s]=function(){n.close()};n.connectEvent.addEventListener(function(){r.connectEvent.raiseEvent(n)});r.sessionService.manager.closeEvent.addEventListener(function(){n.close();delete r.sessionService.manager.on[o];delete r.sessionService.manager.on[s]});n.open(i.port2,r.sessionService.configuration)};e.manager.on["ar.reality.zoom"]=function(e){r.zoom(e)}}Object.defineProperty(e.prototype,"changeEvent",{get:function(){this.sessionService.ensureIsRealityManager();return this._changeEvent},enumerable:true,configurable:true});Object.defineProperty(e.prototype,"frameEvent",{get:function(){this.sessionService.ensureIsRealityManager();return this._frameEvent},enumerable:true,configurable:true});e.prototype.setDefault=function(e){this._default=e};e.prototype.registerLoader=function(e){this.sessionService.ensureIsRealityManager();this._loaders.push(e)};e.prototype.getCurrent=function(){this.sessionService.ensureIsRealityManager();return this._current};e.prototype.isSupported=function(e){this.sessionService.ensureIsRealityManager();return!!this._getLoader(e)};e.prototype.publishFrame=function(e){this.sessionService.ensureIsRealityView();if(this.sessionService.manager.isConnected){this.sessionService.manager.send("ar.reality.frameState",e)}};e.prototype.setDesired=function(e){this.sessionService.ensureNotRealityView();this._desired=e;if(this.sessionService.isRealityManager){this._setNextReality(e,true)}else{this.sessionService.manager.send("ar.reality.desired",{reality:e})}};e.prototype.getDesired=function(){return this._desired};e.prototype.setOptionalReferenceFrames=function(e){};e.prototype.setRequiredReferenceFrames=function(e){};e.prototype.setDesiredFov=function(e){this._desiredFov=e;this.zoom({fov:e||this._defaultFov,zoom:1,state:l.OTHER})};e.prototype.getDesiredFov=function(){return this._desiredFov};e.prototype.setDefaultFov=function(e){if(a.defined(this._desiredFov)){var t=this._desiredFov/this._defaultFov;this.setDesiredFov(e*t)}this._defaultFov=e};e.prototype.getDefaultFov=function(){return this._defaultFov};e.prototype.getMaximumViewport=function(){if(typeof document!=="undefined"&&document.documentElement){return{x:0,y:0,width:document.documentElement.clientWidth,height:document.documentElement.clientHeight}}throw new Error("Not implemeneted for the current platform")};e.prototype.onSelectReality=function(){this.sessionService.ensureIsRealityManager();var e=this.desiredRealityMap.get(this.sessionService.manager);if(!e){var t=this.focusService.getSession();if(t&&t.isConnected){e=this.desiredRealityMap.get(t)}}if(!e){for(var r=0,n=this.sessionService.managedSessions;r=0;s--)if(o=e[s])a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a;return i>3&&a&&Object.defineProperty(t,r,a),a};var i,a,o,s,u,f,c;var l,d,h,v;return{setters:[function(e){i=e},function(e){a=e},function(e){o=e},function(e){s=e},function(e){u=e},function(e){f=e},function(e){c=e}],execute:function(){if(typeof document!=="undefined"&&document.createElement){var t=document.querySelector("meta[name=viewport]");if(!t)t=document.createElement("meta");t.name="viewport";t.content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0";document.head.appendChild(t);var r=document.querySelector("meta[name=argon]");if(!r)r=document.createElement("meta");r.name="argon";document.head.appendChild(r);d=new Promise(function(e){var t=function(){var t=document.querySelector("#argon");if(!t)t=document.createElement("div");t.id="argon";t.classList.add("argon-view");document.body.appendChild(t);l=t;e(t)};if(document.readyState=="loading"){document.addEventListener("DOMContentLoaded",t)}else{t()}});var p=document.createElement("style");p.type="text/css";document.head.insertBefore(p,document.head.firstChild);var m=p.sheet;m.insertRule("\n #argon {\n position: fixed;\n left: 0px;\n bottom: 0px;\n width: 100%;\n height: 100%;\n margin: 0;\n border: 0;\n padding: 0;\n }\n ",0);m.insertRule("\n .argon-view > * {\n position: absolute;\n pointer-events: none;\n }\n ",1)}h=function(){function e(e,t,r,n){var i=this;this.sessionService=t;this.focusService=r;this.contextService=n;this.viewportChangeEvent=new u.Event;this.acquireEvent=new u.Event;this.releaseEvent=new u.Event;this.desiredViewportMap=new WeakMap;this._subviews=[];this._subviewEntities=[];this._frustums=[];if(typeof document!=="undefined"&&document.createElement){var a=this.element=document.createElement("div");a.style.width="100%";a.style.height="100%";a.classList.add("argon-view");this.containingElementPromise=new Promise(function(t){if(e&&e instanceof HTMLElement){e.insertBefore(a,e.firstChild);t(e)}else{l=document.querySelector("#argon");if(l){l.insertBefore(a,l.firstChild);t(l)}else{d.then(function(e){e.insertBefore(a,e.firstChild);t(e)})}i.focusService.focusEvent.addEventListener(function(){d.then(function(e){e.classList.remove("argon-no-focus");e.classList.add("argon-focus")})});i.focusService.blurEvent.addEventListener(function(){d.then(function(e){e.classList.remove("argon-focus");e.classList.add("argon-no-focus")})})}})}if(this.sessionService.isRealityManager){this.sessionService.connectEvent.addEventListener(function(e){e.on["ar.viewport.desired"]=function(t){i.desiredViewportMap.set(e,t)}})}this.contextService.renderEvent.addEventListener(function(){var e=i.contextService.serializedFrameState;var t=i._subviewEntities;t.length=0;e.view.subviews.forEach(function(r,n){var a="ar.view_"+n;e.entities[a]=r.pose||e.view.pose;i.contextService.updateEntityFromFrameState(a,e);delete e.entities[a];t[n]=i.contextService.entities.getById(a)});i._update()})}e.prototype.getSubviews=function(e){var t=this;this._update();var r=this._subviews;r.length=this._current.subviews.length;this._current.subviews.forEach(function(n,i){var o=t._subviewEntities[i];var s=r[i]=r[i]||{};s.index=i;s.type=n.type;s.pose=t.contextService.getEntityPose(o,e);s.viewport=n.viewport||t._current.viewport;s.frustum=t._frustums[i];if(!s.frustum){s.frustum=t._frustums[i]=new a.PerspectiveFrustum;s.frustum.near=.01;s.frustum.far=1e7}s.frustum.fov=n.frustum.fov;s.frustum.aspectRatio=n.frustum.aspectRatio||s.viewport.width/s.viewport.height;s.frustum.xOffset=n.frustum.xOffset||0;s.frustum.yOffset=n.frustum.yOffset||0;s.projectionMatrix=n.projectionMatrix||s.frustum.infiniteProjectionMatrix});return r};e.prototype.getViewport=function(){return this._current.viewport};e.prototype.setDesiredViewport=function(e){this.sessionService.manager.send("ar.view.desiredViewport",e)};e.prototype.requestOwnership=function(){};e.prototype.releaseOwnership=function(){};e.prototype.isOwner=function(){};e.prototype._update=function(){var e=this;var t=this.contextService.serializedFrameState;if(!t)throw new Error("Expected state to be defined");var r=t.view;var n=JSON.stringify(r.viewport);var i=this._current&&this._current.viewport;this._current=r;if(!this._currentViewportJSON||this._currentViewportJSON!==n){this._currentViewportJSON=n;if(this.element){requestAnimationFrame(function(){var t=r.viewport;e.element.style.left=t.x+"px";e.element.style.bottom=t.y+"px";e.element.style.width=t.width+"px";e.element.style.height=t.height+"px"})}this.viewportChangeEvent.raiseEvent({previous:i})}};e=n([i.inject("containerElement",o.SessionService,f.FocusService,s.ContextService)],e); return e}();e("ViewService",h);v=function(){function e(e,t,r,n){var i=this;this.viewService=e;this.realityService=t;this.contextService=r;this.sessionService=n;if(this.sessionService.isRealityManager){this.viewService.containingElementPromise.then(function(e){e.style.pointerEvents="auto";var t=-1;if(typeof PointerEvent!=="undefined"){var r=new Array;var n=-1;var a=1;var o=function(e){for(var t=0;t=0;s--)if(o=e[s])a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a;return i>3&&a&&Object.defineProperty(t,r,a),a};var a,o,s,u;var f;return{setters:[function(e){a=e},function(e){o=e},function(e){s=e},function(e){u=e}],execute:function(){f=function(e){n(t,e);function t(t,r){var n=this;e.call(this);this.sessionService=t;this.viewService=r;this.type="hosted";this.iframeElement=document.createElement("iframe");this.iframeElement.style.border="0";this.iframeElement.width="100%";this.iframeElement.height="100%";r.containingElementPromise.then(function(e){e.insertBefore(n.iframeElement,e.firstChild)})}t.prototype.load=function(e,t){var r=this;this.viewService.containingElementPromise.then(function(n){var i=function(n){if(n.data.type!=="ARGON_SESSION")return;var a=n.ports&&n.ports[0];if(!a)throw new Error("Received an ARGON_SESSION message without a MessagePort object");var o=0;var s;while(o-1;m--){v=p[m];l(e,S,b,v)}}for(d=n-1;d>=0;d--){w=r[d];w.collectionChanged.addEventListener(h.prototype._onCollectionChanged,e);p=w.values;b=w.id;for(m=p.length-1;m>-1;m--){v=p[m];c(e,S,b,v);var T=g.getById(v.id);if(!t(T)){T=y.getById(v.id);if(!t(T)){s.id=v.id;T=new a(s)}else{f(T)}g.add(T)}T.merge(v)}}e._collectionsCopy=r.slice(0);y.suspendEvents();y.removeAll();var _=g.values;for(d=0;d<_.length;d++){y.add(_[d])}y.resumeEvents()}function h(r,n){this._owner=n;this._composite=new o(this);this._suspendCount=0;this._collections=t(r)?r.slice():[];this._collectionsCopy=[];this._id=e();this._eventHash={};d(this);this._shouldRecomposite=false}r(h.prototype,{collectionChanged:{get:function(){return this._composite._collectionChanged}},id:{get:function(){return this._id}},values:{get:function(){return this._composite.values}},owner:{get:function(){return this._owner}}});h.prototype.addCollection=function(e,r){var i=t(r);if(!t(e)){throw new n("collection is required.")}if(i){if(r<0){throw new n("index must be greater than or equal to zero.")}else if(r>this._collections.length){throw new n("index must be less than or equal to the number of collections.")}}if(!i){r=this._collections.length;this._collections.push(e)}else{this._collections.splice(r,0,e)}d(this)};h.prototype.removeCollection=function(e){var t=this._collections.indexOf(e);if(t!==-1){this._collections.splice(t,1);d(this);return true}return false};h.prototype.removeAllCollections=function(){this._collections.length=0;d(this)};h.prototype.containsCollection=function(e){return this._collections.indexOf(e)!==-1};h.prototype.contains=function(e){return this._composite.contains(e)};h.prototype.indexOfCollection=function(e){return this._collections.indexOf(e)};h.prototype.getCollection=function(e){if(!t(e)){throw new n("index is required.","index")}return this._collections[e]};h.prototype.getCollectionsLength=function(){return this._collections.length};function v(e,r){if(!t(r)){throw new n("collection is required.")}var i=e.indexOf(r);if(i===-1){throw new n("collection is not in this composite.")}return i}function p(e,t,r){var n=e._collections;t=i.clamp(t,0,n.length-1);r=i.clamp(r,0,n.length-1);if(t===r){return}var a=n[t];n[t]=n[r];n[r]=a;d(e)}h.prototype.raiseCollection=function(e){var t=v(this._collections,e);p(this,t,t+1)};h.prototype.lowerCollection=function(e){var t=v(this._collections,e);p(this,t,t-1)};h.prototype.raiseCollectionToTop=function(e){var t=v(this._collections,e);if(t===this._collections.length-1){return}this._collections.splice(t,1);this._collections.push(e);d(this)};h.prototype.lowerCollectionToBottom=function(e){var t=v(this._collections,e);if(t===0){return}this._collections.splice(t,1);this._collections.splice(0,0,e);d(this)};h.prototype.suspendEvents=function(){this._suspendCount++;this._composite.suspendEvents()};h.prototype.resumeEvents=function(){if(this._suspendCount===0){throw new n("resumeEvents can not be called before suspendEvents.")}this._suspendCount--;if(this._shouldRecomposite&&this._suspendCount===0){d(this);this._shouldRecomposite=false}this._composite.resumeEvents()};h.prototype.computeAvailability=function(){return this._composite.computeAvailability()};h.prototype.getById=function(e){return this._composite.getById(e)};h.prototype._onCollectionChanged=function(e,r,n){var i=this._collectionsCopy;var o=i.length;var u=this._composite;u.suspendEvents();var d;var h;var v;var p;var m=n.length;var w=this._eventHash;var y=e.id;for(d=0;d=0;h--){v=i[h].getById(S);if(t(v)){if(!t(p)){p=u.getById(S);f(p)}p.merge(v)}}if(!t(p)){u.removeById(S)}p=undefined}var b=r.length;for(d=0;d=0;h--){v=i[h].getById(_);if(t(v)){if(!t(p)){p=u.getById(_);if(!t(p)){s.id=_;p=new a(s);u.add(p)}else{f(p)}}p.merge(v)}}p=undefined}u.resumeEvents()};h.prototype._onDefinitionChanged=function(e,r,n,i){var a=this._collections;var o=this._composite;var s=a.length;var u=e.id;var f=o.getById(u);var c=f[r];var l=!t(c);var d=true;for(var h=s-1;h>=0;h--){var v=a[h].getById(e.id);if(t(v)){var p=v[r];if(t(p)){if(d){d=false;if(t(p.merge)&&t(p.clone)){c=p.clone(c)}else{c=p;break}}c.merge(p)}}}if(l&&f.propertyNames.indexOf(r)===-1){f.addProperty(r)}f[r]=c};return h})})();(function(){var t=e.amdDefine;t("2a",["1a","1b","1c"],function(e,t,r){"use strict";function n(){this._array=[];this._hash={}}t(n.prototype,{length:{get:function(){return this._array.length}},values:{get:function(){return this._array}}});n.prototype.contains=function(t){if(typeof t!=="string"&&typeof t!=="number"){throw new r("key is required to be a string or number.")}return e(this._hash[t])};n.prototype.set=function(e,t){if(typeof e!=="string"&&typeof e!=="number"){throw new r("key is required to be a string or number.")}var n=this._hash[e];if(t!==n){this.remove(e);this._hash[e]=t;this._array.push(t)}};n.prototype.get=function(e){if(typeof e!=="string"&&typeof e!=="number"){throw new r("key is required to be a string or number.")}return this._hash[e]};n.prototype.remove=function(t){if(e(t)&&typeof t!=="string"&&typeof t!=="number"){throw new r("key is required to be a string or number.")}var n=this._hash[t];var i=e(n);if(i){var a=this._array;a.splice(a.indexOf(n),1);delete this._hash[t]}return i};n.prototype.removeAll=function(){var e=this._array;if(e.length>0){this._hash={};e.length=0}};return n})})();(function(){var t=e.amdDefine;t("26",[],function(){"use strict";function e(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=Math.random()*16|0;var r=e==="x"?t:t&3|8;return r.toString(16)})}return e})})();(function(){var t=e.amdDefine;t("2b",["2c","23","1a","1b","1c","1d","2d","2e"],function(e,t,r,n,i,a,o,s){"use strict";function u(r,n){this._definitionChanged=new a;this._value=e.clone(r);this._referenceFrame=t(n,o.FIXED)}n(u.prototype,{isConstant:{get:function(){return!r(this._value)||this._referenceFrame===o.FIXED}},definitionChanged:{get:function(){return this._definitionChanged}},referenceFrame:{get:function(){return this._referenceFrame}}});u.prototype.getValue=function(e,t){return this.getValueInReferenceFrame(e,o.FIXED,t)};u.prototype.setValue=function(t,n){var i=false;if(!e.equals(this._value,t)){i=true;this._value=e.clone(t)}if(r(n)&&this._referenceFrame!==n){i=true;this._referenceFrame=n}if(i){this._definitionChanged.raiseEvent(this)}};u.prototype.getValueInReferenceFrame=function(e,t,n){if(!r(e)){throw new i("time is required.")}if(!r(t)){throw new i("referenceFrame is required.")}return s.convertToReferenceFrame(e,this._value,this._referenceFrame,t,n)};u.prototype.equals=function(t){return this===t||t instanceof u&&e.equals(this._value,t._value)&&this._referenceFrame===t._referenceFrame};return u})})();(function(){var t=e.amdDefine;t("2f",["23","1a","1b","1c","1d"],function(e,t,r,n,i){"use strict";function a(e){this._value=undefined;this._hasClone=false;this._hasEquals=false;this._definitionChanged=new i;this.setValue(e)}r(a.prototype,{isConstant:{value:true},definitionChanged:{get:function(){return this._definitionChanged}}});a.prototype.getValue=function(e,t){return this._hasClone?this._value.clone(t):this._value};a.prototype.setValue=function(e){var r=this._value;if(r!==e){var n=t(e);var i=n&&typeof e.clone==="function";var a=n&&typeof e.equals==="function";this._hasClone=i;this._hasEquals=a;var o=!a||!e.equals(r);if(o){this._value=!i?e:e.clone();this._definitionChanged.raiseEvent(this)}}};a.prototype.equals=function(e){return this===e||e instanceof a&&(!this._hasEquals&&this._value===e._value||this._hasEquals&&this._value.equals(e._value))};return a})})();(function(){var t=e.amdDefine;t("30",["23","1a","2f"],function(e,t,r){"use strict";function n(e,r,n,i,a){return{configurable:i,get:function(){return this[r]},set:function(i){var o=this[r];var s=this[n];if(t(s)){s();this[n]=undefined}var u=t(i);if(u&&!t(i.getValue)&&t(a)){i=a(i)}if(o!==i){this[r]=i;this._definitionChanged.raiseEvent(this,e,i,o)}if(t(i)&&t(i.definitionChanged)){this[n]=i.definitionChanged.addEventListener(function(){this._definitionChanged.raiseEvent(this,e,i,i)},this)}}}}function i(e){return new r(e)}function a(t,r,a){return n(t,"_"+t.toString(),"_"+t.toString()+"Subscription",e(r,false),e(a,i))}return a})})();(function(){var t=e.amdDefine;t("31",["30"],function(e){"use strict";function t(e){return e}function r(r,n){return e(r,n,t)}return r})})();(function(){var t=e.amdDefine;t("28",["2c","26","23","1a","1b","1c","1d","32","33","34","35","@empty","@empty","2b","@empty","30","31","@empty","@empty","@empty","@empty","@empty","@empty","@empty","@empty","@empty","@empty","36","@empty","@empty"],function(e,t,r,n,i,a,o,s,u,f,c,l,d,h,v,p,m,w,y,g,S,b,T,_,E,M,P,A,C,I){"use strict";function x(e){return new h(e)}function R(e){return p(e,undefined,x)}function O(e,t){return p(e,undefined,function(e){if(e instanceof t){return e}return new t(e)})}function D(e){e=r(e,r.EMPTY_OBJECT);var i=e.id;if(!n(i)){i=t()}this._availability=undefined;this._id=i;this._definitionChanged=new o;this._name=e.name;this._show=r(e.show,true);this._parent=undefined;this._propertyNames=["billboard","box","corridor","cylinder","description","ellipse","ellipsoid","label","model","orientation","path","point","polygon","polyline","polylineVolume","position","rectangle","viewFrom","wall"];this._billboard=undefined;this._billboardSubscription=undefined;this._box=undefined;this._boxSubscription=undefined;this._corridor=undefined;this._corridorSubscription=undefined;this._cylinder=undefined;this._cylinderSubscription=undefined;this._description=undefined;this._descriptionSubscription=undefined;this._ellipse=undefined;this._ellipseSubscription=undefined;this._ellipsoid=undefined;this._ellipsoidSubscription=undefined;this._label=undefined;this._labelSubscription=undefined;this._model=undefined;this._modelSubscription=undefined;this._orientation=undefined;this._orientationSubscription=undefined;this._path=undefined;this._pathSubscription=undefined;this._point=undefined;this._pointSubscription=undefined;this._polygon=undefined;this._polygonSubscription=undefined;this._polyline=undefined;this._polylineSubscription=undefined;this._polylineVolume=undefined;this._polylineVolumeSubscription=undefined;this._position=undefined;this._positionSubscription=undefined;this._rectangle=undefined;this._rectangleSubscription=undefined;this._viewFrom=undefined;this._viewFromSubscription=undefined;this._wall=undefined;this._wallSubscription=undefined;this._children=[];this.entityCollection=undefined;this.parent=e.parent;this.merge(e)}function q(e,t,r){var n=t.length;for(var i=0;i0){for(f=0;f=Math.PI){throw new r("fov must be in the range [0, PI).")}if(t.aspectRatio<0){throw new r("aspectRatio must be positive.")}if(t.near<0||t.near>t.far){throw new r("near must be greater than zero and less than far.")}t._aspectRatio=t.aspectRatio;t._fov=t.fov;t._fovy=t.aspectRatio<=1?t.fov:Math.atan(Math.tan(t.fov*.5)/t.aspectRatio)*2;t._near=t.near;t._far=t.far;t._sseDenominator=2*Math.tan(.5*t._fovy);t._xOffset=t.xOffset;t._yOffset=t.yOffset;n.top=t.near*Math.tan(.5*t._fovy);n.bottom=-n.top;n.right=t.aspectRatio*n.top;n.left=-n.right;n.near=t.near;n.far=t.far;n.right+=t.xOffset;n.left+=t.xOffset;n.top+=t.yOffset;n.bottom+=t.yOffset}}t(i.prototype,{projectionMatrix:{get:function(){a(this);return this._offCenterFrustum.projectionMatrix}},infiniteProjectionMatrix:{get:function(){a(this);return this._offCenterFrustum.infiniteProjectionMatrix}},fovy:{get:function(){a(this);return this._fovy}},sseDenominator:{get:function(){a(this);return this._sseDenominator}}});i.prototype.computeCullingVolume=function(e,t,r){a(this);return this._offCenterFrustum.computeCullingVolume(e,t,r)};i.prototype.getPixelDimensions=function(e,t,r,n){a(this);return this._offCenterFrustum.getPixelDimensions(e,t,r,n); diff --git a/test/index.html b/test/index.html index b69a49d..4169053 100644 --- a/test/index.html +++ b/test/index.html @@ -12,7 +12,7 @@