@2l/ewa-analytics-web-sdk
Version:
A lightweight TypeScript SDK for tracking user events and analytics data in web applications. Provides real-time event tracking with support for both WebSocket and HTTP transport methods.
1 lines • 120 kB
JavaScript
(function(X,he){typeof exports=="object"&&typeof module<"u"?he(exports):typeof define=="function"&&define.amd?define(["exports"],he):(X=typeof globalThis<"u"?globalThis:X||self,he(X.CentrifugoWebSDK={}))})(this,function(X){"use strict";function he(i,e){return{...i,...e}}class yn{baseURL;headers;constructor(e={}){const{baseURL:t="",headers:n={}}=e;this.baseURL=t,this.headers=n}buildUrl(e,t){const n=new URL(`${this.baseURL}${e}`);if(t){const r=new URLSearchParams(Object.entries(t));n.search=`?${r.toString()}`}return n.toString()}isValidUrl(e){try{return new URL(e),!0}catch{return!1}}buildRequestOptions(e,t){const n={method:e,headers:t.headers||this.headers};return t.body&&(n.body=t.body,n.headers["Content-Type"]="application/json"),n}async sendRequest(e,t){if(!this.isValidUrl(e))return Promise.reject(new Error("Invalid URL provided"));const n=await fetch(e,t);return n.ok?n.json():this.handleErrorResponse(n)}async handleErrorResponse(e){try{const t=await e.text(),{error:n}=JSON.parse(t);return Promise.reject(he(e,n))}catch(t){return Promise.reject(he(e,t))}}async fetch(e,t,n,r){const o=this.buildUrl(t,n.queryParameters),s=this.buildRequestOptions(e,n);return r&&(s.body=JSON.stringify(r),s.headers["Content-Type"]="application/json"),this.sendRequest(o,s)}setHeaders(e,t){this.headers=t?e:he(this.headers||{},e)}async post(e,t,n={method:"POST"}){return this.fetch("POST",e,n,t)}}for(var I=[],st=0;st<256;++st)I.push((st+256).toString(16).slice(1));function Sn(i,e=0){return(I[i[e+0]]+I[i[e+1]]+I[i[e+2]]+I[i[e+3]]+"-"+I[i[e+4]]+I[i[e+5]]+"-"+I[i[e+6]]+I[i[e+7]]+"-"+I[i[e+8]]+I[i[e+9]]+"-"+I[i[e+10]]+I[i[e+11]]+I[i[e+12]]+I[i[e+13]]+I[i[e+14]]+I[i[e+15]]).toLowerCase()}var ze,En=new Uint8Array(16);function kn(){if(!ze&&(ze=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!ze))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return ze(En)}var Tn=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto);const Rt={randomUUID:Tn};function Cn(i,e,t){if(Rt.randomUUID&&!i)return Rt.randomUUID();i=i||{};var n=i.random||(i.rng||kn)();return n[6]=n[6]&15|64,n[8]=n[8]&63|128,Sn(n)}const ot=(i,e)=>{const t={};for(const n of e)i[n]&&(t[n]=i[n]);return t},at=i=>{const e={};for(const t of Object.keys(i))i[t]&&(e[t]=i[t]);return e};class Ot{random_user_id="";event_name="";app_id="";platform="";created_at_milli=Date.now();event_subtype;web_uuid;session_id;customer_user_id;app_version;web_hwid;country;event_value;language;timezone;os_version;os_name;device_name;device_type;browser;browser_version;constructor(e){const t=["created_at_milli"];for(const r of Object.keys(this))t.includes(r)||(this[r]=e[r]);this.event_subtype=e?.subtype||e?.event_subtype,this.random_user_id=e?.randomUserId,this.app_id=e?.appId,this.app_version=e?.appVersion,this.platform=e?.platform,this.session_id=e?.sessionId;const n=ot(e,Object.keys(this));this.setUserAgentFields(e.userAgent),t.forEach(r=>{n[r]=this[r]}),Object.assign(this,n)}setUserAgentFields(e){this.language=navigator.language.split("-")[0],this.timezone=e.getTimezone(),this.os_version=e.detectOSVersion(),this.os_name=e.detectOS(),this.device_name=e.detectDeviceName(),this.device_type=e.detectDeviceType(),this.browser=e.getBrowserName(),this.browser_version=e.getBrowserVersion()}async setFingerprint(e){this.web_hwid=await e.getFingerPrint()}}class xn extends Ot{store;tracker;tracker_name;network_name;campaign_name;adgroup_name;creative_name;connection_type;adjust_tracker_id;user_agent;ip_address;environment;att_status;constructor(e){super(e);const t=["created_at_milli"],n=Object.keys(this);for(const o of Object.keys(this))t.includes(o)||(this[o]=e[o]);const r=ot(e,n);this.setUserAgentFields(e.userAgent),Object.assign(this,r)}}class Pn extends Ot{event_id="";event;event_type;native_language;learning_language;sdk_version;constructor(e){super(e);function t(o){const s=new Set(Object.keys({})),c=new Set(Object.keys({})),a=new Set(Object.keys({})),u={};for(const[l,w]of Object.entries(o))!s.has(l)&&!c.has(l)&&!a.has(l)&&(u[l]=w);return JSON.stringify(at(u))}this.event_value=t(e),this.event_id=Cn();const n=Object.keys(this),r=ot(e,n);Object.assign(this,r)}}async function Rn(i){const e=new xn(i);return await e.setFingerprint(i.userAgent),at(e)}async function On(i){const e=new Pn(i);return await e.setFingerprint(i.userAgent),at(e)}var An="2.0.4",ct=500,At="user-agent",be="",It="?",We="function",re="undefined",ge="object",ut="string",j="browser",ee="cpu",Y="device",G="engine",B="os",_e="result",p="name",h="type",f="vendor",b="version",N="architecture",Te="major",d="model",Ce="console",m="mobile",E="tablet",O="smarttv",Z="wearable",Fe="xr",xe="embedded",Pe="inapp",lt="brands",de="formFactors",ht="fullVersionList",me="platform",dt="platformVersion",Be="bitness",se="sec-ch-ua",In=se+"-full-version-list",Ln=se+"-arch",Dn=se+"-"+Be,Mn=se+"-form-factors",Un=se+"-"+m,jn=se+"-"+d,Lt=se+"-"+me,Nn=Lt+"-version",Dt=[lt,ht,m,d,me,dt,N,de,Be],He="Amazon",we="Apple",Mt="ASUS",Ut="BlackBerry",fe="Google",jt="Huawei",ft="Lenovo",Nt="Honor",qe="LG",pt="Microsoft",bt="Motorola",gt="Nvidia",zt="OnePlus",_t="OPPO",Re="Samsung",Wt="Sharp",Oe="Sony",mt="Xiaomi",wt="Zebra",Ft="Chrome",Bt="Chromium",oe="Chromecast",Ve="Edge",Ae="Firefox",Ie="Opera",vt="Facebook",Ht="Sogou",ve="Mobile ",Le=" Browser",yt="Windows",zn=typeof window!==re,z=zn&&window.navigator?window.navigator:void 0,ae=z&&z.userAgentData?z.userAgentData:void 0,Wn=function(i,e){var t={},n=e;if(!$e(e)){n={};for(var r in e)for(var o in e[r])n[o]=e[r][o].concat(n[o]?n[o]:[])}for(var s in i)t[s]=n[s]&&n[s].length%2===0?n[s].concat(i[s]):i[s];return t},Ge=function(i){for(var e={},t=0;t<i.length;t++)e[i[t].toUpperCase()]=i[t];return e},St=function(i,e){if(typeof i===ge&&i.length>0){for(var t in i)if(te(e)==te(i[t]))return!0;return!1}return ye(i)?te(e)==te(i):!1},$e=function(i,e){for(var t in i)return/^(browser|cpu|device|engine|os)$/.test(t)||(e?$e(i[t]):!1)},ye=function(i){return typeof i===ut},Et=function(i){if(i){for(var e=[],t=Se(/\\?\"/g,i).split(","),n=0;n<t.length;n++)if(t[n].indexOf(";")>-1){var r=Ke(t[n]).split(";v=");e[n]={brand:r[0],version:r[1]}}else e[n]=Ke(t[n]);return e}},te=function(i){return ye(i)?i.toLowerCase():i},kt=function(i){return ye(i)?Se(/[^\d\.]/g,i).split(".")[0]:void 0},ne=function(i){for(var e in i){var t=i[e];typeof t==ge&&t.length==2?this[t[0]]=t[1]:this[t]=void 0}return this},Se=function(i,e){return ye(e)?e.replace(i,be):e},De=function(i){return Se(/\\?\"/g,i)},Ke=function(i,e){if(ye(i))return i=Se(/^\s\s*/,i),typeof e===re?i:i.substring(0,ct)},Tt=function(i,e){if(!(!i||!e))for(var t=0,n,r,o,s,c,a;t<e.length&&!c;){var u=e[t],l=e[t+1];for(n=r=0;n<u.length&&!c&&u[n];)if(c=u[n++].exec(i),c)for(o=0;o<l.length;o++)a=c[++r],s=l[o],typeof s===ge&&s.length>0?s.length===2?typeof s[1]==We?this[s[0]]=s[1].call(this,a):this[s[0]]=s[1]:s.length>=3&&(typeof s[1]===We&&!(s[1].exec&&s[1].test)?s.length>3?this[s[0]]=a?s[1].apply(this,s.slice(2)):void 0:this[s[0]]=a?s[1].call(this,a,s[2]):void 0:s.length==3?this[s[0]]=a?a.replace(s[1],s[2]):void 0:s.length==4?this[s[0]]=a?s[3].call(this,a.replace(s[1],s[2])):void 0:s.length>4&&(this[s[0]]=a?s[3].apply(this,[a.replace(s[1],s[2])].concat(s.slice(4))):void 0)):this[s]=a||void 0;t+=2}},Q=function(i,e){for(var t in e)if(typeof e[t]===ge&&e[t].length>0){for(var n=0;n<e[t].length;n++)if(St(e[t][n],i))return t===It?void 0:t}else if(St(e[t],i))return t===It?void 0:t;return e.hasOwnProperty("*")?e["*"]:i},qt={ME:"4.90","NT 3.51":"3.51","NT 4.0":"4.0",2e3:["5.0","5.01"],XP:["5.1","5.2"],Vista:"6.0",7:"6.1",8:"6.2","8.1":"6.3",10:["6.4","10.0"],NT:""},Vt={embedded:"Automotive",mobile:"Mobile",tablet:["Tablet","EInk"],smarttv:"TV",wearable:"Watch",xr:["VR","XR"],"?":["Desktop","Unknown"],"*":void 0},Fn={Chrome:"Google Chrome",Edge:"Microsoft Edge","Edge WebView2":"Microsoft Edge WebView2","Chrome WebView":"Android WebView","Chrome Headless":"HeadlessChrome","Huawei Browser":"HuaweiBrowser","MIUI Browser":"Miui Browser","Opera Mobi":"OperaMobile",Yandex:"YaBrowser"},Gt={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[b,[p,ve+"Chrome"]],[/webview.+edge\/([\w\.]+)/i],[b,[p,Ve+" WebView"]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[b,[p,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[p,b],[/opios[\/ ]+([\w\.]+)/i],[b,[p,Ie+" Mini"]],[/\bop(?:rg)?x\/([\w\.]+)/i],[b,[p,Ie+" GX"]],[/\bopr\/([\w\.]+)/i],[b,[p,Ie]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[b,[p,"Baidu"]],[/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],[b,[p,"Maxthon"]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser)\/([-\w\.]+)/i,/(heytap|ovi|115|surf)browser\/([\d\.]+)/i,/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i],[p,b],[/quark(?:pc)?\/([-\w\.]+)/i],[b,[p,"Quark"]],[/\bddg\/([\w\.]+)/i],[b,[p,"DuckDuckGo"]],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[b,[p,"UCBrowser"]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[b,[p,"WeChat"]],[/konqueror\/([\w\.]+)/i],[b,[p,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[b,[p,"IE"]],[/ya(?:search)?browser\/([\w\.]+)/i],[b,[p,"Yandex"]],[/slbrowser\/([\w\.]+)/i],[b,[p,"Smart "+ft+Le]],[/(avast|avg)\/([\w\.]+)/i],[[p,/(.+)/,"$1 Secure"+Le],b],[/\bfocus\/([\w\.]+)/i],[b,[p,Ae+" Focus"]],[/\bopt\/([\w\.]+)/i],[b,[p,Ie+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[b,[p,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[b,[p,"Dolphin"]],[/coast\/([\w\.]+)/i],[b,[p,Ie+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[b,[p,"MIUI"+Le]],[/fxios\/([\w\.-]+)/i],[b,[p,ve+Ae]],[/\bqihoobrowser\/?([\w\.]*)/i],[b,[p,"360"]],[/\b(qq)\/([\w\.]+)/i],[[p,/(.+)/,"$1Browser"],b],[/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],[[p,/(.+)/,"$1"+Le],b],[/samsungbrowser\/([\w\.]+)/i],[b,[p,Re+" Internet"]],[/metasr[\/ ]?([\d\.]+)/i],[b,[p,Ht+" Explorer"]],[/(sogou)mo\w+\/([\d\.]+)/i],[[p,Ht+" Mobile"],b],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i],[p,b],[/(lbbrowser|rekonq)/i],[p],[/ome\/([\w\.]+) \w* ?(iron) saf/i,/ome\/([\w\.]+).+qihu (360)[es]e/i],[b,p],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[p,vt],b,[h,Pe]],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/(daum)apps[\/ ]([\w\.]+)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(twitter)(?:and| f.+e\/([\w\.]+))/i,/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i],[p,b,[h,Pe]],[/\bgsa\/([\w\.]+) .*safari\//i],[b,[p,"GSA"],[h,Pe]],[/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i],[b,[p,"TikTok"],[h,Pe]],[/\[(linkedin)app\]/i],[p,[h,Pe]],[/(chromium)[\/ ]([-\w\.]+)/i],[p,b],[/headlesschrome(?:\/([\w\.]+)| )/i],[b,[p,Ft+" Headless"]],[/wv\).+chrome\/([\w\.]+).+edgw\//i],[b,[p,Ve+" WebView2"]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[p,Ft+" WebView"],b],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[b,[p,"Android"+Le]],[/chrome\/([\w\.]+) mobile/i],[b,[p,ve+"Chrome"]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[p,b],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[b,[p,ve+"Safari"]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[p,ve+"Safari"]],[/version\/([\w\.\,]+) .*(safari)/i],[b,p],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[p,[b,"1"]],[/(webkit|khtml)\/([\w\.]+)/i],[p,b],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[p,ve+Ae],b],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[p,"Netscape"],b],[/(wolvic|librewolf)\/([\w\.]+)/i],[p,b],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[b,[p,Ae+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i,/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/\b(links) \(([\w\.]+)/i],[p,[b,/_/g,"."]],[/(cobalt)\/([\w\.]+)/i],[p,[b,/[^\d\.]+./,be]]],cpu:[[/\b((amd|x|x86[-_]?|wow|win)64)\b/i],[[N,"amd64"]],[/(ia32(?=;))/i,/\b((i[346]|x)86)(pc)?\b/i],[[N,"ia32"]],[/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],[[N,"arm64"]],[/\b(arm(v[67])?ht?n?[fl]p?)\b/i],[[N,"armhf"]],[/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],[[N,"arm"]],[/((ppc|powerpc)(64)?)( mac|;|\))/i],[[N,/ower/,be,te]],[/ sun4\w[;\)]/i],[[N,"sparc"]],[/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i],[[N,te]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[d,[f,Re],[h,E]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,/sec-(sgh\w+)/i],[d,[f,Re],[h,m]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i],[d,[f,we],[h,m]],[/\((ipad);[-\w\),; ]+apple/i,/applecoremedia\/[\w\.]+ \((ipad)/i,/\b(ipad)\d\d?,\d\d?[;\]].+ios/i],[d,[f,we],[h,E]],[/(macintosh);/i],[d,[f,we]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[d,[f,Wt],[h,m]],[/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],[d,[f,Nt],[h,E]],[/honor([-\w ]+)[;\)]/i],[d,[f,Nt],[h,m]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i],[d,[f,jt],[h,E]],[/(?:huawei)([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i],[d,[f,jt],[h,m]],[/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,/\b((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],[[d,/_/g," "],[f,mt],[h,E]],[/\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i,/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,/oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i,/ ([\w ]+) miui\/v?\d/i],[[d,/_/g," "],[f,mt],[h,m]],[/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-k]\w[1m]10)\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[d,[f,zt],[h,m]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[d,[f,_t],[h,m]],[/\b(opd2(\d{3}a?))(?: bui|\))/i],[d,[f,Q,{OnePlus:["203","304","403","404","413","415"],"*":_t}],[h,E]],[/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],[d,[f,"BLU"],[h,m]],[/; vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[d,[f,"Vivo"],[h,m]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[d,[f,"Realme"],[h,m]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],[d,[f,ft],[h,E]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],[d,[f,ft],[h,m]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i],[d,[f,bt],[h,m]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[d,[f,bt],[h,E]],[/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[d,[f,qe],[h,E]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,/\blg-?([\d\w]+) bui/i],[d,[f,qe],[h,m]],[/(nokia) (t[12][01])/i],[f,d,[h,E]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,/nokia[-_ ]?(([-\w\. ]*))/i],[[d,/_/g," "],[h,m],[f,"Nokia"]],[/(pixel (c|tablet))\b/i],[d,[f,fe],[h,E]],[/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i],[d,[f,fe],[h,m]],[/(google) (pixelbook( go)?)/i],[f,d],[/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[d,[f,Oe],[h,m]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[d,"Xperia Tablet"],[f,Oe],[h,E]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[d,[f,He],[h,E]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[d,/(.+)/g,"Fire Phone $1"],[f,He],[h,m]],[/(playbook);[-\w\),; ]+(rim)/i],[d,f,[h,E]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/\(bb10; (\w+)/i],[d,[f,Ut],[h,m]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[d,[f,Mt],[h,E]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[d,[f,Mt],[h,m]],[/(nexus 9)/i],[d,[f,"HTC"],[h,E]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[f,[d,/_/g," "],[h,m]],[/tcl (xess p17aa)/i,/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i],[d,[f,"TCL"],[h,E]],[/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i],[d,[f,"TCL"],[h,m]],[/(itel) ((\w+))/i],[[f,te],d,[h,Q,{tablet:["p10001l","w7001"],"*":"mobile"}]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[d,[f,"Acer"],[h,E]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[d,[f,"Meizu"],[h,m]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[d,[f,"Ulefone"],[h,m]],[/; (energy ?\w+)(?: bui|\))/i,/; energizer ([\w ]+)(?: bui|\))/i],[d,[f,"Energizer"],[h,m]],[/; cat (b35);/i,/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],[d,[f,"Cat"],[h,m]],[/((?:new )?andromax[\w- ]+)(?: bui|\))/i],[d,[f,"Smartfren"],[h,m]],[/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],[d,[f,"Nothing"],[h,m]],[/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],[d,[f,"Archos"],[h,E]],[/archos ([\w ]+)( b|\))/i,/; (ac[3-6]\d\w{2,8})( b|\))/i],[d,[f,"Archos"],[h,m]],[/; (n159v)/i],[d,[f,"HMD"],[h,m]],[/(imo) (tab \w+)/i,/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],[f,d,[h,E]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,/; (blu|hmd|imo|infinix|lava|oneplus|tcl)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,/(hp) ([\w ]+\w)/i,/(microsoft); (lumia[\w ]+)/i,/(oppo) ?([\w ]+) bui/i],[f,d,[h,m]],[/(kobo)\s(ereader|touch)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[f,d,[h,E]],[/(surface duo)/i],[d,[f,pt],[h,E]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[d,[f,"Fairphone"],[h,m]],[/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],[d,[f,gt],[h,E]],[/(sprint) (\w+)/i],[f,d,[h,m]],[/(kin\.[onetw]{3})/i],[[d,/\./g," "],[f,pt],[h,m]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[d,[f,wt],[h,E]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[d,[f,wt],[h,m]],[/smart-tv.+(samsung)/i],[f,[h,O]],[/hbbtv.+maple;(\d+)/i],[[d,/^/,"SmartTV"],[f,Re],[h,O]],[/(vizio)(?: |.+model\/)(\w+-\w+)/i,/tcast.+(lg)e?. ([-\w]+)/i],[f,d,[h,O]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[f,qe],[h,O]],[/(apple) ?tv/i],[f,[d,we+" TV"],[h,O]],[/crkey.*devicetype\/chromecast/i],[[d,oe+" Third Generation"],[f,fe],[h,O]],[/crkey.*devicetype\/([^/]*)/i],[[d,/^/,"Chromecast "],[f,fe],[h,O]],[/fuchsia.*crkey/i],[[d,oe+" Nest Hub"],[f,fe],[h,O]],[/crkey/i],[[d,oe],[f,fe],[h,O]],[/(portaltv)/i],[d,[f,vt],[h,O]],[/droid.+aft(\w+)( bui|\))/i],[d,[f,He],[h,O]],[/(shield \w+ tv)/i],[d,[f,gt],[h,O]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[d,[f,Wt],[h,O]],[/(bravia[\w ]+)( bui|\))/i],[d,[f,Oe],[h,O]],[/(mi(tv|box)-?\w+) bui/i],[d,[f,mt],[h,O]],[/Hbbtv.*(technisat) (.*);/i],[f,d,[h,O]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[f,/.+\/(\w+)/,"$1",Q,{LG:"lge"}],[d,Ke],[h,O]],[/droid.+; ([\w- ]+) (?:android tv|smart[- ]?tv)/i],[d,[h,O]],[/\b(android tv|smart[- ]?tv|opera tv|tv; rv:|large screen[\w ]+safari)\b/i],[[h,O]],[/(playstation \w+)/i],[d,[f,Oe],[h,Ce]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[d,[f,pt],[h,Ce]],[/(ouya)/i,/(nintendo) (\w+)/i,/(retroid) (pocket ([^\)]+))/i],[f,d,[h,Ce]],[/droid.+; (shield)( bui|\))/i],[d,[f,gt],[h,Ce]],[/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],[d,[f,Re],[h,Z]],[/((pebble))app/i,/(asus|google|lg|oppo) ((pixel |zen)?watch[\w ]*)( bui|\))/i],[f,d,[h,Z]],[/(ow(?:19|20)?we?[1-3]{1,3})/i],[d,[f,_t],[h,Z]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[d,[f,we],[h,Z]],[/(opwwe\d{3})/i],[d,[f,zt],[h,Z]],[/(moto 360)/i],[d,[f,bt],[h,Z]],[/(smartwatch 3)/i],[d,[f,Oe],[h,Z]],[/(g watch r)/i],[d,[f,qe],[h,Z]],[/droid.+; (wt63?0{2,3})\)/i],[d,[f,wt],[h,Z]],[/droid.+; (glass) \d/i],[d,[f,fe],[h,Fe]],[/(pico) (4|neo3(?: link|pro)?)/i],[f,d,[h,Fe]],[/(quest( \d| pro)?s?).+vr/i],[d,[f,vt],[h,Fe]],[/mobile vr; rv.+firefox/i],[[h,Fe]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[f,[h,xe]],[/(aeobc)\b/i],[d,[f,He],[h,xe]],[/(homepod).+mac os/i],[d,[f,we],[h,xe]],[/windows iot/i],[[h,xe]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+?(mobile|vr|\d) safari/i],[d,[h,Q,{mobile:"Mobile",xr:"VR","*":E}]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[h,E]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[h,m]],[/droid .+?; ([\w\. -]+)( bui|\))/i],[d,[f,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[b,[p,Ve+"HTML"]],[/(arkweb)\/([\w\.]+)/i],[p,b],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[b,[p,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[p,b],[/ladybird\//i],[[p,"LibWeb"]],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[b,p]],os:[[/(windows nt) (6\.[23]); arm/i],[[p,/N/,"R"],[b,Q,qt]],[/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],[p,b],[/windows nt ?([\d\.\)]*)(?!.+xbox)/i,/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],[[b,/(;|\))/g,"",Q,qt],[p,yt]],[/(windows ce)\/?([\d\.]*)/i],[p,b],[/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,/cfnetwork\/.+darwin/i],[[b,/_/g,"."],[p,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],[[p,"macOS"],[b,/_/g,"."]],[/android ([\d\.]+).*crkey/i],[b,[p,oe+" Android"]],[/fuchsia.*crkey\/([\d\.]+)/i],[b,[p,oe+" Fuchsia"]],[/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],[b,[p,oe+" SmartSpeaker"]],[/linux.*crkey\/([\d\.]+)/i],[b,[p,oe+" Linux"]],[/crkey\/([\d\.]+)/i],[b,[p,oe]],[/droid ([\w\.]+)\b.+(android[- ]x86)/i],[b,p],[/(ubuntu) ([\w\.]+) like android/i],[[p,/(.+)/,"$1 Touch"],b],[/(harmonyos)[\/ ]?([\d\.]*)/i,/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],[p,b],[/\(bb(10);/i],[b,[p,Ut]],[/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],[b,[p,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i],[b,[p,Ae+" OS"]],[/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],[b,[p,"webOS"]],[/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],[[b,Q,{25:"120",24:"108",23:"94",22:"87",6:"79",5:"68",4:"53",3:"38",2:"538",1:"537","*":"TV"}],[p,"webOS"]],[/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i],[b,[p,"watchOS"]],[/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i],[[p,"Chrome OS"],b],[/panasonic;(viera)/i,/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/(pico) .+os([\w\.]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/\b(aix)[; ]([1-9\.]{0,4})/i,/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) ?(r\d)?/i],[p,b],[/(sunos) ?([\d\.]*)/i],[[p,"Solaris"],b],[/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[p,b]]},Je=function(){var i={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}};return ne.call(i.init,[[j,[p,b,Te,h]],[ee,[N]],[Y,[h,d,f]],[G,[p,b]],[B,[p,b]]]),ne.call(i.isIgnore,[[j,[b,Te]],[G,[b]],[B,[b]]]),ne.call(i.isIgnoreRgx,[[j,/ ?browser$/i],[B,/ ?os$/i]]),ne.call(i.toString,[[j,[p,b]],[ee,[N]],[Y,[f,d]],[G,[p,b]],[B,[p,b]]]),i}(),Bn=function(i,e){var t=Je.init[e],n=Je.isIgnore[e]||0,r=Je.isIgnoreRgx[e]||0,o=Je.toString[e]||0;function s(){ne.call(this,t)}return s.prototype.getItem=function(){return i},s.prototype.withClientHints=function(){return ae?ae.getHighEntropyValues(Dt).then(function(c){return i.setCH(new $t(c,!1)).parseCH().get()}):i.parseCH().get()},s.prototype.withFeatureCheck=function(){return i.detectFeature().get()},e!=_e&&(s.prototype.is=function(c){var a=!1;for(var u in this)if(this.hasOwnProperty(u)&&!St(n,u)&&te(r?Se(r,this[u]):this[u])==te(r?Se(r,c):c)){if(a=!0,c!=re)break}else if(c==re&&a){a=!a;break}return a},s.prototype.toString=function(){var c=be;for(var a in o)typeof this[o[a]]!==re&&(c+=(c?" ":be)+this[o[a]]);return c||re}),ae||(s.prototype.then=function(c){var a=this,u=function(){for(var w in a)a.hasOwnProperty(w)&&(this[w]=a[w])};u.prototype={is:s.prototype.is,toString:s.prototype.toString};var l=new u;return c(l),l}),new s};function $t(i,e){if(i=i||{},ne.call(this,Dt),e)ne.call(this,[[lt,Et(i[se])],[ht,Et(i[In])],[m,/\?1/.test(i[Un])],[d,De(i[jn])],[me,De(i[Lt])],[dt,De(i[Nn])],[N,De(i[Ln])],[de,Et(i[Mn])],[Be,De(i[Dn])]]);else for(var t in i)this.hasOwnProperty(t)&&typeof i[t]!==re&&(this[t]=i[t])}function Kt(i,e,t,n){return this.get=function(r){return r?this.data.hasOwnProperty(r)?this.data[r]:void 0:this.data},this.set=function(r,o){return this.data[r]=o,this},this.setCH=function(r){return this.uaCH=r,this},this.detectFeature=function(){if(z&&z.userAgent==this.ua)switch(this.itemType){case j:z.brave&&typeof z.brave.isBrave==We&&this.set(p,"Brave");break;case Y:!this.get(h)&&ae&&ae[m]&&this.set(h,m),this.get(d)=="Macintosh"&&z&&typeof z.standalone!==re&&z.maxTouchPoints&&z.maxTouchPoints>2&&this.set(d,"iPad").set(h,E);break;case B:!this.get(p)&&ae&&ae[me]&&this.set(p,ae[me]);break;case _e:var r=this.data,o=function(s){return r[s].getItem().detectFeature().get()};this.set(j,o(j)).set(ee,o(ee)).set(Y,o(Y)).set(G,o(G)).set(B,o(B))}return this},this.parseUA=function(){return this.itemType!=_e&&Tt.call(this.data,this.ua,this.rgxMap),this.itemType==j&&this.set(Te,kt(this.get(b))),this},this.parseCH=function(){var r=this.uaCH,o=this.rgxMap;switch(this.itemType){case j:case G:var s=r[ht]||r[lt],c;if(s)for(var a in s){var u=s[a].brand||s[a],l=s[a].version;this.itemType==j&&!/not.a.brand/i.test(u)&&(!c||/Chrom/.test(c)&&u!=Bt||c==Ve&&/WebView2/.test(u))&&(u=Q(u,Fn),c=this.get(p),c&&!/Chrom/.test(c)&&/Chrom/.test(u)||this.set(p,u).set(b,l).set(Te,kt(l)),c=u),this.itemType==G&&u==Bt&&this.set(b,l)}break;case ee:var w=r[N];w&&(w&&r[Be]=="64"&&(w+="64"),Tt.call(this.data,w+";",o));break;case Y:if(r[m]&&this.set(h,m),r[d]&&(this.set(d,r[d]),!this.get(h)||!this.get(f))){var R={};Tt.call(R,"droid 9; "+r[d]+")",o),!this.get(h)&&R.type&&this.set(h,R.type),!this.get(f)&&R.vendor&&this.set(f,R.vendor)}if(r[de]){var v;if(typeof r[de]!="string")for(var x=0;!v&&x<r[de].length;)v=Q(r[de][x++],Vt);else v=Q(r[de],Vt);this.set(h,v)}break;case B:var S=r[me];if(S){var T=r[dt];S==yt&&(T=parseInt(kt(T),10)>=13?"11":"10"),this.set(p,S).set(b,T)}this.get(p)==yt&&r[d]=="Xbox"&&this.set(p,"Xbox").set(b,void 0);break;case _e:var V=this.data,le=function(y){return V[y].getItem().setCH(r).parseCH().get()};this.set(j,le(j)).set(ee,le(ee)).set(Y,le(Y)).set(G,le(G)).set(B,le(B))}return this},ne.call(this,[["itemType",i],["ua",e],["uaCH",n],["rgxMap",t],["data",Bn(this,i)]]),this}function $(i,e,t){if(typeof i===ge?($e(i,!0)?(typeof e===ge&&(t=e),e=i):(t=i,e=void 0),i=void 0):typeof i===ut&&!$e(e,!0)&&(t=e,e=void 0),t&&typeof t.append===We){var n={};t.forEach(function(a,u){n[u]=a}),t=n}if(!(this instanceof $))return new $(i,e,t).getResult();var r=typeof i===ut?i:t&&t[At]?t[At]:z&&z.userAgent?z.userAgent:be,o=new $t(t,!0),s=e?Wn(Gt,e):Gt,c=function(a){return a==_e?function(){return new Kt(a,r,s,o).set("ua",r).set(j,this.getBrowser()).set(ee,this.getCPU()).set(Y,this.getDevice()).set(G,this.getEngine()).set(B,this.getOS()).get()}:function(){return new Kt(a,r,s[a],o).parseUA().get()}};return ne.call(this,[["getBrowser",c(j)],["getCPU",c(ee)],["getDevice",c(Y)],["getEngine",c(G)],["getOS",c(B)],["getResult",c(_e)],["getUA",function(){return r}],["setUA",function(a){return ye(a)&&(r=a.length>ct?Ke(a,ct):a),this}]]).setUA(r),this}$.VERSION=An,$.BROWSER=Ge([p,b,Te,h]),$.CPU=Ge([N]),$.DEVICE=Ge([d,f,h,Ce,m,O,E,Z,xe]),$.ENGINE=$.OS=Ge([p,b]);var Me=(i=>(i.PHONE="phone",i.TABLET="tablet",i.DESKTOP="desktop",i))(Me||{}),ce=(i=>(i.ANDROID="android",i.IOS="ios",i.MAC="mac",i.WIN="win",i.LINUX="linux",i.UNKNOWN="unknown",i))(ce||{});function Jt(i){const e=i.toLowerCase();return{detectOS(){return/android/.test(e)?ce.ANDROID:/iphone|ipad|ipod/.test(e)?ce.IOS:/macintosh|mac os x/.test(e)?ce.MAC:/windows/.test(e)?ce.WIN:/linux/.test(e)?ce.LINUX:ce.UNKNOWN},detectDeviceType(){const t=/iphone|ipod|android.*mobile|windows phone|blackberry|webos/.test(e),n=/ipad|android(?!.*mobile)|tablet/.test(e);return t?Me.PHONE:n?Me.TABLET:Me.DESKTOP},detectDeviceName(){const n=new $().getResult();return n.device&&n.device.model?`${n.device.vendor} ${n.device.model}`:n.os&&n.os.name?`${n.os.name} ${n.os.version}`:"Unknown Device"},getTimezone(){const n=new Date().toString().match(/GMT[+-]\d{4}/);return n?n[0]:""},getBrowserName(){return new $(i).getBrowser().name||""},getBrowserVersion(){return new $(i).getBrowser().version||""},async getFingerPrint(){try{return await(await Promise.resolve().then(()=>vn)).getFingerprint()}catch(t){return console.error("device fingerprint ERROR",t),""}},async getExtendedFingerprint(t){try{const n=await Promise.resolve().then(()=>vn);let r={web_hwid:await n.getFingerprint(!0),"web_hwid-rm__applepay--rm__browser-useragent":"","web_hwid-rm__applepay--rm__browser-useragent__add-ip":""};return n.setOption("exclude",["applePayVersion","system.browser.version","system.browser.name","system.useragent"]),r["web_hwid-rm__applepay--rm__browser-useragent"]=await n.getFingerprint(),n.includeComponent("tcp",()=>Promise.resolve({ip:t})),r["web_hwid-rm__applepay--rm__browser-useragent__add-ip"]=await n.getFingerprint(),r}catch(n){console.error("device fingerprint ERROR",n)}},detectOSVersion(){let t;return/android/.test(e)?t=e.match(/android\s([0-9_.]+)/):/iphone|ipad|ipod/.test(e)?t=e.match(/os\s([0-9_]+)/):/macintosh|mac os x/.test(e)?t=e.match(/mac os x\s([0-9_.]+)/):/windows/.test(e)?t=e.match(/windows nt\s([0-9_.]+)/):/linux/.test(e)&&(t=e.match(/linux\s?([0-9_.]*)/)),t?t[1].replace(/_/g,"."):"unknown"}}}var Xt=(i=>(i.SESSIONS="analytics:sessions",i.EVENTS="analytics:events",i))(Xt||{}),Ue=(i=>(i.INITIAL="initial",i.LOCATED="located",i.ATTRIBUTED="attributed",i))(Ue||{});class Hn{config;constructor(e){this.config=e}hasValidLocationData(e,t){return!!(e&&t)}logLocationWarning(e,t,n){console.warn("[EwaAnalytics SDK] Country or IP address is not set. Session located event not sent",{country:e,ip_address:t,context:n})}createSessionLocatedData(e,t){return{event_name:"session",event_subtype:Ue.LOCATED,random_user_id:this.config.globalConfig.initData.randomUserId,app_id:this.config.globalConfig.initData.appId||"web",platform:this.config.globalConfig.initData.platform||"web",country:e,ip_address:t}}createSessionStartedData(){return{event_name:"session",event_subtype:Ue.INITIAL,random_user_id:this.config.globalConfig.initData.randomUserId,platform:this.config.globalConfig.initData.platform||"web",app_id:this.config.globalConfig.initData.appId||"web"}}createFingerprintData(e){return{event_name:"webview_client_attribution",event_subtype:"thumbmarkjs",random_user_id:this.config.globalConfig.initData.randomUserId,app_id:this.config.globalConfig.initData.appId||"web",platform:this.config.globalConfig.initData.platform||"web",event_value:JSON.stringify({fingerprint_data:e})}}async sendSessionStarted(e){const t=this.createSessionStartedData();await this.config.eventTracker.trackEvent("session",t,e)}async sendSessionLocated(e,t,n){if(!this.hasValidLocationData(e,t)){this.logLocationWarning(e,t,n);return}const r=this.createSessionLocatedData(e,t);await this.config.eventTracker.trackEvent("session",r,n)}async sendExtendedFingerprint(e){const n=await Jt(this.config.globalConfig.initData.userAgent).getExtendedFingerprint(this.config.globalConfig.initData.ip_address),r=this.createFingerprintData(n);await this.config.eventTracker.trackEvent("event",r,e)}}function g(i,e,t){typeof console<"u"&&console.debug&&(t==="error"?console.error(`[EwaAnalytics SDK] ${i}`,e||""):console.debug(`[EwaAnalytics SDK] ${i}`,e||""))}class qn{config;userAgent;sessionLocated=!1;initialEventSent=!1;constructor(e){this.config=e,this.userAgent=Jt(e.globalConfig.initData.userAgent)}createMergedPayload(e,t){return{...e,...this.config.globalConfig.initData,...t,userAgent:this.userAgent,session_id:this.config.sessionId}}updateSessionState(e){switch(e){case"located":this.sessionLocated=!0,g("Session marked as located");break;case"initial":this.initialEventSent=!0,g("Initial session events marked as sent");break;case"attributed":this.sessionLocated=!0,this.initialEventSent=!0,g("Session marked as attributed and ready for analytics");break}}canTrackAnalyticsEvents(){return this.sessionLocated?this.initialEventSent?!0:(console.warn("[EwaAnalytics SDK] Initial session events not yet sent. Skipping analytics event tracking."),!1):(console.warn("[EwaAnalytics SDK] Session not yet located. Skipping analytics event tracking."),!1)}async trackEvent(e,t,n){try{this.validateEventType(e),this.validatePayload(t);const r=this.createMergedPayload(t,n);if(e==="session")await this.trackSession(r);else if(e==="event")await this.trackAnalyticsEvent(r);else throw new Error(`Invalid event type: ${e}. Must be 'session' or 'event'`)}catch(r){throw console.error(`[EwaAnalytics SDK] Error tracking ${e}:`,r),r}}async trackSession(e){try{const t=await Rn(e);g(`Tracking session ${e.event_subtype}:`,t),this.updateSessionState(e.event_subtype),await this.sendToTransport(t,"session")}catch(t){throw console.error("[EwaAnalytics SDK] Error tracking session:",t),t}}async trackAnalyticsEvent(e){try{if(!this.canTrackAnalyticsEvents())return;const t=await On(e);g("Tracking event:",t),await this.sendToTransport(t,"event")}catch(t){throw console.error("[EwaAnalytics SDK] Error tracking event:",t),t}}async sendToTransport(e,t){const n=t==="session"?"analytics:sessions":"analytics:events";switch(this.config.globalConfig.transport){case"http":await this.postToHttp(e);break;case"websocket":await this.publishToWebSocket(n,e);break;default:throw new Error(`Unsupported transport: ${this.config.globalConfig.transport}`)}}async postToHttp(e){if(!this.config.apiInstance)throw new Error("HTTP API instance not available");try{await this.config.apiInstance.post("/events",e)}catch(t){throw console.error("[EwaAnalytics SDK] HTTP POST failed:",t),t}}async publishToWebSocket(e,t){if(!this.config.connection)throw new Error("WebSocket connection not available");try{this.config.connection.publish(e,t)}catch(n){throw console.error("[EwaAnalytics SDK] WebSocket publish failed:",n),n}}async trackSessionTyped(e,t){this.validatePayload(e);const n=t?{...t,...e}:e;return this.trackEvent("session",n)}async trackEventTyped(e,t){this.validatePayload(e);const n=t?{...t,...e}:e;return this.trackEvent("event",n)}getTransport(){return this.config.globalConfig.transport}getApiUrl(){return this.config.globalConfig.apiUrl}isWebSocketTransport(){return this.config.globalConfig.transport==="websocket"}isHttpTransport(){return this.config.globalConfig.transport==="http"}isSessionLocated(){return this.sessionLocated}areInitialEventsSent(){return this.initialEventSent}getSessionState(){return{located:this.sessionLocated,initialEventSent:this.initialEventSent}}setSessionLocated(e=!0){this.sessionLocated=e,g(`Session located state manually set to: ${e}`)}setInitialEventsSent(e=!0){this.initialEventSent=e,g(`Initial events sent state manually set to: ${e}`)}resetSessionState(){this.sessionLocated=!1,this.initialEventSent=!1,g("Session state reset")}validateEventType(e){if(!e||typeof e!="string")throw new Error("Event type is required and must be a string");if(!["session","event"].includes(e))throw new Error(`Invalid event type: ${e}. Must be 'session' or 'event'`)}validatePayload(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Payload is required and must be an object")}}function je(i,e,t,n){function r(o){return o instanceof t?o:new t(function(s){s(o)})}return new(t||(t=Promise))(function(o,s){function c(l){try{u(n.next(l))}catch(w){s(w)}}function a(l){try{u(n.throw(l))}catch(w){s(w)}}function u(l){l.done?o(l.value):r(l.value).then(c,a)}u((n=n.apply(i,[])).next())})}typeof SuppressedError=="function"&&SuppressedError;function Vn(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var Ct={exports:{}},Ee=typeof Reflect=="object"?Reflect:null,Yt=Ee&&typeof Ee.apply=="function"?Ee.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)},Xe;Ee&&typeof Ee.ownKeys=="function"?Xe=Ee.ownKeys:Object.getOwnPropertySymbols?Xe=function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:Xe=function(e){return Object.getOwnPropertyNames(e)};function Gn(i){console&&console.warn&&console.warn(i)}var Zt=Number.isNaN||function(e){return e!==e};function k(){k.init.call(this)}Ct.exports=k,Ct.exports.once=Xn,k.EventEmitter=k,k.prototype._events=void 0,k.prototype._eventsCount=0,k.prototype._maxListeners=void 0;var Qt=10;function Ye(i){if(typeof i!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof i)}Object.defineProperty(k,"defaultMaxListeners",{enumerable:!0,get:function(){return Qt},set:function(i){if(typeof i!="number"||i<0||Zt(i))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+i+".");Qt=i}}),k.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},k.prototype.setMaxListeners=function(e){if(typeof e!="number"||e<0||Zt(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this};function en(i){return i._maxListeners===void 0?k.defaultMaxListeners:i._maxListeners}k.prototype.getMaxListeners=function(){return en(this)},k.prototype.emit=function(e){for(var t=[],n=1;n<arguments.length;n++)t.push(arguments[n]);var r=e==="error",o=this._events;if(o!==void 0)r=r&&o.error===void 0;else if(!r)return!1;if(r){var s;if(t.length>0&&(s=t[0]),s instanceof Error)throw s;var c=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw c.context=s,c}var a=o[e];if(a===void 0)return!1;if(typeof a=="function")Yt(a,this,t);else for(var u=a.length,l=on(a,u),n=0;n<u;++n)Yt(l[n],this,t);return!0};function tn(i,e,t,n){var r,o,s;if(Ye(t),o=i._events,o===void 0?(o=i._events=Object.create(null),i._eventsCount=0):(o.newListener!==void 0&&(i.emit("newListener",e,t.listener?t.listener:t),o=i._events),s=o[e]),s===void 0)s=o[e]=t,++i._eventsCount;else if(typeof s=="function"?s=o[e]=n?[t,s]:[s,t]:n?s.unshift(t):s.push(t),r=en(i),r>0&&s.length>r&&!s.warned){s.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(e)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=i,c.type=e,c.count=s.length,Gn(c)}return i}k.prototype.addListener=function(e,t){return tn(this,e,t,!1)},k.prototype.on=k.prototype.addListener,k.prototype.prependListener=function(e,t){return tn(this,e,t,!0)};function $n(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function nn(i,e,t){var n={fired:!1,wrapFn:void 0,target:i,type:e,listener:t},r=$n.bind(n);return r.listener=t,n.wrapFn=r,r}k.prototype.once=function(e,t){return Ye(t),this.on(e,nn(this,e,t)),this},k.prototype.prependOnceListener=function(e,t){return Ye(t),this.prependListener(e,nn(this,e,t)),this},k.prototype.removeListener=function(e,t){var n,r,o,s,c;if(Ye(t),r=this._events,r===void 0)return this;if(n=r[e],n===void 0)return this;if(n===t||n.listener===t)--this._eventsCount===0?this._events=Object.create(null):(delete r[e],r.removeListener&&this.emit("removeListener",e,n.listener||t));else if(typeof n!="function"){for(o=-1,s=n.length-1;s>=0;s--)if(n[s]===t||n[s].listener===t){c=n[s].listener,o=s;break}if(o<0)return this;o===0?n.shift():Kn(n,o),n.length===1&&(r[e]=n[0]),r.removeListener!==void 0&&this.emit("removeListener",e,c||t)}return this},k.prototype.off=k.prototype.removeListener,k.prototype.removeAllListeners=function(e){var t,n,r;if(n=this._events,n===void 0)return this;if(n.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):n[e]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete n[e]),this;if(arguments.length===0){var o=Object.keys(n),s;for(r=0;r<o.length;++r)s=o[r],s!=="removeListener"&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(t=n[e],typeof t=="function")this.removeListener(e,t);else if(t!==void 0)for(r=t.length-1;r>=0;r--)this.removeListener(e,t[r]);return this};function rn(i,e,t){var n=i._events;if(n===void 0)return[];var r=n[e];return r===void 0?[]:typeof r=="function"?t?[r.listener||r]:[r]:t?Jn(r):on(r,r.length)}k.prototype.listeners=function(e){return rn(this,e,!0)},k.prototype.rawListeners=function(e){return rn(this,e,!1)},k.listenerCount=function(i,e){return typeof i.listenerCount=="function"?i.listenerCount(e):sn.call(i,e)},k.prototype.listenerCount=sn;function sn(i){var e=this._events;if(e!==void 0){var t=e[i];if(typeof t=="function")return 1;if(t!==void 0)return t.length}return 0}k.prototype.eventNames=function(){return this._eventsCount>0?Xe(this._events):[]};function on(i,e){for(var t=new Array(e),n=0;n<e;++n)t[n]=i[n];return t}function Kn(i,e){for(;e+1<i.length;e++)i[e]=i[e+1];i.pop()}function Jn(i){for(var e=new Array(i.length),t=0;t<e.length;++t)e[t]=i[t].listener||i[t];return e}function Xn(i,e){return new Promise(function(t,n){function r(s){i.removeListener(e,o),n(s)}function o(){typeof i.removeListener=="function"&&i.removeListener("error",r),t([].slice.call(arguments))}an(i,e,o,{once:!0}),e!=="error"&&Yn(i,r,{once:!0})})}function Yn(i,e,t){typeof i.on=="function"&&an(i,"error",e,t)}function an(i,e,t,n){if(typeof i.on=="function")n.once?i.once(e,t):i.on(e,t);else if(typeof i.addEventListener=="function")i.addEventListener(e,function r(o){n.once&&i.removeEventListener(e,r),t(o)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof i)}var Zn=Ct.exports,cn=Vn(Zn),C;(function(i){i[i.timeout=1]="timeout",i[i.transportClosed=2]="transportClosed",i[i.clientDisconnected=3]="clientDisconnected",i[i.clientClosed=4]="clientClosed",i[i.clientConnectToken=5]="clientConnectToken",i[i.clientRefreshToken=6]="clientRefreshToken",i[i.subscriptionUnsubscribed=7]="subscriptionUnsubscribed",i[i.subscriptionSubscribeToken=8]="subscriptionSubscribeToken",i[i.subscriptionRefreshToken=9]="subscriptionRefreshToken",i[i.transportWriteError=10]="transportWriteError",i[i.connectionClosed=11]="connectionClosed",i[i.badConfiguration=12]="badConfiguration"})(C||(C={}));var ue;(function(i){i[i.connectCalled=0]="connectCalled",i[i.transportClosed=1]="transportClosed",i[i.noPing=2]="noPing",i[i.subscribeTimeout=3]="subscribeTimeout",i[i.unsubscribeError=4]="unsubscribeError"})(ue||(ue={}));var Ne;(function(i){i[i.disconnectCalled=0]="disconnectCalled",i[i.unauthorized=1]="unauthorized",i[i.badProtocol=2]="badProtocol",i[i.messageSizeLimit=3]="messageSizeLimit"})(Ne||(Ne={}));var Ze;(function(i){i[i.subscribeCalled=0]="subscribeCalled",i[i.transportClosed=1]="transportClosed"})(Ze||(Ze={}));var Qe;(function(i){i[i.unsubscribeCalled=0]="unsubscribeCalled",i[i.unauthorized=1]="unauthorized",i[i.clientClosed=2]="clientClosed"})(Qe||(Qe={}));var A;(function(i){i.Disconnected="disconnected",i.Connecting="connecting",i.Connected="connected"})(A||(A={}));var D;(function(i){i.Unsubscribed="unsubscribed",i.Subscribing="subscribing",i.Subscribed="subscribed"})(D||(D={}));function Qn(i,e){return i.lastIndexOf(e,0)===0}function un(i){return i==null?!1:typeof i=="function"}function ei(i,e){if(globalThis.console){const t=globalThis.console[i];un(t)&&t.apply(globalThis.console,e)}}function ti(i,e){return Math.floor(Math.random()*(e-i+1)+i)}function et(i,e,t){i>31&&(i=31);const n=ti(0,Math.min(t,e*Math.pow(2,i)));return Math.min(t,e+n)}function ni(i){return"error"in i&&i.error!==null}function tt(i){return Math.min(i*1e3,2147483647)}class ii extends cn{constructor(e,t,n){super(),this._resubscribeTimeout=null,this._refreshTimeout=null,this.channel=t,this.state=D.Unsubscribed,this._centrifuge=e,this._token="",this._getToken=null,this._data=null,this._getData=null,this._recover=!1,this._offset=null,this._epoch=null,this._recoverable=!1,this._positioned=!1,this._joinLeave=!1,this._minResubscribeDelay=500,this._maxResubscribeDelay=2e4,this._resubscribeTimeout=null,this._resubscribeAttempts=0,this._promises={},this._promiseId=0,this._inflight=!1,this._refreshTimeout=null,this._delta="",this._delta_negotiated=!1,this._prevValue=null,this._unsubPromise=Promise.resolve(),this._setOptions(n),this._centrifuge._debugEnabled?(this.on("state",r=>{this._debug("subscription state",t,r.oldState,"->",r.newState)}),this.on("error",r=>{this._debug("subscription error",t,r)})):this.on("error",function(){Function.prototype()})}ready(e){return this.state===D.Unsubscribed?Promise.reject({code:C.subscriptionUnsubscribed,message:this.state}):this.state===D.Subscribed?Promise.resolve():new Promise((t,n)=>{const r={resolve:t,reject:n};e&&(r.timeout=setTimeout(function(){n({code:C.timeout,message:"timeout"})},e)),this._promises[this._nextPromiseId()]=r})}subscribe(){this._isSubscribed()||(this._resubscribeAttempts=0,this._setSubscribing(Ze.subscribeCalled,"subscribe called"))}unsubscribe(){this._unsubPromise=this._setUnsubscribed(Qe.unsubscribeCalled,"unsubscribe called",!0)}publish(e){const t=this;return this._methodCall().then(function(){return t._centrifuge.publish(t.channel,e)})}presence(){const e=this;return this._methodCall().then(function(){return e._centrifuge.presence(e.channel)})}presenceStats(){const e=this;return this._methodCall().then(function(){return e._centrifuge.presenceStats(e.channel)})}history(e){const t=this;return this._methodCall().then(function(){return t._centrifuge.history(t.channel,e)})}_methodCall(){return this._isSubscribed()?Promise.resolve():this._isUnsubscribed()?Promise.reject({code:C.subscriptionUnsubscribed,message:this.state}):new Promise((e,t)=>{const n=setTimeout(function(){t({code:C.timeout,message:"timeout"})},this._centrifuge._config.timeout);this._promises[this._nextPromiseId()]={timeout:n,resolve:e,reject:t}})}_nextPromiseId(){return++this._promiseId}_needRecover(){return this._recover===!0}_isUnsubscribed(){return this.state===D.Unsubscribed}_isSubscribing(){return this.state===D.Subscribing}_isSubscribed(){return this.state===D.Subscribed}_setState(e){if(this.state!==e){const t=this.state;return this.state=e,this.emit("state",{newState:e,oldState:t,channel:this.channel}),!0}return!1}_usesToken(){return this._token!==""||this._getToken!==null}_clearSubscribingState(){this._resubscribeAttempts=0,this._clearResubscribeTimeout()}_clearSubscribedState(){this._clearRefreshTimeout()}_setSubscribed(e){if(!this._isSubscribing())return;this._clearSubscribingState(),e.recoverable&&(this._recover=!0,this._offset=e.offset||0,this._epoch=e.epoch||""),e.delta?this._delta_negotiated=!0:this._delta_negotiated=!1,this._setState(D.Subscribed);const t=this._centrifuge._getSubscribeContext(this.channel,e);this.emit("subscribed",t),this._resolvePromises();const n=e.publications;if(n&&n.length>0)for(const r in n)n.hasOwnProperty(r)&&this._handlePublication(n[r]);e.expires===!0&&(this._refreshTimeout=setTimeout(()=>this._refresh(),tt(e.ttl)))}_setSubscribing(e,t){return je(this,void 0,void 0,function*(){this._isSubscribing()||(this._isSubscribed()&&this._clearSubscribedState(),this._setState(D.Subscribing)&&this.emit("subscribi