user_agent_parsers:
# CFNetwork Podcast catcher Applications
- 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'
# @note: iOS / OSX Applications
- regex: '(CFNetwork)(?:/(\d+)\.(\d+)(?:\.(\d+)|)|)'
family_replacement: 'CFNetwork'
# 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34'
# Bots
- 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)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
# Bots Pattern 'name/0.0.0'
- regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
# Bots Pattern 'name/0.0.0'
- 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+)|)'
# Bots General matcher 'name/0.0'
- 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+)|)|)'
# Bots containing bot(but not CUBOT)
- regex: '^.{0,200}?((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
# Bots containing spider|scrape|Crawl
- 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+)|)|)'
# must go before Firefox to catch Chimera/SeaMonkey/Camino/Waterfox
- regex: '(Chimera|SeaMonkey|Camino|Waterfox)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*|)'
# must be before Firefox / Gecko to catch SailfishBrowser properly
- regex: '(SailfishBrowser)/(\d+)\.(\d+)(?:\.(\d+)|)'
family_replacement: 'Sailfish Browser'
# Firefox
- regex: '(Fennec)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)'
family_replacement: 'Firefox Mobile'
- regex: '(Fennec)/(\d+)\.(\d+)(pre)'
family_replacement: 'Firefox Mobile'
- regex: '(Fennec)/(\d+)\.(\d+)'
family_replacement: 'Firefox Mobile'
- regex: '(?:Mobile|Tablet);.{0,200}(Firefox)/(\d+)\.(\d+)'
family_replacement: 'Firefox Mobile'
- regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))'
family_replacement: 'Firefox ($1)'
- regex: '(Firefox)/(\d+)\.(\d+)(a\d+[a-z]*)'
family_replacement: 'Firefox Alpha'
- regex: '(Firefox)/(\d+)\.(\d+)(b\d+[a-z]*)'
family_replacement: 'Firefox Beta'
- regex: '(Firefox)-(?:\d+\.\d+|)/(\d+)\.(\d+)(a\d+[a-z]*)'
family_replacement: 'Firefox Alpha'
- regex: '(Firefox)-(?:\d+\.\d+|)/(\d+)\.(\d+)(b\d+[a-z]*)'
family_replacement: 'Firefox Beta'
- regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
family_replacement: 'Firefox ($1)'
- regex: '(Firefox).{0,200}Tablet browser (\d+)\.(\d+)\.(\d+)'
family_replacement: 'MicroB'
- regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
- regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+)|)(\.(\d+)|)'
family_replacement: 'Firefox iOS'
# Opera will stop at 9.80 and hide the real version in the Version string.
# see: http://dev.opera.com/articles/view/opera-ua-string-changes/
- regex: '(Opera Tablet).{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
- regex: '(Opera Mini)(?:/att|)/?(\d+|)(?:\.(\d+)|)(?:\.(\d+)|)'
- regex: '(Opera)/.{1,100}Opera Mobi.{1,100}Version/(\d+)\.(\d+)'
family_replacement: 'Opera Mobile'
- regex: '(Opera)/(\d+)\.(\d+).{1,100}Opera Mobi'
family_replacement: 'Opera Mobile'
- regex: 'Opera Mobi.{1,100}(Opera)(?:/|\s+)(\d+)\.(\d+)'
family_replacement: 'Opera Mobile'
- regex: 'Opera Mobi'
family_replacement: 'Opera Mobile'
- regex: '(Opera)/9.80.{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
# Opera 14 for Android uses a WebKit render engine.
- regex: '(?:Mobile Safari).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Opera Mobile'
# Opera >=15 for Desktop is similar to Chrome but includes an "OPR" Version string.
- regex: '(?:Chrome).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Opera'
# Opera Coast
- regex: '(Coast)/(\d+).(\d+).(\d+)'
family_replacement: 'Opera Coast'
# Opera Mini for iOS (from version 8.0.0)
- regex: '(OPiOS)/(\d+).(\d+).(\d+)'
family_replacement: 'Opera Mini'
# Opera Neon
- regex: 'Chrome/.{1,200}( MMS)/(\d+).(\d+).(\d+)'
family_replacement: 'Opera Neon'
- regex: 'PLAYSTATION 3.{1,200}WebKit'
family_replacement: 'NetFront NX'
- regex: 'PLAYSTATION 3'
family_replacement: 'NetFront'
- regex: '(PlayStation Portable)'
family_replacement: 'NetFront'
- regex: '(PlayStation Vita)'
family_replacement: 'NetFront NX'
- regex: 'AppleWebKit.{1,200} (NX)/(\d+)\.(\d+)\.(\d+)'
family_replacement: 'NetFront NX'
- regex: '(Nintendo 3DS)'
family_replacement: 'NetFront NX'
# Edge Mobile
- regex: 'Windows Phone .{0,200}(Edge)/(\d+)\.(\d+)'
family_replacement: 'Edge Mobile'
- regex: '(EdgiOS|EdgA)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
family_replacement: 'Edge Mobile'
# Google Search App on Android, eg:
- regex: 'Mozilla.{1,200}Android.{1,200}(GSA)/(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Google'
# Chrome Mobile
- regex: 'Version/.{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Chrome Mobile WebView'
- regex: '; wv\).{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Chrome Mobile WebView'
- regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Chrome Mobile'
- regex: '(CriOS)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
family_replacement: 'Chrome Mobile iOS'
- regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)'
family_replacement: 'Chrome Mobile'
- regex: ' Mobile .{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Chrome Mobile'
# Chrome Frame must come before MSIE.
- regex: '(chromeframe)/(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Chrome Frame'
#### MAIN CASES - this catches > 50% of all browsers ####
# Browser/major_version.minor_version.beta_version
- regex: '\b(MobileIron|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Spotify|Flock|Netscape|Lunascape|WebPilot|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave|MacOutlook|Electron|OktaMobile)/(\d+)\.(\d+)\.(\d+)'
# Edge/major_version.minor_version
# Edge with chromium Edg/major_version.minor_version.patch.minor_patch
- regex: '(Edge?)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
family_replacement: 'Edge'
# Headless Chrome
# https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md
- regex: '(HeadlessChrome)(?:/(\d+)\.(\d+)\.(\d+)|)'
# Browser/major_version.minor_version
- regex: '(bingbot|Bolt|AdobeAIR|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|iTunes|MacAppStore|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin|qutebrowser|Otter|QupZilla|MailBar|kmail2|YahooMobileMail|ExchangeWebServices|ExchangeServicesClient|Dragon|Outlook-iOS-Android)/(\d+)\.(\d+)(?:\.(\d+)|)'
# Chrome/Chromium/major_version.minor_version
- regex: '(Chromium|Chrome)/(\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
##########
# IE Mobile needs to happen before Android to catch cases such as:
# Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920)...
# Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; ANZ821)...
# Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Orange)...
# Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Vodafone)...
##########
# IE Mobile
- regex: '(IEMobile)[ /](\d+)\.(\d+)'
family_replacement: 'IE Mobile'
# Browser major_version.minor_version.beta_version (space instead of slash)
- regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
# Browser major_version.minor_version (space instead of slash)
- regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
# weird android UAs
- regex: '(Android) Donut'
v1_replacement: '1'
v2_replacement: '2'
- regex: '(Android) Eclair'
v1_replacement: '2'
v2_replacement: '1'
- regex: '(Android) Froyo'
v1_replacement: '2'
v2_replacement: '2'
- regex: '(Android) Gingerbread'
v1_replacement: '2'
v2_replacement: '3'
- regex: '(Android) Honeycomb'
v1_replacement: '3'
# desktop mode
# http://www.anandtech.com/show/3982/windows-phone-7-review
- regex: '(MSIE) (\d+)\.(\d+).{0,100}XBLWP7'
family_replacement: 'IE Large Screen'
#### END MAIN CASES ####
#### SPECIAL CASES ####
# @note: iOS / OSX Applications
- regex: '(iPod|iPhone|iPad).{1,200}GSA/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|) Mobile'
family_replacement: 'Google'
- regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|).{1,200}[ +]Safari'
family_replacement: 'Mobile Safari'
- 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).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
family_replacement: 'Mobile Safari UI/WKWebView'
- regex: '(iPod|iPod touch|iPhone|iPad).{0,200} Safari'
family_replacement: 'Mobile Safari'
- regex: '(iPod|iPod touch|iPhone|iPad)'
family_replacement: 'Mobile Safari UI/WKWebView'
- regex: '(Watch)(\d+),(\d+)'
family_replacement: 'Apple $1 App'
# WebKit Nightly
- regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .{0,200} Safari'
family_replacement: 'WebKit Nightly'
# Safari
- regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).{0,100}Safari/'
family_replacement: 'Safari'
# Safari didn't provide "Version/d.d.d" prior to 3.0
- regex: '(Safari)/\d+'
- regex: '(OLPC)/Update(\d+)\.(\d+)'
- regex: '(OLPC)/Update()\.(\d+)'
v1_replacement: '0'
- regex: '(SEMC\-Browser)/(\d+)\.(\d+)'
- regex: '(Teleca)'
family_replacement: 'Teleca Browser'
- regex: '(Phantom)/V(\d+)\.(\d+)'
family_replacement: 'Phantom Browser'
- regex: '(Trident)/(7|8)\.(0)'
family_replacement: 'IE'
v1_replacement: '11'
- regex: '(Trident)/(6)\.(0)'
family_replacement: 'IE'
v1_replacement: '10'
- regex: '(Trident)/(5)\.(0)'
family_replacement: 'IE'
v1_replacement: '9'
- regex: '(Trident)/(4)\.(0)'
family_replacement: 'IE'
v1_replacement: '8'
# AFTER THE EDGE CASES ABOVE!
# AFTER IE11
# BEFORE all other IE
- regex: '(Firefox)/(\d+)\.(\d+)(?:\.(\d+)|$)'
- regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)'
- regex: '([MS]?IE) (\d+)\.(\d+)'
family_replacement: 'IE'
# headless user-agents
- 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+)|)|)'
os_parsers:
##########
# @note: Windows Phone needs to come before Windows NT 6.1 {0,2}and* before Android to catch cases such as:
# Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920)...
# Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; ANZ821)...
# Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Orange)...
# Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Vodafone)...
##########
- regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
# Again a MS-special one: iPhone.{0,200}Outlook-iOS-Android/x.x is erroneously detected as Android
- regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).{0,100}Outlook-iOS-Android'
os_replacement: 'iOS'
# Special case for old ArcGIS Mobile products
- regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]{1,50}|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
# Special case for new ArcGIS Mobile products
- regex: 'ArcGISRuntime-(?:Android|iOS)\/\d+\.\d+(?:\.\d+|) \((Android|iOS) (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
##########
# Android
# can actually detect rooted android os. do we care?
##########
- regex: '(Android)[ \-/](\d+)(?:\.(\d+)|)(?:[.\-]([a-z0-9]+)|)'
- regex: '(Android) Donut'
os_v1_replacement: '1'
os_v2_replacement: '2'
- regex: '(Android) Eclair'
os_v1_replacement: '2'
os_v2_replacement: '1'
- regex: '(Android) Froyo'
os_v1_replacement: '2'
os_v2_replacement: '2'
- regex: '(Android) Gingerbread'
os_v1_replacement: '2'
os_v2_replacement: '3'
- regex: '(Android) Honeycomb'
os_v1_replacement: '3'
# Android 9; Android 10;
- regex: '(Android) (\d+);'
- regex: '(Android): (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
# UCWEB
- regex: '^UCWEB.{0,200}; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]{1,100})|);'
os_replacement: 'Android'
- regex: '^UCWEB.{0,200}; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
os_replacement: 'iOS'
- regex: '^UCWEB.{0,200}; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
os_replacement: 'Windows Phone'
# JUC
- regex: '^(JUC).{0,200}; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]{1,100})|)'
os_replacement: 'Android'
##########
# Meta Quest
##########
- regex: 'Quest'
os_replacement: 'Android'
##########
# Kindle Android
##########
- regex: '(Silk-Accelerated=[a-z]{4,5})'
os_replacement: 'Android'
# Citrix Chrome App on Chrome OS
# Note, this needs to come before the windows parsers as the app doesn't
# properly identify as Chrome OS
#
# ex: Mozilla/5.0 (X11; Windows aarch64 10718.88.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.118 Safari/537.36 CitrixChromeApp
- regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).{0,100}Chrome.{0,100}(?:CitrixChromeApp)$'
os_replacement: 'Chrome OS'
##########
# Windows
# http://en.wikipedia.org/wiki/Windows_NT#Releases
# possibility of false positive when different marketing names share same NT kernel
# e.g. windows server 2003 and windows xp
# lots of ua strings have Windows NT 4.1 !?!?!?!? !?!? !? !????!?! !!! ??? !?!?! ?
# (very) roughly ordered in terms of frequency of occurence of regex (win xp currently most frequent, etc)
##########
# ie mobile desktop mode
# spoofs nt 6.1. must come before windows 7
- regex: '(XBLWP7)'
os_replacement: 'Windows Phone'
# @note: This needs to come before Windows NT 6.1
- regex: '(Windows ?Mobile)'
os_replacement: 'Windows Mobile'
- regex: '(Windows 10)'
os_replacement: 'Windows'
os_v1_replacement: '10'
- regex: '(Windows (?:NT 5\.2|NT 5\.1))'
os_replacement: 'Windows'
os_v1_replacement: 'XP'
- regex: '(Win(?:dows NT |32NT\/)6\.1)'
os_replacement: 'Windows'
os_v1_replacement: '7'
- regex: '(Win(?:dows NT |32NT\/)6\.0)'
os_replacement: 'Windows'
os_v1_replacement: 'Vista'
- regex: '(Win 9x 4\.90)'
os_replacement: 'Windows'
os_v1_replacement: 'ME'
- regex: '(Windows NT 6\.2; ARM;)'
os_replacement: 'Windows'
os_v1_replacement: 'RT'
- regex: '(Win(?:dows NT |32NT\/)6\.2)'
os_replacement: 'Windows'
os_v1_replacement: '8'
- regex: '(Windows NT 6\.3; ARM;)'
os_replacement: 'Windows'
os_v1_replacement: 'RT 8'
os_v2_replacement: '1'
- regex: '(Win(?:dows NT |32NT\/)6\.3)'
os_replacement: 'Windows'
os_v1_replacement: '8'
os_v2_replacement: '1'
- regex: '(Win(?:dows NT |32NT\/)6\.4)'
os_replacement: 'Windows'
os_v1_replacement: '10'
- regex: '(Windows NT 10\.0)'
os_replacement: 'Windows'
os_v1_replacement: '10'
- regex: '(Windows NT 5\.0)'
os_replacement: 'Windows'
os_v1_replacement: '2000'
- regex: '(WinNT4.0)'
os_replacement: 'Windows'
os_v1_replacement: 'NT 4.0'
- regex: '(Windows ?CE)'
os_replacement: 'Windows'
os_v1_replacement: 'CE'
- regex: 'Win(?:dows)? ?(95|98|3.1|NT|ME|2000|XP|Vista|7|CE)'
os_replacement: 'Windows'
os_v1_replacement: '$1'
- regex: 'Win16'
os_replacement: 'Windows'
os_v1_replacement: '3.1'
- regex: 'Win32'
os_replacement: 'Windows'
os_v1_replacement: '95'
# Chrome and Edge on iOS with desktop mode contains Mac OS X, so it must be before any Mac OS check
- regex: 'Intel Mac OS X.+(CriOS|EdgiOS)/\d+'
os_replacement: 'iOS'
##########
# Mac OS
# @ref: http://en.wikipedia.org/wiki/Mac_OS_X#Versions
# @ref: http://www.puredarwin.org/curious/versions
##########
- regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+)|)|Mach-O)'
os_replacement: 'Mac OS X'
- 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'
# Leopard
- 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'
# Snow Leopard
- regex: ' (Dar)(win)/(10).(\d+).{0,100}\((?:i386|x86_64)\)'
os_replacement: 'Mac OS X'
os_v1_replacement: '10'
os_v2_replacement: '6'
# Lion
- regex: ' (Dar)(win)/(11).(\d+).{0,100}\((?:i386|x86_64)\)'
os_replacement: 'Mac OS X'
os_v1_replacement: '10'
os_v2_replacement: '7'
# Mountain Lion
- regex: ' (Dar)(win)/(12).(\d+).{0,100}\((?:i386|x86_64)\)'
os_replacement: 'Mac OS X'
os_v1_replacement: '10'
os_v2_replacement: '8'
# Mavericks
- regex: ' (Dar)(win)/(13).(\d+).{0,100}\((?:i386|x86_64)\)'
os_replacement: 'Mac OS X'
os_v1_replacement: '10'
os_v2_replacement: '9'
# Yosemite is Darwin/14.x but patch versions are inconsistent in the Darwin string;
# more accurately covered by CFNetwork regexes downstream
# IE on Mac doesn't specify version number
- regex: 'Mac_PowerPC'
os_replacement: 'Mac OS'
# builds before tiger don't seem to specify version?
# ios devices spoof (mac os x), so including intel/ppc prefixes
- regex: '(?:PPC|Intel) (Mac OS X)'
##########
# iOS
# http://en.wikipedia.org/wiki/IOS_version_history
##########
# keep this above generic iOS, since AppleTV UAs contain 'CPU OS'
- regex: '(Apple\s?TV)(?:/(\d+)\.(\d+)|)'
os_replacement: 'ATV OS X'
- regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
os_replacement: 'iOS'
# remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
- regex: '(iPhone|iPad|iPod); Opera'
os_replacement: 'iOS'
# few more stragglers
- regex: '(iPhone|iPad|iPod).{0,100}Mac OS X.{0,100}Version/(\d+)\.(\d+)'
os_replacement: 'iOS'
# CFNetwork/Darwin - The specific CFNetwork or Darwin version determines
# whether the os maps to Mac OS, or iOS, or just Darwin.
# See: http://user-agents.me/cfnetwork-version-list
- regex: '(CFNetwork)/(5)48\.0\.3.{0,100} Darwin/11\.0\.0'
os_replacement: 'iOS'
- regex: '(CFNetwork)/(5)48\.(0)\.4.{0,100} Darwin/(1)1\.0\.0'
os_replacement: 'iOS'
- regex: '(CFNetwork)/(5)48\.(1)\.4'
os_replacement: 'iOS'
- regex: '(CFNetwork)/(4)85\.1(3)\.9'
os_replacement: 'iOS'
- regex: '(CFNetwork)/(6)09\.(1)\.4'
os_replacement: 'iOS'
- regex: '(CFNetwork)/(6)(0)9'
os_replacement: 'iOS'
- regex: '(CFNetwork)/6(7)2\.(1)\.13'
os_replacement: 'iOS'
- regex: '(CFNetwork)/6(7)2\.(1)\.(1)4'
os_replacement: 'iOS'
- regex: '(CF)(Network)/6(7)(2)\.1\.15'
os_replacement: 'iOS'
os_v1_replacement: '7'
os_v2_replacement: '1'
- regex: '(CFNetwork)/6(7)2\.(0)\.(?:2|8)'
os_replacement: 'iOS'
- regex: '(CFNetwork)/709\.1'
os_replacement: 'iOS'
os_v1_replacement: '8'
os_v2_replacement: '0.b5'
- regex: '(CF)(Network)/711\.(\d)'
os_replacement: 'iOS'
os_v1_replacement: '8'
- regex: '(CF)(Network)/(720)\.(\d)'
os_replacement: 'Mac OS X'
os_v1_replacement: '10'
os_v2_replacement: '10'
- regex: '(CF)(Network)/(760)\.(\d)'
os_replacement: 'Mac OS X'
os_v1_replacement: '10'
os_v2_replacement: '11'
- 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.{0,100} Darwin/15\.5\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '9'
os_v2_replacement: '3'
os_v3_replacement: '2'
- regex: 'CFNetwork/7.{0,100} Darwin/15\.6\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '9'
os_v2_replacement: '3'
os_v3_replacement: '5'
- regex: '(CF)(Network)/758\.(\d)'
os_replacement: 'iOS'
os_v1_replacement: '9'
- regex: 'CFNetwork/808\.3 Darwin/16\.3\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '10'
os_v2_replacement: '2'
os_v3_replacement: '1'
- regex: '(CF)(Network)/808\.(\d)'
os_replacement: 'iOS'
os_v1_replacement: '10'
##########
# CFNetwork macOS Apps (must be before CFNetwork iOS Apps
# @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
##########
- 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/.{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.{0,100} Darwin/15\.\d+.{0,100}\(x86_64\)'
os_replacement: 'Mac OS X'
os_v1_replacement: '10'
os_v2_replacement: '11'
##########
# CFNetwork iOS Apps
# @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
##########
- regex: 'CFNetwork/.{0,100} Darwin/(9)\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '1'
- regex: 'CFNetwork/.{0,100} Darwin/(10)\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '4'
- regex: 'CFNetwork/.{0,100} Darwin/(11)\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '5'
- regex: 'CFNetwork/.{0,100} Darwin/(13)\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '6'
- regex: 'CFNetwork/6.{0,100} Darwin/(14)\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '7'
- regex: 'CFNetwork/7.{0,100} Darwin/(14)\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '8'
os_v2_replacement: '0'
- regex: 'CFNetwork/7.{0,100} Darwin/(15)\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '9'
os_v2_replacement: '0'
- regex: 'CFNetwork/8.{0,100} Darwin/16\.5\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '10'
os_v2_replacement: '3'
- 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.{0,100} Darwin/16\.7\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '10'
os_v2_replacement: '3'
os_v3_replacement: '3'
- regex: 'CFNetwork/8.{0,100} Darwin/(16)\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '10'
- regex: 'CFNetwork/8.{0,100} Darwin/17\.0\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '11'
os_v2_replacement: '0'
- regex: 'CFNetwork/8.{0,100} Darwin/17\.2\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '11'
os_v2_replacement: '1'
- regex: 'CFNetwork/8.{0,100} Darwin/17\.3\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '11'
os_v2_replacement: '2'
- 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.{0,100} Darwin/17\.5\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '11'
os_v2_replacement: '3'
- regex: 'CFNetwork/9.{0,100} Darwin/17\.6\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '11'
os_v2_replacement: '4'
- 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.{0,100} Darwin/(17)\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '11'
- regex: 'CFNetwork/9.{0,100} Darwin/18\.0\.\d+'
os_replacement: 'iOS'
os_v1_replacement: '12'
os_v2_replacement: '0'
- 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/.{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'
# iOS Apps
- regex: '\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d; )|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+)|)'
os_replacement: 'iOS'
- regex: '\((iOS);'
##########
# Apple Watch
##########
- regex: '(watchOS)[/ ](\d+)\.(\d+)(?:\.(\d+)|)'
os_replacement: 'WatchOS'
##########################
# iOS devices, the same regex matches mobile safari webviews
##########################
- regex: '(iPod|iPhone|iPad)'
os_replacement: 'iOS'
##########
# Apple TV
##########
- regex: '(tvOS)[/ ](\d+)\.(\d+)(?:\.(\d+)|)'
os_replacement: 'tvOS'
##########
# Chrome OS
# if version 0.0.0, probably this stuff:
# http://code.google.com/p/chromium-os/issues/detail?id=11573
# http://code.google.com/p/chromium-os/issues/detail?id=13790
##########
- regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+)|)'
os_replacement: 'Chrome OS'
##########
# Linux distros
##########
- regex: '([Dd]ebian)'
os_replacement: 'Debian'
- regex: '(Linux Mint)(?:/(\d+)|)'
- regex: '(Mandriva)(?: Linux|)/(?:[\d.-]+m[a-z]{2}(\d+).(\d)|)'
##########
# KaiOS
##########
- regex: '(K[Aa][Ii]OS)\/(\d+)\.(\d+)(?:\.(\d+)|)'
os_replacement: 'KaiOS'
##########
# Firefox OS
##########
- 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);.{1,200}Gecko/18.1 Firefox/\d+\.\d+'
os_replacement: 'Firefox OS'
os_v1_replacement: '1'
os_v2_replacement: '1'
- 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);.{1,200}Gecko/28.0 Firefox/\d+\.\d+'
os_replacement: 'Firefox OS'
os_v1_replacement: '1'
os_v2_replacement: '3'
- 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);.{1,200}Gecko/32.0 Firefox/\d+\.\d+'
os_replacement: 'Firefox OS'
os_v1_replacement: '2'
os_v2_replacement: '0'
- regex: '\((?:Mobile|Tablet);.{1,200}Gecko/34.0 Firefox/\d+\.\d+'
os_replacement: 'Firefox OS'
os_v1_replacement: '2'
os_v2_replacement: '1'
# Firefox OS Generic
- regex: '\((?:Mobile|Tablet);.{1,200}Firefox/\d+\.\d+'
os_replacement: 'Firefox OS'
##########
# Google TV
##########
- regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+)|)|/[\da-z]+)'
- regex: '(WebTV)/(\d+).(\d+)'
##########
# Misc mobile
##########
- regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+)|)'
os_replacement: 'webOS'
- regex: '(VRE);'
##########
# Generic patterns
# since the majority of os cases are very specific, these go last
##########
- regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
# Gentoo Linux + Kernel Version
- regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).{0,100}gentoo'
os_replacement: 'Gentoo'
# Opera Mini Bada
- regex: '\((Bada);'
# just os
- regex: '(Windows|Android|WeTab|Maemo|Web0S)'
- regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|SerenityOS|(?:Free|Open|Net|\b)BSD)'
# Linux + Kernel Version
- regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+)|)|)'
- regex: 'SunOS'
os_replacement: 'Solaris'
# Wget/x.x.x (linux-gnu)
- regex: '\(linux-gnu\)'
os_replacement: 'Linux'
- regex: '\(x86_64-redhat-linux-gnu\)'
os_replacement: 'Red Hat'
- regex: '\((freebsd)(\d+)\.(\d+)\)'
os_replacement: 'FreeBSD'
- regex: 'linux'
os_replacement: 'Linux'
device_parsers:
# Unused. Just left to keep the required device_parsers section.
- regex: 'Mac OS'
device_replacement: 'Mac'
brand_replacement: 'Apple'
model_replacement: 'Mac'