diff --git a/resources/regexes.php b/resources/regexes.php index de582b4..1aa2169 100644 --- a/resources/regexes.php +++ b/resources/regexes.php @@ -59,9 +59,9 @@ ], ['regex' => '@(TopPodcasts)Pro/(\\d+) CFNetwork@'], ['regex' => '@(MusicDownloader)Lite/(\\d+)\\.(\\d+)\\.(\\d+) CFNetwork@'], - ['regex' => '@^(.*)-iPad\\/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork@'], - ['regex' => '@^(.*)-iPhone/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork@'], - ['regex' => '@^(.*)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork@'], + ['regex' => '@^(.{0,200})-iPad\\/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork@'], + ['regex' => '@^(.{0,200})-iPhone/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork@'], + ['regex' => '@^(.{0,200})/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork@'], ['regex' => '@^(Luminary)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'], [ 'regex' => '@(espn\\.go)@', @@ -92,6 +92,10 @@ 'regex' => '@(PingdomTMS)/(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'PingdomBot', ], + [ + 'regex' => '@(PingdomPageSpeed)/(\\d+)\\.(\\d+)@', + 'family_replacement' => 'PingdomBot', + ], [ 'regex' => '@ (PTST)/(\\d+)(?:\\.(\\d+)|)$@', 'family_replacement' => 'WebPageTest.org bot', @@ -106,7 +110,7 @@ 'family_replacement' => 'Tableau', ], [ - 'regex' => '@AppleWebKit/\\d+\\.\\d+.* Safari.* (CreativeCloud)/(\\d+)\\.(\\d+).(\\d+)@', + 'regex' => '@AppleWebKit/\\d{1,10}\\.\\d{1,10}.{0,200} Safari.{0,200} (CreativeCloud)/(\\d+)\\.(\\d+).(\\d+)@', 'family_replacement' => 'Adobe CreativeCloud', ], ['regex' => '@(Salesforce)(?:.)\\/(\\d+)\\.(\\d?)@'], @@ -119,7 +123,7 @@ 'family_replacement' => 'FacebookBot', ], [ - 'regex' => '@Google.*/\\+/web/snippet@', + 'regex' => '@Google.{0,50}/\\+/web/snippet@', 'family_replacement' => 'GooglePlusBot', ], [ @@ -135,66 +139,83 @@ 'family_replacement' => 'Twitterbot', ], ['regex' => '@/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \\-](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'], - ['regex' => '@\\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'], + ['regex' => '@\\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|Pandora|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'], [ - 'regex' => '@(MSIE) (\\d+)\\.(\\d+)([a-z]\\d|[a-z]|);.* MSIECrawler@', + 'regex' => '@(MSIE) (\\d+)\\.(\\d+)([a-z]\\d|[a-z]|);.{0,200} MSIECrawler@', 'family_replacement' => 'MSIECrawler', ], ['regex' => '@(DAVdroid)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'], - ['regex' => '@(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest|axios|unirest-(?:java|python|ruby|nodejs|php|net))(?:[ /](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@'], + ['regex' => '@(Google-HTTP-Java-Client|Apache-HttpClient|PostmanRuntime|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest|axios|unirest-(?:java|python|ruby|nodejs|php|net))(?:[ /](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@'], [ 'regex' => '@(Pinterest(?:bot|))/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)[;\\s(]+\\+https://www.pinterest.com/bot.html@', 'family_replacement' => 'Pinterestbot', ], - ['regex' => '@(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\\/\\$BotVersion|123metaspider-Bot|1470\\.net crawler|50\\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\\b\\w{0,30}favicon\\w{0,30}\\b|\\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\\(S\\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\\.almaden\\.ibm\\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\\.ze\\.bz|ZooShot|ZyBorg|ArcGIS Hub Indexer)(?:[ /]v?(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)|)@'], - ['regex' => '@\\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?|dotnet-(?:\\d{1,2}|core)))|s3fs)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'], + ['regex' => '@(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\\/\\$BotVersion|123metaspider-Bot|1470\\.net crawler|50\\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\\b\\w{0,30}favicon\\w{0,30}\\b|\\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\\(S\\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|GoogleOther|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PHPCrawl|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\\.almaden\\.ibm\\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\\.ze\\.bz|ZooShot|ZyBorg|ArcGIS Hub Indexer|GPTBot|Google-InspectionTool)(?:[ /]v?(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)|)@'], + ['regex' => '@\\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|go-v\\d|java|nodejs|ruby2?|dotnet-(?:\\d{1,2}|core)))|s3fs)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'], ['regex' => '@(FME)\\/(\\d+\\.\\d+)\\.(\\d+)\\.(\\d+)@'], ['regex' => '@(QGIS)\\/(\\d)\\.?0?(\\d{1,2})\\.?0?(\\d{1,2})@'], ['regex' => '@(JOSM)/(\\d+)\\.(\\d+)@'], ['regex' => '@(Tygron Platform) \\((\\d+)\\.(\\d+)\\.(\\d+(?:\\.\\d+| RC \\d+\\.\\d+))@'], [ - 'regex' => '@\\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)@', + 'regex' => '@\\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)|)@', 'family_replacement' => 'Facebook Messenger', ], [ - 'regex' => '@\\[FB.*;(FBAV)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@', + 'regex' => '@\\[FB.{0,300};(FBAV)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@', 'family_replacement' => 'Facebook', ], [ - 'regex' => '@\\[FB.*;@', + 'regex' => '@\\[FB.{0,300};@', 'family_replacement' => 'Facebook', ], - ['regex' => '@(?:\\/[A-Za-z0-9\\.]+|) {0,5}([A-Za-z0-9 \\-_\\!\\[\\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)@'], - ['regex' => '@((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\\b(?:(?:[ /]| v)(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@'], - ['regex' => '@((?:[A-z0-9]{1,50}|[A-z\\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@'], + ['regex' => '@(RecipeRadar)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'], + ['regex' => '@^.{0,200}?(?:\\/[A-Za-z0-9\\.]{0,50}|) {0,2}([A-Za-z0-9 \\-_\\!\\[\\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)@'], + ['regex' => '@^.{0,200}?((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\\b(?:(?:[ /]| v)(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@'], + ['regex' => '@^.{0,200}?((?:[A-z0-9]{1,50}|[A-z\\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@'], ['regex' => '@(HbbTV)/(\\d+)\\.(\\d+)\\.(\\d+) \\(@'], ['regex' => '@(Chimera|SeaMonkey|Camino|Waterfox)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*|)@'], [ 'regex' => '@(SailfishBrowser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@', 'family_replacement' => 'Sailfish Browser', ], - ['regex' => '@\\[(Pinterest)/[^\\]]+\\]@'], + ['regex' => '@\\[(Pinterest)/[^\\]]{1,50}\\]@'], ['regex' => '@(Pinterest)(?: for Android(?: Tablet|)|)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'], - ['regex' => '@Mozilla.*Mobile.*(Instagram).(\\d+)\\.(\\d+)\\.(\\d+)@'], - ['regex' => '@Mozilla.*Mobile.*(Flipboard).(\\d+)\\.(\\d+)\\.(\\d+)@'], - ['regex' => '@Mozilla.*Mobile.*(Flipboard-Briefing).(\\d+)\\.(\\d+)\\.(\\d+)@'], - ['regex' => '@Mozilla.*Mobile.*(Onefootball)\\/Android.(\\d+)\\.(\\d+)\\.(\\d+)@'], + ['regex' => '@Mozilla.{1,200}Mobile.{1,100}(Instagram).(\\d+)\\.(\\d+)\\.(\\d+)@'], + ['regex' => '@Mozilla.{1,200}Mobile.{1,100}(Flipboard).(\\d+)\\.(\\d+)\\.(\\d+)@'], + ['regex' => '@Mozilla.{1,200}Mobile.{1,100}(Flipboard-Briefing).(\\d+)\\.(\\d+)\\.(\\d+)@'], + ['regex' => '@Mozilla.{1,200}Mobile.{1,100}(Onefootball)\\/Android.(\\d+)\\.(\\d+)\\.(\\d+)@'], ['regex' => '@(Snapchat)\\/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@'], [ 'regex' => '@(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\\/(\\d+)\\.(\\d+)|)@', 'family_replacement' => 'Twitter', ], [ - 'regex' => '@Mozilla.*Mobile.*AspiegelBot@', + 'regex' => '@(musical_ly) app_version\\/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'TikTok', + ], + [ + 'regex' => '@(musical_ly_)(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'TikTok', + ], + [ + 'regex' => '@(BytedanceWebview)\\/[a-z0-9]+@', + 'family_replacement' => 'TikTok', + ], + [ + 'regex' => '@Mozilla.{1,200}Mobile.{1,100}(KAKAOTALK)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'KakaoTalk', + ], + [ + 'regex' => '@Mozilla.{1,200}Mobile.{1,100}(Phantom\\/ios|Phantom\\/android).(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Phantom', + ], + [ + 'regex' => '@Mozilla.{1,100}Mobile.{1,100}(AspiegelBot|PetalBot)@', 'family_replacement' => 'Spider', - 'brand_replacement' => 'Spider', - 'model_replacement' => 'Smartphone', ], [ - 'regex' => '@AspiegelBot@', + 'regex' => '@AspiegelBot|PetalBot@', 'family_replacement' => 'Spider', - 'brand_replacement' => 'Spider', - 'model_replacement' => 'Desktop', ], [ 'regex' => '@(Firefox)/(\\d+)\\.(\\d+) Basilisk/(\\d+)@', @@ -217,7 +238,7 @@ 'family_replacement' => 'Firefox Mobile', ], [ - 'regex' => '@(?:Mobile|Tablet);.*(Firefox)/(\\d+)\\.(\\d+)@', + 'regex' => '@(?:Mobile|Tablet);.{0,200}(Firefox)/(\\d+)\\.(\\d+)@', 'family_replacement' => 'Firefox Mobile', ], [ @@ -245,7 +266,7 @@ 'family_replacement' => 'Firefox ($1)', ], [ - 'regex' => '@(Firefox).*Tablet browser (\\d+)\\.(\\d+)\\.(\\d+)@', + 'regex' => '@(Firefox).{0,200}Tablet browser (\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'MicroB', ], ['regex' => '@(MozillaDeveloperPreview)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*|)@'], @@ -275,31 +296,31 @@ 'regex' => '@(UC? ?Browser|UCWEB|U3)[ /]?(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'UC Browser', ], - ['regex' => '@(Opera Tablet).*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'], + ['regex' => '@(Opera Tablet).{0,200}Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'], ['regex' => '@(Opera Mini)(?:/att|)/?(\\d+|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'], [ - 'regex' => '@(Opera)/.+Opera Mobi.+Version/(\\d+)\\.(\\d+)@', + 'regex' => '@(Opera)/.{1,100}Opera Mobi.{1,100}Version/(\\d+)\\.(\\d+)@', 'family_replacement' => 'Opera Mobile', ], [ - 'regex' => '@(Opera)/(\\d+)\\.(\\d+).+Opera Mobi@', + 'regex' => '@(Opera)/(\\d+)\\.(\\d+).{1,100}Opera Mobi@', 'family_replacement' => 'Opera Mobile', ], [ - 'regex' => '@Opera Mobi.+(Opera)(?:/|\\s+)(\\d+)\\.(\\d+)@', + 'regex' => '@Opera Mobi.{1,100}(Opera)(?:/|\\s+)(\\d+)\\.(\\d+)@', 'family_replacement' => 'Opera Mobile', ], [ 'regex' => '@Opera Mobi@', 'family_replacement' => 'Opera Mobile', ], - ['regex' => '@(Opera)/9.80.*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'], + ['regex' => '@(Opera)/9.80.{0,200}Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'], [ - 'regex' => '@(?:Mobile Safari).*(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'regex' => '@(?:Mobile Safari).{1,300}(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'Opera Mobile', ], [ - 'regex' => '@(?:Chrome).*(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'regex' => '@(?:Chrome).{1,300}(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'Opera', ], [ @@ -311,7 +332,7 @@ 'family_replacement' => 'Opera Mini', ], [ - 'regex' => '@Chrome/.+( MMS)/(\\d+).(\\d+).(\\d+)@', + 'regex' => '@Chrome/.{1,200}( MMS)/(\\d+).(\\d+).(\\d+)@', 'family_replacement' => 'Opera Neon', ], [ @@ -355,7 +376,7 @@ ], ['regex' => '@(Symphony) (\\d+).(\\d+)@'], [ - 'regex' => '@PLAYSTATION 3.+WebKit@', + 'regex' => '@PLAYSTATION 3.{1,200}WebKit@', 'family_replacement' => 'NetFront NX', ], [ @@ -371,26 +392,51 @@ 'family_replacement' => 'NetFront NX', ], [ - 'regex' => '@AppleWebKit.+ (NX)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'regex' => '@AppleWebKit.{1,200} (NX)/(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'NetFront NX', ], [ 'regex' => '@(Nintendo 3DS)@', 'family_replacement' => 'NetFront NX', ], + [ + 'regex' => '@(HuaweiBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.\\d+@', + 'family_replacement' => 'Huawei Browser', + ], + [ + 'regex' => '@(AVG)/(\\d+)\\.(\\d+)\\.(\\d+)\\.\\d+@', + 'family_replacement' => 'AVG', + ], + [ + 'regex' => '@(AvastSecureBrowser|Avast)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Avast Secure Browser', + ], + ['regex' => '@(Instabridge)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'], + [ + 'regex' => '@(AlohaBrowser|ABB)/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@', + 'family_replacement' => 'Aloha Browser', + ], + [ + 'regex' => '@((?:B|b)rave(?:\\sChrome)?)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@', + 'family_replacement' => 'Brave', + ], [ 'regex' => '@(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+)|)@', 'family_replacement' => 'Amazon Silk', ], ['regex' => '@(Puffin)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'], [ - 'regex' => '@Windows Phone .*(Edge)/(\\d+)\\.(\\d+)@', + 'regex' => '@Windows Phone .{0,200}(Edge)/(\\d+)\\.(\\d+)@', 'family_replacement' => 'Edge Mobile', ], [ - 'regex' => '@(EdgiOS|EdgA)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', + 'regex' => '@(EdgiOS|EdgA)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@', 'family_replacement' => 'Edge Mobile', ], + [ + 'regex' => '@(OculusBrowser)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+)|)@', + 'family_replacement' => 'Oculus Browser', + ], [ 'regex' => '@(SamsungBrowser)/(\\d+)\\.(\\d+)@', 'family_replacement' => 'Samsung Internet', @@ -403,14 +449,6 @@ 'regex' => '@(coc_coc_browser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@', 'family_replacement' => 'Coc Coc', ], - [ - 'regex' => '@(baidubrowser)[/\\s](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@', - 'family_replacement' => 'Baidu Browser', - ], - [ - 'regex' => '@(FlyFlow)/(\\d+)\\.(\\d+)@', - 'family_replacement' => 'Baidu Explorer', - ], [ 'regex' => '@(MxBrowser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@', 'family_replacement' => 'Maxthon', @@ -433,9 +471,17 @@ 'family_replacement' => 'TopBuzz', ], [ - 'regex' => '@Mozilla.+Android.+(GSA)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'regex' => '@Mozilla.{1,200}Android.{1,200}(GSA)/(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'Google', ], + [ + 'regex' => '@(baidubrowser)[/\\s](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@', + 'family_replacement' => 'Baidu Browser', + ], + [ + 'regex' => '@(FlyFlow|flyflow|baiduboxapp)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@', + 'family_replacement' => 'Baidu Explorer', + ], [ 'regex' => '@(MQQBrowser/Mini)(?:(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@', 'family_replacement' => 'QQ Browser Mini', @@ -449,11 +495,49 @@ 'family_replacement' => 'QQ Browser', ], [ - 'regex' => '@Version/.+(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', + 'regex' => '@Mozilla.{1,200}Mobile.{1,100}(DuckDuckGo)/(\\d+)@', + 'family_replacement' => 'DuckDuckGo Mobile', + ], + [ + 'regex' => '@Mozilla.{1,200}(DuckDuckGo)/(\\d+)@', + 'family_replacement' => 'DuckDuckGo', + ], + [ + 'regex' => '@Mozilla.{1,200}Mobile.{1,100}(Ddg)/(\\d+)(?:\\.(\\d+)|)@', + 'family_replacement' => 'DuckDuckGo Mobile', + ], + [ + 'regex' => '@Mozilla.{1,200}(Ddg)/(\\d+)(?:\\.(\\d+)|)@', + 'family_replacement' => 'DuckDuckGo', + ], + [ + 'regex' => '@(Tenta/)(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Tenta Browser', + ], + [ + 'regex' => '@(Ecosia) ios\\@(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@', + 'family_replacement' => 'Ecosia iOS', + ], + [ + 'regex' => '@(Ecosia) android\\@(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@', + 'family_replacement' => 'Ecosia Android', + ], + ['regex' => '@(VivoBrowser)\\/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'], + ['regex' => '@(HiBrowser)\\/v(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@'], + [ + 'regex' => '@(weibo)__(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Weibo', + ], + [ + 'regex' => '@(WeiboliteiOS|WeiboIntliOS)@', + 'family_replacement' => 'Weibo', + ], + [ + 'regex' => '@Version/.{1,300}(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'Chrome Mobile WebView', ], [ - 'regex' => '@; wv\\).+(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', + 'regex' => '@; wv\\).{1,300}(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'Chrome Mobile WebView', ], [ @@ -461,7 +545,7 @@ 'family_replacement' => 'Chrome Mobile', ], [ - 'regex' => '@(CriOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', + 'regex' => '@(CriOS)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@', 'family_replacement' => 'Chrome Mobile iOS', ], [ @@ -469,7 +553,7 @@ 'family_replacement' => 'Chrome Mobile', ], [ - 'regex' => '@ Mobile .*(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', + 'regex' => '@ Mobile .{1,300}(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'Chrome Mobile', ], [ @@ -495,7 +579,11 @@ 'family_replacement' => 'Yandex Browser', ], [ - 'regex' => '@(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+).* MRCHROME@', + 'regex' => '@(YaSearchBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Yandex Browser', + ], + [ + 'regex' => '@(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+).{0,100} MRCHROME@', 'family_replacement' => 'Mail.ru Chromium Browser', ], ['regex' => '@(AOL) (\\d+)\\.(\\d+); AOLBuild (\\d+)@'], @@ -511,6 +599,95 @@ ], ['regex' => '@(1Password)/(\\d+)\\.(\\d+)\\.(\\d+)@'], ['regex' => '@(Ghost)/(\\d+)\\.(\\d+)\\.(\\d+)@'], + ['regex' => '@PAN (GlobalProtect)/(\\d+)\\.(\\d+)\\.(\\d+) .{1,100} \\(X11; Linux x86_64\\)@'], + [ + 'regex' => '@^(surveyon)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Surveyon', + ], + [ + 'regex' => '@(115Browser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => '115 Browser', + ], + [ + 'regex' => '@(Avira)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Avira', + ], + [ + 'regex' => '@(CCleaner)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'CCleaner', + ], + [ + 'regex' => '@(Norton)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Norton', + ], + [ + 'regex' => '@(Quark)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Quark', + ], + [ + 'regex' => '@(QuarkPC)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Quark PC', + ], + [ + 'regex' => '@(SLBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) SLBChan/(\\d+)@', + 'family_replacement' => 'Smart Lenovo Browser', + ], + [ + 'regex' => '@(Atom)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Atom Browser', + ], + [ + 'regex' => '@(Chrome)/\\d+\\.\\d+\\.\\d+\\.\\d+ .* QIHU 360(?:SEi18n|ENT)@', + 'family_replacement' => '360 Secure Browser', + ], + [ + 'regex' => '@(Decentr)@', + 'family_replacement' => 'Decentr Web3 Browser', + ], + [ + 'regex' => '@(Sparrow)@', + 'family_replacement' => 'Sparrow Browser', + ], + [ + 'regex' => '@(Chromium GOST)@', + 'family_replacement' => 'Chromium GOST Browser', + ], + [ + 'regex' => '@(AOLShield)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'AOL Shield Browser', + ], + [ + 'regex' => '@(Hola)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Hola Browser', + ], + [ + 'regex' => '@(CravingExplorer)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Craving Explorer Browser', + ], + [ + 'regex' => '@(Talon)@', + 'family_replacement' => 'Talon Cyber Security Browser', + ], + [ + 'regex' => '@(Qaxbrowser)@', + 'family_replacement' => 'QAX Browser', + ], + [ + 'regex' => '@(ADG)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'AOL Desktop Gold Browser', + ], + [ + 'regex' => '@(SberBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Sber Browser', + ], + [ + 'regex' => '@(JiSu)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'JiSu Browser', + ], + [ + 'regex' => '@(Wolvic)/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'family_replacement' => 'Wolvic Browser', + ], [ 'regex' => '@(Slack_SSB)/(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'Slack Desktop Client', @@ -542,7 +719,7 @@ ], ['regex' => '@Microsoft Office (Word) 2014@'], [ - 'regex' => '@Outlook-Express\\/7\\.0.*@', + 'regex' => '@Outlook-Express\\/7\\.0@', 'family_replacement' => 'Windows Live Mail', ], ['regex' => '@(Airmail) (\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'], @@ -566,17 +743,13 @@ 'regex' => '@Superhuman@', 'family_replacement' => 'Superhuman', ], - ['regex' => '@(Vivaldi)/(\\d+)\\.(\\d+)\\.(\\d+)@'], + ['regex' => '@(Vivaldi)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'], [ 'regex' => '@(Edge?)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@', 'family_replacement' => 'Edge', ], [ - 'regex' => '@(brave)/(\\d+)\\.(\\d+)\\.(\\d+) Chrome@', - 'family_replacement' => 'Brave', - ], - [ - 'regex' => '@(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)[\\d.]* Iron[^/]@', + 'regex' => '@(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)[\\d.]{0,100} Iron[^/]@', 'family_replacement' => 'Iron', ], ['regex' => '@\\b(Dolphin)(?: |HDCN/|/INT\\-)(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'], @@ -639,16 +812,16 @@ ['regex' => '@^(HTC) Streaming Player \\S+ / \\S+ / \\S+ / (\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'], ['regex' => '@^(Stitcher)/iOS@'], ['regex' => '@^(Stitcher)/Android@'], - ['regex' => '@^(VLC) .*version (\\d+)\\.(\\d+)\\.(\\d+)@'], + ['regex' => '@^(VLC) .{0,200}version (\\d+)\\.(\\d+)\\.(\\d+)@'], ['regex' => '@ (VLC) for@'], [ 'regex' => '@(vlc)/(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'VLC', ], - ['regex' => '@^(foobar)\\S+/([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)@'], - ['regex' => '@^(Clementine)\\S+ ([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)@'], + ['regex' => '@^(foobar)\\S{1,10}/(\\d+)\\.(\\d+|)\\.?([\\da-z]+|)@'], + ['regex' => '@^(Clementine)\\S{1,10} (\\d+)\\.(\\d+|)\\.?(\\d+|)@'], [ - 'regex' => '@(amarok)/([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)@', + 'regex' => '@(amarok)/(\\d+)\\.(\\d+|)\\.?(\\d+|)@', 'family_replacement' => 'Amarok', ], ['regex' => '@(Custom)-Feed Reader@'], @@ -680,7 +853,7 @@ 'v1_replacement' => '3', ], [ - 'regex' => '@(MSIE) (\\d+)\\.(\\d+).*XBLWP7@', + 'regex' => '@(MSIE) (\\d+)\\.(\\d+).{0,100}XBLWP7@', 'family_replacement' => 'IE Large Screen', ], ['regex' => '@(Nextcloud)@'], @@ -693,6 +866,15 @@ 'regex' => '@(OC)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) \\(Skype for Business\\)@', 'family_replacement' => 'Skype', ], + [ + 'regex' => '@(OpenVAS)(?:-VT)?(?:[ \\/](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@', + 'family_replacement' => 'OpenVAS Scanner', + ], + ['regex' => '@(AnyConnect)\\/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)@'], + [ + 'regex' => '@compatible; monitis@', + 'family_replacement' => 'Monitis', + ], ['regex' => '@(Obigo)InternetBrowser@'], ['regex' => '@(Obigo)\\-Browser@'], [ @@ -737,23 +919,23 @@ 'family_replacement' => 'TopBuzz', ], [ - 'regex' => '@(iPod|iPhone|iPad).+GSA/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|) Mobile@', + 'regex' => '@(iPod|iPhone|iPad).{1,200}GSA/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|) Mobile@', 'family_replacement' => 'Google', ], [ - 'regex' => '@(iPod|iPhone|iPad).+Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|).*[ +]Safari@', + 'regex' => '@(iPod|iPhone|iPad).{1,200}Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|).{1,200}[ +]Safari@', 'family_replacement' => 'Mobile Safari', ], [ - 'regex' => '@(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\\d+)_(\\d+)(?:_(\\d+)|).* AppleNews\\/\\d+\\.\\d+\\.\\d+?@', + 'regex' => '@(iPod|iPod touch|iPhone|iPad);.{0,30}CPU.{0,30}OS[ +](\\d+)_(\\d+)(?:_(\\d+)|).{0,30} AppleNews\\/\\d+\\.\\d+(?:\\.\\d+|)@', 'family_replacement' => 'Mobile Safari UI/WKWebView', ], [ - 'regex' => '@(iPod|iPhone|iPad).+Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@', + 'regex' => '@(iPod|iPhone|iPad).{1,200}Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@', 'family_replacement' => 'Mobile Safari UI/WKWebView', ], [ - 'regex' => '@(iPod|iPod touch|iPhone|iPad).* Safari@', + 'regex' => '@(iPod|iPod touch|iPhone|iPad).{0,200} Safari@', 'family_replacement' => 'Mobile Safari', ], [ @@ -819,11 +1001,11 @@ ], ['regex' => '@(Nokia)[EN]?(\\d+)@'], [ - 'regex' => '@(PlayBook).+RIM Tablet OS (\\d+)\\.(\\d+)\\.(\\d+)@', + 'regex' => '@(PlayBook).{1,200}RIM Tablet OS (\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'BlackBerry WebKit', ], [ - 'regex' => '@(Black[bB]erry|BB10).+Version/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'regex' => '@(Black[bB]erry|BB10).{1,200}Version/(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'BlackBerry WebKit', ], [ @@ -845,11 +1027,11 @@ ['regex' => '@(QtWeb) Internet Browser/(\\d+)\\.(\\d+)@'], ['regex' => '@(PhantomJS)/(\\d+)\\.(\\d+)\\.(\\d+)@'], [ - 'regex' => '@(AppleWebKit)/(\\d+)(?:\\.(\\d+)|)\\+ .* Safari@', + 'regex' => '@(AppleWebKit)/(\\d+)(?:\\.(\\d+)|)\\+ .{0,200} Safari@', 'family_replacement' => 'WebKit Nightly', ], [ - 'regex' => '@(Version)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|).*Safari/@', + 'regex' => '@(Version)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|).{0,100}Safari/@', 'family_replacement' => 'Safari', ], ['regex' => '@(Safari)/\\d+@'], @@ -892,7 +1074,7 @@ 'regex' => '@(AppleWebKit)/(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'Apple Mail', ], - ['regex' => '@(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+)@'], + ['regex' => '@(Firefox)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|$)@'], ['regex' => '@(Firefox)/(\\d+)\\.(\\d+)(pre|[ab]\\d+[a-z]*|)@'], [ 'regex' => '@([MS]?IE) (\\d+)\\.(\\d+)@', @@ -902,14 +1084,33 @@ 'regex' => '@(python-requests)/(\\d+)\\.(\\d+)@', 'family_replacement' => 'Python Requests', ], - ['regex' => '@\\b(Windows-Update-Agent|WindowsPowerShell|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|wget2|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got)(?:[ /](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@'], + ['regex' => '@\\b(Windows-Update-Agent|WindowsPowerShell|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|wget2|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got|CloudCockpitBackend|ReactorNetty|axios|Jersey|Vert.x-WebClient|Apache-CXF|Go-CF-client|go-resty|AHC|HTTPie)(?:[ /](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@'], + [ + 'regex' => '@^(cf)\\/(\\d+)\\.(\\d+)\\.(\\S+)@', + 'family_replacement' => 'CloudFoundry', + ], + ['regex' => '@^(sap-leonardo-iot-sdk-nodejs) \\/ (\\d+)\\.(\\d+)\\.(\\d+)@'], + ['regex' => '@^(SAP NetWeaver Application Server) \\(1.0;(\\d{1})(\\d{2})\\)@'], + [ + 'regex' => '@^(\\w+-HTTPClient)\\/(\\d+)\\.(\\d+)-(\\S+)@', + 'family_replacement' => 'HTTPClient', + ], + ['regex' => '@^(go-cli)\\s(\\d+)\\.(\\d+).(\\S+)@'], + ['regex' => '@^(Java-EurekaClient|Java-EurekaClient-Replication|HTTPClient|lua-resty-http)\\/v?(\\d+)\\.(\\d+)\\.?(\\d*)@'], + ['regex' => '@^(ping-service|sap xsuaa|Node-oauth|Site24x7|SAP CPI|JAEGER_SECURITY)@'], [ 'regex' => '@(Python/3\\.\\d{1,3} aiohttp)/(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'Python aiohttp', ], - ['regex' => '@(Java)[/ ]?\\d+\\.(\\d+)\\.(\\d+)[_-]*([a-zA-Z0-9]+|)@'], + ['regex' => '@(Java)[/ ]?\\d{1}\\.(\\d+)\\.(\\d+)[_-]*([a-zA-Z0-9]+|)@'], + ['regex' => '@(Java)[/ ]?(\\d+)\\.(\\d+)\\.(\\d+)@'], + ['regex' => '@(minio-go)/v(\\d+)\\.(\\d+)\\.(\\d+)@'], + ['regex' => '@^(ureq)[/ ](\\d+)\\.(\\d+).(\\d+)@'], + ['regex' => '@^(http\\.rb)/(\\d+)\\.(\\d+).(\\d+)@'], + ['regex' => '@^(GuzzleHttp)/(\\d+)\\.(\\d+).(\\d+)@'], + ['regex' => '@^(grab)\\b@'], ['regex' => '@^(Cyberduck)/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.\\d+|)@'], - ['regex' => '@^(S3 Browser) (\\d+)-(\\d+)-(\\d+)(?:\\s*http://s3browser\\.com|)@'], + ['regex' => '@^(S3 Browser) (\\d+)[.-](\\d+)[.-](\\d+)(?:\\s*https?://s3browser\\.com|)@'], ['regex' => '@(S3Gof3r)@'], ['regex' => '@\\b(ibm-cos-sdk-(?:core|java|js|python))/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'], ['regex' => '@^(rusoto)/(\\d+)\\.(\\d+)\\.(\\d+)@'], @@ -924,6 +1125,11 @@ 'regex' => '@^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\\d+)\\.(\\d+)\\.(\\d+)@', 'family_replacement' => 'ViaFree', ], + ['regex' => '@(Transmit)/(\\d+)\\.(\\d+)\\.(\\d+)@'], + ['regex' => '@(Download Master)@'], + ['regex' => '@\\b(HTTrack) (\\d+)\\.(\\d+)(?:[\\.\\-](\\d+)|)@'], + ['regex' => '@(Ladybird)\\/(\\d+)\\.(\\d+)@'], + ['regex' => '@(MullvadBrowser)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'], ], 'os_parsers' => [ [ @@ -940,41 +1146,57 @@ 'os_v1_replacement' => '2011', ], [ - 'regex' => '@HbbTV/\\d+\\.\\d+\\.\\d+ \\(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC@', + 'regex' => '@HbbTV/\\d+\\.\\d+\\.\\d+ \\(;(Samsung);SmartTV([0-9]{4});.{0,200}FXPDEUC@', 'os_v2_replacement' => 'UE40F7000', ], [ - 'regex' => '@HbbTV/\\d+\\.\\d+\\.\\d+ \\(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC@', + 'regex' => '@HbbTV/\\d+\\.\\d+\\.\\d+ \\(;(Samsung);SmartTV([0-9]{4});.{0,200}MST12DEUC@', 'os_v2_replacement' => 'UE32F4500', ], [ - 'regex' => '@HbbTV/1\\.1\\.1 \\(; (Philips);.*NETTV/4@', + 'regex' => '@HbbTV/1\\.1\\.1 \\(; (Philips);.{0,200}NETTV/4@', 'os_v1_replacement' => '2013', ], [ - 'regex' => '@HbbTV/1\\.1\\.1 \\(; (Philips);.*NETTV/3@', + 'regex' => '@HbbTV/1\\.1\\.1 \\(; (Philips);.{0,200}NETTV/3@', 'os_v1_replacement' => '2012', ], [ - 'regex' => '@HbbTV/1\\.1\\.1 \\(; (Philips);.*NETTV/2@', + 'regex' => '@HbbTV/1\\.1\\.1 \\(; (Philips);.{0,200}NETTV/2@', 'os_v1_replacement' => '2011', ], [ - 'regex' => '@HbbTV/\\d+\\.\\d+\\.\\d+.*(firetv)-firefox-plugin (\\d+).(\\d+).(\\d+)@', + 'regex' => '@HbbTV/\\d+\\.\\d+\\.\\d+.{0,100}(firetv)-firefox-plugin (\\d+).(\\d+).(\\d+)@', 'os_replacement' => 'FireHbbTV', ], - ['regex' => '@HbbTV/\\d+\\.\\d+\\.\\d+ \\(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\\)@'], + ['regex' => '@HbbTV/\\d+\\.\\d+\\.\\d+ \\(.{0,30}; ?([a-zA-Z]+) ?;.{0,30}(201[1-9]).{0,30}\\)@'], [ - 'regex' => '@AspiegelBot@', + 'regex' => '@AspiegelBot|PetalBot@', 'os_replacement' => 'Other', ], ['regex' => '@(Windows Phone) (?:OS[ /])?(\\d+)\\.(\\d+)@'], [ - 'regex' => '@(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\\d+)[_\\.](\\d+)(?:[_\\.](\\d+)|).*Outlook-iOS-Android@', + 'regex' => '@(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\\d+)[_\\.](\\d+)(?:[_\\.](\\d+)|).{0,100}Outlook-iOS-Android@', 'os_replacement' => 'iOS', ], - ['regex' => '@ArcGIS\\.?(iOS|Android)-\\d+\\.\\d+(?:\\.\\d+|)(?:[^\\/]+|)\\/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)@'], + ['regex' => '@ArcGIS\\.?(iOS|Android)-\\d+\\.\\d+(?:\\.\\d+|)(?:[^\\/]{1,50}|)\\/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)@'], ['regex' => '@ArcGISRuntime-(?:Android|iOS)\\/\\d+\\.\\d+(?:\\.\\d+|) \\((Android|iOS) (\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|);@'], + [ + 'regex' => '@(Android) (\\d+)(?:\\.(\\d+)).*CrKey@', + 'os_replacement' => 'Chromecast Android', + ], + [ + 'regex' => '@Fuchsia.*(CrKey)(?:[/](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)@', + 'os_replacement' => 'Chromecast Fuchsia', + ], + [ + 'regex' => '@Linux.*(CrKey)(?:[/](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|).*DeviceType/SmartSpeaker@', + 'os_replacement' => 'Chromecast SmartSpeaker', + ], + [ + 'regex' => '@Linux.*(CrKey)(?:[/](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)@', + 'os_replacement' => 'Chromecast Linux', + ], ['regex' => '@(Android)[ \\-/](\\d+)(?:\\.(\\d+)|)(?:[.\\-]([a-z0-9]+)|)@'], [ 'regex' => '@(Android) Donut@', @@ -1001,32 +1223,37 @@ 'os_v1_replacement' => '3', ], ['regex' => '@(Android) (\\d+);@'], + ['regex' => '@(Android): (\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|);@'], [ - 'regex' => '@^UCWEB.*; (Adr) (\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+)|);@', + 'regex' => '@^UCWEB.{0,200}; (Adr) (\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]{1,100})|);@', 'os_replacement' => 'Android', ], [ - 'regex' => '@^UCWEB.*; (iPad|iPh|iPd) OS (\\d+)_(\\d+)(?:_(\\d+)|);@', + 'regex' => '@^UCWEB.{0,200}; (iPad|iPh|iPd) OS (\\d+)_(\\d+)(?:_(\\d+)|);@', 'os_replacement' => 'iOS', ], [ - 'regex' => '@^UCWEB.*; (wds) (\\d+)\\.(\\d+)(?:\\.(\\d+)|);@', + 'regex' => '@^UCWEB.{0,200}; (wds) (\\d+)\\.(\\d+)(?:\\.(\\d+)|);@', 'os_replacement' => 'Windows Phone', ], [ - 'regex' => '@^(JUC).*; ?U; ?(?:Android|)(\\d+)\\.(\\d+)(?:[\\.\\-]([a-z0-9]+)|)@', + 'regex' => '@^(JUC).{0,200}; ?U; ?(?:Android|)(\\d+)\\.(\\d+)(?:[\\.\\-]([a-z0-9]{1,100})|)@', 'os_replacement' => 'Android', ], [ 'regex' => '@(android)\\s(?:mobile\\/)(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)@', 'os_replacement' => 'Android', ], + [ + 'regex' => '@Quest@', + 'os_replacement' => 'Android', + ], [ 'regex' => '@(Silk-Accelerated=[a-z]{4,5})@', 'os_replacement' => 'Android', ], [ - 'regex' => '@(x86_64|aarch64)\\ (\\d+)\\.(\\d+)\\.(\\d+).*Chrome.*(?:CitrixChromeApp)$@', + 'regex' => '@(x86_64|aarch64)\\ (\\d+)\\.(\\d+)\\.(\\d+).{0,100}Chrome.{0,100}(?:CitrixChromeApp)$@', 'os_replacement' => 'Chrome OS', ], [ @@ -1125,48 +1352,52 @@ 'os_v1_replacement' => '95', ], [ - 'regex' => '@^Box.*Windows/([\\d.]+);@', + 'regex' => '@^Box.{0,200}Windows/([\\d.]+);@', 'os_replacement' => 'Windows', 'os_v1_replacement' => '$1', ], ['regex' => '@(Tizen)[/ ](\\d+)\\.(\\d+)@'], + [ + 'regex' => '@Intel Mac OS X.+(CriOS|EdgiOS)/\\d+@', + 'os_replacement' => 'iOS', + ], [ 'regex' => '@((?:Mac[ +]?|; )OS[ +]X)[\\s+/](?:(\\d+)[_.](\\d+)(?:[_.](\\d+)|)|Mach-O)@', 'os_replacement' => 'Mac OS X', ], [ - 'regex' => '@\\w+\\s+Mac OS X\\s+\\w+\\s+(\\d+).(\\d+).(\\d+).*@', + 'regex' => '@Mac OS X\\s.{1,50}\\s(\\d+).(\\d+).(\\d+)@', 'os_replacement' => 'Mac OS X', 'os_v1_replacement' => '$1', 'os_v2_replacement' => '$2', 'os_v3_replacement' => '$3', ], [ - 'regex' => '@ (Dar)(win)/(9).(\\d+).*\\((?:i386|x86_64|Power Macintosh)\\)@', + 'regex' => '@ (Dar)(win)/(9).(\\d+).{0,100}\\((?:i386|x86_64|Power Macintosh)\\)@', 'os_replacement' => 'Mac OS X', 'os_v1_replacement' => '10', 'os_v2_replacement' => '5', ], [ - 'regex' => '@ (Dar)(win)/(10).(\\d+).*\\((?:i386|x86_64)\\)@', + 'regex' => '@ (Dar)(win)/(10).(\\d+).{0,100}\\((?:i386|x86_64)\\)@', 'os_replacement' => 'Mac OS X', 'os_v1_replacement' => '10', 'os_v2_replacement' => '6', ], [ - 'regex' => '@ (Dar)(win)/(11).(\\d+).*\\((?:i386|x86_64)\\)@', + 'regex' => '@ (Dar)(win)/(11).(\\d+).{0,100}\\((?:i386|x86_64)\\)@', 'os_replacement' => 'Mac OS X', 'os_v1_replacement' => '10', 'os_v2_replacement' => '7', ], [ - 'regex' => '@ (Dar)(win)/(12).(\\d+).*\\((?:i386|x86_64)\\)@', + 'regex' => '@ (Dar)(win)/(12).(\\d+).{0,100}\\((?:i386|x86_64)\\)@', 'os_replacement' => 'Mac OS X', 'os_v1_replacement' => '10', 'os_v2_replacement' => '8', ], [ - 'regex' => '@ (Dar)(win)/(13).(\\d+).*\\((?:i386|x86_64)\\)@', + 'regex' => '@ (Dar)(win)/(13).(\\d+).{0,100}\\((?:i386|x86_64)\\)@', 'os_replacement' => 'Mac OS X', 'os_v1_replacement' => '10', 'os_v2_replacement' => '9', @@ -1177,7 +1408,11 @@ ], ['regex' => '@(?:PPC|Intel) (Mac OS X)@'], [ - 'regex' => '@^Box.*;(Darwin)/(10)\\.(1\\d)(?:\\.(\\d+)|)@', + 'regex' => '@^Box.{0,200};(Darwin)/(10)\\.(1\\d)(?:\\.(\\d+)|)@', + 'os_replacement' => 'Mac OS X', + ], + [ + 'regex' => '@darwin; arm64@', 'os_replacement' => 'Mac OS X', ], [ @@ -1185,7 +1420,7 @@ 'os_replacement' => 'ATV OS X', ], [ - 'regex' => '@(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\\d+)[_\\.](\\d+)(?:[_\\.](\\d+)|)@', + 'regex' => '@(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(\\d+)[_\\.](\\d+)(?:[_\\.](\\d+)|)@', 'os_replacement' => 'iOS', ], [ @@ -1193,15 +1428,15 @@ 'os_replacement' => 'iOS', ], [ - 'regex' => '@(iPhone|iPad|iPod).*Mac OS X.*Version/(\\d+)\\.(\\d+)@', + 'regex' => '@(iPhone|iPad|iPod).{0,100}Mac OS X.{0,100}Version/(\\d+)\\.(\\d+)@', 'os_replacement' => 'iOS', ], [ - 'regex' => '@(CFNetwork)/(5)48\\.0\\.3.* Darwin/11\\.0\\.0@', + 'regex' => '@(CFNetwork)/(5)48\\.0\\.3.{0,100} Darwin/11\\.0\\.0@', 'os_replacement' => 'iOS', ], [ - 'regex' => '@(CFNetwork)/(5)48\\.(0)\\.4.* Darwin/(1)1\\.0\\.0@', + 'regex' => '@(CFNetwork)/(5)48\\.(0)\\.4.{0,100} Darwin/(1)1\\.0\\.0@', 'os_replacement' => 'iOS', ], [ @@ -1262,21 +1497,21 @@ 'os_v2_replacement' => '11', ], [ - 'regex' => '@CFNetwork/7.* Darwin/15\\.4\\.\\d+@', + 'regex' => '@CFNetwork/7.{0,100} Darwin/15\\.4\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '9', 'os_v2_replacement' => '3', 'os_v3_replacement' => '1', ], [ - 'regex' => '@CFNetwork/7.* Darwin/15\\.5\\.\\d+@', + 'regex' => '@CFNetwork/7.{0,100} Darwin/15\\.5\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '9', 'os_v2_replacement' => '3', 'os_v3_replacement' => '2', ], [ - 'regex' => '@CFNetwork/7.* Darwin/15\\.6\\.\\d+@', + 'regex' => '@CFNetwork/7.{0,100} Darwin/15\\.6\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '9', 'os_v2_replacement' => '3', @@ -1300,147 +1535,328 @@ 'os_v1_replacement' => '10', ], [ - 'regex' => '@CFNetwork/.* Darwin/17\\.\\d+.*\\(x86_64\\)@', + 'regex' => '@CFNetwork/.{0,100} Darwin/17\\.\\d+.{0,100}\\(x86_64\\)@', 'os_replacement' => 'Mac OS X', 'os_v1_replacement' => '10', 'os_v2_replacement' => '13', ], [ - 'regex' => '@CFNetwork/.* Darwin/16\\.\\d+.*\\(x86_64\\)@', + 'regex' => '@CFNetwork/.{0,100} Darwin/16\\.\\d+.{0,100}\\(x86_64\\)@', 'os_replacement' => 'Mac OS X', 'os_v1_replacement' => '10', 'os_v2_replacement' => '12', ], [ - 'regex' => '@CFNetwork/8.* Darwin/15\\.\\d+.*\\(x86_64\\)@', + 'regex' => '@CFNetwork/8.{0,100} Darwin/15\\.\\d+.{0,100}\\(x86_64\\)@', 'os_replacement' => 'Mac OS X', 'os_v1_replacement' => '10', 'os_v2_replacement' => '11', ], [ - 'regex' => '@CFNetwork/.* Darwin/(9)\\.\\d+@', + 'regex' => '@CFNetwork/.{0,100} Darwin/(9)\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '1', ], [ - 'regex' => '@CFNetwork/.* Darwin/(10)\\.\\d+@', + 'regex' => '@CFNetwork/.{0,100} Darwin/(10)\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '4', ], [ - 'regex' => '@CFNetwork/.* Darwin/(11)\\.\\d+@', + 'regex' => '@CFNetwork/.{0,100} Darwin/(11)\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '5', ], [ - 'regex' => '@CFNetwork/.* Darwin/(13)\\.\\d+@', + 'regex' => '@CFNetwork/.{0,100} Darwin/(13)\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '6', ], [ - 'regex' => '@CFNetwork/6.* Darwin/(14)\\.\\d+@', + 'regex' => '@CFNetwork/6.{0,100} Darwin/(14)\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '7', ], [ - 'regex' => '@CFNetwork/7.* Darwin/(14)\\.\\d+@', + 'regex' => '@CFNetwork/7.{0,100} Darwin/(14)\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '8', 'os_v2_replacement' => '0', ], [ - 'regex' => '@CFNetwork/7.* Darwin/(15)\\.\\d+@', + 'regex' => '@CFNetwork/7.{0,100} Darwin/(15)\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '9', 'os_v2_replacement' => '0', ], [ - 'regex' => '@CFNetwork/8.* Darwin/16\\.5\\.\\d+@', + 'regex' => '@CFNetwork/8.{0,100} Darwin/16\\.5\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '10', 'os_v2_replacement' => '3', ], [ - 'regex' => '@CFNetwork/8.* Darwin/16\\.6\\.\\d+@', + 'regex' => '@CFNetwork/8.{0,100} Darwin/16\\.6\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '10', 'os_v2_replacement' => '3', 'os_v3_replacement' => '2', ], [ - 'regex' => '@CFNetwork/8.* Darwin/16\\.7\\.\\d+@', + 'regex' => '@CFNetwork/8.{0,100} Darwin/16\\.7\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '10', 'os_v2_replacement' => '3', 'os_v3_replacement' => '3', ], [ - 'regex' => '@CFNetwork/8.* Darwin/(16)\\.\\d+@', + 'regex' => '@CFNetwork/8.{0,100} Darwin/(16)\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '10', ], [ - 'regex' => '@CFNetwork/8.* Darwin/17\\.0\\.\\d+@', + 'regex' => '@CFNetwork/8.{0,100} Darwin/17\\.0\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '11', 'os_v2_replacement' => '0', ], [ - 'regex' => '@CFNetwork/8.* Darwin/17\\.2\\.\\d+@', + 'regex' => '@CFNetwork/8.{0,100} Darwin/17\\.2\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '11', 'os_v2_replacement' => '1', ], [ - 'regex' => '@CFNetwork/8.* Darwin/17\\.3\\.\\d+@', + 'regex' => '@CFNetwork/8.{0,100} Darwin/17\\.3\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '11', 'os_v2_replacement' => '2', ], [ - 'regex' => '@CFNetwork/8.* Darwin/17\\.4\\.\\d+@', + 'regex' => '@CFNetwork/8.{0,100} Darwin/17\\.4\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '11', 'os_v2_replacement' => '2', 'os_v3_replacement' => '6', ], [ - 'regex' => '@CFNetwork/8.* Darwin/17\\.5\\.\\d+@', + 'regex' => '@CFNetwork/8.{0,100} Darwin/17\\.5\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '11', 'os_v2_replacement' => '3', ], [ - 'regex' => '@CFNetwork/9.* Darwin/17\\.6\\.\\d+@', + 'regex' => '@CFNetwork/9.{0,100} Darwin/17\\.6\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '11', 'os_v2_replacement' => '4', ], [ - 'regex' => '@CFNetwork/9.* Darwin/17\\.7\\.\\d+@', + 'regex' => '@CFNetwork/9.{0,100} Darwin/17\\.7\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '11', 'os_v2_replacement' => '4', 'os_v3_replacement' => '1', ], [ - 'regex' => '@CFNetwork/8.* Darwin/(17)\\.\\d+@', + 'regex' => '@CFNetwork/8.{0,100} Darwin/(17)\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '11', ], [ - 'regex' => '@CFNetwork/9.* Darwin/18\\.0\\.\\d+@', + 'regex' => '@CFNetwork/9.{0,100} Darwin/18\\.0\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '12', 'os_v2_replacement' => '0', ], [ - 'regex' => '@CFNetwork/9.* Darwin/(18)\\.\\d+@', + 'regex' => '@CFNetwork/9.{0,100} Darwin/18\\.2\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '12', + 'os_v2_replacement' => '1', + ], + [ + 'regex' => '@CFNetwork/9.{0,100} Darwin/18\\.5\\.\\d+@', 'os_replacement' => 'iOS', 'os_v1_replacement' => '12', + 'os_v2_replacement' => '2', + ], + [ + 'regex' => '@CFNetwork/9.{0,100} Darwin/18\\.6\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '12', + 'os_v2_replacement' => '3', + ], + [ + 'regex' => '@CFNetwork/9.{0,100} Darwin/18\\.7\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '12', + 'os_v2_replacement' => '4', + ], + [ + 'regex' => '@CFNetwork/9.{0,100} Darwin/(18)\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '12', + ], + [ + 'regex' => '@CFNetwork/11.{0,100} Darwin/19\\.2\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '13', + 'os_v2_replacement' => '3', + ], + [ + 'regex' => '@CFNetwork/11.{0,100} Darwin/19\\.3\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '13', + 'os_v2_replacement' => '3', + 'os_v3_replacement' => '1', + ], + [ + 'regex' => '@CFNetwork/11.{0,100} Darwin/19\\.4\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '13', + 'os_v2_replacement' => '4', + ], + [ + 'regex' => '@CFNetwork/11.{0,100} Darwin/19\\.5\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '13', + 'os_v2_replacement' => '5', + ], + [ + 'regex' => '@CFNetwork/11.{0,100} Darwin/19\\.6\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '13', + 'os_v2_replacement' => '6', + ], + [ + 'regex' => '@CFNetwork/1[01].{0,100} Darwin/19\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '13', + ], + [ + 'regex' => '@CFNetwork/12.{0,100} Darwin/20\\.1\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '14', + 'os_v2_replacement' => '2', + ], + [ + 'regex' => '@CFNetwork/12.{0,100} Darwin/20\\.2\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '14', + 'os_v2_replacement' => '3', + ], + [ + 'regex' => '@CFNetwork/12.{0,100} Darwin/20\\.3\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '14', + 'os_v2_replacement' => '4', + ], + [ + 'regex' => '@CFNetwork/12.{0,100} Darwin/20\\.4\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '14', + 'os_v2_replacement' => '5', + ], + [ + 'regex' => '@CFNetwork/12.{0,100} Darwin/20\\.5\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '14', + 'os_v2_replacement' => '6', + ], + [ + 'regex' => '@CFNetwork/12.{0,100} Darwin/20\\.6\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '14', + 'os_v2_replacement' => '8', + ], + [ + 'regex' => '@CFNetwork/.{0,100} Darwin/(20)\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '14', + ], + [ + 'regex' => '@CFNetwork/13.{0,100} Darwin/21\\.0\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '15', + 'os_v2_replacement' => '0', + ], + [ + 'regex' => '@CFNetwork/13.{0,100} Darwin/21\\.1\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '15', + 'os_v2_replacement' => '1', + ], + [ + 'regex' => '@CFNetwork/13.{0,100} Darwin/21\\.2\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '15', + 'os_v2_replacement' => '2', + ], + [ + 'regex' => '@CFNetwork/13.{0,100} Darwin/21\\.3\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '15', + 'os_v2_replacement' => '3', + ], + [ + 'regex' => '@CFNetwork/13.{0,100} Darwin/21\\.4\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '15', + 'os_v2_replacement' => '4', + ], + [ + 'regex' => '@CFNetwork/13.{0,100} Darwin/21\\.5\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '15', + 'os_v2_replacement' => '5', + ], + [ + 'regex' => '@CFNetwork/13.{0,100} Darwin/21\\.6\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '15', + 'os_v2_replacement' => '6', + ], + [ + 'regex' => '@CFNetwork/.{0,100} Darwin/(21)\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '15', + ], + [ + 'regex' => '@CFNetwork/.{0,100} Darwin/22\\.([0-5])\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '16', + 'os_v2_replacement' => '$1', + ], + [ + 'regex' => '@CFNetwork/.{0,100} Darwin/(22)\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '16', + ], + [ + 'regex' => '@CFNetwork/.{0,100} Darwin/23\\.([0-5])\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '17', + 'os_v2_replacement' => '$1', ], [ - 'regex' => '@CFNetwork/.* Darwin/@', + 'regex' => '@CFNetwork/.{0,100} Darwin/(23)\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '17', + ], + [ + 'regex' => '@CFNetwork/.{0,100} Darwin/24\\.([0-5])\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '18', + 'os_v2_replacement' => '$1', + ], + [ + 'regex' => '@CFNetwork/.{0,100} Darwin/(24)\\.\\d+@', + 'os_replacement' => 'iOS', + 'os_v1_replacement' => '18', + ], + [ + 'regex' => '@CFNetwork/.{0,100} Darwin/@', 'os_replacement' => 'iOS', ], [ @@ -1449,7 +1865,7 @@ ], ['regex' => '@\\((iOS);@'], [ - 'regex' => '@(watchOS)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@', + 'regex' => '@(watchOS)[/ ](\\d+)\\.(\\d+)(?:\\.(\\d+)|)@', 'os_replacement' => 'WatchOS', ], ['regex' => '@Outlook-(iOS)/\\d+\\.\\d+\\.prod\\.iphone@'], @@ -1476,11 +1892,11 @@ 'os_replacement' => 'Symbian OS', ], [ - 'regex' => '@(Symbian/3).+NokiaBrowser/7\\.3@', + 'regex' => '@(Symbian/3).{1,200}NokiaBrowser/7\\.3@', 'os_replacement' => 'Symbian^3 Anna', ], [ - 'regex' => '@(Symbian/3).+NokiaBrowser/7\\.4@', + 'regex' => '@(Symbian/3).{1,200}NokiaBrowser/7\\.4@', 'os_replacement' => 'Symbian^3 Belle', ], [ @@ -1505,7 +1921,7 @@ 'os_replacement' => 'Nokia Series 30 Plus', ], [ - 'regex' => '@(BB10);.+Version/(\\d+)\\.(\\d+)\\.(\\d+)@', + 'regex' => '@(BB10);.{1,200}Version/(\\d+)\\.(\\d+)\\.(\\d+)@', 'os_replacement' => 'BlackBerry OS', ], [ @@ -1513,7 +1929,7 @@ 'os_replacement' => 'BlackBerry OS', ], [ - 'regex' => '@(Black[Bb]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@', + 'regex' => '@(Black[Bb]erry).{1,200}Version/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@', 'os_replacement' => 'BlackBerry OS', ], [ @@ -1533,50 +1949,50 @@ 'os_replacement' => 'KaiOS', ], [ - 'regex' => '@\\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\\d+\\.\\d+@', + 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Gecko/18.0 Firefox/\\d+\\.\\d+@', 'os_replacement' => 'Firefox OS', 'os_v1_replacement' => '1', 'os_v2_replacement' => '0', 'os_v3_replacement' => '1', ], [ - 'regex' => '@\\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\\d+\\.\\d+@', + 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Gecko/18.1 Firefox/\\d+\\.\\d+@', 'os_replacement' => 'Firefox OS', 'os_v1_replacement' => '1', 'os_v2_replacement' => '1', ], [ - 'regex' => '@\\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\\d+\\.\\d+@', + 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Gecko/26.0 Firefox/\\d+\\.\\d+@', 'os_replacement' => 'Firefox OS', 'os_v1_replacement' => '1', 'os_v2_replacement' => '2', ], [ - 'regex' => '@\\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\\d+\\.\\d+@', + 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Gecko/28.0 Firefox/\\d+\\.\\d+@', 'os_replacement' => 'Firefox OS', 'os_v1_replacement' => '1', 'os_v2_replacement' => '3', ], [ - 'regex' => '@\\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\\d+\\.\\d+@', + 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Gecko/30.0 Firefox/\\d+\\.\\d+@', 'os_replacement' => 'Firefox OS', 'os_v1_replacement' => '1', 'os_v2_replacement' => '4', ], [ - 'regex' => '@\\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\\d+\\.\\d+@', + 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Gecko/32.0 Firefox/\\d+\\.\\d+@', 'os_replacement' => 'Firefox OS', 'os_v1_replacement' => '2', 'os_v2_replacement' => '0', ], [ - 'regex' => '@\\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\\d+\\.\\d+@', + 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Gecko/34.0 Firefox/\\d+\\.\\d+@', 'os_replacement' => 'Firefox OS', 'os_v1_replacement' => '2', 'os_v2_replacement' => '1', ], [ - 'regex' => '@\\((?:Mobile|Tablet);.+Firefox/\\d+\\.\\d+@', + 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Firefox/\\d+\\.\\d+@', 'os_replacement' => 'Firefox OS', ], ['regex' => '@(BREW)[ /](\\d+)\\.(\\d+)\\.(\\d+)@'], @@ -1591,10 +2007,6 @@ ], ['regex' => '@(GoogleTV)(?: (\\d+)\\.(\\d+)(?:\\.(\\d+)|)|/[\\da-z]+)@'], ['regex' => '@(WebTV)/(\\d+).(\\d+)@'], - [ - 'regex' => '@(CrKey)(?:[/](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)@', - 'os_replacement' => 'Chromecast', - ], [ 'regex' => '@(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@', 'os_replacement' => 'webOS', @@ -1602,12 +2014,12 @@ ['regex' => '@(VRE);@'], ['regex' => '@(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\\b)BSD)[/ ](\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'], [ - 'regex' => '@(Linux)[ /](\\d+)\\.(\\d+)(?:\\.(\\d+)|).*gentoo@', + 'regex' => '@(Linux)[ /](\\d+)\\.(\\d+)(?:\\.(\\d+)|).{0,100}gentoo@', 'os_replacement' => 'Gentoo', ], ['regex' => '@\\((Bada);@'], ['regex' => '@(Windows|Android|WeTab|Maemo|Web0S)@'], - ['regex' => '@(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\\b)BSD)@'], + ['regex' => '@(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|SerenityOS|(?:Free|Open|Net|\\b)BSD)@'], ['regex' => '@(Linux)(?:[ /](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)@'], [ 'regex' => '@SunOS@', @@ -1630,22 +2042,30 @@ 'os_replacement' => 'Linux', ], ['regex' => '@^(Roku)/DVP-(\\d+)\\.(\\d+)@'], + [ + 'regex' => '@os\\/macos[#]?(\\d*)[.]?(\\d*)[.]?(\\d*)@', + 'os_replacement' => 'Mac OS X', + 'os_v1_replacement' => '$1', + 'os_v2_replacement' => '$2', + 'os_v3_replacement' => '$3', + ], + ['regex' => '@(HarmonyOS)[\\s;]+(\\d+|)\\.?(\\d+|)\\.?(\\d+|)@'], ], 'device_parsers' => [ [ - 'regex' => '@(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\\d|(?:bot|spider)\\.html)|AdsBot-Google-Mobile.*iPhone)@i', + 'regex' => '@^.{0,100}?(?:(?:iPhone|Windows CE|Windows Phone|Android).{0,300}(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\\d|(?:bot|spider)\\.html|Google-InspectionTool)|AdsBot-Google-Mobile.{0,200}iPhone)@i', 'device_replacement' => 'Spider', 'brand_replacement' => 'Spider', 'model_replacement' => 'Smartphone', ], [ - 'regex' => '@(?:DoCoMo|\\bMOT\\b|\\bLG\\b|Nokia|Samsung|SonyEricsson).*(?:(?:Bot|Yeti)-Mobile|bots?/\\d|(?:bot|crawler)\\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)@i', + 'regex' => '@^.{0,100}?(?:DoCoMo|\\bMOT\\b|\\bLG\\b|Nokia|Samsung|SonyEricsson).{0,200}(?:(?:Bot|Yeti)-Mobile|bots?/\\d|(?:bot|crawler)\\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)@i', 'device_replacement' => 'Spider', 'brand_replacement' => 'Spider', 'model_replacement' => 'Feature Phone', ], [ - 'regex' => '@ PTST/\\d+(?:\\.)?\\d+$@', + 'regex' => '@ PTST/\\d+(?:\\.\\d+|)$@', 'device_replacement' => 'Spider', 'brand_replacement' => 'Spider', ], @@ -1655,451 +2075,451 @@ 'brand_replacement' => 'Spider', ], [ - 'regex' => '@Mozilla.*Mobile.*AspiegelBot@', + 'regex' => '@Mozilla.{1,100}Mobile.{1,100}(AspiegelBot|PetalBot)@', 'device_replacement' => 'Spider', 'brand_replacement' => 'Spider', 'model_replacement' => 'Smartphone', ], [ - 'regex' => '@Mozilla.*AspiegelBot@', + 'regex' => '@Mozilla.{0,200}(AspiegelBot|PetalBot)@', 'device_replacement' => 'Spider', 'brand_replacement' => 'Spider', 'model_replacement' => 'Desktop', ], [ - 'regex' => '@\\bSmartWatch {0,2}\\( {0,2}([^;]+) {0,2}; {0,2}([^;]+) {0,2};@', + 'regex' => '@\\bSmartWatch {0,2}\\( {0,2}([^;]{1,200}) {0,2}; {0,2}([^;]{1,200}) {0,2};@', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@Android Application[^\\-]+ - (Sony) ?(Ericsson|) (.+) \\w+ - @', + 'regex' => '@Android Application[^\\-]{1,300} - (Sony) ?(Ericsson|) (.{1,200}) \\w{1,20} - @', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1$2', 'model_replacement' => '$3', ], [ - 'regex' => '@Android Application[^\\-]+ - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\\-](.+) \\w+ - @i', + 'regex' => '@Android Application[^\\-]{1,300} - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\\-](.{1,200}) \\w{1,20} - @i', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@Android Application[^\\-]+ - ([^ ]+) (.+) \\w+ - @', + 'regex' => '@Android Application[^\\-]{1,300} - ([^ ]+) (.{1,200}) \\w{1,20} - @', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@; *([BLRQ]C\\d{4}[A-Z]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}([BLRQ]C\\d{4}[A-Z]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '3Q $1', 'brand_replacement' => '3Q', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:3Q_)([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:3Q_)([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '3Q $1', 'brand_replacement' => '3Q', 'model_replacement' => '$1', ], [ - 'regex' => '@Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\\d{3}|B1-\\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@Android [34].{0,200}; {0,2}(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\\d{3}|B1-\\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Acer', 'model_replacement' => '$1', ], [ - 'regex' => '@; *Acer Iconia Tab ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}Acer Iconia Tab ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Acer', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\\d+)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Z1[1235]0|E320[^/]{0,10}|S500|S510|Liquid[^;/]{0,30}|Iconia A\\d+)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Acer', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Acer |ACER )([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Acer |ACER )([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Acer', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Advent |)(Vega(?:Bean|Comb|)).*?(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Advent |)(Vega(?:Bean|Comb|)).{0,200}?(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Advent', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Ainol |)((?:NOVO|[Nn]ovo)[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Ainol', 'model_replacement' => '$2', ], [ - 'regex' => '@; *AIRIS[ _\\-]?([^/;\\)]+) *(?:;|\\)|Build)@i', + 'regex' => '@; {0,2}AIRIS[ _\\-]?([^/;\\)]+) {0,2}(?:;|\\)|Build)@i', 'device_replacement' => '$1', 'brand_replacement' => 'Airis', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(OnePAD[^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(OnePAD[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1', 'brand_replacement' => 'Airis', 'model_replacement' => '$1', ], [ - 'regex' => '@; *Airpad[ \\-]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}Airpad[ \\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Airpad $1', 'brand_replacement' => 'Airpad', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(one ?touch) (EVO7|T10|T20)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(one ?touch) (EVO7|T10|T20)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Alcatel One Touch $2', 'brand_replacement' => 'Alcatel', 'model_replacement' => 'One Touch $2', ], [ - 'regex' => '@; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \\-])([^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \\-])([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => 'Alcatel One Touch $1', 'brand_replacement' => 'Alcatel', 'model_replacement' => 'One Touch $1', ], [ - 'regex' => '@; *(TCL)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TCL)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Vodafone Smart II|Optimus_Madrid)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Vodafone Smart II|Optimus_Madrid)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Alcatel $1', 'brand_replacement' => 'Alcatel', 'model_replacement' => '$1', ], [ - 'regex' => '@; *BASE_Lutea_3(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}BASE_Lutea_3(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Alcatel One Touch 998', 'brand_replacement' => 'Alcatel', 'model_replacement' => 'One Touch 998', ], [ - 'regex' => '@; *BASE_Varia(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}BASE_Varia(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Alcatel One Touch 918D', 'brand_replacement' => 'Alcatel', 'model_replacement' => 'One Touch 918D', ], [ - 'regex' => '@; *((?:FINE|Fine)\\d[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}((?:FINE|Fine)\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Allfine', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).{0,200}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Allview', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Allview', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Allview', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(A13-MID)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(A13-MID)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Allwinner', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Allwinner)[ _\\-]?([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Allwinner)[ _\\-]?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Allwinner', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Amaway', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:AMOI|Amoi)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:AMOI|Amoi)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Amoi $1', 'brand_replacement' => 'Amoi', 'model_replacement' => '$1', ], [ - 'regex' => '@^(?:AMOI|Amoi)[ _]([^;/]+?) Linux@', + 'regex' => '@^(?:AMOI|Amoi)[ _]([^;/]{1,100}?) Linux@', 'device_replacement' => 'Amoi $1', 'brand_replacement' => 'Amoi', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(MW(?:0[789]|10)[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(MW(?:0[789]|10)[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Aoc', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Aoson $1', 'brand_replacement' => 'Aoson', 'model_replacement' => '$1', ], [ - 'regex' => '@; *Aoson ([^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}Aoson ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => 'Aoson $1', 'brand_replacement' => 'Aoson', 'model_replacement' => '$1', ], [ - 'regex' => '@; *[Aa]panda[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}[Aa]panda[ _\\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Apanda $1', 'brand_replacement' => 'Apanda', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:ARCHOS|Archos) ?(GAMEPAD.{0,200}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Archos $1', 'brand_replacement' => 'Archos', 'model_replacement' => '$1', ], [ - 'regex' => '@ARCHOS; GOGI; ([^;]+);@', + 'regex' => '@ARCHOS; GOGI; ([^;]{1,200});@', 'device_replacement' => 'Archos $1', 'brand_replacement' => 'Archos', 'model_replacement' => '$1', ], [ - 'regex' => '@(?:ARCHOS|Archos)[ _]?(.*?)(?: Build|[;/\\(\\)\\-]|$)@', + 'regex' => '@(?:ARCHOS|Archos)[ _]?(.{0,200}?)(?: Build|[;/\\(\\)\\-]|$)@', 'device_replacement' => 'Archos $1', 'brand_replacement' => 'Archos', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Archos $1', 'brand_replacement' => 'Archos', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Archos $1', 'brand_replacement' => 'Archos', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(PAD-FMD[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(PAD-FMD[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Arival', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(BioniQ) ?([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(BioniQ) ?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Arival', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(AN\\d[^;/]+|ARCHM\\d+)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(AN\\d[^;/]{1,100}|ARCHM\\d+)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Arnova $1', 'brand_replacement' => 'Arnova', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:ARNOVA|Arnova) ?([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:ARNOVA|Arnova) ?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Arnova $1', 'brand_replacement' => 'Arnova', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:ASSISTANT |)(AP)-?([1789]\\d{2}[A-Z]{0,2}|80104)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:ASSISTANT |)(AP)-?([1789]\\d{2}[A-Z]{0,2}|80104)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Assistant $1-$2', 'brand_replacement' => 'Assistant', 'model_replacement' => '$1-$2', ], [ - 'regex' => '@; *(ME17\\d[^;/]*|ME3\\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\\d{3}[^;/]*|eeepc)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ME17\\d[^;/]*|ME3\\d{2}[^;/]{1,100}|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\\d{3}[^;/]*|eeepc)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Asus $1', 'brand_replacement' => 'Asus', 'model_replacement' => '$1', ], [ - 'regex' => '@; *ASUS[ _]*([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}ASUS[ _]{0,10}([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Asus $1', 'brand_replacement' => 'Asus', 'model_replacement' => '$1', ], [ - 'regex' => '@; *Garmin-Asus ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}Garmin-Asus ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Garmin-Asus $1', 'brand_replacement' => 'Garmin-Asus', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Garminfone)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Garminfone)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Garmin $1', 'brand_replacement' => 'Garmin-Asus', 'model_replacement' => '$1', ], [ - 'regex' => '@; (\\@TAB-[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; (\\@TAB-[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Attab', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(T-(?:07|[^0]\\d)[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(T-(?:07|[^0]\\d)[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Audiosonic', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:Axioo[ _\\-]([^;/]+?)|(picopad)[ _\\-]([^;/]+?))(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(?:Axioo[ _\\-]([^;/]{1,100}?)|(picopad)[ _\\-]([^;/]{1,100}?))(?: Build|\\) AppleWebKit)@i', 'device_replacement' => 'Axioo $1$2 $3', 'brand_replacement' => 'Axioo', 'model_replacement' => '$1$2 $3', ], [ - 'regex' => '@; *(V(?:100|700|800)[^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(V(?:100|700|800)[^;/]*)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Azend', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(IBAK\\-[^;/]*)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(IBAK\\-[^;/]*)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1', 'brand_replacement' => 'Bak', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(HY5001|HY6501|X12|X21|I5)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(HY5001|HY6501|X12|X21|I5)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Bedove $1', 'brand_replacement' => 'Bedove', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(JC-[^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(JC-[^;/]*)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Benss $1', 'brand_replacement' => 'Benss', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(BB) ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(BB) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Blackberry', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(BlackBird)[ _](I8.*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(BlackBird)[ _](I8.{0,200}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(BlackBird)[ _](.*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(BlackBird)[ _](.{0,200}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}([0-9]+BP[EM][^;/]*|Endeavour[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Blaupunkt $1', 'brand_replacement' => 'Blaupunkt', 'model_replacement' => '$1', ], [ - 'regex' => '@; *((?:BLU|Blu)[ _\\-])([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}((?:BLU|Blu)[ _\\-])([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Blu', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\\.3|TANK 4\\.5)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:BMOBILE )?(Blu|BLU|DASH [^;/]{1,100}|VIVO 4\\.3|TANK 4\\.5)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Blu', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(TOUCH\\d[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TOUCH\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Blusens', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(AX5\\d+)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(AX5\\d+)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Bmobile', 'model_replacement' => '$1', ], [ - 'regex' => '@; *([Bb]q) ([^;/]+?);?(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}([Bb]q) ([^;/]{1,100}?);?(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'bq', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Maxwell [^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Maxwell [^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'bq', 'model_replacement' => '$1', ], [ - 'regex' => '@; *((?:B-Tab|B-TAB) ?\\d[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}((?:B-Tab|B-TAB) ?\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Braun', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Broncho) ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Broncho) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@; *CAPTIVA ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}CAPTIVA ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Captiva $1', 'brand_replacement' => 'Captiva', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(C771|CAL21|IS11CA)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(C771|CAL21|IS11CA)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Casio', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:Cat|CAT) ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Cat|CAT) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Cat $1', 'brand_replacement' => 'Cat', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:Cat)(Nova.*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Cat)(Nova.{0,200}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Cat $1', 'brand_replacement' => 'Cat', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(INM8002KP|ADM8000KP_[AB])(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(INM8002KP|ADM8000KP_[AB])(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Cat', 'model_replacement' => 'Tablet PHOENIX 8.1J0', ], [ - 'regex' => '@; *(?:[Cc]elkon[ _\\*]|CELKON[ _\\*])([^;/\\)]+) ?(?:Build|;|\\))@', + 'regex' => '@; {0,2}(?:[Cc]elkon[ _\\*]|CELKON[ _\\*])([^;/\\)]+) ?(?:Build|;|\\))@', 'device_replacement' => '$1', 'brand_replacement' => 'Celkon', 'model_replacement' => '$1', @@ -2111,295 +2531,313 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@; *(CT)-?(\\d+)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(CT)-?(\\d+)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Celkon', 'model_replacement' => '$1$2', ], [ - 'regex' => '@; *(A19|A19Q|A105|A107[^;/\\)]*) ?(?:Build|;|\\))@', + 'regex' => '@; {0,2}(A19|A19Q|A105|A107[^;/\\)]*) ?(?:Build|;|\\))@', 'device_replacement' => '$1', 'brand_replacement' => 'Celkon', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(TPC[0-9]{4,5})(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TPC[0-9]{4,5})(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'ChangJia', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Cloudfone)[ _](Excite)([^ ][^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@CrKey.*DeviceType/([^/]*)@', + 'brand_replacement' => 'Google', + 'device_replacement' => 'Chromecast', + 'model_replacement' => '$1', + ], + [ + 'regex' => '@Fuchsia.*CrKey@', + 'brand_replacement' => 'Google', + 'device_replacement' => 'Chromecast', + 'model_replacement' => 'Nest Hub', + ], + [ + 'regex' => '@Linux.*CrKey/1.36@', + 'brand_replacement' => 'Google', + 'device_replacement' => 'Chromecast', + 'model_replacement' => 'First Generation', + ], + [ + 'regex' => '@CrKey/@', + 'brand_replacement' => 'Google', + 'device_replacement' => 'Chromecast', + 'model_replacement' => 'Chromecast', + ], + [ + 'regex' => '@; {0,2}(Cloudfone)[ _](Excite)([^ ][^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2 $3', 'brand_replacement' => 'Cloudfone', 'model_replacement' => '$1 $2 $3', ], [ - 'regex' => '@; *(Excite|ICE)[ _](\\d+[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Excite|ICE)[ _](\\d+[^;/]{0,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Cloudfone $1 $2', 'brand_replacement' => 'Cloudfone', 'model_replacement' => 'Cloudfone $1 $2', ], [ - 'regex' => '@; *(Cloudfone|CloudPad)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Cloudfone|CloudPad)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Cloudfone', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *((?:Aquila|Clanga|Rapax)[^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}((?:Aquila|Clanga|Rapax)[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1', 'brand_replacement' => 'Cmx', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\\(3G\\)-4G| GB 8K| 3G| 8K| GB)? *(?:Build|[;\\)])@', + 'regex' => '@; {0,2}(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\\(3G\\)-4G| GB 8K| 3G| 8K| GB)? {0,2}(?:Build|[;\\)])@', 'device_replacement' => 'CobyKyros $1$2', 'brand_replacement' => 'CobyKyros', 'model_replacement' => '$1$2', ], [ - 'regex' => '@; *([^;/]*)Coolpad[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}([^;/]{0,50})Coolpad[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Coolpad', 'model_replacement' => '$1$2', ], [ - 'regex' => '@; *(CUBE[ _])?([KU][0-9]+ ?GT.*?|A5300)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(CUBE[ _])?([KU][0-9]+ ?GT.{0,200}?|A5300)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1$2', 'brand_replacement' => 'Cube', 'model_replacement' => '$2', ], [ - 'regex' => '@; *CUBOT ([^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}CUBOT ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1', 'brand_replacement' => 'Cubot', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(BOBBY)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(BOBBY)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1', 'brand_replacement' => 'Cubot', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Dslide [^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Dslide [^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Danew', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(XCD)[ _]?(28|35)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(XCD)[ _]?(28|35)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Dell $1$2', 'brand_replacement' => 'Dell', 'model_replacement' => '$1$2', ], [ - 'regex' => '@; *(001DL)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(001DL)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Dell $1', 'brand_replacement' => 'Dell', 'model_replacement' => 'Streak', ], [ - 'regex' => '@; *(?:Dell|DELL) (Streak)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Dell|DELL) (Streak)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Dell $1', 'brand_replacement' => 'Dell', 'model_replacement' => 'Streak', ], [ - 'regex' => '@; *(101DL|GS01|Streak Pro[^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(101DL|GS01|Streak Pro[^;/]{0,100})(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Dell $1', 'brand_replacement' => 'Dell', 'model_replacement' => 'Streak Pro', ], [ - 'regex' => '@; *([Ss]treak ?7)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}([Ss]treak ?7)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Dell $1', 'brand_replacement' => 'Dell', 'model_replacement' => 'Streak 7', ], [ - 'regex' => '@; *(Mini-3iX)(?: Build|\\) AppleWebKit)@', - 'device_replacement' => 'Dell $1', - 'brand_replacement' => 'Dell', - 'model_replacement' => '$1', - ], - [ - 'regex' => '@; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*?|Streak[ _]Pro)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Mini-3iX)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Dell $1', 'brand_replacement' => 'Dell', 'model_replacement' => '$1', ], [ - 'regex' => '@; *Dell[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.{0,200}?|Streak[ _]Pro)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Dell $1', 'brand_replacement' => 'Dell', 'model_replacement' => '$1', ], [ - 'regex' => '@; *Dell ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}Dell[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Dell $1', 'brand_replacement' => 'Dell', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(TA[CD]-\\d+[^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TA[CD]-\\d+[^;/]{0,100})(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Denver', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(iP[789]\\d{2}(?:-3G)?|IP10\\d{2}(?:-8GB)?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(iP[789]\\d{2}(?:-3G)?|IP10\\d{2}(?:-8GB)?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Dex', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(AirTab)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(AirTab)[ _\\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'DNS', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(F\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(F\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Fujitsu', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(HT-03A)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(HT-03A)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'HTC', 'model_replacement' => 'Magic', ], [ - 'regex' => '@; *(HT\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(HT\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'HTC', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(L\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(L\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'LG', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(N\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(N\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Nec', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(P\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(P\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Panasonic', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SC\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(SC\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Samsung', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SH\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(SH\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Sharp', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SO\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(SO\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'SonyEricsson', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(T\\-0[12][^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(T\\-0[12][^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Toshiba', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(DOOV)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(DOOV)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'DOOV', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Enot|ENOT)[ -]?([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Enot|ENOT)[ -]?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Enot', 'model_replacement' => '$2', ], [ - 'regex' => '@; *[^;/]+ Build/(?:CROSS|Cross)+[ _\\-]([^\\)]+)@', + 'regex' => '@; {0,2}[^;/]{1,100} Build/(?:CROSS|Cross)+[ _\\-]([^\\)]+)@', 'device_replacement' => 'CROSS $1', 'brand_replacement' => 'Evercoss', 'model_replacement' => 'Cross $1', ], [ - 'regex' => '@; *(CROSS|Cross)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(CROSS|Cross)[ _\\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Evercoss', 'model_replacement' => 'Cross $2', ], [ - 'regex' => '@; *Explay[_ ](.+?)(?:[\\)]| Build)@', + 'regex' => '@; {0,2}Explay[_ ](.{1,200}?)(?:[\\)]| Build)@', 'device_replacement' => '$1', 'brand_replacement' => 'Explay', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(IQ.*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(IQ.{0,200}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Fly', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Fly|FLY)[ _](IQ[^;]+?|F[34]\\d+[^;]*?);?(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Fly|FLY)[ _](IQ[^;]{1,100}?|F[34]\\d+[^;]{0,100}?);?(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Fly', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(M532|Q572|FJL21)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(M532|Q572|FJL21)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Fujitsu', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(G1)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(G1)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Galapad', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Geeksphone) ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Geeksphone) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(G[^F]?FIVE) ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(G[^F]?FIVE) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Gfive', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Gionee)[ _\\-]([^;/]+?)(?:/[^;/]+|)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(Gionee)[ _\\-]([^;/]{1,100}?)(?:/[^;/]{1,100}|)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Gionee', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(GN\\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(GN\\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Gionee $1', 'brand_replacement' => 'Gionee', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(E3) Build/JOP40D@', + 'regex' => '@; {0,2}(E3) Build/JOP40D@', 'device_replacement' => 'Gionee $1', 'brand_replacement' => 'Gionee', 'model_replacement' => '$1', @@ -2411,583 +2849,595 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@; *((?:FONE|QUANTUM|INSIGNIA) \\d+[^;/]*|PLAYTAB)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}((?:FONE|QUANTUM|INSIGNIA) \\d+[^;/]{0,100}|PLAYTAB)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'GoClever $1', 'brand_replacement' => 'GoClever', 'model_replacement' => '$1', ], [ - 'regex' => '@; *GOCLEVER ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}GOCLEVER ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'GoClever $1', 'brand_replacement' => 'GoClever', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Glass \\d+)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Glass \\d+)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Google', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Pixel.*?)(?: Build|\\) AppleWebKit)@', - 'device_replacement' => '$1', + 'regex' => '@; {0,2}([g|G]oogle)? (Pixel[ a-zA-z0-9]{1,100});(?: Build|.{0,50}\\) AppleWebKit)@', + 'device_replacement' => '$2', 'brand_replacement' => 'Google', - 'model_replacement' => '$1', + 'model_replacement' => '$2', + ], + [ + 'regex' => '@; {0,2}([g|G]oogle)? (Pixel.{0,200}?)(?: Build|\\) AppleWebKit)@', + 'device_replacement' => '$2', + 'brand_replacement' => 'Google', + 'model_replacement' => '$2', ], [ - 'regex' => '@; *(GSmart)[ -]([^/]+)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(GSmart)[ -]([^/]{1,50})(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Gigabyte', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(imx5[13]_[^/]+)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(imx5[13]_[^/]{1,50})(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Freescale $1', 'brand_replacement' => 'Freescale', 'model_replacement' => '$1', ], [ - 'regex' => '@; *Haier[ _\\-]([^/]+)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}Haier[ _\\-]([^/]{1,50})(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Haier $1', 'brand_replacement' => 'Haier', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(PAD1016)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(PAD1016)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Haipad $1', 'brand_replacement' => 'Haipad', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(M701|M7|M8|M9)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(M701|M7|M8|M9)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Haipad $1', 'brand_replacement' => 'Haipad', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SN\\d+T[^;\\)/]*)(?: Build|[;\\)])@', + 'regex' => '@; {0,2}(SN\\d+T[^;\\)/]*)(?: Build|[;\\)])@', 'device_replacement' => 'Hannspree $1', 'brand_replacement' => 'Hannspree', 'model_replacement' => '$1', ], [ - 'regex' => '@Build/HCL ME Tablet ([^;\\)]+)[\\);]@', + 'regex' => '@Build/HCL ME Tablet ([^;\\)]{1,3})[\\);]@', 'device_replacement' => 'HCLme $1', 'brand_replacement' => 'HCLme', 'model_replacement' => '$1', ], [ - 'regex' => '@; *([^;\\/]+) Build/HCL@', + 'regex' => '@; {0,2}([^;\\/]+) Build/HCL@', 'device_replacement' => 'HCLme $1', 'brand_replacement' => 'HCLme', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(MID-?\\d{4}C[EM])(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(MID-?\\d{4}C[EM])(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Hena $1', 'brand_replacement' => 'Hena', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(EG\\d{2,}|HS-[^;/]+|MIRA[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(EG\\d{2,}|HS-[^;/]{1,100}|MIRA[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Hisense $1', 'brand_replacement' => 'Hisense', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(andromax[^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(andromax[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => 'Hisense $1', 'brand_replacement' => 'Hisense', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:AMAZE[ _](S\\d+)|(S\\d+)[ _]AMAZE)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:AMAZE[ _](S\\d+)|(S\\d+)[ _]AMAZE)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'AMAZE $1$2', 'brand_replacement' => 'hitech', 'model_replacement' => 'AMAZE $1$2', ], [ - 'regex' => '@; *(PlayBook)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(PlayBook)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'HP $1', 'brand_replacement' => 'HP', 'model_replacement' => '$1', ], [ - 'regex' => '@; *HP ([^/]+)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}HP ([^/]{1,50})(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'HP $1', 'brand_replacement' => 'HP', 'model_replacement' => '$1', ], [ - 'regex' => '@; *([^/]+_tenderloin)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}([^/]{1,30}_tenderloin)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'HP TouchPad', 'brand_replacement' => 'HP', 'model_replacement' => 'TouchPad', ], [ - 'regex' => '@; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\\);]+)\\)@', + 'regex' => '@; {0,2}(HUAWEI |Huawei-|)([UY][^;/]{1,100}) Build/(?:Huawei|HUAWEI)([UY][^\\);]+)\\)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Huawei', 'model_replacement' => '$2', ], [ - 'regex' => '@; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\\d+[^\\);]+)\\)@', + 'regex' => '@; {0,2}([^;/]{1,100}) Build[/ ]Huawei(MT1-U06|[A-Z]{1,50}\\d+[^\\);]{1,50})\\)@', 'device_replacement' => '$1', 'brand_replacement' => 'Huawei', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(S7|M860) Build@', + 'regex' => '@; {0,2}(S7|M860) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'Huawei', 'model_replacement' => '$1', ], [ - 'regex' => '@; *((?:HUAWEI|Huawei)[ \\-]?)(MediaPad) Build@', + 'regex' => '@; {0,2}((?:HUAWEI|Huawei)[ \\-]?)(MediaPad) Build@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Huawei', 'model_replacement' => '$2', ], [ - 'regex' => '@; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build@', + 'regex' => '@; {0,2}((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]{1,100}) Build@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Huawei', 'model_replacement' => '$2', ], [ - 'regex' => '@; *((?:HUAWEI|Huawei)[ _\\-]?)((?:G700-|MT-)[^;/]+) Build@', + 'regex' => '@; {0,2}((?:HUAWEI|Huawei)[ _\\-]?)((?:G700-|MT-)[^;/]{1,100}) Build@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Huawei', 'model_replacement' => '$2', ], [ - 'regex' => '@; *((?:HUAWEI|Huawei)[ _\\-]?)([^;/]+) Build@', + 'regex' => '@; {0,2}((?:HUAWEI|Huawei)[ _\\-]?)([^;/]{1,100}) Build@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Huawei', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(MediaPad[^;]+|SpringBoard) Build/Huawei@', + 'regex' => '@; {0,2}(MediaPad[^;]{1,200}|SpringBoard) Build/Huawei@', 'device_replacement' => '$1', 'brand_replacement' => 'Huawei', 'model_replacement' => '$1', ], [ - 'regex' => '@; *([^;]+) Build/(?:Huawei|HUAWEI)@', + 'regex' => '@; {0,2}([^;]{1,200}) Build/(?:Huawei|HUAWEI)@', 'device_replacement' => '$1', 'brand_replacement' => 'Huawei', 'model_replacement' => '$1', ], [ - 'regex' => '@; *([Uu])([89]\\d{3}) Build@', + 'regex' => '@; {0,2}([Uu])([89]\\d{3}) Build@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Huawei', 'model_replacement' => 'U$2', ], [ - 'regex' => '@; *(?:Ideos |IDEOS )(S7) Build@', + 'regex' => '@; {0,2}(?:Ideos |IDEOS )(S7) Build@', 'device_replacement' => 'Huawei Ideos$1', 'brand_replacement' => 'Huawei', 'model_replacement' => 'Ideos$1', ], [ - 'regex' => '@; *(?:Ideos |IDEOS )([^;/]+\\s*|\\s*)Build@', + 'regex' => '@; {0,2}(?:Ideos |IDEOS )([^;/]{1,50}\\s{0,5}|\\s{0,5})Build@', 'device_replacement' => 'Huawei Ideos$1', 'brand_replacement' => 'Huawei', 'model_replacement' => 'Ideos$1', ], [ - 'regex' => '@; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]@', + 'regex' => '@; {0,2}(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.{1,200}?) Build[/ ]@', 'device_replacement' => 'Huawei $1', 'brand_replacement' => 'Huawei', 'model_replacement' => '$1', ], [ - 'regex' => '@; *((?:[A-Z]{3})\\-L[A-Za0-9]{2})[\\)]@', + 'regex' => '@; {0,2}((?:[A-Z]{3})\\-L[A-Za0-9]{2})[\\)]@', 'device_replacement' => 'Huawei $1', 'brand_replacement' => 'Huawei', 'model_replacement' => '$1', ], [ - 'regex' => '@; *HTC[ _]([^;]+); Windows Phone@', + 'regex' => '@; {0,2}([^;]{1,200}) Build/(HONOR|Honor)@', + 'device_replacement' => 'Huawei Honor $1', + 'brand_replacement' => 'Huawei', + 'model_replacement' => 'Honor $1', + ], + [ + 'regex' => '@; {0,2}HTC[ _]([^;]{1,200}); Windows Phone@', 'device_replacement' => 'HTC $1', 'brand_replacement' => 'HTC', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:HTC[ _/])+([^ _/]+)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))@', + 'regex' => '@; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: {0,2}Build|\\))@', 'device_replacement' => 'HTC $1', 'brand_replacement' => 'HTC', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))@', + 'regex' => '@; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: {0,2}Build|\\))@', 'device_replacement' => 'HTC $1 $2', 'brand_replacement' => 'HTC', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))@', + 'regex' => '@; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: {0,2}Build|\\))@', 'device_replacement' => 'HTC $1 $2 $3', 'brand_replacement' => 'HTC', 'model_replacement' => '$1 $2 $3', ], [ - 'regex' => '@; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))@', + 'regex' => '@; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: {0,2}Build|\\))@', 'device_replacement' => 'HTC $1 $2 $3 $4', 'brand_replacement' => 'HTC', 'model_replacement' => '$1 $2 $3 $4', ], [ - 'regex' => '@; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\\)]| - )@', + 'regex' => '@; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: {0,2}Build|[;\\)]| - )@', 'device_replacement' => 'HTC $1', 'brand_replacement' => 'HTC', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\\)]+)|)(?: *Build|[;\\)]| - )@', + 'regex' => '@; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\\)]+)|)(?: {0,2}Build|[;\\)]| - )@', 'device_replacement' => 'HTC $1 $2', 'brand_replacement' => 'HTC', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\\)]+)|)|)(?: *Build|[;\\)]| - )@', + 'regex' => '@; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\\)]+)|)|)(?: {0,2}Build|[;\\)]| - )@', 'device_replacement' => 'HTC $1 $2 $3', 'brand_replacement' => 'HTC', 'model_replacement' => '$1 $2 $3', ], [ - 'regex' => '@; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\\)]| - )@', + 'regex' => '@; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: {0,2}Build|[;\\)]| - )@', 'device_replacement' => 'HTC $1 $2 $3 $4', 'brand_replacement' => 'HTC', 'model_replacement' => '$1 $2 $3 $4', ], [ - 'regex' => '@HTC Streaming Player [^\\/]*/[^\\/]*/ htc_([^/]+) /@', + 'regex' => '@HTC Streaming Player [^\\/]{0,30}/[^\\/]{0,10}/ htc_([^/]{1,10}) /@', 'device_replacement' => 'HTC $1', 'brand_replacement' => 'HTC', 'model_replacement' => '$1', ], [ - 'regex' => '@(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\\(\\)]|$)@i', + 'regex' => '@(?:[;,] {0,2}|^)(?:htccn_chs-|)HTC[ _-]?([^;]{1,200}?)(?: {0,2}Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\\(\\)]|$)@i', 'device_replacement' => 'HTC $1', 'brand_replacement' => 'HTC', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\\+?)\\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\\(\\)])@i', + 'regex' => '@; {0,2}(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\\+?)\\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\\(\\)])@i', 'device_replacement' => 'HTC $1', 'brand_replacement' => 'HTC', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.+?)(?:[/;\\)]|Build|MIUI|1\\.0)@i', + 'regex' => '@; {0,2}(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.{1,200}?)(?:[/;\\)]|Build|MIUI|1\\.0)@i', 'device_replacement' => 'HTC $1 $2', 'brand_replacement' => 'HTC', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *HYUNDAI (T\\d[^/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}HYUNDAI (T\\d[^/]{0,10})(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Hyundai $1', 'brand_replacement' => 'Hyundai', 'model_replacement' => '$1', ], [ - 'regex' => '@; *HYUNDAI ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}HYUNDAI ([^;/]{1,10}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Hyundai $1', 'brand_replacement' => 'Hyundai', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(X700|Hold X|MB-6900)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(X700|Hold X|MB-6900)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Hyundai $1', 'brand_replacement' => 'Hyundai', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:iBall[ _\\-]|)(Andi)[ _]?(\\d[^;/]*)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(?:iBall[ _\\-]|)(Andi)[ _]?(\\d[^;/]*)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1 $2', 'brand_replacement' => 'iBall', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(IBall)(?:[ _]([^;/]+?)|)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(IBall)(?:[ _]([^;/]{1,100}?)|)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1 $2', 'brand_replacement' => 'iBall', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(NT-\\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(NT-\\d+[^ ;/]{0,50}|Net[Tt]AB [^;/]{1,50}|Mercury [A-Z]{1,50}|iconBIT)(?: S/N:[^;/]{1,50}|)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'IconBIT', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(IMO)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(IMO)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1 $2', 'brand_replacement' => 'IMO', 'model_replacement' => '$2', ], [ - 'regex' => '@; *i-?mobile[ _]([^/]+)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}i-?mobile[ _]([^/]{1,50})(?: Build|\\) AppleWebKit)@i', 'device_replacement' => 'i-mobile $1', 'brand_replacement' => 'imobile', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(i-(?:style|note)[^/]*)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(i-(?:style|note)[^/]{0,10})(?: Build|\\) AppleWebKit)@i', 'device_replacement' => 'i-mobile $1', 'brand_replacement' => 'imobile', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(ImPAD) ?(\\d+(?:.)*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ImPAD) ?(\\d+(?:.){0,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Impression', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(Infinix)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Infinix)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Infinix', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Informer)[ \\-]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Informer)[ \\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Informer', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(TAB) ?([78][12]4)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TAB) ?([78][12]4)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Intenso $1', 'brand_replacement' => 'Intenso', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(?:Intex[ _]|)(AQUA|Aqua)([ _\\.\\-])([^;/]+?) *(?:Build|;)@', + 'regex' => '@; {0,2}(?:Intex[ _]|)(AQUA|Aqua)([ _\\.\\-])([^;/]{1,100}?) {0,2}(?:Build|;)@', 'device_replacement' => '$1$2$3', 'brand_replacement' => 'Intex', 'model_replacement' => '$1 $3', ], [ - 'regex' => '@; *(?:INTEX|Intex)(?:[_ ]([^\\ _;/]+))(?:[_ ]([^\\ _;/]+)|) *(?:Build|;)@', + 'regex' => '@; {0,2}(?:INTEX|Intex)(?:[_ ]([^\\ _;/]+))(?:[_ ]([^\\ _;/]+)|) {0,2}(?:Build|;)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Intex', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *([iI]Buddy)[ _]?(Connect)(?:_|\\?_| |)([^;/]*) *(?:Build|;)@', + 'regex' => '@; {0,2}([iI]Buddy)[ _]?(Connect)(?:_|\\?_| |)([^;/]{0,50}) {0,2}(?:Build|;)@', 'device_replacement' => '$1 $2 $3', 'brand_replacement' => 'Intex', 'model_replacement' => 'iBuddy $2 $3', ], [ - 'regex' => '@; *(I-Buddy)[ _]([^;/]+?) *(?:Build|;)@', + 'regex' => '@; {0,2}(I-Buddy)[ _]([^;/]{1,100}?) {0,2}(?:Build|;)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Intex', 'model_replacement' => 'iBuddy $2', ], [ - 'regex' => '@; *(iOCEAN) ([^/]+)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(iOCEAN) ([^/]{1,50})(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1 $2', 'brand_replacement' => 'iOCEAN', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(TP\\d+(?:\\.\\d+|)\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TP\\d+(?:\\.\\d+|)\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'ionik $1', 'brand_replacement' => 'ionik', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(M702pro)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(M702pro)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Iru', 'model_replacement' => '$1', ], [ - 'regex' => '@; *itel ([^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}itel ([^;/]*)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Itel $1', 'brand_replacement' => 'Itel', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(DE88Plus|MD70)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(DE88Plus|MD70)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Ivio', 'model_replacement' => '$1', ], [ - 'regex' => '@; *IVIO[_\\-]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}IVIO[_\\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Ivio', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(TPC-\\d+|JAY-TECH)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TPC-\\d+|JAY-TECH)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Jaytech', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(JY-[^;/]+|G[234]S?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(JY-[^;/]{1,100}|G[234]S?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Jiayu', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(JXD)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(JXD)[ _\\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'JXD', 'model_replacement' => '$2', ], [ - 'regex' => '@; *Karbonn[ _]?([^;/]+) *(?:Build|;)@i', + 'regex' => '@; {0,2}Karbonn[ _]?([^;/]{1,100}) {0,2}(?:Build|;)@i', 'device_replacement' => '$1', 'brand_replacement' => 'Karbonn', 'model_replacement' => '$1', ], [ - 'regex' => '@; *([^;]+) Build/Karbonn@', + 'regex' => '@; {0,2}([^;]{1,200}) Build/Karbonn@', 'device_replacement' => '$1', 'brand_replacement' => 'Karbonn', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\\d) +Build@', + 'regex' => '@; {0,2}(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\\d) +Build@', 'device_replacement' => '$1', 'brand_replacement' => 'Karbonn', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(IS01|IS03|IS05|IS\\d{2}SH)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(IS01|IS03|IS05|IS\\d{2}SH)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Sharp', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(IS04)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(IS04)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Regza', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(IS06|IS\\d{2}PT)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(IS06|IS\\d{2}PT)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Pantech', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(IS11S)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(IS11S)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'SonyEricsson', 'model_replacement' => 'Xperia Acro', ], [ - 'regex' => '@; *(IS11CA)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(IS11CA)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Casio', 'model_replacement' => 'GzOne $1', ], [ - 'regex' => '@; *(IS11LG)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(IS11LG)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'LG', 'model_replacement' => 'Optimus X', ], [ - 'regex' => '@; *(IS11N)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(IS11N)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Medias', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(IS11PT)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(IS11PT)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Pantech', 'model_replacement' => 'MIRACH', ], [ - 'regex' => '@; *(IS12F)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(IS12F)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Fujitsu', 'model_replacement' => 'Arrows ES', ], [ - 'regex' => '@; *(IS12M)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(IS12M)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Motorola', 'model_replacement' => 'XT909', ], [ - 'regex' => '@; *(IS12S)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(IS12S)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'SonyEricsson', 'model_replacement' => 'Xperia Acro HD', ], [ - 'regex' => '@; *(ISW11F)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ISW11F)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Fujitsu', 'model_replacement' => 'Arrowz Z', ], [ - 'regex' => '@; *(ISW11HT)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ISW11HT)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'HTC', 'model_replacement' => 'EVO', ], [ - 'regex' => '@; *(ISW11K)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ISW11K)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Kyocera', 'model_replacement' => 'DIGNO', ], [ - 'regex' => '@; *(ISW11M)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ISW11M)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Motorola', 'model_replacement' => 'Photon', ], [ - 'regex' => '@; *(ISW11SC)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ISW11SC)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Samsung', 'model_replacement' => 'GALAXY S II WiMAX', ], [ - 'regex' => '@; *(ISW12HT)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ISW12HT)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'HTC', 'model_replacement' => 'EVO 3D', ], [ - 'regex' => '@; *(ISW13HT)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ISW13HT)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'HTC', 'model_replacement' => 'J', ], [ - 'regex' => '@; *(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'KDDI', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(INFOBAR [^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(INFOBAR [^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'KDDI', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(JOYPAD|Joypad)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(JOYPAD|Joypad)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Kingcom', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(Vox|VOX|Arc|K080)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(Vox|VOX|Arc|K080)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1', 'brand_replacement' => 'Kobo', 'model_replacement' => '$1', @@ -2999,79 +3449,79 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@; *(K-Touch)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(K-Touch)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Ktouch', 'model_replacement' => '$2', ], [ - 'regex' => '@; *((?:EV|KM)-S\\d+[A-Z]?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}((?:EV|KM)-S\\d+[A-Z]?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1', 'brand_replacement' => 'KTtech', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\\d{2})(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\\d{2})(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Kyocera', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:LAVA[ _]|)IRIS[ _\\-]?([^/;\\)]+) *(?:;|\\)|Build)@i', + 'regex' => '@; {0,2}(?:LAVA[ _]|)IRIS[ _\\-]?([^/;\\)]+) {0,2}(?:;|\\)|Build)@i', 'device_replacement' => 'Iris $1', 'brand_replacement' => 'Lava', 'model_replacement' => 'Iris $1', ], [ - 'regex' => '@; *LAVA[ _]([^;/]+) Build@', + 'regex' => '@; {0,2}LAVA[ _]([^;/]{1,100}) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'Lava', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_?(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]{1,100}))_?(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Lemon $1$2', 'brand_replacement' => 'Lemon', 'model_replacement' => '$1$2', ], [ - 'regex' => '@; *(TAB-1012)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TAB-1012)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Lenco $1', 'brand_replacement' => 'Lenco', 'model_replacement' => '$1', ], [ - 'regex' => '@; Lenco ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; Lenco ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Lenco $1', 'brand_replacement' => 'Lenco', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build@', + 'regex' => '@; {0,2}(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'Lenovo', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Idea[Tp]ab)[ _]([^;/]+);? Build@', + 'regex' => '@; {0,2}(Idea[Tp]ab)[ _]([^;/]{1,100});? Build@', 'device_replacement' => 'Lenovo $1 $2', 'brand_replacement' => 'Lenovo', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(Idea(?:Tab|pad)) ?([^;/]+) Build@', + 'regex' => '@; {0,2}(Idea(?:Tab|pad)) ?([^;/]{1,100}) Build@', 'device_replacement' => 'Lenovo $1 $2', 'brand_replacement' => 'Lenovo', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(ThinkPad) ?(Tablet) Build/@', + 'regex' => '@; {0,2}(ThinkPad) ?(Tablet) Build/@', 'device_replacement' => 'Lenovo $1 $2', 'brand_replacement' => 'Lenovo', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(?:LNV-|)(?:=?[Ll]enovo[ _\\-]?|LENOVO[ _])(.+?)(?:Build|[;/\\)])@', + 'regex' => '@; {0,2}(?:LNV-|)(?:=?[Ll]enovo[ _\\-]?|LENOVO[ _])(.{1,200}?)(?:Build|[;/\\)])@', 'device_replacement' => 'Lenovo $1', 'brand_replacement' => 'Lenovo', 'model_replacement' => '$1', @@ -3083,13 +3533,13 @@ 'model_replacement' => '$1 $2 $3', ], [ - 'regex' => '@; *(?:Ideapad |)K1 Build/@', + 'regex' => '@; {0,2}(?:Ideapad |)K1 Build/@', 'device_replacement' => 'Lenovo Ideapad K1', 'brand_replacement' => 'Lenovo', 'model_replacement' => 'Ideapad K1', ], [ - 'regex' => '@; *(3GC101|3GW10[01]|A390) Build/@', + 'regex' => '@; {0,2}(3GC101|3GW10[01]|A390) Build/@', 'device_replacement' => '$1', 'brand_replacement' => 'Lenovo', 'model_replacement' => '$1', @@ -3101,37 +3551,37 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@; *(MFC\\d+)[A-Z]{2}([^;,/]*),?(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(MFC\\d+)[A-Z]{2}([^;,/]*),?(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Lexibook', 'model_replacement' => '$1$2', ], [ - 'regex' => '@; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)@', + 'regex' => '@; {0,2}(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]{1,30}|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) {0,2}(?:Build|;)@', 'device_replacement' => '$1', 'brand_replacement' => 'LG', 'model_replacement' => '$1', ], [ - 'regex' => '@[;:] *(L-\\d+[A-Z]|LGL\\d+[A-Z]?)(?:/V\\d+|) *(?:Build|[;\\)])@', + 'regex' => '@[;:] {0,2}(L-\\d+[A-Z]|LGL\\d+[A-Z]?)(?:/V\\d+|) {0,2}(?:Build|[;\\)])@', 'device_replacement' => '$1', 'brand_replacement' => 'LG', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(LG-)([A-Z]{1,2}\\d{2,}[^,;/\\)\\(]*?)(?:Build| V\\d+|[,;/\\)\\(]|$)@', + 'regex' => '@; {0,2}(LG-)([A-Z]{1,2}\\d{2,}[^,;/\\)\\(]*?)(?:Build| V\\d+|[,;/\\)\\(]|$)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'LG', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(LG[ \\-]|LG)([^;/]+)[;/]? Build@', + 'regex' => '@; {0,2}(LG[ \\-]|LG)([^;/]{1,100})[;/]? Build@', 'device_replacement' => '$1$2', 'brand_replacement' => 'LG', 'model_replacement' => '$2', ], [ - 'regex' => '@^(LG)-([^;/]+)/ Mozilla/.*; Android@', + 'regex' => '@^(LG)-([^;/]{1,100})/ Mozilla/.{0,200}; Android@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'LG', 'model_replacement' => '$2', @@ -3143,259 +3593,283 @@ 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *((?:SMB|smb)[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}((?:SMB|smb)[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Malata', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:Malata|MALATA) ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Malata|MALATA) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Malata', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Manta', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Match', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(GenxDroid7|MSD7.*?|AX\\d.*?|Tab 701|Tab 722)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(GenxDroid7|MSD7.{0,200}?|AX\\d.{0,200}?|Tab 701|Tab 722)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Maxx $1', 'brand_replacement' => 'Maxx', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(M-PP[^;/]+|PhonePad ?\\d{2,}[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(M-PP[^;/]{1,30}|PhonePad ?\\d{2,}[^;/]{1,30}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Mediacom $1', 'brand_replacement' => 'Mediacom', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(M-MP[^;/]+|SmartPad ?\\d{2,}[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(M-MP[^;/]{1,30}|SmartPad ?\\d{2,}[^;/]{1,30}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Mediacom $1', 'brand_replacement' => 'Mediacom', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:MD_|)LIFETAB[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(?:MD_|)LIFETAB[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => 'Medion Lifetab $1', 'brand_replacement' => 'Medion', 'model_replacement' => 'Lifetab $1', ], [ - 'regex' => '@; *MEDION ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}MEDION ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Medion $1', 'brand_replacement' => 'Medion', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(M030|M031|M035|M040|M065|m9)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(M030|M031|M035|M040|M065|m9)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Meizu $1', 'brand_replacement' => 'Meizu', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:meizu_|MEIZU )(.+?) *(?:Build|[;\\)])@', + 'regex' => '@; {0,2}(?:meizu_|MEIZU )(.{1,200}?) {0,2}(?:Build|[;\\)])@', 'device_replacement' => 'Meizu $1', 'brand_replacement' => 'Meizu', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:Micromax[ _](A111|A240)|(A111|A240)) Build@i', + 'regex' => '@Quest 3@', + 'device_replacement' => 'Quest', + 'brand_replacement' => 'Meta', + 'model_replacement' => 'Quest 3', + ], + [ + 'regex' => '@Quest 2@', + 'device_replacement' => 'Quest', + 'brand_replacement' => 'Meta', + 'model_replacement' => 'Quest 2', + ], + [ + 'regex' => '@Quest Pro@', + 'device_replacement' => 'Quest', + 'brand_replacement' => 'Meta', + 'model_replacement' => 'Quest Pro', + ], + [ + 'regex' => '@Quest@', + 'device_replacement' => 'Quest', + 'brand_replacement' => 'Meta', + 'model_replacement' => 'Quest', + ], + [ + 'regex' => '@; {0,2}(?:Micromax[ _](A111|A240)|(A111|A240)) Build@i', 'device_replacement' => 'Micromax $1$2', 'brand_replacement' => 'Micromax', 'model_replacement' => '$1$2', ], [ - 'regex' => '@; *Micromax[ _](A\\d{2,3}[^;/]*) Build@i', + 'regex' => '@; {0,2}Micromax[ _](A\\d{2,3}[^;/]*) Build@i', 'device_replacement' => 'Micromax $1', 'brand_replacement' => 'Micromax', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(A\\d{2}|A[12]\\d{2}|A90S|A110Q) Build@i', + 'regex' => '@; {0,2}(A\\d{2}|A[12]\\d{2}|A90S|A110Q) Build@i', 'device_replacement' => 'Micromax $1', 'brand_replacement' => 'Micromax', 'model_replacement' => '$1', ], [ - 'regex' => '@; *Micromax[ _](P\\d{3}[^;/]*) Build@i', + 'regex' => '@; {0,2}Micromax[ _](P\\d{3}[^;/]*) Build@i', 'device_replacement' => 'Micromax $1', 'brand_replacement' => 'Micromax', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(P\\d{3}|P\\d{3}\\(Funbook\\)) Build@i', + 'regex' => '@; {0,2}(P\\d{3}|P\\d{3}\\(Funbook\\)) Build@i', 'device_replacement' => 'Micromax $1', 'brand_replacement' => 'Micromax', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(MITO)[ _\\-]?([^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(MITO)[ _\\-]?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Mito', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Cynus)[ _](F5|T\\d|.+?) *(?:Build|[;/\\)])@i', + 'regex' => '@; {0,2}(Cynus)[ _](F5|T\\d|.{1,200}?) {0,2}(?:Build|[;/\\)])@i', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Mobistel', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(MODECOM |)(FreeTab) ?([^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(MODECOM |)(FreeTab) ?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1$2 $3', 'brand_replacement' => 'Modecom', 'model_replacement' => '$2 $3', ], [ - 'regex' => '@; *(MODECOM )([^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(MODECOM )([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Modecom', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(MZ\\d{3}\\+?|MZ\\d{3} 4G|Xoom|XOOM[^;/]*) Build@', + 'regex' => '@; {0,2}(MZ\\d{3}\\+?|MZ\\d{3} 4G|Xoom|XOOM[^;/]*) Build@', 'device_replacement' => 'Motorola $1', 'brand_replacement' => 'Motorola', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Milestone )(XT[^;/]*) Build@', + 'regex' => '@; {0,2}(Milestone )(XT[^;/]*) Build@', 'device_replacement' => 'Motorola $1$2', 'brand_replacement' => 'Motorola', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Motoroi ?x|Droid X|DROIDX) Build@i', + 'regex' => '@; {0,2}(Motoroi ?x|Droid X|DROIDX) Build@i', 'device_replacement' => 'Motorola $1', 'brand_replacement' => 'Motorola', 'model_replacement' => 'DROID X', ], [ - 'regex' => '@; *(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build@', + 'regex' => '@; {0,2}(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build@', 'device_replacement' => 'Motorola $1', 'brand_replacement' => 'Motorola', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(A555|A85[34][^;/]*|A95[356]|ME[58]\\d{2}\\+?|ME600|ME632|ME722|MB\\d{3}\\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\\d{3,4}[A-Z\\+]*|CL[iI]Q|CL[iI]Q XT) Build@', + 'regex' => '@; {0,2}(A555|A85[34][^;/]*|A95[356]|ME[58]\\d{2}\\+?|ME600|ME632|ME722|MB\\d{3}\\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\\d{3,4}[A-Z\\+]*|CL[iI]Q|CL[iI]Q XT) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'Motorola', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Motorola MOT-|Motorola[ _\\-]|MOT\\-?)([^;/]+) Build@', + 'regex' => '@; {0,2}(Motorola MOT-|Motorola[ _\\-]|MOT\\-?)([^;/]{1,100}) Build@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Motorola', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Moto[_ ]?|MOT\\-)([^;/]+) Build@', + 'regex' => '@; {0,2}(Moto[_ ]?|MOT\\-)([^;/]{1,100}) Build@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Motorola', 'model_replacement' => '$2', ], [ - 'regex' => '@; *((?:MP[DQ]C|MPG\\d{1,4}|MP\\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}((?:MP[DQ]C|MPG\\d{1,4}|MP\\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Mpman', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:MSI[ _]|)(Primo\\d+|Enjoy[ _\\-][^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(?:MSI[ _]|)(Primo\\d+|Enjoy[ _\\-][^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1', 'brand_replacement' => 'Msi', 'model_replacement' => '$1', ], [ - 'regex' => '@; *Multilaser[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}Multilaser[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Multilaser', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(My)[_]?(Pad)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(My)[_]?(Pad)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2 $3', 'brand_replacement' => 'MyPhone', 'model_replacement' => '$1$2 $3', ], [ - 'regex' => '@; *(My)\\|?(Phone)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(My)\\|?(Phone)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2 $3', 'brand_replacement' => 'MyPhone', 'model_replacement' => '$3', ], [ - 'regex' => '@; *(A\\d+)[ _](Duo|)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(A\\d+)[ _](Duo|)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1 $2', 'brand_replacement' => 'MyPhone', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(myTab[^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(myTab[^;/]*)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Mytab', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(NABI2?-)([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(NABI2?-)([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Nabi', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(N-\\d+[CDE])(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(N-\\d+[CDE])(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Nec', 'model_replacement' => '$1', ], [ - 'regex' => '@; ?(NEC-)(.*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; ?(NEC-)(.{0,200}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Nec', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(LT-NA7)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(LT-NA7)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Nec', 'model_replacement' => 'Lifetouch Note', ], [ - 'regex' => '@; *(NXM\\d+[A-Za-z0-9_]*|Next\\d[A-Za-z0-9_ \\-]*|NEXT\\d[A-Za-z0-9_ \\-]*|Nextbook [A-Za-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\\);])@', + 'regex' => '@; {0,2}(NXM\\d+[A-Za-z0-9_]{0,50}|Next\\d[A-Za-z0-9_ \\-]{0,50}|NEXT\\d[A-Za-z0-9_ \\-]{0,50}|Nextbook [A-Za-z0-9_ ]{0,50}|DATAM803HC|M805)(?: Build|[\\);])@', 'device_replacement' => '$1', 'brand_replacement' => 'Nextbook', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Nokia)([ _\\-]*)([^;/]*) Build@i', + 'regex' => '@; {0,2}(Nokia)([ _\\-]{0,5})([^;/]{0,50}) Build@i', 'device_replacement' => '$1$2$3', 'brand_replacement' => 'Nokia', 'model_replacement' => '$3', ], [ - 'regex' => '@; *(TA\\-\\d{4})(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TA\\-\\d{4})(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Nokia $1', 'brand_replacement' => 'Nokia', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Nook ?|Barnes & Noble Nook |BN )([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Nook', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Nook', 'model_replacement' => '$2', @@ -3407,13 +3881,13 @@ 'model_replacement' => 'Tablet', ], [ - 'regex' => '@; *(OP110|OliPad[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(OP110|OliPad[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Olivetti $1', 'brand_replacement' => 'Olivetti', 'model_replacement' => '$1', ], [ - 'regex' => '@; *OMEGA[ _\\-](MID[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}OMEGA[ _\\-](MID[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Omega $1', 'brand_replacement' => 'Omega', 'model_replacement' => '$1', @@ -3425,54 +3899,54 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@; *((?:CIUS|cius)[^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}((?:CIUS|cius)[^;/]*)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Openpeak $1', 'brand_replacement' => 'Openpeak', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Find ?(?:5|7a)|R8[012]\\d{1,2}|T703\\d?|U70\\d{1,2}T?|X90\\d{1,2}|[AFR]\\d{1,2}[a-z]{1,2})(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Find ?(?:5|7a)|R8[012]\\d{1,2}|T703\\d?|U70\\d{1,2}T?|X90\\d{1,2}|[AFR]\\d{1,2}[a-z]{1,2})(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Oppo $1', 'brand_replacement' => 'Oppo', 'model_replacement' => '$1', ], [ - 'regex' => '@; *OPPO ?([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}OPPO ?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Oppo $1', 'brand_replacement' => 'Oppo', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(CPH\\d{1,4}|RMX\\d{1,4}|P[A-Z]{3}\\d{2})(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(CPH\\d{1,4}|RMX\\d{1,4}|P[A-Z]{3}\\d{2})(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Oppo $1', 'brand_replacement' => 'Oppo', ], [ - 'regex' => '@; *(A1601)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(A1601)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Oppo F1s', 'brand_replacement' => 'Oppo', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:Odys\\-|ODYS\\-|ODYS )([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Odys\\-|ODYS\\-|ODYS )([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Odys $1', 'brand_replacement' => 'Odys', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SELECT) ?(7)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(SELECT) ?(7)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Odys $1 $2', 'brand_replacement' => 'Odys', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(PEDI)_(PLUS)_(W)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(PEDI)_(PLUS)_(W)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Odys $1 $2 $3', 'brand_replacement' => 'Odys', 'model_replacement' => '$1 $2 $3', ], [ - 'regex' => '@; *(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\\d+ ?[Pp]ro|XENO10|XPRESS PRO)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\\d+ ?[Pp]ro|XENO10|XPRESS PRO)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Odys $1', 'brand_replacement' => 'Odys', 'model_replacement' => '$1', @@ -3490,61 +3964,79 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@; *(TP-\\d+)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(HD1903|GM1917|IN2025|LE2115|LE2127|HD1907|BE2012|BE2025|BE2026|BE2028|BE2029|DE2117|DE2118|EB2101|GM1900|GM1910|GM1915|HD1905|HD1925|IN2015|IN2017|IN2019|KB2005|KB2007|LE2117|LE2125|BE2015|GM1903|HD1900|HD1901|HD1910|HD1913|IN2010|IN2013|IN2020|LE2111|LE2120|LE2121|LE2123|BE2011|IN2023|KB2003|LE2113|NE2215|DN2101)(?: Build|\\) AppleWebKit)@', + 'device_replacement' => 'OnePlus $1', + 'brand_replacement' => 'OnePlus', + 'model_replacement' => 'OnePlus $1', + ], + [ + 'regex' => '@; (OnePlus[ a-zA-z0-9]{0,50});((?: Build|.{0,50}\\) AppleWebKit))@', + 'device_replacement' => '$1', + 'brand_replacement' => 'OnePlus', + 'model_replacement' => '$1', + ], + [ + 'regex' => '@; (OnePlus[ a-zA-z0-9]{0,50})((?: Build|\\) AppleWebKit))@', + 'device_replacement' => '$1', + 'brand_replacement' => 'OnePlus', + 'model_replacement' => '$1', + ], + [ + 'regex' => '@; {0,2}(TP-\\d+)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Orion $1', 'brand_replacement' => 'Orion', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(G100W?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(G100W?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'PackardBell $1', 'brand_replacement' => 'PackardBell', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Panasonic)[_ ]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Panasonic)[_ ]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(FZ-A1B|JT-B1)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(FZ-A1B|JT-B1)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Panasonic $1', 'brand_replacement' => 'Panasonic', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(dL1|DL1)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(dL1|DL1)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Panasonic $1', 'brand_replacement' => 'Panasonic', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SKY[ _]|)(IM\\-[AT]\\d{3}[^;/]+).* Build/@', + 'regex' => '@; {0,2}(SKY[ _]|)(IM\\-[AT]\\d{3}[^;/]{1,100}).{0,30} Build/@', 'device_replacement' => 'Pantech $1$2', 'brand_replacement' => 'Pantech', 'model_replacement' => '$1$2', ], [ - 'regex' => '@; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/@', + 'regex' => '@; {0,2}((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/@', 'device_replacement' => '$1', 'brand_replacement' => 'Pantech', 'model_replacement' => '$1', ], [ - 'regex' => '@; *Pantech([^;/]+).* Build/@', + 'regex' => '@; {0,2}Pantech([^;/]{1,30}).{0,200}? Build/@', 'device_replacement' => 'Pantech $1', 'brand_replacement' => 'Pantech', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(papyre)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(papyre)[ _\\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Papyre', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(?:Touchlet )?(X10\\.[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Touchlet )?(X10\\.[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Pearl $1', 'brand_replacement' => 'Pearl', 'model_replacement' => '$1', @@ -3556,133 +4048,133 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@; PHICOMM ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; PHICOMM ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Phicomm $1', 'brand_replacement' => 'Phicomm', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(FWS\\d{3}[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(FWS\\d{3}[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Phicomm $1', 'brand_replacement' => 'Phicomm', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Philips', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:Philips|PHILIPS)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Philips|PHILIPS)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Philips $1', 'brand_replacement' => 'Philips', 'model_replacement' => '$1', ], [ - 'regex' => '@Android 4\\..*; *(M[12356789]|U[12368]|S[123])\\ ?(pro)?(?: Build|\\) AppleWebKit)@', + 'regex' => '@Android 4\\..{0,200}; {0,2}(M[12356789]|U[12368]|S[123])\\ ?(pro)?(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Pipo $1$2', 'brand_replacement' => 'Pipo', 'model_replacement' => '$1$2', ], [ - 'regex' => '@; *(MOMO[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(MOMO[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Ployer', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:Polaroid[ _]|)((?:MIDC\\d{3,}|PMID\\d{2,}|PTAB\\d{3,})[^;/]*?)(\\/[^;/]*|)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Polaroid[ _]|)((?:MIDC\\d{3,}|PMID\\d{2,}|PTAB\\d{3,})[^;/]{0,30}?)(\\/[^;/]{0,30}|)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Polaroid', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:Polaroid )(Tablet)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Polaroid )(Tablet)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Polaroid', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(POMP)[ _\\-](.+?) *(?:Build|[;/\\)])@', + 'regex' => '@; {0,2}(POMP)[ _\\-](.{1,200}?) {0,2}(?:Build|[;/\\)])@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Pomp', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Positivo', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:Positivo |)((?:YPY|Ypy)[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Positivo |)((?:YPY|Ypy)[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Positivo', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(MOB-[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(MOB-[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'POV', 'model_replacement' => '$1', ], [ - 'regex' => '@; *POV[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}POV[ _\\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'POV $1', 'brand_replacement' => 'POV', 'model_replacement' => '$1', ], [ - 'regex' => '@; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\\-]|TAB-P)[^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\\-]|TAB-P)[^;/]*)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'POV $1', 'brand_replacement' => 'POV', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:Prestigio |)((?:PAP|PMP)\\d[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Prestigio |)((?:PAP|PMP)\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Prestigio $1', 'brand_replacement' => 'Prestigio', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(PLT[0-9]{4}.*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(PLT[0-9]{4}.{0,200}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Proscan', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(A2|A5|A8|A900)_?(Classic|)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(A2|A5|A8|A900)_?(Classic|)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Qmobile', 'model_replacement' => '$1 $2', ], [ - 'regex' => '@; *(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Qmobile $2 $3', 'brand_replacement' => 'Qmobile', 'model_replacement' => '$2 $3', ], [ - 'regex' => '@; *(Q\\-?[Mm]obile)[_ ](A[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Q\\-?[Mm]obile)[_ ](A[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Qmobile $2', 'brand_replacement' => 'Qmobile', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Q\\-Smart)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Q\\-Smart)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Qmobilevn', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Q\\-?[Mm]obile)[ _\\-](S[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Q\\-?[Mm]obile)[ _\\-](S[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Qmobilevn', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(TA1013)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TA1013)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Quanta', 'model_replacement' => '$1', @@ -3700,7 +4192,7 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@; *(RK\\d+),?(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(RK\\d+),?(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Rockchip', 'model_replacement' => '$1', @@ -3712,157 +4204,157 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\\d)|GT-I9082|GT-I9205|GT-N7\\d{3}|SM-N9005)[^;/]*)\\/?[^;/]* Build/@', + 'regex' => '@; {0,2}(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\\d)|GT-I9082|GT-I9205|GT-N7\\d{3}|SM-N9005)[^;/]{0,100})\\/?[^;/]{0,50} Build/@', 'device_replacement' => 'Samsung $1$2', 'brand_replacement' => 'Samsung', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Google |)(Nexus [Ss](?: 4G|)) Build/@', + 'regex' => '@; {0,2}(Google |)(Nexus [Ss](?: 4G|)) Build/@', 'device_replacement' => 'Samsung $1$2', 'brand_replacement' => 'Samsung', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(SAMSUNG |Samsung )([^\\/]*)\\/[^ ]* Build/@', + 'regex' => '@; {0,2}(SAMSUNG |Samsung )([^\\/]{0,50})\\/[^ ]{0,50} Build/@', 'device_replacement' => 'Samsung $2', 'brand_replacement' => 'Samsung', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/@', + 'regex' => '@; {0,2}(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/@', 'device_replacement' => 'Samsung $1', 'brand_replacement' => 'Samsung', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SAMSUNG[ _\\-]|)(?:SAMSUNG[ _\\-])([^;/]+) Build@', + 'regex' => '@; {0,2}(SAMSUNG[ _\\-]|)(?:SAMSUNG[ _\\-])([^;/]{1,100}) Build@', 'device_replacement' => 'Samsung $2', 'brand_replacement' => 'Samsung', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(SAMSUNG-|)(GT\\-[BINPS]\\d{4}[^\\/]*)(\\/[^ ]*) Build@', + 'regex' => '@; {0,2}(SAMSUNG-|)(GT\\-[BINPS]\\d{4}[^\\/]{0,50})(\\/[^ ]{0,50}) Build@', 'device_replacement' => 'Samsung $1$2$3', 'brand_replacement' => 'Samsung', 'model_replacement' => '$2', ], [ - 'regex' => '@(?:; *|^)((?:GT\\-[BIiNPS]\\d{4}|I9\\d{2}0[A-Za-z\\+]?\\b)[^;/\\)]*?)(?:Build|Linux|MIUI|[;/\\)])@', + 'regex' => '@(?:; {0,2}|^)((?:GT\\-[BIiNPS]\\d{4}|I9\\d{2}0[A-Za-z\\+]?\\b)[^;/\\)]*?)(?:Build|Linux|MIUI|[;/\\)])@', 'device_replacement' => 'Samsung $1', 'brand_replacement' => 'Samsung', 'model_replacement' => '$1', ], [ - 'regex' => '@; (SAMSUNG-)([A-Za-z0-9\\-]+).* Build/@', + 'regex' => '@; (SAMSUNG-)([A-Za-z0-9\\-]{0,50}).{0,200} Build/@', 'device_replacement' => 'Samsung $1$2', 'brand_replacement' => 'Samsung', 'model_replacement' => '$2', ], [ - 'regex' => '@; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build@', + 'regex' => '@; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build@', 'device_replacement' => 'Samsung $1', 'brand_replacement' => 'Samsung', 'model_replacement' => '$1', ], [ - 'regex' => '@; *((?:SC)\\-[A-Za-z0-9 ]+)(/?[^ ]*|)\\)@', + 'regex' => '@; {0,2}((?:SC)\\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|)\\)@', 'device_replacement' => 'Samsung $1', 'brand_replacement' => 'Samsung', 'model_replacement' => '$1', ], [ - 'regex' => '@ ((?:SCH)\\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build@', + 'regex' => '@ ((?:SCH)\\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build@', 'device_replacement' => 'Samsung $1', 'brand_replacement' => 'Samsung', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Behold ?(?:2|II)|YP\\-G[^;/]+|EK-GC100|SCL21|I9300) Build@', + 'regex' => '@; {0,2}(Behold ?(?:2|II)|YP\\-G[^;/]{1,100}|EK-GC100|SCL21|I9300) Build@', 'device_replacement' => 'Samsung $1', 'brand_replacement' => 'Samsung', 'model_replacement' => '$1', ], [ - 'regex' => '@; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\\-[A-Za-z0-9]{5,6})[\\)]@', + 'regex' => '@; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\\-[A-Za-z0-9]{5,6})[\\)]@', 'device_replacement' => 'Samsung $1', 'brand_replacement' => 'Samsung', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SH\\-?\\d\\d[^;/]+|SBM\\d[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(SH\\-?\\d\\d[^;/]{1,100}|SBM\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Sharp', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SHARP[ -])([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(SHARP[ -])([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Sharp', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(SPX[_\\-]\\d[^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(SPX[_\\-]\\d[^;/]*)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Simvalley', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SX7\\-PEARL\\.GmbH)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(SX7\\-PEARL\\.GmbH)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Simvalley', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SP[T]?\\-\\d{2}[^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(SP[T]?\\-\\d{2}[^;/]*)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Simvalley', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SK\\-.*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(SK\\-.{0,200}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'SKtelesys', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:SKYTEX|SX)-([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:SKYTEX|SX)-([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Skytex', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(IMAGINE [^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(IMAGINE [^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Skytex', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SmartQ) ?([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(SmartQ) ?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(WF7C|WF10C|SBT[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(WF7C|WF10C|SBT[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Smartbitt', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build@', + 'regex' => '@; {0,2}(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'Sharp', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(003P|101P|101P11C|102P) Build@', + 'regex' => '@; {0,2}(003P|101P|101P11C|102P) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'Panasonic', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(00\\dZ) Build/@', + 'regex' => '@; {0,2}(00\\dZ) Build/@', 'device_replacement' => '$1', 'brand_replacement' => 'ZTE', 'model_replacement' => '$1', @@ -3874,85 +4366,85 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@; *(001HT|X06HT) Build@', + 'regex' => '@; {0,2}(001HT|X06HT) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'HTC', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(201M) Build@', + 'regex' => '@; {0,2}(201M) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'Motorola', 'model_replacement' => 'XT902', ], [ - 'regex' => '@; *(ST\\d{4}.*)Build/ST@', + 'regex' => '@; {0,2}(ST\\d{4}.{0,200})Build/ST@', 'device_replacement' => 'Trekstor $1', 'brand_replacement' => 'Trekstor', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(ST\\d{4}.*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ST\\d{4}.{0,200}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Trekstor $1', 'brand_replacement' => 'Trekstor', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Sony ?Ericsson ?)([^;/]+) Build@', + 'regex' => '@; {0,2}(Sony ?Ericsson ?)([^;/]{1,100}) Build@', 'device_replacement' => '$1$2', 'brand_replacement' => 'SonyEricsson', 'model_replacement' => '$2', ], [ - 'regex' => '@; *((?:SK|ST|E|X|LT|MK|MT|WT)\\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build@', + 'regex' => '@; {0,2}((?:SK|ST|E|X|LT|MK|MT|WT)\\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'SonyEricsson', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\\d+)[^;/]*) Build@i', + 'regex' => '@; {0,2}(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\\d+)[^;/]{0,50}) Build@i', 'device_replacement' => '$1', 'brand_replacement' => 'SonyEricsson', 'model_replacement' => '$1', ], [ - 'regex' => '@; Sony (Tablet[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; Sony (Tablet[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Sony $1', 'brand_replacement' => 'Sony', 'model_replacement' => '$1', ], [ - 'regex' => '@; Sony ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; Sony ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Sony $1', 'brand_replacement' => 'Sony', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(Sony)([A-Za-z0-9\\-]+)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Sony)([A-Za-z0-9\\-]+)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Xperia [^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Xperia [^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Sony', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\\d{3}|D6[56]\\d{2})(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\\d{3}|D6[56]\\d{2})(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Sony', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SGP\\d{3}|SGPT\\d{2})(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(SGP\\d{3}|SGPT\\d{2})(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Sony', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(NW-Z1000Series)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(NW-Z1000Series)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Sony', 'model_replacement' => '$1', @@ -3970,13 +4462,13 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\\-]?|)([Mm][Ii])([ _\\-]|)(\\d{3}[^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}((?:CSL_Spice|Spice|SPICE|CSL)[ _\\-]?|)([Mm][Ii])([ _\\-]|)(\\d{3}[^;/]*)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2$3$4', 'brand_replacement' => 'Spice', 'model_replacement' => 'Mi$4', ], [ - 'regex' => '@; *(Sprint )(.+?) *(?:Build|[;/])@', + 'regex' => '@; {0,2}(Sprint )(.{1,200}?) {0,2}(?:Build|[;/])@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Sprint', 'model_replacement' => '$2', @@ -3988,103 +4480,103 @@ 'model_replacement' => '$2', ], [ - 'regex' => '@; *(TAGI[ ]?)(MID) ?([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TAGI[ ]?)(MID) ?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2$3', 'brand_replacement' => 'Tagi', 'model_replacement' => '$2$3', ], [ - 'regex' => '@; *(Oyster500|Opal 800)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Oyster500|Opal 800)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Tecmobile $1', 'brand_replacement' => 'Tecmobile', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(TECNO[ _])([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TECNO[ _])([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Tecno', 'model_replacement' => '$2', ], [ - 'regex' => '@; *Android for (Telechips|Techvision) ([^ ]+) @i', + 'regex' => '@; {0,2}Android for (Telechips|Techvision) ([^ ]+) @i', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(T-Hub2)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(T-Hub2)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Telstra', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(PAD) ?(100[12])(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(PAD) ?(100[12])(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Terra $1$2', 'brand_replacement' => 'Terra', 'model_replacement' => '$1$2', ], [ - 'regex' => '@; *(T[BM]-\\d{3}[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(T[BM]-\\d{3}[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Texet', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(tolino [^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(tolino [^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Thalia', 'model_replacement' => '$1', ], [ - 'regex' => '@; *Build/.* (TOLINO_BROWSER)@', + 'regex' => '@; {0,2}Build/.{0,200} (TOLINO_BROWSER)@', 'device_replacement' => '$1', 'brand_replacement' => 'Thalia', 'model_replacement' => 'Tolino Shine', ], [ - 'regex' => '@; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:CJ[ -])?(ThL|THL)[ -]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Thl', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(T100|T200|T5|W100|W200|W8s)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(T100|T200|T5|W100|W200|W8s)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Thl', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(T-Mobile[ _]G2[ _]Touch) Build@', + 'regex' => '@; {0,2}(T-Mobile[ _]G2[ _]Touch) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'HTC', 'model_replacement' => 'Hero', ], [ - 'regex' => '@; *(T-Mobile[ _]G2) Build@', + 'regex' => '@; {0,2}(T-Mobile[ _]G2) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'HTC', 'model_replacement' => 'Desire Z', ], [ - 'regex' => '@; *(T-Mobile myTouch Q) Build@', + 'regex' => '@; {0,2}(T-Mobile myTouch Q) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'Huawei', 'model_replacement' => 'U8730', ], [ - 'regex' => '@; *(T-Mobile myTouch) Build@', + 'regex' => '@; {0,2}(T-Mobile myTouch) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'Huawei', 'model_replacement' => 'U8680', ], [ - 'regex' => '@; *(T-Mobile_Espresso) Build@', + 'regex' => '@; {0,2}(T-Mobile_Espresso) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'HTC', 'model_replacement' => 'Espresso', ], [ - 'regex' => '@; *(T-Mobile G1) Build@', + 'regex' => '@; {0,2}(T-Mobile G1) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'HTC', 'model_replacement' => 'Dream', @@ -4096,13 +4588,13 @@ 'model_replacement' => '$2 $3 $4', ], [ - 'regex' => '@\\b(T-Mobile)_([^_]+)_(.*) Build@', + 'regex' => '@\\b(T-Mobile)_([^_]+)_(.{0,200}) Build@', 'device_replacement' => '$1 $2 $3', 'brand_replacement' => 'Tmobile', 'model_replacement' => '$2 $3', ], [ - 'regex' => '@\\b(T-Mobile)[_ ]?(.*?)Build@', + 'regex' => '@\\b(T-Mobile)[_ ]?(.{0,200}?)Build@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Tmobile', 'model_replacement' => '$2', @@ -4114,7 +4606,7 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@ *(TOOKY)[ _\\-]([^;/]+?) ?(?:Build|;)@i', + 'regex' => '@ ?(TOOKY)[ _\\-]([^;/]{1,100}) ?(?:Build|;)@i', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Tooky', 'model_replacement' => '$2', @@ -4126,67 +4618,85 @@ 'model_replacement' => 'Folio 100', ], [ - 'regex' => '@; *([Ff]olio ?100)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}([Ff]olio ?100)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Toshiba', 'model_replacement' => 'Folio 100', ], [ - 'regex' => '@; *(AT[0-9]{2,3}(?:\\-A|LE\\-A|PE\\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(AT[0-9]{2,3}(?:\\-A|LE\\-A|PE\\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]{1,100}|THRiVE|Thrive)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Toshiba $1', 'brand_replacement' => 'Toshiba', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(TM-MID\\d+[^;/]+|TOUCHMATE|MID-750)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TM-MID\\d+[^;/]{1,50}|TOUCHMATE|MID-750)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Touchmate', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(TM-SM\\d+[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(TM-SM\\d+[^;/]{1,50}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Touchmate', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(A10 [Bb]asic2?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(A10 [Bb]asic2?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Treq', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(TREQ[ _\\-])([^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(TREQ[ _\\-])([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => '$1$2', 'brand_replacement' => 'Treq', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(X-?5|X-?3)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(X-?5|X-?3)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Umeox', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(A502\\+?|A936|A603|X1|X2)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(A502\\+?|A936|A603|X1|X2)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Umeox', 'model_replacement' => '$1', ], [ - 'regex' => '@(TOUCH(?:TAB|PAD).+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; thor Build/@', + 'device_replacement' => 'Thor', + 'brand_replacement' => 'Vernee', + 'model_replacement' => 'Thor', + ], + [ + 'regex' => '@; Thor (E)? Build/@', + 'device_replacement' => 'Thor $1', + 'brand_replacement' => 'Vernee', + 'model_replacement' => 'Thor', + ], + [ + 'regex' => '@; Apollo Lite Build/@', + 'device_replacement' => 'Apollo Lite', + 'brand_replacement' => 'Vernee', + 'model_replacement' => 'Apollo', + ], + [ + 'regex' => '@(TOUCH(?:TAB|PAD).{1,200}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => 'Versus $1', 'brand_replacement' => 'Versus', 'model_replacement' => '$1', ], [ - 'regex' => '@(VERTU) ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@(VERTU) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Vertu', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Videocon)[ _\\-]([^;/]+?) *(?:Build|;)@', + 'regex' => '@; {0,2}(Videocon)[ _\\-]([^;/]{1,100}?) {0,2}(?:Build|;)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'Videocon', 'model_replacement' => '$2', @@ -4198,49 +4708,49 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@; *((?:ViewPad|ViewPhone|VSD)[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}((?:ViewPad|ViewPhone|VSD)[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Viewsonic', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(ViewSonic-)([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ViewSonic-)([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'Viewsonic', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(GTablet.*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(GTablet.{0,200}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'Viewsonic', 'model_replacement' => '$1', ], [ - 'regex' => '@; *([Vv]ivo)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}([Vv]ivo)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'vivo', 'model_replacement' => '$2', ], [ - 'regex' => '@(Vodafone) (.*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@(Vodafone) (.{0,200}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(?:Walton[ _\\-]|)(Primo[ _\\-][^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(?:Walton[ _\\-]|)(Primo[ _\\-][^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => 'Walton $1', 'brand_replacement' => 'Walton', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:WIKO[ \\-]|)(CINK\\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(?:WIKO[ \\-]|)(CINK\\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => 'Wiko $1', 'brand_replacement' => 'Wiko', 'model_replacement' => '$1', ], [ - 'regex' => '@; *WellcoM-([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}WellcoM-([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Wellcom $1', 'brand_replacement' => 'Wellcom', 'model_replacement' => '$1', @@ -4252,139 +4762,139 @@ 'model_replacement' => 'WeTab', ], [ - 'regex' => '@; *(AT-AS[^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(AT-AS[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Wolfgang $1', 'brand_replacement' => 'Wolfgang', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:Woxter|Wxt) ([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Woxter|Wxt) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Woxter $1', 'brand_replacement' => 'Woxter', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\\d{3}|TAB0?9-\\d{3}|TAB1[03]-\\d{3}|SMP\\d{2}-\\d{3})(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\\d{3}|TAB0?9-\\d{3}|TAB1[03]-\\d{3}|SMP\\d{2}-\\d{3})(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Yarvik $1', 'brand_replacement' => 'Yarvik', 'model_replacement' => '$1', ], [ - 'regex' => '@; *([A-Z]{2,4})(M\\d{3,}[A-Z]{2})([^;\\)\\/]*)(?: Build|[;\\)])@', + 'regex' => '@; {0,2}([A-Z]{2,4})(M\\d{3,}[A-Z]{2})([^;\\)\\/]*)(?: Build|[;\\)])@', 'device_replacement' => 'Yifang $1$2$3', 'brand_replacement' => 'Yifang', 'model_replacement' => '$2', ], [ - 'regex' => '@; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/@', + 'regex' => '@; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/@', 'device_replacement' => 'XiaoMi $1', 'brand_replacement' => 'XiaoMi', 'model_replacement' => '$1', ], [ - 'regex' => '@; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\\)]*)@', + 'regex' => '@; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\\)]*)@', 'device_replacement' => 'XiaoMi $1', 'brand_replacement' => 'XiaoMi', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(MIX) (Build|MIUI)/@', + 'regex' => '@; {0,2}(MIX) (Build|MIUI)/@', 'device_replacement' => 'XiaoMi $1', 'brand_replacement' => 'XiaoMi', 'model_replacement' => '$1', ], [ - 'regex' => '@; *((MIX) ([^;/]*)) (Build|MIUI)/@', + 'regex' => '@; {0,2}((MIX) ([^;/]*)) (Build|MIUI)/@', 'device_replacement' => 'XiaoMi $1', 'brand_replacement' => 'XiaoMi', 'model_replacement' => '$1', ], [ - 'regex' => '@; *XOLO[ _]([^;/]*tab.*)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}XOLO[ _]([^;/]{0,30}tab.{0,30})(?: Build|\\) AppleWebKit)@i', 'device_replacement' => 'Xolo $1', 'brand_replacement' => 'Xolo', 'model_replacement' => '$1', ], [ - 'regex' => '@; *XOLO[ _]([^;/]+?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}XOLO[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => 'Xolo $1', 'brand_replacement' => 'Xolo', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(q\\d0{2,3}[a-z]?)(?: Build|\\) AppleWebKit)@i', + 'regex' => '@; {0,2}(q\\d0{2,3}[a-z]?)(?: Build|\\) AppleWebKit)@i', 'device_replacement' => 'Xolo $1', 'brand_replacement' => 'Xolo', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(PAD ?[79]\\d+[^;/]*|TelePAD\\d+[^;/])(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(PAD ?[79]\\d+[^;/]{0,50}|TelePAD\\d+[^;/])(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'Xoro $1', 'brand_replacement' => 'Xoro', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:(?:ZOPO|Zopo)[ _]([^;/]+?)|(ZP ?(?:\\d{2}[^;/]+|C2))|(C[2379]))(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:(?:ZOPO|Zopo)[ _]([^;/]{1,100}?)|(ZP ?(?:\\d{2}[^;/]{1,100}|C2))|(C[2379]))(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2$3', 'brand_replacement' => 'Zopo', 'model_replacement' => '$1$2$3', ], [ - 'regex' => '@; *(ZiiLABS) (Zii[^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ZiiLABS) (Zii[^;/]*)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'ZiiLabs', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(Zii)_([^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Zii)_([^;/]*)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'ZiiLabs', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]*?|Era|Memo[^;]*?)|JOE|(?:Kis|KIS)\\b[^;]*?|Libra|Light [^;]*?|N8[056][01]|N850L|N8000|N9[15]\\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]*?|RacerII|RACERII|San Francisco[^;]*?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]{0,200}?|Era|Memo[^;]{0,200}?)|JOE|(?:Kis|KIS)\\b[^;]{0,200}?|Libra|Light [^;]{0,200}?|N8[056][01]|N850L|N8000|N9[15]\\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]{0,200}?|RacerII|RACERII|San Francisco[^;]{0,200}?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'ZTE', 'model_replacement' => '$1', ], [ - 'regex' => '@; *([A-Z]\\d+)_USA_[^;]*(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}([A-Z]\\d+)_USA_[^;]{0,200}(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'ZTE', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(SmartTab\\d+)[^;]*(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(SmartTab\\d+)[^;]{0,50}(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1', 'brand_replacement' => 'ZTE', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'ZTE Blade$1', 'brand_replacement' => 'ZTE', 'model_replacement' => 'Blade$1', ], [ - 'regex' => '@; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'ZTE Skate$1', 'brand_replacement' => 'ZTE', 'model_replacement' => 'Skate$1', ], [ - 'regex' => '@; *(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1$2', 'brand_replacement' => 'ZTE', 'model_replacement' => '$1$2', ], [ - 'regex' => '@; *(?:ZXY-ZTE_|ZTE\\-U |ZTE[\\- _]|ZTE-C[_ ])([^;/]+?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; {0,2}(?:ZXY-ZTE_|ZTE\\-U |ZTE[\\- _]|ZTE-C[_ ])([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => 'ZTE $1', 'brand_replacement' => 'ZTE', 'model_replacement' => '$1', ], [ - 'regex' => '@; (BASE) (lutea|Lutea 2|Tab[^;]*?)(?: Build|\\) AppleWebKit)@', + 'regex' => '@; (BASE) (lutea|Lutea 2|Tab[^;]{0,200}?)(?: Build|\\) AppleWebKit)@', 'device_replacement' => '$1 $2', 'brand_replacement' => 'ZTE', 'model_replacement' => '$1 $2', @@ -4396,7 +4906,7 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@; *(vp9plus)\\)@', + 'regex' => '@; {0,2}(vp9plus)\\)@', 'device_replacement' => '$1', 'brand_replacement' => 'ZTE', 'model_replacement' => '$1', @@ -4468,7 +4978,7 @@ 'model_replacement' => 'Kindle Fire HDX 8.9" 4G', ], [ - 'regex' => '@; ?Amazon ([^;/]+) Build\\b@', + 'regex' => '@; ?Amazon ([^;/]{1,100}) Build\\b@', 'device_replacement' => '$1', 'brand_replacement' => 'Amazon', 'model_replacement' => '$1', @@ -4498,25 +5008,25 @@ 'model_replacement' => 'Kindle', ], [ - 'regex' => '@(sprd)\\-([^/]+)/@', + 'regex' => '@(sprd)\\-([^/]{1,50})/@', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@; *(H\\d{2}00\\+?) Build@', + 'regex' => '@; {0,2}(H\\d{2}00\\+?) Build@', 'device_replacement' => '$1', 'brand_replacement' => 'Hero', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(iphone|iPhone5) Build/@', + 'regex' => '@; {0,2}(iphone|iPhone5) Build/@', 'device_replacement' => 'Xianghe $1', 'brand_replacement' => 'Xianghe', 'model_replacement' => '$1', ], [ - 'regex' => '@; *(e\\d{4}[a-z]?_?v\\d+|v89_[^;/]+)[^;/]+ Build/@', + 'regex' => '@; {0,2}(e\\d{4}[a-z]?_?v\\d+|v89_[^;/]{1,100})[^;/]{1,30} Build/@', 'device_replacement' => 'Xianghe $1', 'brand_replacement' => 'Xianghe', 'model_replacement' => '$1', @@ -4528,115 +5038,115 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\\)]+)@', + 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]{0,200}; {0,2}([^;,\\)]+)@', 'device_replacement' => 'Alcatel $1', 'brand_replacement' => 'Alcatel', 'model_replacement' => '$1', ], [ - 'regex' => '@Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\\)]+)@', + 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]{0,200}; {0,2}([^;,\\)]+)@', 'device_replacement' => 'Asus $1', 'brand_replacement' => 'Asus', 'model_replacement' => '$1', ], [ - 'regex' => '@Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\\)]+)@', + 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]{0,200}; {0,2}([^;,\\)]+)@', 'device_replacement' => 'Dell $1', 'brand_replacement' => 'Dell', 'model_replacement' => '$1', ], [ - 'regex' => '@Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\\)]+)@', + 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]{0,200})[^;]{0,200}; {0,2}(?:HTC|)([^;,\\)]+)@', 'device_replacement' => 'HTC $1', 'brand_replacement' => 'HTC', 'model_replacement' => '$1', ], [ - 'regex' => '@Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\\)]+)@', + 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]{0,200}; {0,2}(?:HUAWEI |)([^;,\\)]+)@', 'device_replacement' => 'Huawei $1', 'brand_replacement' => 'Huawei', 'model_replacement' => '$1', ], [ - 'regex' => '@Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \\-]|)([^;,\\)]+)@', + 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]{0,200}; {0,2}(?:LG[ \\-]|)([^;,\\)]+)@', 'device_replacement' => 'LG $1', 'brand_replacement' => 'LG', 'model_replacement' => '$1', ], [ - 'regex' => '@Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\\d{3,10}[^;\\)]*)@', + 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\\d{3,10}[^;\\)]*)@', 'device_replacement' => 'Lumia $1', 'brand_replacement' => 'Nokia', 'model_replacement' => 'Lumia $1', ], [ - 'regex' => '@Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\\d{3,})@', + 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(RM-\\d{3,})@', 'device_replacement' => 'Nokia $1', 'brand_replacement' => 'Nokia', 'model_replacement' => '$1', ], [ - 'regex' => '@(?:Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\\)]+)@', + 'regex' => '@(?:Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\\)]+)@', 'device_replacement' => 'Nokia $1', 'brand_replacement' => 'Nokia', 'model_replacement' => '$1', ], [ - 'regex' => '@Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\\)]+)@', + 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]{0,200}; {0,2}([^;,\\)]+)@', 'device_replacement' => 'Microsoft $1', 'brand_replacement' => 'Microsoft', 'model_replacement' => '$1', ], [ - 'regex' => '@Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\\.\\)]+)@', + 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]{0,200}; {0,2}(?:SAMSUNG |)([^;,\\.\\)]+)@', 'device_replacement' => 'Samsung $1', 'brand_replacement' => 'Samsung', 'model_replacement' => '$1', ], [ - 'regex' => '@Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\\)]+)@', + 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]{0,200}; {0,2}([^;,\\)]+)@', 'device_replacement' => 'Toshiba $1', 'brand_replacement' => 'Toshiba', 'model_replacement' => '$1', ], [ - 'regex' => '@Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\\)]+)@', + 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]{1,200}); {0,2}([^;,\\)]+)@', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@(?:^|; )SAMSUNG\\-([A-Za-z0-9\\-]+).* Bada/@', + 'regex' => '@(?:^|; )SAMSUNG\\-([A-Za-z0-9\\-]{1,50}).{0,200} Bada/@', 'device_replacement' => 'Samsung $1', 'brand_replacement' => 'Samsung', 'model_replacement' => '$1', ], [ - 'regex' => '@\\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+?)(?:/[^;]+|); rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/@', + 'regex' => '@\\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]{1,100}?)(?:/[^;]{1,200}|); rv:[^\\)]{1,200}\\) Gecko/[^\\/]{1,200} Firefox/@', 'device_replacement' => 'Alcatel $1 $2 $3', 'brand_replacement' => 'Alcatel', 'model_replacement' => 'One Touch $3', ], [ - 'regex' => '@\\(Mobile; (?:ZTE([^;]+)|(OpenC)); rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/@', + 'regex' => '@\\(Mobile; (?:ZTE([^;]{1,200})|(OpenC)); rv:[^\\)]{1,200}\\) Gecko/[^\\/]{1,200} Firefox/@', 'device_replacement' => 'ZTE $1$2', 'brand_replacement' => 'ZTE', 'model_replacement' => '$1$2', ], [ - 'regex' => '@\\(Mobile; ALCATEL([A-Za-z0-9\\-]+); rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/[^\\/]+ KaiOS/@', + 'regex' => '@\\(Mobile; ALCATEL([A-Za-z0-9\\-]+); rv:[^\\)]{1,200}\\) Gecko/[^\\/]{1,200} Firefox/[^\\/]{1,200} KaiOS/@', 'device_replacement' => 'Alcatel $1', 'brand_replacement' => 'Alcatel', 'model_replacement' => '$1', ], [ - 'regex' => '@\\(Mobile; LYF\\/([A-Za-z0-9\\-]+)\\/.+;.+rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/[^\\/]+ KAIOS/@', + 'regex' => '@\\(Mobile; LYF\\/([A-Za-z0-9\\-]{1,100})\\/.{0,100};.{0,100}rv:[^\\)]{1,100}\\) Gecko/[^\\/]{1,100} Firefox/[^\\/]{1,100} KAIOS/@', 'device_replacement' => 'LYF $1', 'brand_replacement' => 'LYF', 'model_replacement' => '$1', ], [ - 'regex' => '@\\(Mobile; Nokia_([A-Za-z0-9\\-]+)_.+; rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/[^\\/]+ KAIOS/@', + 'regex' => '@\\(Mobile; Nokia_([A-Za-z0-9\\-]{1,100})_.{1,100}; rv:[^\\)]{1,100}\\) Gecko/[^\\/]{1,100} Firefox/[^\\/]{1,100} KAIOS/@', 'device_replacement' => 'Nokia $1', 'brand_replacement' => 'Nokia', 'model_replacement' => '$1', @@ -4648,7 +5158,7 @@ 'model_replacement' => '$1$2', ], [ - 'regex' => '@(?:NOKIA|Nokia)(?:\\-| *)(?:([A-Za-z0-9]+)\\-[0-9a-f]{32}|([A-Za-z0-9\\-]+)(?:UCBrowser)|([A-Za-z0-9\\-]+))@', + 'regex' => '@(?:NOKIA|Nokia)(?:\\-| {0,2})(?:([A-Za-z0-9]+)\\-[0-9a-f]{32}|([A-Za-z0-9\\-]+)(?:UCBrowser)|([A-Za-z0-9\\-]+))@', 'device_replacement' => 'Nokia $1$2$3', 'brand_replacement' => 'Nokia', 'model_replacement' => '$1$2$3', @@ -4660,13 +5170,13 @@ 'model_replacement' => 'Lumia $1', ], [ - 'regex' => '@\\(Symbian; U; S60 V5; [A-z]{2}\\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+?)\\)@', + 'regex' => '@\\(Symbian; U; S60 V5; [A-z]{2}\\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]{1,100}?)\\)@', 'device_replacement' => '$1 $2', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@\\(Symbian(?:/3|); U; ([^;]+);@', + 'regex' => '@\\(Symbian(?:/3|); U; ([^;]{1,200});@', 'device_replacement' => 'Nokia $1', 'brand_replacement' => 'Nokia', 'model_replacement' => '$1', @@ -4678,7 +5188,7 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@Play[Bb]ook.+RIM Tablet OS@', + 'regex' => '@Play[Bb]ook.{1,200}RIM Tablet OS@', 'device_replacement' => 'BlackBerry Playbook', 'brand_replacement' => 'BlackBerry', 'model_replacement' => 'Playbook', @@ -4719,7 +5229,7 @@ 'model_replacement' => 'Treo $1', ], [ - 'regex' => '@webOS.*(P160U(?:NA|))/(\\d+).(\\d+)@', + 'regex' => '@webOS.{0,200}(P160U(?:NA|))/(\\d+).(\\d+)@', 'device_replacement' => 'HP Veer', 'brand_replacement' => 'HP', 'model_replacement' => 'Veer', @@ -4731,7 +5241,7 @@ 'model_replacement' => 'TouchPad', ], [ - 'regex' => '@HPiPAQ([A-Za-z0-9]+)/\\d+.\\d+@', + 'regex' => '@HPiPAQ([A-Za-z0-9]{1,20})/\\d+\\.\\d+@', 'device_replacement' => 'HP iPAQ $1', 'brand_replacement' => 'HP', 'model_replacement' => 'iPAQ $1', @@ -4803,19 +5313,19 @@ 'model_replacement' => 'iPhone', ], [ - 'regex' => '@CFNetwork/.* Darwin/\\d.*\\(((?:Mac|iMac|PowerMac|PowerBook)[^\\d]*)(\\d+)(?:,|%2C)(\\d+)@', + 'regex' => '@CFNetwork/.{0,100} Darwin/\\d.{0,100}\\(((?:Mac|iMac|PowerMac|PowerBook)[^\\d]*)(\\d+)(?:,|%2C)(\\d+)@', 'device_replacement' => '$1$2,$3', 'brand_replacement' => 'Apple', 'model_replacement' => '$1$2,$3', ], [ - 'regex' => '@CFNetwork/.* Darwin/\\d+\\.\\d+\\.\\d+ \\(x86_64\\)@', + 'regex' => '@CFNetwork/.{0,100} Darwin/\\d+\\.\\d+\\.\\d+ \\(x86_64\\)@', 'device_replacement' => 'Mac', 'brand_replacement' => 'Apple', 'model_replacement' => 'Mac', ], [ - 'regex' => '@CFNetwork/.* Darwin/\\d@', + 'regex' => '@CFNetwork/.{0,100} Darwin/\\d@', 'device_replacement' => 'iOS-Device', 'brand_replacement' => 'Apple', 'model_replacement' => 'iOS-Device', @@ -4851,7 +5361,7 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@(?:asus.*?ASUS|Asus|ASUS|asus)[\\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)@', + 'regex' => '@(?:asus.{0,200}?ASUS|Asus|ASUS|asus)[\\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)@', 'device_replacement' => 'Asus $1', 'brand_replacement' => 'Asus', 'model_replacement' => '$1', @@ -4881,19 +5391,19 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@([A-Za-z0-9]+)_W;FOMA@', + 'regex' => '@^.{0,50}?([A-Za-z0-9]{1,30})_W;FOMA@', 'device_replacement' => 'DoCoMo $1', 'brand_replacement' => 'DoCoMo', 'model_replacement' => '$1', ], [ - 'regex' => '@([A-Za-z0-9]+);FOMA@', + 'regex' => '@^.{0,50}?([A-Za-z0-9]{1,30});FOMA@', 'device_replacement' => 'DoCoMo $1', 'brand_replacement' => 'DoCoMo', 'model_replacement' => '$1', ], [ - 'regex' => '@\\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\\(\\)]|$)@', + 'regex' => '@\\b(?:HTC/|HTC/[a-z0-9]{1,20}/|)HTC[ _\\-;]? {0,2}(.{0,200}?)(?:-?Mozilla|fingerPrint|[;/\\(\\)]|$)@', 'device_replacement' => 'HTC $1', 'brand_replacement' => 'HTC', 'model_replacement' => '$1', @@ -4953,13 +5463,13 @@ 'model_replacement' => '$3', ], [ - 'regex' => '@(HbbTV)/1\\.1\\.1.*CE-HTML/1\\.\\d;(Vendor/|)(THOM[^;]*?)[;\\s].{0,30}(LF[^;]+);?@', + 'regex' => '@(HbbTV)/1\\.1\\.1.{0,200}CE-HTML/1\\.\\d;(Vendor/|)(THOM[^;]{0,200}?)[;\\s].{0,30}(LF[^;]{1,200});?@', 'device_replacement' => '$1', 'brand_replacement' => 'Thomson', 'model_replacement' => '$4', ], [ - 'regex' => '@(HbbTV)(?:/1\\.1\\.1|) ?(?: \\(;;;;;\\)|); *CE-HTML(?:/1\\.\\d|); *([^ ]+) ([^;]+);@', + 'regex' => '@(HbbTV)(?:/1\\.1\\.1|) ?(?: \\(;;;;;\\)|); {0,2}CE-HTML(?:/1\\.\\d|); {0,2}([^ ]{1,30}) ([^;]{1,200});@', 'device_replacement' => '$1', 'brand_replacement' => '$2', 'model_replacement' => '$3', @@ -4970,7 +5480,7 @@ 'brand_replacement' => 'Samsung', ], [ - 'regex' => '@(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+ \\([^;]{0,30}; ?(?:CUS:([^;]*)|([^;]+)) ?; ?([^;]{0,30})@', + 'regex' => '@(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+ \\([^;]{0,30}; ?(?:CUS:([^;]{0,200})|([^;]{1,200})) ?; ?([^;]{0,30})@', 'device_replacement' => '$1', 'brand_replacement' => '$2$3', 'model_replacement' => '$4', @@ -4980,19 +5490,19 @@ 'device_replacement' => '$1', ], [ - 'regex' => '@LGE; (?:Media\\/|)([^;]*);[^;]*;[^;]*;?\\); "?LG NetCast(\\.TV|\\.Media|)-\\d+@', + 'regex' => '@LGE; (?:Media\\/|)([^;]{0,200});[^;]{0,200};[^;]{0,200};?\\); "?LG NetCast(\\.TV|\\.Media|)-\\d+@', 'device_replacement' => 'NetCast$2', 'brand_replacement' => 'LG', 'model_replacement' => '$1', ], [ - 'regex' => '@InettvBrowser/[0-9]+\\.[0-9A-Z]+ \\([^;]*;(Sony)([^;]*);[^;]*;[^\\)]*\\)@', + 'regex' => '@InettvBrowser/[0-9]{1,30}\\.[0-9A-Z]{1,30} \\([^;]{0,200};(Sony)([^;]{0,200});[^;]{0,200};[^\\)]{0,10}\\)@', 'device_replacement' => 'Inettv', 'brand_replacement' => '$1', 'model_replacement' => '$2', ], [ - 'regex' => '@InettvBrowser/[0-9]+\\.[0-9A-Z]+ \\([^;]*;([^;]*);[^;]*;[^\\)]*\\)@', + 'regex' => '@InettvBrowser/[0-9]{1,30}\\.[0-9A-Z]{1,30} \\([^;]{0,200};([^;]{0,200});[^;]{0,200};[^\\)]{0,10}\\)@', 'device_replacement' => 'Inettv', 'brand_replacement' => 'Generic_Inettv', 'model_replacement' => '$1', @@ -5033,7 +5543,7 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@(?:MSIE|XBMC).*\\b(Xbox)\\b@', + 'regex' => '@(?:MSIE|XBMC).{0,200}\\b(Xbox)\\b@', 'device_replacement' => '$1', 'brand_replacement' => 'Microsoft', 'model_replacement' => '$1', @@ -5062,6 +5572,18 @@ 'brand_replacement' => 'Motorola', 'model_replacement' => '$1', ], + [ + 'regex' => '@; (moto[ a-zA-z0-9()]{0,50});((?: Build|.{0,50}\\) AppleWebKit))@', + 'device_replacement' => '$1', + 'brand_replacement' => 'Motorola', + 'model_replacement' => '$1', + ], + [ + 'regex' => '@; {0,2}(moto)(.{0,50})(?: Build|\\) AppleWebKit)@', + 'device_replacement' => 'Motorola$2', + 'brand_replacement' => 'Motorola', + 'model_replacement' => '$2', + ], [ 'regex' => '@Nintendo WiiU@', 'device_replacement' => 'Nintendo Wii U', @@ -5069,7 +5591,7 @@ 'model_replacement' => 'Wii U', ], [ - 'regex' => '@Nintendo (DS|3DS|DSi|Wii);@', + 'regex' => '@Nintendo (Switch|DS|3DS|DSi|Wii);@', 'device_replacement' => 'Nintendo $1', 'brand_replacement' => 'Nintendo', 'model_replacement' => '$1', @@ -5093,13 +5615,13 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@(SMART-TV); .* Tizen @', + 'regex' => '@(SMART-TV); .{0,200} Tizen @', 'device_replacement' => 'Samsung $1', 'brand_replacement' => 'Samsung', 'model_replacement' => '$1', ], [ - 'regex' => '@SymbianOS/9\\.\\d.* Samsung[/\\-]([A-Za-z0-9 \\-]+)@', + 'regex' => '@SymbianOS/9\\.\\d.{0,200} Samsung[/\\-]([A-Za-z0-9 \\-]+)@', 'device_replacement' => 'Samsung $1', 'brand_replacement' => 'Samsung', 'model_replacement' => '$1', @@ -5111,7 +5633,7 @@ 'model_replacement' => '$2-$3', ], [ - 'regex' => '@SAMSUNG-ANDROID-MMS/([^;/]+)@', + 'regex' => '@SAMSUNG-ANDROID-MMS/([^;/]{1,100})@', 'device_replacement' => '$1', 'brand_replacement' => 'Samsung', 'model_replacement' => '$1', @@ -5147,7 +5669,7 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@Android [^;]+; ([^ ]+) (Sony)/@', + 'regex' => '@Android [^;]{1,200}; ([^ ]+) (Sony)/@', 'device_replacement' => '$2 $1', 'brand_replacement' => '$2', 'model_replacement' => '$1', @@ -5183,48 +5705,48 @@ 'model_replacement' => 'Smartphone', ], [ - 'regex' => '@Android[\\- ][\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\\))@', + 'regex' => '@Android[\\- ][\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{0,2}; WOWMobile (.{1,200})( Build[/ ]|\\))@', 'brand_replacement' => 'Generic_Android', 'model_replacement' => '$1', ], [ - 'regex' => '@Android[\\- ][\\d]+\\.[\\d]+\\-update1; [A-Za-z]{2}\\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\\))@', + 'regex' => '@Android[\\- ][\\d]+\\.[\\d]+\\-update1; [A-Za-z]{2}\\-[A-Za-z]{0,2} {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\\))@', 'brand_replacement' => 'Generic_Android', 'model_replacement' => '$1', ], [ - 'regex' => '@Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *[A-Za-z]{2}[_\\-][A-Za-z]{0,2}\\-? *; *(.+?)( Build[/ ]|\\))@', + 'regex' => '@Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); {0,2}[A-Za-z]{2}[_\\-][A-Za-z]{0,2}\\-? {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\\))@', 'brand_replacement' => 'Generic_Android', 'model_replacement' => '$1', ], [ - 'regex' => '@Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *[A-Za-z]{0,2}\\- *; *(.+?)( Build[/ ]|\\))@', + 'regex' => '@Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); {0,2}[A-Za-z]{0,2}\\- {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\\))@', 'brand_replacement' => 'Generic_Android', 'model_replacement' => '$1', ], [ - 'regex' => '@Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *[a-z]{0,2}[_\\-]?[A-Za-z]{0,2};?( Build[/ ]|\\))@', + 'regex' => '@Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); {0,2}[a-z]{0,2}[_\\-]?[A-Za-z]{0,2};?( Build[/ ]|\\))@', 'device_replacement' => 'Generic Smartphone', 'brand_replacement' => 'Generic', 'model_replacement' => 'Smartphone', ], [ - 'regex' => '@Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *\\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\\))@', + 'regex' => '@Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); {0,3}\\-?[A-Za-z]{2}; {0,2}(.{1,50}?)( Build[/ ]|\\))@', 'brand_replacement' => 'Generic_Android', 'model_replacement' => '$1', ], [ - 'regex' => '@Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]+?)(?: Build|\\) AppleWebKit).+? Mobile Safari@', + 'regex' => '@Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]{1,100}?)(?: Build|\\) AppleWebKit).{1,200}? Mobile Safari@', 'brand_replacement' => 'Generic_Android', 'model_replacement' => '$1', ], [ - 'regex' => '@Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]+?)(?: Build|\\) AppleWebKit).+? Safari@', + 'regex' => '@Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]{1,100}?)(?: Build|\\) AppleWebKit).{1,200}? Safari@', 'brand_replacement' => 'Generic_Android_Tablet', 'model_replacement' => '$1', ], [ - 'regex' => '@Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]+?)(?: Build|\\))@', + 'regex' => '@Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]{1,100}?)(?: Build|\\))@', 'brand_replacement' => 'Generic_Android', 'model_replacement' => '$1', ], @@ -5244,13 +5766,13 @@ 'model_replacement' => '$1', ], [ - 'regex' => '@(Android 3\\.\\d|Opera Tablet|Tablet; .+Firefox/|Android.*(?:Tab|Pad))@i', + 'regex' => '@(Android 3\\.\\d|Opera Tablet|Tablet; .{1,100}Firefox/|Android.{0,100}(?:Tab|Pad))@i', 'device_replacement' => 'Generic Tablet', 'brand_replacement' => 'Generic', 'model_replacement' => 'Tablet', ], [ - 'regex' => '@(Symbian|\\bS60(Version|V\\d)|\\bS60\\b|\\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .+Firefox/|iPhone OS|Android|MobileSafari|Windows *Phone|\\(webOS/|PalmOS)@', + 'regex' => '@(Symbian|\\bS60(Version|V\\d)|\\bS60\\b|\\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .{1,200}Firefox/|iPhone OS|Android|MobileSafari|Windows {0,2}Phone|\\(webOS/|PalmOS)@', 'device_replacement' => 'Generic Smartphone', 'brand_replacement' => 'Generic', 'model_replacement' => 'Smartphone', @@ -5262,7 +5784,7 @@ 'model_replacement' => 'Smartphone', ], [ - 'regex' => '@(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper)@i', + 'regex' => '@^.{0,100}(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.{0,200}/\\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper|RecipeRadar|GPTBot|Google-InspectionTool)@i', 'device_replacement' => 'Spider', 'brand_replacement' => 'Spider', 'model_replacement' => 'Desktop', diff --git a/uap-core b/uap-core index f215924..432e95f 160000 --- a/uap-core +++ b/uap-core @@ -1 +1 @@ -Subproject commit f21592418f6323f9ce32f10e231841cf8e782b43 +Subproject commit 432e95f6767cc8bab4c20c255784cd6f7e93bc15