sitepong 0.2.12 → 0.2.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- var SitePong=(function(exports){'use strict';function Kn(){try{return typeof localStorage>"u"?null:{getItem:async r=>localStorage.getItem(r),setItem:async(r,e)=>{localStorage.setItem(r,e);},removeItem:async r=>{localStorage.removeItem(r);}}}catch{return null}}function St(){return {platform:"browser",storage:Kn(),getDeviceInfo(){let e={platform:"browser"};return typeof navigator<"u"&&(e.userAgent=navigator.userAgent),typeof window<"u"&&window.screen&&(e.screenWidth=window.screen.width,e.screenHeight=window.screen.height),e},getCurrentUrl(){if(!(typeof window>"u"||!window.location))return window.location.href},getReferrer(){if(!(typeof document>"u"))return document.referrer||void 0},getUserAgent(){if(!(typeof navigator>"u"))return navigator.userAgent},onUncaughtError(e){if(typeof window>"u"||!window.addEventListener)return ()=>{};let t=n=>{e(n.error||n.message);};return window.addEventListener("error",t),()=>window.removeEventListener("error",t)},onUnhandledRejection(e){if(typeof window>"u"||!window.addEventListener)return ()=>{};let t=n=>{e(n.reason);};return window.addEventListener("unhandledrejection",t),()=>window.removeEventListener("unhandledrejection",t)},onBeforeTerminate(e){return typeof window>"u"||!window.addEventListener?()=>{}:(window.addEventListener("beforeunload",e),()=>window.removeEventListener("beforeunload",e))},onVisibilityHidden(e){if(typeof document>"u"||!document.addEventListener)return ()=>{};let t=()=>{document.visibilityState==="hidden"&&e();};return document.addEventListener("visibilitychange",t),()=>document.removeEventListener("visibilitychange",t)},sendBeacon(e,t){if(typeof navigator>"u"||typeof navigator.sendBeacon!="function")return false;try{let n=new Blob([t],{type:"application/json"});return navigator.sendBeacon(e,n)}catch{return false}}}}var R=null;function z(r){R=r;}function S(){return R}function Pe(){if(R)return R.platform;let r=globalThis;return r.navigator&&r.navigator.product==="ReactNative"?"react-native":r.process&&r.process.versions&&r.process.versions.node?"node":r.window&&r.document?"browser":"unknown"}function _(){return Pe()==="react-native"}var Wn=null;function qn(){return R&&R.platform==="react-native"?R:null}function Le(r){let e=qn();e&&e._setGetCurrentScreen(r);}function ce(){return Wn}function _e(){return R?R.storage:null}var le="sitepong_anonymous_id";function De(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let e=Math.random()*16|0;return (r==="x"?e:e&3|8).toString(16)})}var I=null;function D(){if(typeof window<"u"&&typeof localStorage<"u")try{let r=localStorage.getItem(le);return r||(r=De(),localStorage.setItem(le,r)),r}catch{return I||(I=De()),I}return I||(I=De()),I}function Tt(){if(typeof window<"u"&&typeof localStorage<"u")try{localStorage.removeItem(le);}catch{}I=null;}function kt(r){if(typeof window<"u"&&typeof localStorage<"u")try{localStorage.setItem(le,r);}catch{I=r;}else I=r;}function xt(r){let e=r.toLowerCase();return /ipad/.test(e)||/android/.test(e)&&!/mobile/.test(e)||/tablet/.test(e)?"tablet":/mobile/.test(e)||/iphone/.test(e)||/ipod/.test(e)||/android/.test(e)||/blackberry/.test(e)||/windows phone/.test(e)?"mobile":"desktop"}function Et(r){let e=r.toLowerCase();return /edg/.test(e)?"edge":/opr|opera/.test(e)?"opera":/samsungbrowser/.test(e)?"samsung":/chrome|chromium|crios/.test(e)?"chrome":/safari/.test(e)&&!/chrome/.test(e)?"safari":/firefox|fxios/.test(e)?"firefox":/msie|trident/.test(e)?"ie":"other"}function Ct(r){let e=r.toLowerCase();return /iphone|ipad|ipod/.test(e)?"ios":/android/.test(e)?"android":/mac os|macos|macintosh/.test(e)?"macos":/windows/.test(e)?"windows":/linux/.test(e)?"linux":"other"}function Fe(){let r=S()?.getUserAgent()??"";return {anonymous_id:D(),device_type:r?xt(r):void 0,browser:r?Et(r):void 0,os:r?Ct(r):void 0,user_agent:r||void 0,timestamp:new Date}}function Mt(r){let e=5381;for(let t=0;t<r.length;t++)e=(e<<5)+e^r.charCodeAt(t);return e>>>0}function jn(r){return Math.random()*100<r.percentage}function Gn(r,e,t){let n=`${e.anonymous_id}:${t}`;return Mt(n)%100<r.percentage}function ue(r){let[e,t]=r.split(":").map(Number);return e*60+t}function Xn(r,e){let t=e.timestamp||new Date,i=new Intl.DateTimeFormat("en-US",{timeZone:r.timezone,weekday:"short",hour:"2-digit",minute:"2-digit",hour12:false}).formatToParts(t),o=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"].indexOf(i.find(u=>u.type==="weekday")?.value||""),s=parseInt(i.find(u=>u.type==="hour")?.value||"0",10),a=parseInt(i.find(u=>u.type==="minute")?.value||"0",10),c=s*60+a;if(r.days_of_week&&r.days_of_week.length>0&&!r.days_of_week.includes(o))return false;if(r.start_time&&r.end_time){let u=ue(r.start_time),p=ue(r.end_time);if(u>p){if(c<u&&c>=p)return false}else if(c<u||c>=p)return false}else if(r.start_time){let u=ue(r.start_time);if(c<u)return false}else if(r.end_time){let u=ue(r.end_time);if(c>=u)return false}return true}function Qn(r,e){return e.device_type?r.types.includes(e.device_type):false}function Yn(r,e){return e.browser?r.browsers.includes(e.browser):false}function Jn(r,e){return e.os?r.operating_systems.includes(e.os):false}function Zn(r,e,t,n){switch(r){case "percentage_rollout":return jn(e);case "userbase_percentage":return Gn(e,t,n);case "time_based":return Xn(e,t);case "device_type":return Qn(e,t);case "browser":return Yn(e,t);case "os":return Jn(e,t);default:return false}}function de(r,e){if(r.override==="force_on")return true;if(r.override==="force_off"||!r.enabled)return false;if(!r.rules||r.rules.length===0)return true;for(let t of r.rules)if(!Zn(t.rule_type,t.config,e,r.key))return false;return true}function Rt(r,e){if(!de(r,e)||r.flag_type!=="multivariate"||!r.variants||r.variants.length===0)return null;let t=`${e.anonymous_id}:${r.key}:variant`,n=Mt(t),i=r.variants.reduce((a,c)=>a+c.weight,0),o=n%i,s=0;for(let a of r.variants)if(s+=a.weight,o<s)return a.key;return r.variants[0].key}function It(r,e){return r.variant_payloads&&r.variant_payloads[e]!==void 0?r.variant_payloads[e]:r.variants?.find(n=>n.key===e)?.payload||null}var er="https://api.sitepong.com",F=class{constructor(e){this.flags=new Map;this.evaluatedFlags=new Map;this.evaluatedVariants=new Map;this.context=null;this.initialized=false;this.initPromise=null;this.config={endpoint:er,debug:false,...e};}async init(){if(!this.initialized){if(this.initPromise)return this.initPromise;this.initPromise=this.fetchAndEvaluateFlags();try{await this.initPromise,this.initialized=!0;}catch(e){this.log("Failed to initialize flags:",e),this.initialized=true;}finally{this.initPromise=null;}}}async fetchAndEvaluateFlags(){try{let e=await fetch(`${this.config.endpoint}/api/sdk/flags`,{method:"GET",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey}});if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);let t=await e.json();this.log("Fetched flags:",t.flags.length),this.context=Fe(),this.log("Evaluation context:",this.context),this.flags.clear(),this.evaluatedFlags.clear(),this.evaluatedVariants.clear();for(let n of t.flags){this.flags.set(n.key,n);let i=de(n,this.context);if(this.evaluatedFlags.set(n.key,i),n.flag_type==="multivariate"&&n.variants){let o=Rt(n,this.context);this.evaluatedVariants.set(n.key,o),this.log(`Flag "${n.key}": ${i}, variant: ${o}`);}else this.log(`Flag "${n.key}": ${i}`);}}catch(e){throw this.log("Error fetching flags:",e),e}}getFlag(e,t=false){if(!this.initialized)return this.log(`Flag "${e}" requested before init, returning default:`,t),t;let n=this.evaluatedFlags.get(e);return n===void 0?(this.log(`Flag "${e}" not found, returning default:`,t),t):n}getVariant(e,t=null){if(!this.initialized)return this.log(`Variant "${e}" requested before init, returning default:`,t),t;let n=this.evaluatedVariants.get(e);return n===void 0?(this.log(`Variant "${e}" not found, returning default:`,t),t):n}getVariantPayload(e,t=null){let n=this.getVariant(e);if(!n)return t;let i=this.flags.get(e);return i?It(i,n)??t:t}getAllFlags(){let e={};for(let[t,n]of this.evaluatedFlags)e[t]=n;return e}hasFlag(e){return this.flags.has(e)}isInitialized(){return this.initialized}async waitForInit(){this.initialized||await this.init();}async refresh(){this.initialized=false,await this.init();}getContext(){return this.context}log(...e){this.config.debug&&console.log("[SitePong Flags]",...e);}};var Ae="sitepong_session_id",pe="sitepong_session_ts";var V=null,K=null;function Lt(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let e=Math.random()*16|0;return (r==="x"?e:e&3|8).toString(16)})}function _t(r){return Date.now()-r>18e5}function Ne(){if(typeof window<"u"&&typeof sessionStorage<"u")try{let r=sessionStorage.getItem(Ae),e=sessionStorage.getItem(pe);if(r&&e&&!_t(parseInt(e,10)))return sessionStorage.setItem(pe,String(Date.now())),r;let t=Lt();return sessionStorage.setItem(Ae,t),sessionStorage.setItem(pe,String(Date.now())),t}catch{return Pt()}return Pt()}function Pt(){return V&&K&&!_t(K)?(K=Date.now(),V):(V=Lt(),K=Date.now(),V)}function Oe(){if(typeof window<"u"&&typeof sessionStorage<"u")try{sessionStorage.removeItem(Ae),sessionStorage.removeItem(pe);}catch{}V=null,K=null;}var Dt="sp_utm",tr=[["source","utm_source"],["medium","utm_medium"],["campaign","utm_campaign"],["term","utm_term"],["content","utm_content"]];function nr(){if(typeof window>"u"||!window.location||!window.location.search)return null;let r;try{r=new URLSearchParams(window.location.search);}catch{return null}let e={},t=false;for(let[n,i]of tr){let o=r.get(i);o&&(e[n]=o,t=true);}return t?e:null}function rr(){if(typeof sessionStorage>"u")return null;try{let r=sessionStorage.getItem(Dt);if(!r)return null;let e=JSON.parse(r);return e&&typeof e=="object"?e:null}catch{return null}}function ir(r){if(!(typeof sessionStorage>"u"))try{sessionStorage.setItem(Dt,JSON.stringify(r));}catch{}}function Ft(){let r=rr();if(r)return r;let e=nr();return e&&ir(e),e}var At=["[data-sp-no-capture]",".sp-no-capture"];var P=class{constructor(e,t){this.listeners=[];this.clickHandler=null;this.submitHandler=null;this.active=false;this.config={clicks:true,forms:true,pageviews:true,blockSelectors:At,maxTextLength:255,debug:false,...e},this.callback=t;}addListener(e){return this.listeners.push(e),()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1);}}emit(e){this.callback(e);for(let t of this.listeners)try{t(e);}catch{}}start(){this.active||typeof document>"u"||typeof document.addEventListener!="function"||(this.active=true,this.config.clicks&&this.setupClickCapture(),this.config.forms&&this.setupFormCapture(),this.log("Autocapture started"));}stop(){this.active&&(this.active=false,this.clickHandler&&(document.removeEventListener("click",this.clickHandler,true),this.clickHandler=null),this.submitHandler&&(document.removeEventListener("submit",this.submitHandler,true),this.submitHandler=null),this.log("Autocapture stopped"));}setupClickCapture(){this.clickHandler=e=>{let t=e.target;if(!t||!this.shouldCapture(t))return;let n=this.getElementProperties(t);n.$event_type="click",n.$x=e.clientX,n.$y=e.clientY,this.emit({type:"click",timestamp:new Date().toISOString(),properties:n});},document.addEventListener("click",this.clickHandler,true);}setupFormCapture(){this.submitHandler=e=>{let t=e.target;if(!t||!this.shouldCapture(t))return;let n={$event_type:"form_submit",$form_action:t.action||void 0,$form_method:t.method||"get",$form_name:t.name||t.id||void 0,$field_names:this.getFormFieldNames(t),$field_count:t.elements.length},i=this.getElementProperties(t);Object.assign(n,i),this.emit({type:"form_submit",timestamp:new Date().toISOString(),properties:n});},document.addEventListener("submit",this.submitHandler,true);}shouldCapture(e){let t=this.config.blockSelectors||At;for(let n of t)if(e.matches(n)||e.closest(n))return false;return !(this.config.allowSelectors&&this.config.allowSelectors.length>0&&!this.config.allowSelectors.some(i=>e.matches(i)||e.closest(i)!==null)||e.offsetParent===null&&e.tagName!=="BODY")}getElementProperties(e){let t={};t.$tag_name=e.tagName.toLowerCase(),t.$el_id=e.id||void 0,e.classList.length>0&&(t.$el_classes=Array.from(e.classList).slice(0,5));let n=this.getElementText(e);n&&(t.$el_text=n),e instanceof HTMLAnchorElement&&(t.$href=e.href||void 0,t.$target=e.target||void 0),(e instanceof HTMLInputElement||e instanceof HTMLButtonElement)&&(t.$el_type=e.type||void 0,t.$el_name=e.name||void 0);let i=e.getAttribute("aria-label");i&&(t.$aria_label=this.truncate(i));let o=e.getAttribute("role");return o&&(t.$el_role=o),t.$selector=this.getSelector(e),typeof window<"u"&&window.location&&(t.$current_url=window.location.href,t.$pathname=window.location.pathname),t}getElementText(e){if(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement)return;let t="";if(e instanceof HTMLButtonElement||e instanceof HTMLAnchorElement)t=e.innerText||e.textContent||"";else for(let n of Array.from(e.childNodes))n.nodeType===Node.TEXT_NODE&&(t+=n.textContent||"");return t=t.trim().replace(/\s+/g," "),t?this.truncate(t):void 0}getFormFieldNames(e){let t=[];for(let n of Array.from(e.elements)){let i=n;i.name&&i.type!=="password"&&i.type!=="hidden"&&t.push(i.name);}return t.slice(0,20)}getSelector(e){let t=[],n=e,i=0;for(;n&&n!==document.body&&i<5;){let o=n.tagName.toLowerCase();if(n.id){o=`#${n.id}`,t.unshift(o);break}n.classList.length>0&&(o+=`.${Array.from(n.classList).slice(0,2).join(".")}`);let s=n.parentElement;if(s){let a=Array.from(s.children).filter(c=>c.tagName===n.tagName);if(a.length>1){let c=a.indexOf(n)+1;o+=`:nth-of-type(${c})`;}}t.unshift(o),n=n.parentElement,i++;}return t.join(" > ")}truncate(e){let t=this.config.maxTextLength||255;return e.length>t?e.slice(0,t)+"...":e}log(...e){this.config.debug&&console.log("[SitePong Autocapture]",...e);}};var or="https://ingest.sitepong.com",sr=20,ar=1e4,He=3,A=class{constructor(e){this.eventQueue=[];this.flushTimer=null;this.flushFailures=0;this.disabled=false;this.userId=null;this.groupId=null;this.userTraits=null;this.groupTraits=null;this.lastUrl=null;this.popstateHandler=null;this.autocaptureModule=null;this.config={endpoint:or,enabled:true,autocapturePageviews:false,maxBatchSize:sr,flushInterval:ar,debug:false,...e};}init(){this.config.enabled&&(this.startFlushTimer(),this.setupPageHideListener(),this.config.autocapturePageviews&&this.setupSPATracking(),this.setupAutocapture(),this.log("Analytics initialized"));}initHeadless(){this.config.enabled&&(this.startFlushTimer(),this.log("Analytics initialized (headless)"));}setupAutocapture(){let e=this.config.autocapture,t=this.config.autocaptureClicks,n=this.config.autocaptureForms,i=t||false,o=n||false,s,a;e===true?(i=true,o=true):e&&typeof e=="object"&&(i=e.clicks!==false,o=e.forms!==false,s=e.blockSelectors,a=e.allowSelectors,e.pageviews!==false&&!this.config.autocapturePageviews&&this.setupSPATracking()),!(!i&&!o)&&(this.autocaptureModule=new P({clicks:i,forms:o,pageviews:false,blockSelectors:s,allowSelectors:a,debug:this.config.debug},c=>{let u=c.type==="click"?"$autocapture_click":c.type==="form_submit"?"$autocapture_form_submit":"$autocapture";this.track(u,c.properties);}),this.autocaptureModule.start());}getAutocaptureModule(){return this.autocaptureModule}track(e,t){if(!this.config.enabled)return;let n=this.createEvent("track",{name:e,properties:t});this.enqueue(n),this.log("Track:",e,t);}trackPageView(e,t){if(!this.config.enabled)return;let n=e||(typeof window<"u"&&window.location?window.location.href:void 0),i=this.createEvent("page",{properties:{url:n,referrer:typeof document<"u"?document.referrer:void 0,title:typeof document<"u"?document.title:void 0,...t}});this.enqueue(i),this.log("Page view:",n);}identify(e,t){if(!this.config.enabled)return;this.userId=e,t&&(this.userTraits={...this.userTraits,...t});let n=this.createEvent("identify",{traits:this.userTraits||void 0});this.enqueue(n),this.log("Identify:",e,t);}group(e,t){if(!this.config.enabled)return;this.groupId=e,t&&(this.groupTraits={...this.groupTraits,...t});let n=this.createEvent("group",{traits:this.groupTraits||void 0});this.enqueue(n),this.log("Group:",e,t);}reset(){this.userId=null,this.groupId=null,this.userTraits=null,this.groupTraits=null,Oe(),this.log("Analytics state reset");}async flush(){if(this.eventQueue.length===0)return;if(this.disabled){this.eventQueue=[];return}let e=[...this.eventQueue];this.eventQueue=[];let t=this.config.eventsEndpoint||`${this.config.endpoint}/api/events`;try{let n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({events:e})});if(!n.ok)throw new Error(`HTTP ${n.status}`);this.flushFailures=0,this.log(`Flushed ${e.length} events`);}catch(n){if(this.flushFailures++,this.flushFailures>=He){this.disabled=true,console.warn(`[SitePong Analytics] Disabled after ${He} consecutive failures. Check that ${t} is accessible and has proper CORS headers.`);return}this.eventQueue.unshift(...e),this.log(`Failed to flush events (attempt ${this.flushFailures}/${He}):`,n);}}destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.popstateHandler&&typeof window<"u"&&(window.removeEventListener("popstate",this.popstateHandler),this.popstateHandler=null),this.autocaptureModule&&(this.autocaptureModule.stop(),this.autocaptureModule=null),this.flushWithBeacon();}createEvent(e,t){return {type:e,name:t.name,properties:t.properties,userId:this.userId||void 0,anonymousId:D(),deviceId:void 0,groupId:this.groupId||void 0,traits:t.traits,sessionId:Ne(),timestamp:new Date().toISOString(),url:typeof window<"u"&&window.location?window.location.href:void 0,referrer:typeof document<"u"&&typeof document.referrer=="string"?document.referrer:void 0,userAgent:typeof navigator<"u"?navigator.userAgent:void 0,utm:Ft()||void 0,appVersion:this.config.appVersion||void 0}}enqueue(e){this.eventQueue.push(e),this.eventQueue.length>=this.config.maxBatchSize&&this.flush();}startFlushTimer(){this.flushTimer&&clearInterval(this.flushTimer),this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval);}setupPageHideListener(){typeof window>"u"||_()||typeof window.addEventListener!="function"||window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flushWithBeacon();});}flushWithBeacon(){if(this.eventQueue.length===0||_()||typeof navigator?.sendBeacon!="function")return;let e=[...this.eventQueue];this.eventQueue=[];let t=this.config.eventsEndpoint||`${this.config.endpoint}/api/events`,n=new Blob([JSON.stringify({events:e,apiKey:this.config.apiKey})],{type:"application/json"});navigator.sendBeacon(t,n),this.log(`Flushed ${e.length} events via beacon`);}setupSPATracking(){if(typeof window>"u"||_()||!window.location||typeof window.addEventListener!="function")return;this.lastUrl=window.location.href,this.trackPageView(),this.popstateHandler=()=>{if(!window.location)return;let n=window.location.href;n!==this.lastUrl&&(this.lastUrl=n,this.trackPageView(n));},window.addEventListener("popstate",this.popstateHandler);let e=history.pushState.bind(history),t=history.replaceState.bind(history);history.pushState=(...n)=>{e(...n),this.handleUrlChange();},history.replaceState=(...n)=>{t(...n),this.handleUrlChange();};}handleUrlChange(){if(typeof window>"u"||!window.location)return;let e=window.location.href;e!==this.lastUrl&&(this.lastUrl=e,this.trackPageView(e));}log(...e){this.config.debug&&console.log("[SitePong Analytics]",...e);}};var W=class{constructor(e){this.apiKey=e.apiKey,this.endpoint=e.endpoint,this.debug=e.debug||false;}async checkin(e,t={}){try{let n=await fetch(`${this.endpoint}/api/sdk/crons`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey},body:JSON.stringify({slug:e,status:t.status||"ok",duration_ms:t.duration_ms,message:t.message,environment:t.environment})});if(!n.ok)throw new Error(`HTTP ${n.status}`);this.log(`Check-in sent for "${e}" (${t.status||"ok"})`);}catch(n){this.log("Failed to send check-in:",n);}}start(e,t){let n=Date.now();return this.checkin(e,{status:"in_progress",environment:t}),{ok:async i=>{let o=Date.now()-n;await this.checkin(e,{status:"ok",duration_ms:o,message:i,environment:t});},error:async i=>{let o=Date.now()-n;await this.checkin(e,{status:"error",duration_ms:o,message:i,environment:t});}}}wrap(e,t,n){let i=this.start(e,n);return t().then(async o=>(await i.ok(),o),async o=>{throw await i.error(o?.message||String(o)),o})}log(...e){this.debug&&console.log("[SitePong:Cron]",...e);}};var q=class{constructor(e){this.queue=[];this.flushTimer=null;this.apiKey=e.apiKey,this.endpoint=e.endpoint,this.debug=e.debug||false,this.flushInterval=e.flushInterval||1e4,this.maxBatchSize=e.maxBatchSize||100,this.startFlushTimer();}increment(e,t=1,n){this.enqueue(e,t,"counter",n);}decrement(e,t=1,n){this.enqueue(e,-t,"counter",n);}gauge(e,t,n){this.enqueue(e,t,"gauge",n);}histogram(e,t,n){this.enqueue(e,t,"histogram",n);}distribution(e,t,n){this.enqueue(e,t,"distribution",n);}async time(e,t,n){let i=Date.now();try{let o=await t();return this.distribution(e,Date.now()-i,{...n,unit:n?.unit||"ms"}),o}catch(o){throw this.distribution(e,Date.now()-i,{...n,unit:n?.unit||"ms",tags:{...n?.tags,error:"true"}}),o}}startTimer(e,t){let n=Date.now();return {stop:()=>{this.distribution(e,Date.now()-n,{...t,unit:t?.unit||"ms"});}}}async flush(){if(this.queue.length===0)return;let e=[...this.queue];this.queue=[];try{let t=await fetch(`${this.endpoint}/api/sdk/metrics`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey},body:JSON.stringify({metrics:e})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.log(`Flushed ${e.length} metrics`);}catch(t){this.queue.unshift(...e),this.log("Failed to flush metrics:",t);}}async destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush();}enqueue(e,t,n,i){this.queue.push({name:e,value:t,type:n,unit:i?.unit,tags:i?.tags,timestamp:i?.timestamp||new Date().toISOString()}),this.queue.length>=this.maxBatchSize&&this.flush();}startFlushTimer(){this.flushTimer=setInterval(()=>{this.flush();},this.flushInterval);let e=S();e&&e.onVisibilityHidden(()=>this.flushWithBeacon());}flushWithBeacon(){if(this.queue.length===0)return;let e=S();if(!e||!e.sendBeacon)return;let t=[...this.queue];this.queue=[];let n=JSON.stringify({metrics:t,apiKey:this.apiKey});e.sendBeacon(`${this.endpoint}/api/sdk/metrics`,n)?this.log(`Flushed ${t.length} metrics via beacon`):this.queue.unshift(...t);}log(...e){this.debug&&console.log("[SitePong:Metrics]",...e);}};var j=class{constructor(e){this.queue=[];this.flushTimer=null;this.queryCounter=0;this.nPlusOneDetector=new Map;this.config={slowQueryThreshold:1e3,maxBatchSize:50,flushInterval:1e4,redactParams:true,...e},this.startFlushTimer();}async track(e,t,n){let i=Date.now();this.queryCounter++;try{let o=await t(),s=Date.now()-i;return this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,is_slow:s>=(this.config.slowQueryThreshold||1e3)}),this.detectNPlusOne(e),o}catch(o){let s=Date.now()-i;throw this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,error:o instanceof Error?o.message:String(o)}),o}}trackSync(e,t,n){let i=Date.now();this.queryCounter++;try{let o=t(),s=Date.now()-i;return this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,is_slow:s>=(this.config.slowQueryThreshold||1e3)}),o}catch(o){let s=Date.now()-i;throw this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,error:o instanceof Error?o.message:String(o)}),o}}getQueryCount(){return this.queryCounter}resetQueryCount(){this.queryCounter=0,this.nPlusOneDetector.clear();}getNPlusOnePatterns(){let e=[];for(let[t,{count:n}]of this.nPlusOneDetector.entries())n>=5&&e.push({query:t,count:n});return e}async flush(){if(this.queue.length===0)return;let e=[...this.queue];this.queue=[];try{let t=await fetch(`${this.config.endpoint}/api/sdk/metrics`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({metrics:e.map(n=>({name:"db.query",value:n.duration_ms,type:"distribution",unit:"ms",tags:{query:n.query.substring(0,200),source:n.source||"unknown",is_slow:String(n.is_slow||!1),...n.error?{error:"true"}:{}},timestamp:n.timestamp}))})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.log(`Flushed ${e.length} query events`);}catch(t){this.queue.unshift(...e),this.log("Failed to flush query events:",t);}}async destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush();}recordQuery(e){this.queue.push(e),this.queue.length>=(this.config.maxBatchSize||50)&&this.flush(),e.is_slow&&this.log(`Slow query (${e.duration_ms}ms):`,e.query.substring(0,100));}detectNPlusOne(e){let t=this.normalizeQuery(e),n=Date.now(),i=this.nPlusOneDetector.get(t);if(i?n-i.since<1e3?(i.count++,i.count===5&&this.log(`N+1 query detected! Pattern repeated ${i.count} times:`,t.substring(0,100))):this.nPlusOneDetector.set(t,{count:1,since:n}):this.nPlusOneDetector.set(t,{count:1,since:n}),this.nPlusOneDetector.size>100){let o=[...this.nPlusOneDetector.entries()];o.sort((s,a)=>s[1].since-a[1].since);for(let s=0;s<50;s++)this.nPlusOneDetector.delete(o[s][0]);}}normalizeQuery(e){return e.replace(/\s+/g," ").replace(/'[^']*'/g,"?").replace(/\b\d+\b/g,"?").trim().substring(0,300)}redactQuery(e){return e.replace(/'[^']*'/g,"'***'").replace(/\b\d{4,}\b/g,"***")}startFlushTimer(){this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval||1e4);}log(...e){this.config.debug&&console.log("[SitePong:DB]",...e);}};var G=class{constructor(e){this.profiles=[];this.activeProfile=null;this.frameStack=[];this.flushTimer=null;this.config={sampleRate:.1,maxDuration:3e4,flushInterval:3e4,...e},this.startFlushTimer();}async profile(e,t,n){if(Math.random()>(this.config.sampleRate||.1))return t();let i=this.generateId(),o=performance.now();this.activeProfile={id:i,name:e,startTime:o,duration_ms:0,frames:[],metadata:n},this.frameStack=[];let s={name:e,start_ms:0,duration_ms:0,children:[],metadata:n};this.frameStack.push(s);try{let a=await t();return s.duration_ms=performance.now()-o,this.activeProfile.duration_ms=s.duration_ms,this.activeProfile.frames=[s],s.duration_ms<=(this.config.maxDuration||3e4)&&this.profiles.push(this.activeProfile),this.activeProfile=null,this.frameStack=[],a}catch(a){throw s.duration_ms=performance.now()-o,s.metadata={...s.metadata,error:true},this.activeProfile&&(this.activeProfile.duration_ms=s.duration_ms,this.activeProfile.frames=[s],this.profiles.push(this.activeProfile)),this.activeProfile=null,this.frameStack=[],a}}startSpan(e,t){if(!this.activeProfile)return ()=>{};let n=performance.now()-this.activeProfile.startTime,i={name:e,start_ms:n,duration_ms:0,children:[],metadata:t},o=this.frameStack[this.frameStack.length-1];return o&&o.children.push(i),this.frameStack.push(i),()=>{i.duration_ms=performance.now()-this.activeProfile.startTime-i.start_ms,this.frameStack.pop();}}getProfiles(){return [...this.profiles]}getLatestProfile(){return this.profiles.length>0?this.profiles[this.profiles.length-1]:null}async flush(){if(this.profiles.length===0)return;let e=[...this.profiles];this.profiles=[];try{let t=await fetch(`${this.config.endpoint}/api/sdk/metrics`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({metrics:e.map(n=>({name:`profile.${n.name}`,value:n.duration_ms,type:"distribution",unit:"ms",tags:{profile_id:n.id,frame_count:String(Nt(n.frames)),...n.metadata||{}},timestamp:new Date(Date.now()-n.duration_ms).toISOString()}))})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.log(`Flushed ${e.length} profiles`);}catch(t){this.profiles.unshift(...e),this.log("Failed to flush profiles:",t);}}async destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush();}startFlushTimer(){this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval||3e4);}generateId(){return `prof_${Date.now().toString(36)}_${Math.random().toString(36).substring(2,8)}`}log(...e){this.config.debug&&console.log("[SitePong:Profiler]",...e);}};function Nt(r){let e=r.length;for(let t of r)e+=Nt(t.children);return e}var Ue={features:{},sampling:{errors:1,analytics:1,replay:1,performance:1},transport:{flushInterval:1e4,maxBatchSize:20,maxRetries:3},autocapture:{clicks:true,forms:true,pageviews:true,appState:true,screenViews:true},ttl:300};var Ot="sitepong_remote_config",Ht="sitepong_remote_config_ts",N=class{constructor(e){this.listeners=[];this.refreshTimer=null;this.initialized=false;this.options=e,this.config={...Ue};}async init(){await this.loadFromCache(),this.initialized=true,this.fetchAndApply().catch(e=>{this.log("Failed to fetch remote config:",e);});}getConfig(){return this.config}isFeatureEnabled(e,t=true){return this.config.features[e]??t}onChange(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e);}}isInitialized(){return this.initialized}destroy(){this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=null),this.listeners=[];}async loadFromCache(){let e=this.options.storage;if(e)try{let t=await e.getItem(Ot),n=await e.getItem(Ht);if(t&&n){let i=Date.now()-parseInt(n,10),o=this.config.ttl*1e3;if(i<o){let s=JSON.parse(t);this.config=s,this.log("Loaded config from cache (age:",Math.round(i/1e3),"s)");}}}catch{this.log("Failed to load cached config");}}async fetchAndApply(){try{let e=Pe(),t=new URLSearchParams({platform:e,...this.options.sdkVersion?{sdkVersion:this.options.sdkVersion}:{}}),n=await fetch(`${this.options.endpoint}/api/sdk/config?${t}`,{method:"GET",headers:{"X-API-Key":this.options.apiKey}});if(!n.ok)throw new Error(`HTTP ${n.status}`);let i=await n.json();this.config=i.config;for(let o of this.listeners)try{o(this.config);}catch{}await this.saveToCache(),this.scheduleRefresh(),i.config.minSdkVersion&&this.options.sdkVersion&&this.compareVersions(this.options.sdkVersion,i.config.minSdkVersion)<0&&console.warn(`[SitePong] SDK version ${this.options.sdkVersion} is outdated. Minimum recommended: ${i.config.minSdkVersion}. Please update.`),this.log("Remote config fetched successfully");}catch(e){throw this.scheduleRefresh(),e}}async saveToCache(){let e=this.options.storage;if(e)try{await e.setItem(Ot,JSON.stringify(this.config)),await e.setItem(Ht,String(Date.now()));}catch{this.log("Failed to cache remote config");}}scheduleRefresh(){this.refreshTimer&&clearTimeout(this.refreshTimer);let t=(typeof this.config.ttl=="number"&&this.config.ttl>0?this.config.ttl:300)*1e3;this.refreshTimer=setTimeout(()=>{this.fetchAndApply().catch(n=>{this.log("Refresh failed:",n);});},t);}compareVersions(e,t){let n=e.split(".").map(Number),i=t.split(".").map(Number);for(let o=0;o<3;o++){let s=n[o]||0,a=i[o]||0;if(s>a)return 1;if(s<a)return -1}return 0}log(...e){this.options.debug&&console.log("[SitePong RemoteConfig]",...e);}};function Ut(r){try{if(typeof crypto<"u"&&crypto.getRandomValues){let t=new Uint8Array(r);return crypto.getRandomValues(t),Array.from(t).map(n=>n.toString(16).padStart(2,"0")).join("")}}catch{}let e="";for(let t=0;t<r;t++)e+=Math.floor(Math.random()*256).toString(16).padStart(2,"0");return e}function Be(){return Ut(16)}function ge(){return Ut(8)}function $e(){return {traceId:Be(),spanId:ge(),parentSpanId:null,sampled:true}}function fe(r){let e=r.sampled?"01":"00";return {traceparent:`00-${r.traceId}-${r.spanId}-${e}`,tracestate:`sitepong=${r.spanId}`}}function Bt(r){let e=r.traceparent||r.Traceparent;if(!e)return null;let t=e.split("-");if(t.length!==4)return null;let[n,i,o,s]=t;if(n!=="00"||i.length!==32||!/^[0-9a-f]{32}$/.test(i)||o.length!==16||!/^[0-9a-f]{16}$/.test(o)||s.length!==2||!/^[0-9a-f]{2}$/.test(s))return null;let a=(parseInt(s,16)&1)===1;return {traceId:i,spanId:ge(),parentSpanId:o,sampled:a}}var he=class{constructor(e){this.originalFetch=null;this.targets=e;}shouldPropagate(e){return this.targets.some(t=>{if(t.includes("*")){let n=t.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${n}$`).test(e)}return e.startsWith(t)})}injectHeaders(e,t,n){if(!this.shouldPropagate(e))return t;let i=fe(n);return {...t,...i}}start(){if(typeof window>"u"||!window.fetch||this.originalFetch)return;this.originalFetch=window.fetch;let e=this;window.fetch=function(t,n){let i=typeof t=="string"?t:t instanceof URL?t.toString():t.url;if(e.shouldPropagate(i)){let o=$e(),s=fe(o),a={};if(n?.headers)if(n.headers instanceof Headers)n.headers.forEach((p,h)=>{a[h]=p;});else if(Array.isArray(n.headers))for(let[p,h]of n.headers)a[p]=h;else Object.assign(a,n.headers);let c={...a,...s},u={...n,headers:c};return e.originalFetch.call(window,t,u)}return e.originalFetch.call(window,t,n)};}stop(){typeof window>"u"||this.originalFetch&&(window.fetch=this.originalFetch,this.originalFetch=null);}};var ze="https://pongl.ink",X=class{constructor(e={}){this.config={endpoint:$t(e.endpoint||ze),appId:e.appId,installId:e.installId,debug:e.debug??false};}configure(e){e.endpoint&&(this.config.endpoint=$t(e.endpoint)),e.appId!==void 0&&(this.config.appId=e.appId),e.installId!==void 0&&(this.config.installId=e.installId),e.debug!==void 0&&(this.config.debug=e.debug);}log(...e){this.config.debug&&console.warn("[SuperLink]",...e);}async match(e){let t={...e,install_id:e.install_id??this.config.installId};try{let n=await fetch(`${this.config.endpoint}/match`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return n.ok?await n.json()??{matched:!1}:(this.log("match failed",n.status),{matched:!1})}catch(n){return this.log("match error",n),{matched:false}}}async reportEvent(e){try{let t=await fetch(`${this.config.endpoint}/events`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({app_id:this.config.appId,install_id:this.config.installId,...e})});return t.ok||this.log("event failed",e.type,t.status),t.ok}catch(t){return this.log("event error",t),false}}};function $t(r){return r.endsWith("/")?r.slice(0,-1):r}var T=new X;var cr=[["source","utm_source"],["medium","utm_medium"],["campaign","utm_campaign"],["term","utm_term"],["content","utm_content"]];function me(r){let e;try{e=new URL(r);}catch{return null}let t=e.searchParams,n={};for(let[c,u]of cr){let p=t.get(u);p&&(n[c]=p);}let i={},o={};return t.forEach((c,u)=>{u.startsWith("r_")?i[u.slice(2)]=c:u.startsWith("~")&&(o[u.slice(1)]=c);}),{deep_link_path:t.get("$deep_link_path")??t.get("dlp")??(e.pathname&&e.pathname!=="/"?e.pathname:null),deep_link_data:o,utm:n,referral:i,click_id:t.get("click_id"),match_type:"none",confidence:1}}var Ve=new Set,ve=null;function Ke(r){return {deep_link_path:r.deep_link_path??null,deep_link_data:r.deep_link_data??{},utm:r.utm??{},referral:r.referral??{},click_id:r.click_id??null,match_type:r.match_type??"fingerprint",confidence:r.confidence??(r.match_type&&r.match_type!=="none"?1:0)}}function We(r){ve=r;for(let e of Ve)try{e(r);}catch(t){T.config.debug&&console.warn("[SuperLink] handler threw",t);}}function zt(r){if(Ve.add(r),ve)try{r(ve);}catch{}return ()=>{Ve.delete(r);}}function Vt(){return ve}var Kt="sp_superlink",O=null,qe=false;function lr(){if(typeof sessionStorage>"u")return null;try{let r=sessionStorage.getItem(Kt);if(!r)return null;let e=JSON.parse(r);return e&&typeof e=="object"?e:null}catch{return null}}function ur(r){if(!(typeof sessionStorage>"u"))try{sessionStorage.setItem(Kt,JSON.stringify(r));}catch{}}function dr(r){return !!(r.deep_link_path||r.click_id||Object.keys(r.deep_link_data).length>0||Object.keys(r.referral).length>0||Object.keys(r.utm).length>0)}function Wt(r){if(typeof navigator>"u"||!navigator.clipboard)return;let e=`${T.config.endpoint}/c/${r}`;navigator.clipboard.writeText(e).catch(()=>{});}function qt(r){let e=r??(typeof window<"u"&&window.location?window.location.href:null);if(!e)return;let t;try{t=new URL(e);}catch{return}let n=t.searchParams.get("email"),i=t.searchParams.get("phone"),o=t.searchParams.get("user_id"),s=t.searchParams.get("id"),a=t.searchParams.get("custom"),c={};if(n&&(c.email=n),i&&(c.phone=i),o&&(c.user_id=o),s&&(c.id=s),a)try{let u=JSON.parse(decodeURIComponent(a));typeof u=="object"&&u!==null&&(c.custom=u);}catch{}return Object.keys(c).length>0?c:void 0}function Q(){if(qe)return O;qe=true;let r=lr();if(r)return O=r,O;if(typeof window>"u"||!window.location)return null;let e=me(window.location.href);return e&&dr(e)&&(O=e,ur(e),T.reportEvent({type:"opened",click_id:e.click_id,platform:"desktop",properties:{surface:"web"}})),O}function jt(){return qe?O:Q()}function Gt(){let r={platform:"desktop"};if(typeof navigator<"u"){navigator.userAgent&&(r.user_agent=navigator.userAgent);let e=navigator.language||navigator.languages&&navigator.languages[0];e&&(r.language=e);}return r}async function Xt(r){if(!r||Object.keys(r).length===0)return null;let e=await T.match({identity:r,fingerprint:Gt()});if(!e.matched)return null;let t=Ke(e);return We(t),t}async function Qt(r){if(!r)return null;let e=await T.match({qr_token:r,fingerprint:Gt()});if(!e.matched)return null;let t=Ke(e);return We(t),t}function pr(r={}){T.configure(r),Q();}function fr(){if(S())return;let r=globalThis,e=typeof r.window<"u"&&typeof r.document<"u",t=!e&&!!r.process?.versions?.node,n=e?"browser":"node";z({platform:n,storage:null,getDeviceInfo(){let o={platform:n};return r.navigator?.userAgent&&(o.userAgent=r.navigator.userAgent),e&&r.window?.screen&&(o.screenWidth=r.window.screen.width,o.screenHeight=r.window.screen.height),t&&r.process&&(o.osName=r.process.platform,o.osVersion=r.process.versions?.node),o},getCurrentUrl(){return r.window?.location?.href??void 0},getReferrer(){return r.document?.referrer||void 0},getUserAgent(){if(r.navigator?.userAgent)return r.navigator.userAgent;if(t&&r.process)return `SitePong-Node/${r.process.versions?.node} (${r.process.platform})`},onUncaughtError(o){if(e&&r.window?.addEventListener){let s=a=>o(a.error||a.message);return r.window.addEventListener("error",s),()=>r.window?.removeEventListener?.("error",s)}if(t&&r.process?.on&&r.process.off){let s=a=>o(a);return r.process.on("uncaughtException",s),()=>r.process?.off?.("uncaughtException",s)}return ()=>{}},onUnhandledRejection(o){if(e&&r.window?.addEventListener){let s=a=>o(a.reason);return r.window.addEventListener("unhandledrejection",s),()=>r.window?.removeEventListener?.("unhandledrejection",s)}if(t&&r.process?.on&&r.process.off){let s=a=>o(a);return r.process.on("unhandledRejection",s),()=>r.process?.off?.("unhandledRejection",s)}return ()=>{}},onBeforeTerminate(o){return e&&r.window?.addEventListener?(r.window.addEventListener("beforeunload",o),()=>r.window?.removeEventListener?.("beforeunload",o)):t&&r.process?.on&&r.process.off?(r.process.on("beforeExit",o),r.process.on("SIGINT",o),r.process.on("SIGTERM",o),()=>{r.process?.off?.("beforeExit",o),r.process?.off?.("SIGINT",o),r.process?.off?.("SIGTERM",o);}):()=>{}},onVisibilityHidden(o){if(r.document?.addEventListener){let s=()=>{r.document?.visibilityState==="hidden"&&o();};return r.document.addEventListener("visibilitychange",s),()=>r.document?.removeEventListener?.("visibilitychange",s)}return ()=>{}},sendBeacon(o,s){if(typeof r.navigator?.sendBeacon!="function")return false;try{return r.navigator.sendBeacon(o,new Blob([s],{type:"application/json"}))}catch{return false}}});}fr();var k={};function Yt(r){k={...k,...r};}var v="https://ingest.sitepong.com",hr=10,gr=5e3,je=3,Ge=class{constructor(){this.errorQueue=[];this.flushTimer=null;this.context={};this.initialized=false;this.flushFailures=0;this.disabled=false;this.flagManager=null;this.analyticsManager=null;this.fingerprintManager=null;this.replayManager=null;this.performanceManager=null;this.cronManager=null;this.metricsManager=null;this.databaseTracker=null;this.profiler=null;this.remoteConfigManager=null;this.watchtowerCapture=null;this.watchtowerOptions=void 0;this.envUnsubs=[];this.identifyHooks=[];this.config={apiKey:"",endpoint:v,environment:"production",release:"",autoCapture:true,maxBatchSize:hr,flushInterval:gr,debug:false};}init(e){if(!e.apiKey){console.error("[SitePong] API key is required");return}if(this.config={...this.config,...e},this.initialized=true,this.config.autoCapture&&this.setupAutoCapture(),this.startFlushTimer(),this.log("Initialized with endpoint:",this.config.endpoint),e.enableFlags&&(this.flagManager=new F({apiKey:e.apiKey,endpoint:e.flagsEndpoint||e.endpoint||v,debug:e.debug}),this.flagManager.init().catch(t=>{this.log("Failed to initialize flags:",t);})),e.analytics?.enabled&&(this.analyticsManager&&this.analyticsManager.destroy(),this.analyticsManager=new A({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,autocapturePageviews:e.analytics.autocapturePageviews,autocaptureClicks:e.analytics.autocaptureClicks,autocaptureForms:e.analytics.autocaptureForms,autocapture:e.analytics.autocapture,maxBatchSize:e.analytics.maxBatchSize,flushInterval:e.analytics.flushInterval,eventsEndpoint:e.analytics.eventsEndpoint,debug:e.debug}),this.analyticsManager.init()),e.fingerprint?.enabled&&k.createFingerprint?this.fingerprintManager=k.createFingerprint({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,extendedSignals:e.fingerprint.extendedSignals,visitorEndpoint:e.fingerprint.visitorEndpoint,debug:e.debug}):e.fingerprint?.enabled&&this.log("Fingerprint requested but not available on this platform (web only)."),e.performance?.enabled&&k.createPerformance?(this.performanceManager&&this.performanceManager.destroy(),this.performanceManager=k.createPerformance({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,webVitals:e.performance.webVitals,navigationTiming:e.performance.navigationTiming,resourceTiming:e.performance.resourceTiming,capturePageLoadTimings:e.performance.capturePageLoadTimings,capturePageRenderTimings:e.performance.capturePageRenderTimings,excludedResourceUrls:e.performance.excludedResourceUrls,resourceNameSanitizer:e.performance.resourceNameSanitizer,sampleRate:e.performance.sampleRate,flushInterval:e.performance.flushInterval,performanceEndpoint:e.performance.performanceEndpoint,debug:e.debug}),this.performanceManager.init()):e.performance?.enabled&&this.log("Performance requested but not available on this platform (web only)."),e.replay?.enabled&&k.createReplay?(this.replayManager&&this.replayManager.stop(),this.replayManager=k.createReplay({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,maskInputs:e.replay.maskInputs,blockSelector:e.replay.blockSelector,maskSelector:e.replay.maskSelector,sampleRate:e.replay.sampleRate,maxSessionDuration:e.replay.maxSessionDuration,flushInterval:e.replay.flushInterval,replayEndpoint:e.replay.replayEndpoint,recordNetwork:e.replay.recordNetwork,captureNetworkHeaders:e.replay.captureNetworkHeaders,recordConsole:e.replay.recordConsole,consoleLevels:e.replay.consoleLevels,bufferDuration:e.replay.bufferDuration,debug:e.debug}),this.replayManager.start()):e.replay?.enabled&&this.log("Replay requested but not available on this platform (web only)."),this.watchtowerOptions=e.watchtower,e.watchtower?.enabled&&k.createWatchtowerCapture?this.startWatchtowerCapture():e.watchtower?.enabled&&this.log("Watchtower capture requested but not available on this platform (web only)."),e.crons?.enabled&&(this.cronManager=new W({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug})),e.database?.enabled&&(this.databaseTracker=new j({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,slowQueryThreshold:e.database.slowQueryThreshold,redactParams:e.database.redactParams})),e.metrics?.enabled&&(this.metricsManager=new q({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,flushInterval:e.metrics.flushInterval,maxBatchSize:e.metrics.maxBatchSize})),e.profiling?.enabled&&(this.profiler=new G({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,sampleRate:e.profiling.sampleRate,maxDuration:e.profiling.maxDuration,flushInterval:e.profiling.flushInterval})),e.remoteConfig?.enabled!==false){let t=e._storageAdapter||_e();this.remoteConfigManager=new N({apiKey:e.apiKey,endpoint:e.endpoint||v,storage:t,debug:e.debug}),this.remoteConfigManager.init().catch(n=>{this.log("Failed to initialize remote config:",n);});}}initRN(e){if(!e.apiKey){console.error("[SitePong] API key is required");return}if(this.config={...this.config,...e},this.initialized=true,this.flushTimer&&clearInterval(this.flushTimer),this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval),this.log("Initialized (React Native) with endpoint:",this.config.endpoint),e.enableFlags&&(this.flagManager=new F({apiKey:e.apiKey,endpoint:e.flagsEndpoint||e.endpoint||v,debug:e.debug}),this.flagManager.init().catch(t=>{this.log("Failed to initialize flags:",t);})),e.analytics?.enabled&&(this.analyticsManager&&this.analyticsManager.destroy(),this.analyticsManager=new A({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,maxBatchSize:e.analytics.maxBatchSize,flushInterval:e.analytics.flushInterval,eventsEndpoint:e.analytics.eventsEndpoint,debug:e.debug}),this.analyticsManager.initHeadless()),e.crons?.enabled&&(this.cronManager=new W({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug})),e.metrics?.enabled&&(this.metricsManager=new q({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,flushInterval:e.metrics.flushInterval,maxBatchSize:e.metrics.maxBatchSize})),e.database?.enabled&&(this.databaseTracker=new j({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,slowQueryThreshold:e.database.slowQueryThreshold,redactParams:e.database.redactParams})),e.profiling?.enabled&&(this.profiler=new G({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,sampleRate:e.profiling.sampleRate,maxDuration:e.profiling.maxDuration,flushInterval:e.profiling.flushInterval})),e.remoteConfig?.enabled!==false){let t=e._storageAdapter||_e();this.remoteConfigManager=new N({apiKey:e.apiKey,endpoint:e.endpoint||v,storage:t,debug:e.debug}),this.remoteConfigManager.init().catch(n=>{this.log("Failed to initialize remote config:",n);});}}isInitialized(){return this.initialized}getFlag(e,t=false){return this.flagManager?this.flagManager.getFlag(e,t):(this.log("Flags not enabled. Set enableFlags: true in init()"),t)}getAllFlags(){return this.flagManager?this.flagManager.getAllFlags():{}}async waitForFlags(){this.flagManager&&await this.flagManager.waitForInit();}areFlagsReady(){return this.flagManager?.isInitialized()??false}getVariant(e,t=null){return this.flagManager?this.flagManager.getVariant(e,t):(this.log("Flags not enabled. Set enableFlags: true in init()"),t)}getVariantPayload(e,t=null){return this.flagManager?this.flagManager.getVariantPayload(e,t):t}async refreshFlags(){this.flagManager&&await this.flagManager.refresh();}track(e,t){if(!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.track(e,t);}trackPageView(e,t){if(!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.trackPageView(e,t);}identify(e,t){this.replayManager&&this.replayManager.setUser({id:e});for(let n of this.identifyHooks)try{n(e);}catch(i){this.log("identify hook failed:",i);}if(this.watchtowerCapture?.setDistinctId(e),!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.identify(e,t);}registerIdentifyHook(e){return this.identifyHooks.push(e),()=>{let t=this.identifyHooks.indexOf(e);t>=0&&this.identifyHooks.splice(t,1);}}group(e,t){if(!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.group(e,t);}resetAnalytics(){this.analyticsManager&&this.analyticsManager.reset();}async getVisitorId(){if(!this.fingerprintManager)throw new Error("Fingerprint not enabled. Set fingerprint.enabled: true in init()");return this.fingerprintManager.getVisitorId()}async getDeviceSignals(){if(!this.fingerprintManager)throw new Error("Fingerprint not enabled. Set fingerprint.enabled: true in init()");return this.fingerprintManager.getDeviceSignals()}async getFraudCheck(){if(!this.fingerprintManager)throw new Error("Fingerprint not enabled. Set fingerprint.enabled: true in init()");return this.fingerprintManager.getFraudCheck()}startReplay(){return this.replayManager?this.replayManager.start():(this.log("Replay not enabled. Set replay.enabled: true in init()"),false)}stopReplay(){this.replayManager&&this.replayManager.stop();}isReplayRecording(){return this.replayManager?.isRecording()??false}getReplaySessionId(){return this.replayManager?.getSessionId()??null}startWatchtowerCapture(e){if(!k.createWatchtowerCapture)return this.log("Watchtower capture not available on this platform (web only)."),false;if(!this.initialized||!this.config.apiKey)return this.log("Watchtower capture requires init() to be called first."),false;let t={...this.watchtowerOptions,...e};return t.projectId?(this.watchtowerCapture&&(this.watchtowerCapture.stop(),this.watchtowerCapture=null),this.watchtowerCapture=k.createWatchtowerCapture({apiKey:this.config.apiKey,projectId:t.projectId,endpoint:t.endpoint||this.config.endpoint||v,appVersion:this.config.release||void 0,maxBatchSize:t.maxBatchSize,flushInterval:t.flushInterval,blockSelector:t.blockSelector,maskSelector:t.maskSelector,debug:this.config.debug}),this.watchtowerCapture.start(this.analyticsManager?.getAutocaptureModule()??null),true):(this.log("Watchtower capture requires watchtower.projectId."),false)}stopWatchtowerCapture(){this.watchtowerCapture&&(this.watchtowerCapture.stop(),this.watchtowerCapture=null);}startTransaction(e,t){return this.performanceManager?this.performanceManager.startTransaction(e,t):(this.log("Performance not enabled. Set performance.enabled: true in init()"),"")}endTransaction(e,t="ok"){this.performanceManager&&this.performanceManager.endTransaction(e,t);}startSpan(e,t,n){return this.performanceManager?this.performanceManager.startSpan(e,t,n):""}endSpan(e,t,n="ok"){this.performanceManager&&this.performanceManager.endSpan(e,t,n);}getWebVitals(){return this.performanceManager?this.performanceManager.getVitals():{}}cronCheckin(e,t){return this.cronManager?this.cronManager.checkin(e,t):(this.log("Cron monitoring not enabled. Set crons.enabled: true in init()"),Promise.resolve())}cronStart(e,t){return this.cronManager?this.cronManager.start(e,t):(this.log("Cron monitoring not enabled. Set crons.enabled: true in init()"),{ok:()=>Promise.resolve(),error:()=>Promise.resolve()})}cronWrap(e,t,n){return this.cronManager?this.cronManager.wrap(e,t,n):t()}metricIncrement(e,t,n){if(!this.metricsManager){this.log("Metrics not enabled. Set metrics.enabled: true in init()");return}this.metricsManager.increment(e,t,n);}metricGauge(e,t,n){this.metricsManager&&this.metricsManager.gauge(e,t,n);}metricHistogram(e,t,n){this.metricsManager&&this.metricsManager.histogram(e,t,n);}metricDistribution(e,t,n){this.metricsManager&&this.metricsManager.distribution(e,t,n);}async metricTime(e,t,n){return this.metricsManager?this.metricsManager.time(e,t,n):t()}metricStartTimer(e,t){return this.metricsManager?this.metricsManager.startTimer(e,t):{stop:()=>{}}}async flushMetrics(){if(this.metricsManager)return this.metricsManager.flush()}async dbTrack(e,t,n){return this.databaseTracker?this.databaseTracker.track(e,t,n):t()}dbTrackSync(e,t,n){return this.databaseTracker?this.databaseTracker.trackSync(e,t,n):t()}getDbQueryCount(){return this.databaseTracker?this.databaseTracker.getQueryCount():0}resetDbQueryCount(){this.databaseTracker&&this.databaseTracker.resetQueryCount();}getDbNPlusOnePatterns(){return this.databaseTracker?this.databaseTracker.getNPlusOnePatterns():[]}async profile(e,t,n){return this.profiler?this.profiler.profile(e,t,n):t()}startProfileSpan(e,t){return this.profiler?this.profiler.startSpan(e,t):()=>{}}getProfiles(){return this.profiler?this.profiler.getProfiles():[]}getLatestProfile(){return this.profiler?this.profiler.getLatestProfile():null}async flushProfiles(){if(this.profiler)return this.profiler.flush()}getRemoteConfig(){return this.remoteConfigManager?.getConfig()??null}isRemoteConfigFeatureEnabled(e,t=true){return this.remoteConfigManager?.isFeatureEnabled(e,t)??t}onRemoteConfigChange(e){return this.remoteConfigManager?this.remoteConfigManager.onChange(e):()=>{}}setContext(e){this.context={...this.context,...e};}setUser(e){this.context.user=e,this.replayManager&&this.replayManager.setUser(e?{id:e.id}:null);}setTags(e){this.context.tags={...this.context.tags,...e};}clearUser(){this.context.user=void 0,this.replayManager&&this.replayManager.setUser(null),this.watchtowerCapture?.setDistinctId(null);}addBreadcrumb(e){this.log("Breadcrumb added:",e);}captureError(e,t){if(!this.initialized){console.warn("[SitePong] SDK not initialized. Call init() first.");return}let n=this.formatError(e,t);this.errorQueue.push(n),this.log("Captured error:",n.message),this.replayManager?.isRecording()&&this.replayManager.flushOnError().catch(i=>{this.log("Failed to flush replay on error:",i);}),this.errorQueue.length>=this.config.maxBatchSize&&this.flush();}captureMessage(e,t="info",n){if(!this.initialized){console.warn("[SitePong] SDK not initialized. Call init() first.");return}let i={message:e,type:t,timestamp:new Date().toISOString(),url:this.getUrl(),userAgent:this.getUserAgent(),environment:this.config.environment,release:this.config.release,context:{...this.context,...n},replaySessionId:this.replayManager?.isRecording()&&this.replayManager.getSessionId()||void 0};this.errorQueue.push(i),this.log("Captured message:",e),this.errorQueue.length>=this.config.maxBatchSize&&this.flush();}async flush(){if(this.errorQueue.length===0)return;if(this.disabled){this.errorQueue=[];return}let e=[...this.errorQueue];this.errorQueue=[];try{let t=await fetch(`${this.config.endpoint}/api/errors/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({errors:e})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.flushFailures=0,this.log(`Flushed ${e.length} errors`);}catch(t){if(this.flushFailures++,this.flushFailures>=je){this.disabled=true,console.warn(`[SitePong] SDK disabled after ${je} consecutive failures. Events will no longer be sent. This may be due to CORS issues or network problems. Check that ${this.config.endpoint} is accessible and has proper CORS headers.`);return}this.errorQueue.unshift(...e),this.log(`Failed to flush errors (attempt ${this.flushFailures}/${je}):`,t);}}formatError(e,t){let n=e instanceof Error,i=n?e.message:String(e),o=n?e.stack:new Error(i).stack,s=n?e.name:"Error";return {message:i,stack:o,type:s,timestamp:new Date().toISOString(),url:this.getUrl(),userAgent:this.getUserAgent(),environment:this.config.environment,release:this.config.release,context:{...this.context,...t},fingerprint:this.generateFingerprint(i,o,s),replaySessionId:this.replayManager?.isRecording()&&this.replayManager.getSessionId()||void 0}}generateFingerprint(e,t,n){let i=n||"Error",o=this.normalizeMessage(e),s=t?this.extractTopFrame(t):"",a=[i,o,s].join(`
1
+ var SitePong=(function(exports){'use strict';function Kn(){try{return typeof localStorage>"u"?null:{getItem:async r=>localStorage.getItem(r),setItem:async(r,e)=>{localStorage.setItem(r,e);},removeItem:async r=>{localStorage.removeItem(r);}}}catch{return null}}function St(){return {platform:"browser",storage:Kn(),getDeviceInfo(){let e={platform:"browser"};return typeof navigator<"u"&&(e.userAgent=navigator.userAgent),typeof window<"u"&&window.screen&&(e.screenWidth=window.screen.width,e.screenHeight=window.screen.height),e},getCurrentUrl(){if(!(typeof window>"u"||!window.location))return window.location.href},getReferrer(){if(!(typeof document>"u"))return document.referrer||void 0},getUserAgent(){if(!(typeof navigator>"u"))return navigator.userAgent},onUncaughtError(e){if(typeof window>"u"||!window.addEventListener)return ()=>{};let t=n=>{e(n.error||n.message);};return window.addEventListener("error",t),()=>window.removeEventListener("error",t)},onUnhandledRejection(e){if(typeof window>"u"||!window.addEventListener)return ()=>{};let t=n=>{e(n.reason);};return window.addEventListener("unhandledrejection",t),()=>window.removeEventListener("unhandledrejection",t)},onBeforeTerminate(e){return typeof window>"u"||!window.addEventListener?()=>{}:(window.addEventListener("beforeunload",e),()=>window.removeEventListener("beforeunload",e))},onVisibilityHidden(e){if(typeof document>"u"||!document.addEventListener)return ()=>{};let t=()=>{document.visibilityState==="hidden"&&e();};return document.addEventListener("visibilitychange",t),()=>document.removeEventListener("visibilitychange",t)},sendBeacon(e,t){if(typeof navigator>"u"||typeof navigator.sendBeacon!="function")return false;try{let n=new Blob([t],{type:"application/json"});return navigator.sendBeacon(e,n)}catch{return false}}}}var R=null;function z(r){R=r;}function S(){return R}function Pe(){if(R)return R.platform;let r=globalThis;return r.navigator&&r.navigator.product==="ReactNative"?"react-native":r.process&&r.process.versions&&r.process.versions.node?"node":r.window&&r.document?"browser":"unknown"}function _(){return Pe()==="react-native"}var Wn=null;function qn(){return R&&R.platform==="react-native"?R:null}function Le(r){let e=qn();e&&e._setGetCurrentScreen(r);}function ce(){return Wn}function _e(){return R?R.storage:null}var le="sitepong_anonymous_id";function De(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let e=Math.random()*16|0;return (r==="x"?e:e&3|8).toString(16)})}var I=null;function D(){if(typeof window<"u"&&typeof localStorage<"u")try{let r=localStorage.getItem(le);return r||(r=De(),localStorage.setItem(le,r)),r}catch{return I||(I=De()),I}return I||(I=De()),I}function Tt(){if(typeof window<"u"&&typeof localStorage<"u")try{localStorage.removeItem(le);}catch{}I=null;}function kt(r){if(typeof window<"u"&&typeof localStorage<"u")try{localStorage.setItem(le,r);}catch{I=r;}else I=r;}function xt(r){let e=r.toLowerCase();return /ipad/.test(e)||/android/.test(e)&&!/mobile/.test(e)||/tablet/.test(e)?"tablet":/mobile/.test(e)||/iphone/.test(e)||/ipod/.test(e)||/android/.test(e)||/blackberry/.test(e)||/windows phone/.test(e)?"mobile":"desktop"}function Et(r){let e=r.toLowerCase();return /edg/.test(e)?"edge":/opr|opera/.test(e)?"opera":/samsungbrowser/.test(e)?"samsung":/chrome|chromium|crios/.test(e)?"chrome":/safari/.test(e)&&!/chrome/.test(e)?"safari":/firefox|fxios/.test(e)?"firefox":/msie|trident/.test(e)?"ie":"other"}function Ct(r){let e=r.toLowerCase();return /iphone|ipad|ipod/.test(e)?"ios":/android/.test(e)?"android":/mac os|macos|macintosh/.test(e)?"macos":/windows/.test(e)?"windows":/linux/.test(e)?"linux":"other"}function Fe(){let r=S()?.getUserAgent()??"";return {anonymous_id:D(),device_type:r?xt(r):void 0,browser:r?Et(r):void 0,os:r?Ct(r):void 0,user_agent:r||void 0,timestamp:new Date}}function Mt(r){let e=5381;for(let t=0;t<r.length;t++)e=(e<<5)+e^r.charCodeAt(t);return e>>>0}function jn(r){return Math.random()*100<r.percentage}function Gn(r,e,t){let n=`${e.anonymous_id}:${t}`;return Mt(n)%100<r.percentage}function ue(r){let[e,t]=r.split(":").map(Number);return e*60+t}function Xn(r,e){let t=e.timestamp||new Date,i=new Intl.DateTimeFormat("en-US",{timeZone:r.timezone,weekday:"short",hour:"2-digit",minute:"2-digit",hour12:false}).formatToParts(t),o=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"].indexOf(i.find(u=>u.type==="weekday")?.value||""),s=parseInt(i.find(u=>u.type==="hour")?.value||"0",10),a=parseInt(i.find(u=>u.type==="minute")?.value||"0",10),c=s*60+a;if(r.days_of_week&&r.days_of_week.length>0&&!r.days_of_week.includes(o))return false;if(r.start_time&&r.end_time){let u=ue(r.start_time),p=ue(r.end_time);if(u>p){if(c<u&&c>=p)return false}else if(c<u||c>=p)return false}else if(r.start_time){let u=ue(r.start_time);if(c<u)return false}else if(r.end_time){let u=ue(r.end_time);if(c>=u)return false}return true}function Qn(r,e){return e.device_type?r.types.includes(e.device_type):false}function Yn(r,e){return e.browser?r.browsers.includes(e.browser):false}function Jn(r,e){return e.os?r.operating_systems.includes(e.os):false}function Zn(r,e,t,n){switch(r){case "percentage_rollout":return jn(e);case "userbase_percentage":return Gn(e,t,n);case "time_based":return Xn(e,t);case "device_type":return Qn(e,t);case "browser":return Yn(e,t);case "os":return Jn(e,t);default:return false}}function de(r,e){if(r.override==="force_on")return true;if(r.override==="force_off"||!r.enabled)return false;if(!r.rules||r.rules.length===0)return true;for(let t of r.rules)if(!Zn(t.rule_type,t.config,e,r.key))return false;return true}function Rt(r,e){if(!de(r,e)||r.flag_type!=="multivariate"||!r.variants||r.variants.length===0)return null;let t=`${e.anonymous_id}:${r.key}:variant`,n=Mt(t),i=r.variants.reduce((a,c)=>a+c.weight,0),o=n%i,s=0;for(let a of r.variants)if(s+=a.weight,o<s)return a.key;return r.variants[0].key}function It(r,e){return r.variant_payloads&&r.variant_payloads[e]!==void 0?r.variant_payloads[e]:r.variants?.find(n=>n.key===e)?.payload||null}var er="https://api.sitepong.com",F=class{constructor(e){this.flags=new Map;this.evaluatedFlags=new Map;this.evaluatedVariants=new Map;this.context=null;this.initialized=false;this.initPromise=null;this.config={endpoint:er,debug:false,...e};}async init(){if(!this.initialized){if(this.initPromise)return this.initPromise;this.initPromise=this.fetchAndEvaluateFlags();try{await this.initPromise,this.initialized=!0;}catch(e){this.log("Failed to initialize flags:",e),this.initialized=true;}finally{this.initPromise=null;}}}async fetchAndEvaluateFlags(){try{let e=await fetch(`${this.config.endpoint}/api/sdk/flags`,{method:"GET",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey}});if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);let t=await e.json();this.log("Fetched flags:",t.flags.length),this.context=Fe(),this.log("Evaluation context:",this.context),this.flags.clear(),this.evaluatedFlags.clear(),this.evaluatedVariants.clear();for(let n of t.flags){this.flags.set(n.key,n);let i=de(n,this.context);if(this.evaluatedFlags.set(n.key,i),n.flag_type==="multivariate"&&n.variants){let o=Rt(n,this.context);this.evaluatedVariants.set(n.key,o),this.log(`Flag "${n.key}": ${i}, variant: ${o}`);}else this.log(`Flag "${n.key}": ${i}`);}}catch(e){throw this.log("Error fetching flags:",e),e}}getFlag(e,t=false){if(!this.initialized)return this.log(`Flag "${e}" requested before init, returning default:`,t),t;let n=this.evaluatedFlags.get(e);return n===void 0?(this.log(`Flag "${e}" not found, returning default:`,t),t):n}getVariant(e,t=null){if(!this.initialized)return this.log(`Variant "${e}" requested before init, returning default:`,t),t;let n=this.evaluatedVariants.get(e);return n===void 0?(this.log(`Variant "${e}" not found, returning default:`,t),t):n}getVariantPayload(e,t=null){let n=this.getVariant(e);if(!n)return t;let i=this.flags.get(e);return i?It(i,n)??t:t}getAllFlags(){let e={};for(let[t,n]of this.evaluatedFlags)e[t]=n;return e}hasFlag(e){return this.flags.has(e)}isInitialized(){return this.initialized}async waitForInit(){this.initialized||await this.init();}async refresh(){this.initialized=false,await this.init();}getContext(){return this.context}log(...e){this.config.debug&&console.log("[SitePong Flags]",...e);}};var Ae="sitepong_session_id",pe="sitepong_session_ts";var V=null,K=null;function Lt(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let e=Math.random()*16|0;return (r==="x"?e:e&3|8).toString(16)})}function _t(r){return Date.now()-r>18e5}function Ne(){if(typeof window<"u"&&typeof sessionStorage<"u")try{let r=sessionStorage.getItem(Ae),e=sessionStorage.getItem(pe);if(r&&e&&!_t(parseInt(e,10)))return sessionStorage.setItem(pe,String(Date.now())),r;let t=Lt();return sessionStorage.setItem(Ae,t),sessionStorage.setItem(pe,String(Date.now())),t}catch{return Pt()}return Pt()}function Pt(){return V&&K&&!_t(K)?(K=Date.now(),V):(V=Lt(),K=Date.now(),V)}function Oe(){if(typeof window<"u"&&typeof sessionStorage<"u")try{sessionStorage.removeItem(Ae),sessionStorage.removeItem(pe);}catch{}V=null,K=null;}var Dt="sp_utm",tr=[["source","utm_source"],["medium","utm_medium"],["campaign","utm_campaign"],["term","utm_term"],["content","utm_content"]];function nr(){if(typeof window>"u"||!window.location||!window.location.search)return null;let r;try{r=new URLSearchParams(window.location.search);}catch{return null}let e={},t=false;for(let[n,i]of tr){let o=r.get(i);o&&(e[n]=o,t=true);}return t?e:null}function rr(){if(typeof sessionStorage>"u")return null;try{let r=sessionStorage.getItem(Dt);if(!r)return null;let e=JSON.parse(r);return e&&typeof e=="object"?e:null}catch{return null}}function ir(r){if(!(typeof sessionStorage>"u"))try{sessionStorage.setItem(Dt,JSON.stringify(r));}catch{}}function Ft(){let r=rr();if(r)return r;let e=nr();return e&&ir(e),e}var At=["[data-sp-no-capture]",".sp-no-capture"];var P=class{constructor(e,t){this.listeners=[];this.clickHandler=null;this.submitHandler=null;this.active=false;this.config={clicks:true,forms:true,pageviews:true,blockSelectors:At,maxTextLength:255,debug:false,...e},this.callback=t;}addListener(e){return this.listeners.push(e),()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1);}}emit(e){this.callback(e);for(let t of this.listeners)try{t(e);}catch{}}start(){this.active||typeof document>"u"||typeof document.addEventListener!="function"||(this.active=true,this.config.clicks&&this.setupClickCapture(),this.config.forms&&this.setupFormCapture(),this.log("Autocapture started"));}stop(){this.active&&(this.active=false,this.clickHandler&&(document.removeEventListener("click",this.clickHandler,true),this.clickHandler=null),this.submitHandler&&(document.removeEventListener("submit",this.submitHandler,true),this.submitHandler=null),this.log("Autocapture stopped"));}setupClickCapture(){this.clickHandler=e=>{let t=e.target;if(!t||!this.shouldCapture(t))return;let n=this.getElementProperties(t);n.$event_type="click",n.$x=e.clientX,n.$y=e.clientY,this.emit({type:"click",timestamp:new Date().toISOString(),properties:n});},document.addEventListener("click",this.clickHandler,true);}setupFormCapture(){this.submitHandler=e=>{let t=e.target;if(!t||!this.shouldCapture(t))return;let n={$event_type:"form_submit",$form_action:t.action||void 0,$form_method:t.method||"get",$form_name:t.name||t.id||void 0,$field_names:this.getFormFieldNames(t),$field_count:t.elements.length},i=this.getElementProperties(t);Object.assign(n,i),this.emit({type:"form_submit",timestamp:new Date().toISOString(),properties:n});},document.addEventListener("submit",this.submitHandler,true);}shouldCapture(e){let t=this.config.blockSelectors||At;for(let n of t)if(e.matches(n)||e.closest(n))return false;return !(this.config.allowSelectors&&this.config.allowSelectors.length>0&&!this.config.allowSelectors.some(i=>e.matches(i)||e.closest(i)!==null)||e.offsetParent===null&&e.tagName!=="BODY")}getElementProperties(e){let t={};t.$tag_name=e.tagName.toLowerCase(),t.$el_id=e.id||void 0,e.classList.length>0&&(t.$el_classes=Array.from(e.classList).slice(0,5));let n=this.getElementText(e);n&&(t.$el_text=n),e instanceof HTMLAnchorElement&&(t.$href=e.href||void 0,t.$target=e.target||void 0),(e instanceof HTMLInputElement||e instanceof HTMLButtonElement)&&(t.$el_type=e.type||void 0,t.$el_name=e.name||void 0);let i=e.getAttribute("aria-label");i&&(t.$aria_label=this.truncate(i));let o=e.getAttribute("role");return o&&(t.$el_role=o),t.$selector=this.getSelector(e),typeof window<"u"&&window.location&&(t.$current_url=window.location.href,t.$pathname=window.location.pathname),t}getElementText(e){if(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement)return;let t="";if(e instanceof HTMLButtonElement||e instanceof HTMLAnchorElement)t=e.innerText||e.textContent||"";else for(let n of Array.from(e.childNodes))n.nodeType===Node.TEXT_NODE&&(t+=n.textContent||"");return t=t.trim().replace(/\s+/g," "),t?this.truncate(t):void 0}getFormFieldNames(e){let t=[];for(let n of Array.from(e.elements)){let i=n;i.name&&i.type!=="password"&&i.type!=="hidden"&&t.push(i.name);}return t.slice(0,20)}getSelector(e){let t=[],n=e,i=0;for(;n&&n!==document.body&&i<5;){let o=n.tagName.toLowerCase();if(n.id){o=`#${n.id}`,t.unshift(o);break}n.classList.length>0&&(o+=`.${Array.from(n.classList).slice(0,2).join(".")}`);let s=n.parentElement;if(s){let a=Array.from(s.children).filter(c=>c.tagName===n.tagName);if(a.length>1){let c=a.indexOf(n)+1;o+=`:nth-of-type(${c})`;}}t.unshift(o),n=n.parentElement,i++;}return t.join(" > ")}truncate(e){let t=this.config.maxTextLength||255;return e.length>t?e.slice(0,t)+"...":e}log(...e){this.config.debug&&console.log("[SitePong Autocapture]",...e);}};var or="https://ingest.sitepong.com",sr=20,ar=1e4,He=3,A=class{constructor(e){this.eventQueue=[];this.flushTimer=null;this.flushFailures=0;this.disabled=false;this.userId=null;this.groupId=null;this.userTraits=null;this.groupTraits=null;this.lastUrl=null;this.popstateHandler=null;this.autocaptureModule=null;this.config={endpoint:or,enabled:true,autocapturePageviews:false,maxBatchSize:sr,flushInterval:ar,debug:false,...e};}init(){this.config.enabled&&(this.startFlushTimer(),this.setupPageHideListener(),this.config.autocapturePageviews&&this.setupSPATracking(),this.setupAutocapture(),this.log("Analytics initialized"));}initHeadless(){this.config.enabled&&(this.startFlushTimer(),this.log("Analytics initialized (headless)"));}setupAutocapture(){let e=this.config.autocapture,t=this.config.autocaptureClicks,n=this.config.autocaptureForms,i=t||false,o=n||false,s,a;e===true?(i=true,o=true):e&&typeof e=="object"&&(i=e.clicks!==false,o=e.forms!==false,s=e.blockSelectors,a=e.allowSelectors,e.pageviews!==false&&!this.config.autocapturePageviews&&this.setupSPATracking()),!(!i&&!o)&&(this.autocaptureModule=new P({clicks:i,forms:o,pageviews:false,blockSelectors:s,allowSelectors:a,debug:this.config.debug},c=>{let u=c.type==="click"?"$autocapture_click":c.type==="form_submit"?"$autocapture_form_submit":"$autocapture";this.track(u,c.properties);}),this.autocaptureModule.start());}getAutocaptureModule(){return this.autocaptureModule}track(e,t){if(!this.config.enabled)return;let n=this.createEvent("track",{name:e,properties:t});this.enqueue(n),this.log("Track:",e,t);}trackPageView(e,t){if(!this.config.enabled)return;let n=e||(typeof window<"u"&&window.location?window.location.href:void 0),i=this.createEvent("page",{properties:{url:n,referrer:typeof document<"u"?document.referrer:void 0,title:typeof document<"u"?document.title:void 0,...t}});this.enqueue(i),this.log("Page view:",n);}identify(e,t){if(!this.config.enabled)return;this.userId=e,t&&(this.userTraits={...this.userTraits,...t});let n=this.createEvent("identify",{traits:this.userTraits||void 0});this.enqueue(n),this.log("Identify:",e,t);}group(e,t){if(!this.config.enabled)return;this.groupId=e,t&&(this.groupTraits={...this.groupTraits,...t});let n=this.createEvent("group",{traits:this.groupTraits||void 0});this.enqueue(n),this.log("Group:",e,t);}reset(){this.userId=null,this.groupId=null,this.userTraits=null,this.groupTraits=null,Oe(),this.log("Analytics state reset");}async flush(){if(this.eventQueue.length===0)return;if(this.disabled){this.eventQueue=[];return}let e=[...this.eventQueue];this.eventQueue=[];let t=this.config.eventsEndpoint||`${this.config.endpoint}/api/events`;try{let n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({events:e})});if(!n.ok)throw new Error(`HTTP ${n.status}`);this.flushFailures=0,this.log(`Flushed ${e.length} events`);}catch(n){if(this.flushFailures++,this.flushFailures>=He){this.disabled=true,console.warn(`[SitePong Analytics] Disabled after ${He} consecutive failures. Check that ${t} is accessible and has proper CORS headers.`);return}this.eventQueue.unshift(...e),this.log(`Failed to flush events (attempt ${this.flushFailures}/${He}):`,n);}}destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.popstateHandler&&typeof window<"u"&&(window.removeEventListener("popstate",this.popstateHandler),this.popstateHandler=null),this.autocaptureModule&&(this.autocaptureModule.stop(),this.autocaptureModule=null),this.flushWithBeacon();}createEvent(e,t){return {type:e,name:t.name,properties:t.properties,userId:this.userId||void 0,anonymousId:D(),deviceId:void 0,groupId:this.groupId||void 0,traits:t.traits,sessionId:Ne(),timestamp:new Date().toISOString(),url:typeof window<"u"&&window.location?window.location.href:void 0,referrer:typeof document<"u"&&typeof document.referrer=="string"?document.referrer:void 0,userAgent:typeof navigator<"u"?navigator.userAgent:void 0,utm:Ft()||void 0,appVersion:this.config.appVersion||void 0}}enqueue(e){this.eventQueue.push(e),this.eventQueue.length>=this.config.maxBatchSize&&this.flush();}startFlushTimer(){this.flushTimer&&clearInterval(this.flushTimer),this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval);}setupPageHideListener(){typeof window>"u"||_()||typeof window.addEventListener!="function"||window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flushWithBeacon();});}flushWithBeacon(){if(this.eventQueue.length===0||_()||typeof navigator?.sendBeacon!="function")return;let e=[...this.eventQueue];this.eventQueue=[];let t=this.config.eventsEndpoint||`${this.config.endpoint}/api/events`,n=new Blob([JSON.stringify({events:e,apiKey:this.config.apiKey})],{type:"application/json"});navigator.sendBeacon(t,n),this.log(`Flushed ${e.length} events via beacon`);}setupSPATracking(){if(typeof window>"u"||_()||!window.location||typeof window.addEventListener!="function")return;this.lastUrl=window.location.href,this.trackPageView(),this.popstateHandler=()=>{if(!window.location)return;let n=window.location.href;n!==this.lastUrl&&(this.lastUrl=n,this.trackPageView(n));},window.addEventListener("popstate",this.popstateHandler);let e=history.pushState.bind(history),t=history.replaceState.bind(history);history.pushState=(...n)=>{e(...n),this.handleUrlChange();},history.replaceState=(...n)=>{t(...n),this.handleUrlChange();};}handleUrlChange(){if(typeof window>"u"||!window.location)return;let e=window.location.href;e!==this.lastUrl&&(this.lastUrl=e,this.trackPageView(e));}log(...e){this.config.debug&&console.log("[SitePong Analytics]",...e);}};var W=class{constructor(e){this.apiKey=e.apiKey,this.endpoint=e.endpoint,this.debug=e.debug||false;}async checkin(e,t={}){try{let n=await fetch(`${this.endpoint}/api/sdk/crons`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey},body:JSON.stringify({slug:e,status:t.status||"ok",duration_ms:t.duration_ms,message:t.message,environment:t.environment})});if(!n.ok)throw new Error(`HTTP ${n.status}`);this.log(`Check-in sent for "${e}" (${t.status||"ok"})`);}catch(n){this.log("Failed to send check-in:",n);}}start(e,t){let n=Date.now();return this.checkin(e,{status:"in_progress",environment:t}),{ok:async i=>{let o=Date.now()-n;await this.checkin(e,{status:"ok",duration_ms:o,message:i,environment:t});},error:async i=>{let o=Date.now()-n;await this.checkin(e,{status:"error",duration_ms:o,message:i,environment:t});}}}wrap(e,t,n){let i=this.start(e,n);return t().then(async o=>(await i.ok(),o),async o=>{throw await i.error(o?.message||String(o)),o})}log(...e){this.debug&&console.log("[SitePong:Cron]",...e);}};var q=class{constructor(e){this.queue=[];this.flushTimer=null;this.apiKey=e.apiKey,this.endpoint=e.endpoint,this.debug=e.debug||false,this.flushInterval=e.flushInterval||1e4,this.maxBatchSize=e.maxBatchSize||100,this.startFlushTimer();}increment(e,t=1,n){this.enqueue(e,t,"counter",n);}decrement(e,t=1,n){this.enqueue(e,-t,"counter",n);}gauge(e,t,n){this.enqueue(e,t,"gauge",n);}histogram(e,t,n){this.enqueue(e,t,"histogram",n);}distribution(e,t,n){this.enqueue(e,t,"distribution",n);}async time(e,t,n){let i=Date.now();try{let o=await t();return this.distribution(e,Date.now()-i,{...n,unit:n?.unit||"ms"}),o}catch(o){throw this.distribution(e,Date.now()-i,{...n,unit:n?.unit||"ms",tags:{...n?.tags,error:"true"}}),o}}startTimer(e,t){let n=Date.now();return {stop:()=>{this.distribution(e,Date.now()-n,{...t,unit:t?.unit||"ms"});}}}async flush(){if(this.queue.length===0)return;let e=[...this.queue];this.queue=[];try{let t=await fetch(`${this.endpoint}/api/sdk/metrics`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey},body:JSON.stringify({metrics:e})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.log(`Flushed ${e.length} metrics`);}catch(t){this.queue.unshift(...e),this.log("Failed to flush metrics:",t);}}async destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush();}enqueue(e,t,n,i){this.queue.push({name:e,value:t,type:n,unit:i?.unit,tags:i?.tags,timestamp:i?.timestamp||new Date().toISOString()}),this.queue.length>=this.maxBatchSize&&this.flush();}startFlushTimer(){this.flushTimer=setInterval(()=>{this.flush();},this.flushInterval);let e=S();e&&e.onVisibilityHidden(()=>this.flushWithBeacon());}flushWithBeacon(){if(this.queue.length===0)return;let e=S();if(!e||!e.sendBeacon)return;let t=[...this.queue];this.queue=[];let n=JSON.stringify({metrics:t,apiKey:this.apiKey});e.sendBeacon(`${this.endpoint}/api/sdk/metrics`,n)?this.log(`Flushed ${t.length} metrics via beacon`):this.queue.unshift(...t);}log(...e){this.debug&&console.log("[SitePong:Metrics]",...e);}};var j=class{constructor(e){this.queue=[];this.flushTimer=null;this.queryCounter=0;this.nPlusOneDetector=new Map;this.config={slowQueryThreshold:1e3,maxBatchSize:50,flushInterval:1e4,redactParams:true,...e},this.startFlushTimer();}async track(e,t,n){let i=Date.now();this.queryCounter++;try{let o=await t(),s=Date.now()-i;return this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,is_slow:s>=(this.config.slowQueryThreshold||1e3)}),this.detectNPlusOne(e),o}catch(o){let s=Date.now()-i;throw this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,error:o instanceof Error?o.message:String(o)}),o}}trackSync(e,t,n){let i=Date.now();this.queryCounter++;try{let o=t(),s=Date.now()-i;return this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,is_slow:s>=(this.config.slowQueryThreshold||1e3)}),o}catch(o){let s=Date.now()-i;throw this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,error:o instanceof Error?o.message:String(o)}),o}}getQueryCount(){return this.queryCounter}resetQueryCount(){this.queryCounter=0,this.nPlusOneDetector.clear();}getNPlusOnePatterns(){let e=[];for(let[t,{count:n}]of this.nPlusOneDetector.entries())n>=5&&e.push({query:t,count:n});return e}async flush(){if(this.queue.length===0)return;let e=[...this.queue];this.queue=[];try{let t=await fetch(`${this.config.endpoint}/api/sdk/metrics`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({metrics:e.map(n=>({name:"db.query",value:n.duration_ms,type:"distribution",unit:"ms",tags:{query:n.query.substring(0,200),source:n.source||"unknown",is_slow:String(n.is_slow||!1),...n.error?{error:"true"}:{}},timestamp:n.timestamp}))})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.log(`Flushed ${e.length} query events`);}catch(t){this.queue.unshift(...e),this.log("Failed to flush query events:",t);}}async destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush();}recordQuery(e){this.queue.push(e),this.queue.length>=(this.config.maxBatchSize||50)&&this.flush(),e.is_slow&&this.log(`Slow query (${e.duration_ms}ms):`,e.query.substring(0,100));}detectNPlusOne(e){let t=this.normalizeQuery(e),n=Date.now(),i=this.nPlusOneDetector.get(t);if(i?n-i.since<1e3?(i.count++,i.count===5&&this.log(`N+1 query detected! Pattern repeated ${i.count} times:`,t.substring(0,100))):this.nPlusOneDetector.set(t,{count:1,since:n}):this.nPlusOneDetector.set(t,{count:1,since:n}),this.nPlusOneDetector.size>100){let o=[...this.nPlusOneDetector.entries()];o.sort((s,a)=>s[1].since-a[1].since);for(let s=0;s<50;s++)this.nPlusOneDetector.delete(o[s][0]);}}normalizeQuery(e){return e.replace(/\s+/g," ").replace(/'[^']*'/g,"?").replace(/\b\d+\b/g,"?").trim().substring(0,300)}redactQuery(e){return e.replace(/'[^']*'/g,"'***'").replace(/\b\d{4,}\b/g,"***")}startFlushTimer(){this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval||1e4);}log(...e){this.config.debug&&console.log("[SitePong:DB]",...e);}};var G=class{constructor(e){this.profiles=[];this.activeProfile=null;this.frameStack=[];this.flushTimer=null;this.config={sampleRate:.1,maxDuration:3e4,flushInterval:3e4,...e},this.startFlushTimer();}async profile(e,t,n){if(Math.random()>(this.config.sampleRate||.1))return t();let i=this.generateId(),o=performance.now();this.activeProfile={id:i,name:e,startTime:o,duration_ms:0,frames:[],metadata:n},this.frameStack=[];let s={name:e,start_ms:0,duration_ms:0,children:[],metadata:n};this.frameStack.push(s);try{let a=await t();return s.duration_ms=performance.now()-o,this.activeProfile.duration_ms=s.duration_ms,this.activeProfile.frames=[s],s.duration_ms<=(this.config.maxDuration||3e4)&&this.profiles.push(this.activeProfile),this.activeProfile=null,this.frameStack=[],a}catch(a){throw s.duration_ms=performance.now()-o,s.metadata={...s.metadata,error:true},this.activeProfile&&(this.activeProfile.duration_ms=s.duration_ms,this.activeProfile.frames=[s],this.profiles.push(this.activeProfile)),this.activeProfile=null,this.frameStack=[],a}}startSpan(e,t){if(!this.activeProfile)return ()=>{};let n=performance.now()-this.activeProfile.startTime,i={name:e,start_ms:n,duration_ms:0,children:[],metadata:t},o=this.frameStack[this.frameStack.length-1];return o&&o.children.push(i),this.frameStack.push(i),()=>{i.duration_ms=performance.now()-this.activeProfile.startTime-i.start_ms,this.frameStack.pop();}}getProfiles(){return [...this.profiles]}getLatestProfile(){return this.profiles.length>0?this.profiles[this.profiles.length-1]:null}async flush(){if(this.profiles.length===0)return;let e=[...this.profiles];this.profiles=[];try{let t=await fetch(`${this.config.endpoint}/api/sdk/metrics`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({metrics:e.map(n=>({name:`profile.${n.name}`,value:n.duration_ms,type:"distribution",unit:"ms",tags:{profile_id:n.id,frame_count:String(Nt(n.frames)),...n.metadata||{}},timestamp:new Date(Date.now()-n.duration_ms).toISOString()}))})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.log(`Flushed ${e.length} profiles`);}catch(t){this.profiles.unshift(...e),this.log("Failed to flush profiles:",t);}}async destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush();}startFlushTimer(){this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval||3e4);}generateId(){return `prof_${Date.now().toString(36)}_${Math.random().toString(36).substring(2,8)}`}log(...e){this.config.debug&&console.log("[SitePong:Profiler]",...e);}};function Nt(r){let e=r.length;for(let t of r)e+=Nt(t.children);return e}var Ue={features:{},sampling:{errors:1,analytics:1,replay:1,performance:1},transport:{flushInterval:1e4,maxBatchSize:20,maxRetries:3},autocapture:{clicks:true,forms:true,pageviews:true,appState:true,screenViews:true},ttl:300};var Ot="sitepong_remote_config",Ht="sitepong_remote_config_ts",N=class{constructor(e){this.listeners=[];this.refreshTimer=null;this.initialized=false;this.options=e,this.config={...Ue};}async init(){await this.loadFromCache(),this.initialized=true,this.fetchAndApply().catch(e=>{this.log("Failed to fetch remote config:",e);});}getConfig(){return this.config}isFeatureEnabled(e,t=true){return this.config.features[e]??t}onChange(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e);}}isInitialized(){return this.initialized}destroy(){this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=null),this.listeners=[];}async loadFromCache(){let e=this.options.storage;if(e)try{let t=await e.getItem(Ot),n=await e.getItem(Ht);if(t&&n){let i=Date.now()-parseInt(n,10),o=this.config.ttl*1e3;if(i<o){let s=JSON.parse(t);this.config=s,this.log("Loaded config from cache (age:",Math.round(i/1e3),"s)");}}}catch{this.log("Failed to load cached config");}}async fetchAndApply(){try{let e=Pe(),t=new URLSearchParams({platform:e,...this.options.sdkVersion?{sdkVersion:this.options.sdkVersion}:{}}),n=await fetch(`${this.options.endpoint}/api/sdk/config?${t}`,{method:"GET",headers:{"X-API-Key":this.options.apiKey}});if(!n.ok)throw new Error(`HTTP ${n.status}`);let i=await n.json();this.config=i.config;for(let o of this.listeners)try{o(this.config);}catch{}await this.saveToCache(),this.scheduleRefresh(),i.config.minSdkVersion&&this.options.sdkVersion&&this.compareVersions(this.options.sdkVersion,i.config.minSdkVersion)<0&&console.warn(`[SitePong] SDK version ${this.options.sdkVersion} is outdated. Minimum recommended: ${i.config.minSdkVersion}. Please update.`),this.log("Remote config fetched successfully");}catch(e){throw this.scheduleRefresh(),e}}async saveToCache(){let e=this.options.storage;if(e)try{await e.setItem(Ot,JSON.stringify(this.config)),await e.setItem(Ht,String(Date.now()));}catch{this.log("Failed to cache remote config");}}scheduleRefresh(){this.refreshTimer&&clearTimeout(this.refreshTimer);let t=(typeof this.config.ttl=="number"&&this.config.ttl>0?this.config.ttl:300)*1e3;this.refreshTimer=setTimeout(()=>{this.fetchAndApply().catch(n=>{this.log("Refresh failed:",n);});},t);}compareVersions(e,t){let n=e.split(".").map(Number),i=t.split(".").map(Number);for(let o=0;o<3;o++){let s=n[o]||0,a=i[o]||0;if(s>a)return 1;if(s<a)return -1}return 0}log(...e){this.options.debug&&console.log("[SitePong RemoteConfig]",...e);}};function Ut(r){try{if(typeof crypto<"u"&&crypto.getRandomValues){let t=new Uint8Array(r);return crypto.getRandomValues(t),Array.from(t).map(n=>n.toString(16).padStart(2,"0")).join("")}}catch{}let e="";for(let t=0;t<r;t++)e+=Math.floor(Math.random()*256).toString(16).padStart(2,"0");return e}function Be(){return Ut(16)}function ge(){return Ut(8)}function $e(){return {traceId:Be(),spanId:ge(),parentSpanId:null,sampled:true}}function fe(r){let e=r.sampled?"01":"00";return {traceparent:`00-${r.traceId}-${r.spanId}-${e}`,tracestate:`sitepong=${r.spanId}`}}function Bt(r){let e=r.traceparent||r.Traceparent;if(!e)return null;let t=e.split("-");if(t.length!==4)return null;let[n,i,o,s]=t;if(n!=="00"||i.length!==32||!/^[0-9a-f]{32}$/.test(i)||o.length!==16||!/^[0-9a-f]{16}$/.test(o)||s.length!==2||!/^[0-9a-f]{2}$/.test(s))return null;let a=(parseInt(s,16)&1)===1;return {traceId:i,spanId:ge(),parentSpanId:o,sampled:a}}var he=class{constructor(e){this.originalFetch=null;this.targets=e;}shouldPropagate(e){return this.targets.some(t=>{if(t.includes("*")){let n=t.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${n}$`).test(e)}return e.startsWith(t)})}injectHeaders(e,t,n){if(!this.shouldPropagate(e))return t;let i=fe(n);return {...t,...i}}start(){if(typeof window>"u"||!window.fetch||this.originalFetch)return;this.originalFetch=window.fetch;let e=this;window.fetch=function(t,n){let i=typeof t=="string"?t:t instanceof URL?t.toString():t.url;if(e.shouldPropagate(i)){let o=$e(),s=fe(o),a={};if(n?.headers)if(n.headers instanceof Headers)n.headers.forEach((p,h)=>{a[h]=p;});else if(Array.isArray(n.headers))for(let[p,h]of n.headers)a[p]=h;else Object.assign(a,n.headers);let c={...a,...s},u={...n,headers:c};return e.originalFetch.call(window,t,u)}return e.originalFetch.call(window,t,n)};}stop(){typeof window>"u"||this.originalFetch&&(window.fetch=this.originalFetch,this.originalFetch=null);}};var ze="https://pongl.ink",X=class{constructor(e={}){this.config={endpoint:$t(e.endpoint||ze),appId:e.appId,installId:e.installId,debug:e.debug??false};}configure(e){e.endpoint&&(this.config.endpoint=$t(e.endpoint)),e.appId!==void 0&&(this.config.appId=e.appId),e.installId!==void 0&&(this.config.installId=e.installId),e.debug!==void 0&&(this.config.debug=e.debug);}log(...e){this.config.debug&&console.warn("[SuperLink]",...e);}async match(e){let t={...e,install_id:e.install_id??this.config.installId};try{let n=await fetch(`${this.config.endpoint}/match`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return n.ok?await n.json()??{matched:!1}:(this.log("match failed",n.status),{matched:!1})}catch(n){return this.log("match error",n),{matched:false}}}async reportEvent(e){try{let t=await fetch(`${this.config.endpoint}/events`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({app_id:this.config.appId,install_id:this.config.installId,...e})});return t.ok||this.log("event failed",e.type,t.status),t.ok}catch(t){return this.log("event error",t),false}}};function $t(r){return r.endsWith("/")?r.slice(0,-1):r}var T=new X;var cr=[["source","utm_source"],["medium","utm_medium"],["campaign","utm_campaign"],["term","utm_term"],["content","utm_content"]];function me(r){let e;try{e=new URL(r);}catch{return null}let t=e.searchParams,n={};for(let[c,u]of cr){let p=t.get(u);p&&(n[c]=p);}let i={},o={};return t.forEach((c,u)=>{u.startsWith("r_")?i[u.slice(2)]=c:u.startsWith("~")&&(o[u.slice(1)]=c);}),{deep_link_path:t.get("$deep_link_path")??t.get("dlp")??(e.pathname&&e.pathname!=="/"?e.pathname:null),deep_link_data:o,utm:n,referral:i,click_id:t.get("click_id"),match_type:"none",confidence:1}}var Ve=new Set,ve=null;function Ke(r){return {deep_link_path:r.deep_link_path??null,deep_link_data:r.deep_link_data??{},utm:r.utm??{},referral:r.referral??{},click_id:r.click_id??null,match_type:r.match_type??"fingerprint",confidence:r.confidence??(r.match_type&&r.match_type!=="none"?1:0)}}function We(r){ve=r;for(let e of Ve)try{e(r);}catch(t){T.config.debug&&console.warn("[SuperLink] handler threw",t);}}function zt(r){if(Ve.add(r),ve)try{r(ve);}catch{}return ()=>{Ve.delete(r);}}function Vt(){return ve}var Kt="sp_superlink",O=null,qe=false;function lr(){if(typeof sessionStorage>"u")return null;try{let r=sessionStorage.getItem(Kt);if(!r)return null;let e=JSON.parse(r);return e&&typeof e=="object"?e:null}catch{return null}}function ur(r){if(!(typeof sessionStorage>"u"))try{sessionStorage.setItem(Kt,JSON.stringify(r));}catch{}}function dr(r){return !!(r.deep_link_path||r.click_id||Object.keys(r.deep_link_data).length>0||Object.keys(r.referral).length>0||Object.keys(r.utm).length>0)}function Wt(r){if(typeof navigator>"u"||!navigator.clipboard)return;let e=`${T.config.endpoint}/c/${r}`;navigator.clipboard.writeText(e).catch(()=>{});}function qt(r){let e=r??(typeof window<"u"&&window.location?window.location.href:null);if(!e)return;let t;try{t=new URL(e);}catch{return}let n=t.searchParams.get("email"),i=t.searchParams.get("phone"),o=t.searchParams.get("user_id"),s=t.searchParams.get("id"),a=t.searchParams.get("custom"),c={};if(n&&(c.email=n),i&&(c.phone=i),o&&(c.user_id=o),s&&(c.id=s),a)try{let u=JSON.parse(decodeURIComponent(a));typeof u=="object"&&u!==null&&(c.custom=u);}catch{}return Object.keys(c).length>0?c:void 0}function Q(){if(qe)return O;qe=true;let r=lr();if(r)return O=r,O;if(typeof window>"u"||!window.location)return null;let e=me(window.location.href);return e&&dr(e)&&(O=e,ur(e),T.reportEvent({type:"opened",click_id:e.click_id,platform:"desktop",properties:{surface:"web"}})),O}function jt(){return qe?O:Q()}function Gt(){let r={platform:"desktop"};if(typeof navigator<"u"){navigator.userAgent&&(r.user_agent=navigator.userAgent);let e=navigator.language||navigator.languages&&navigator.languages[0];e&&(r.language=e);}return r}async function Xt(r){if(!r||Object.keys(r).length===0)return null;let e=await T.match({identity:r,fingerprint:Gt()});if(!e.matched)return null;let t=Ke(e);return We(t),t}async function Qt(r){if(!r)return null;let e=await T.match({qr_token:r,fingerprint:Gt()});if(!e.matched)return null;let t=Ke(e);return We(t),t}function pr(r={}){T.configure(r),Q();}function fr(){if(S())return;let r=globalThis,e=typeof r.window<"u"&&typeof r.document<"u",t=!e&&!!r.process?.versions?.node,n=e?"browser":"node";z({platform:n,storage:null,getDeviceInfo(){let o={platform:n};return r.navigator?.userAgent&&(o.userAgent=r.navigator.userAgent),e&&r.window?.screen&&(o.screenWidth=r.window.screen.width,o.screenHeight=r.window.screen.height),t&&r.process&&(o.osName=r.process.platform,o.osVersion=r.process.versions?.node),o},getCurrentUrl(){return r.window?.location?.href??void 0},getReferrer(){return r.document?.referrer||void 0},getUserAgent(){if(r.navigator?.userAgent)return r.navigator.userAgent;if(t&&r.process)return `SitePong-Node/${r.process.versions?.node} (${r.process.platform})`},onUncaughtError(o){if(e&&r.window?.addEventListener){let s=a=>o(a.error||a.message);return r.window.addEventListener("error",s),()=>r.window?.removeEventListener?.("error",s)}if(t&&r.process?.on&&r.process.off){let s=a=>o(a);return r.process.on("uncaughtException",s),()=>r.process?.off?.("uncaughtException",s)}return ()=>{}},onUnhandledRejection(o){if(e&&r.window?.addEventListener){let s=a=>o(a.reason);return r.window.addEventListener("unhandledrejection",s),()=>r.window?.removeEventListener?.("unhandledrejection",s)}if(t&&r.process?.on&&r.process.off){let s=a=>o(a);return r.process.on("unhandledRejection",s),()=>r.process?.off?.("unhandledRejection",s)}return ()=>{}},onBeforeTerminate(o){return e&&r.window?.addEventListener?(r.window.addEventListener("beforeunload",o),()=>r.window?.removeEventListener?.("beforeunload",o)):t&&r.process?.on&&r.process.off?(r.process.on("beforeExit",o),r.process.on("SIGINT",o),r.process.on("SIGTERM",o),()=>{r.process?.off?.("beforeExit",o),r.process?.off?.("SIGINT",o),r.process?.off?.("SIGTERM",o);}):()=>{}},onVisibilityHidden(o){if(r.document?.addEventListener){let s=()=>{r.document?.visibilityState==="hidden"&&o();};return r.document.addEventListener("visibilitychange",s),()=>r.document?.removeEventListener?.("visibilitychange",s)}return ()=>{}},sendBeacon(o,s){if(typeof r.navigator?.sendBeacon!="function")return false;try{return r.navigator.sendBeacon(o,new Blob([s],{type:"application/json"}))}catch{return false}}});}fr();var k={};function Yt(r){k={...k,...r};}var v="https://ingest.sitepong.com",hr=10,gr=5e3,je=3,Ge=class{constructor(){this.errorQueue=[];this.flushTimer=null;this.context={};this.initialized=false;this.flushFailures=0;this.disabled=false;this.flagManager=null;this.analyticsManager=null;this.fingerprintManager=null;this.replayManager=null;this.performanceManager=null;this.cronManager=null;this.metricsManager=null;this.databaseTracker=null;this.profiler=null;this.remoteConfigManager=null;this.watchtowerCapture=null;this.watchtowerOptions=void 0;this.envUnsubs=[];this.identifyHooks=[];this.config={apiKey:"",endpoint:v,environment:"production",release:"",autoCapture:true,maxBatchSize:hr,flushInterval:gr,debug:false};}init(e){if(!e.apiKey){console.error("[SitePong] API key is required");return}if(this.config={...this.config,...e},this.initialized=true,this.config.autoCapture&&this.setupAutoCapture(),this.startFlushTimer(),this.log("Initialized with endpoint:",this.config.endpoint),e.enableFlags&&(this.flagManager=new F({apiKey:e.apiKey,endpoint:e.flagsEndpoint||e.endpoint||v,debug:e.debug}),this.flagManager.init().catch(t=>{this.log("Failed to initialize flags:",t);})),e.analytics?.enabled&&(this.analyticsManager&&this.analyticsManager.destroy(),this.analyticsManager=new A({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,autocapturePageviews:e.analytics.autocapturePageviews,autocaptureClicks:e.analytics.autocaptureClicks,autocaptureForms:e.analytics.autocaptureForms,autocapture:e.analytics.autocapture,maxBatchSize:e.analytics.maxBatchSize,flushInterval:e.analytics.flushInterval,eventsEndpoint:e.analytics.eventsEndpoint,debug:e.debug}),this.analyticsManager.init()),e.fingerprint?.enabled&&k.createFingerprint?this.fingerprintManager=k.createFingerprint({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,extendedSignals:e.fingerprint.extendedSignals,visitorEndpoint:e.fingerprint.visitorEndpoint,debug:e.debug}):e.fingerprint?.enabled&&this.log("Fingerprint requested but not available on this platform (web only)."),e.performance?.enabled&&k.createPerformance?(this.performanceManager&&this.performanceManager.destroy(),this.performanceManager=k.createPerformance({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,webVitals:e.performance.webVitals,navigationTiming:e.performance.navigationTiming,resourceTiming:e.performance.resourceTiming,capturePageLoadTimings:e.performance.capturePageLoadTimings,capturePageRenderTimings:e.performance.capturePageRenderTimings,excludedResourceUrls:e.performance.excludedResourceUrls,resourceNameSanitizer:e.performance.resourceNameSanitizer,sampleRate:e.performance.sampleRate,flushInterval:e.performance.flushInterval,performanceEndpoint:e.performance.performanceEndpoint,debug:e.debug}),this.performanceManager.init()):e.performance?.enabled&&this.log("Performance requested but not available on this platform (web only)."),e.replay?.enabled&&k.createReplay?(this.replayManager&&this.replayManager.stop(),this.replayManager=k.createReplay({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,maskInputs:e.replay.maskInputs,blockSelector:e.replay.blockSelector,maskSelector:e.replay.maskSelector,sampleRate:e.replay.sampleRate,maxSessionDuration:e.replay.maxSessionDuration,flushInterval:e.replay.flushInterval,replayEndpoint:e.replay.replayEndpoint,recordNetwork:e.replay.recordNetwork,captureNetworkHeaders:e.replay.captureNetworkHeaders,recordConsole:e.replay.recordConsole,consoleLevels:e.replay.consoleLevels,bufferDuration:e.replay.bufferDuration,debug:e.debug}),this.replayManager.start()):e.replay?.enabled&&this.log("Replay requested but not available on this platform (web only)."),this.watchtowerOptions=e.watchtower,e.watchtower?.enabled&&k.createWatchtowerCapture?this.startWatchtowerCapture():e.watchtower?.enabled&&this.log("Watchtower capture requested but not available on this platform (web only)."),e.crons?.enabled&&(this.cronManager=new W({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug})),e.database?.enabled&&(this.databaseTracker=new j({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,slowQueryThreshold:e.database.slowQueryThreshold,redactParams:e.database.redactParams})),e.metrics?.enabled&&(this.metricsManager=new q({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,flushInterval:e.metrics.flushInterval,maxBatchSize:e.metrics.maxBatchSize})),e.profiling?.enabled&&(this.profiler=new G({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,sampleRate:e.profiling.sampleRate,maxDuration:e.profiling.maxDuration,flushInterval:e.profiling.flushInterval})),e.remoteConfig?.enabled!==false){let t=e._storageAdapter||_e();this.remoteConfigManager=new N({apiKey:e.apiKey,endpoint:e.endpoint||v,storage:t,debug:e.debug}),this.remoteConfigManager.init().catch(n=>{this.log("Failed to initialize remote config:",n);});}}initRN(e){if(!e.apiKey){console.error("[SitePong] API key is required");return}if(this.config={...this.config,...e},this.initialized=true,this.flushTimer&&clearInterval(this.flushTimer),this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval),this.log("Initialized (React Native) with endpoint:",this.config.endpoint),e.enableFlags&&(this.flagManager=new F({apiKey:e.apiKey,endpoint:e.flagsEndpoint||e.endpoint||v,debug:e.debug}),this.flagManager.init().catch(t=>{this.log("Failed to initialize flags:",t);})),e.analytics?.enabled&&(this.analyticsManager&&this.analyticsManager.destroy(),this.analyticsManager=new A({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,maxBatchSize:e.analytics.maxBatchSize,flushInterval:e.analytics.flushInterval,eventsEndpoint:e.analytics.eventsEndpoint,debug:e.debug}),this.analyticsManager.initHeadless()),e.crons?.enabled&&(this.cronManager=new W({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug})),e.metrics?.enabled&&(this.metricsManager=new q({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,flushInterval:e.metrics.flushInterval,maxBatchSize:e.metrics.maxBatchSize})),e.database?.enabled&&(this.databaseTracker=new j({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,slowQueryThreshold:e.database.slowQueryThreshold,redactParams:e.database.redactParams})),e.profiling?.enabled&&(this.profiler=new G({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,sampleRate:e.profiling.sampleRate,maxDuration:e.profiling.maxDuration,flushInterval:e.profiling.flushInterval})),e.remoteConfig?.enabled!==false){let t=e._storageAdapter||_e();this.remoteConfigManager=new N({apiKey:e.apiKey,endpoint:e.endpoint||v,storage:t,debug:e.debug}),this.remoteConfigManager.init().catch(n=>{this.log("Failed to initialize remote config:",n);});}}isInitialized(){return this.initialized}getFlag(e,t=false){return this.flagManager?this.flagManager.getFlag(e,t):(this.log("Flags not enabled. Set enableFlags: true in init()"),t)}getAllFlags(){return this.flagManager?this.flagManager.getAllFlags():{}}async waitForFlags(){this.flagManager&&await this.flagManager.waitForInit();}areFlagsReady(){return this.flagManager?.isInitialized()??false}getVariant(e,t=null){return this.flagManager?this.flagManager.getVariant(e,t):(this.log("Flags not enabled. Set enableFlags: true in init()"),t)}getVariantPayload(e,t=null){return this.flagManager?this.flagManager.getVariantPayload(e,t):t}async refreshFlags(){this.flagManager&&await this.flagManager.refresh();}track(e,t){if(!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.track(e,t);}trackPageView(e,t){if(!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.trackPageView(e,t);}identify(e,t){this.replayManager&&this.replayManager.setUser({id:e});for(let n of this.identifyHooks)try{n(e,t);}catch(i){this.log("identify hook failed:",i);}if(this.watchtowerCapture?.setDistinctId(e),!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.identify(e,t);}registerIdentifyHook(e){return this.identifyHooks.push(e),()=>{let t=this.identifyHooks.indexOf(e);t>=0&&this.identifyHooks.splice(t,1);}}group(e,t){if(!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.group(e,t);}resetAnalytics(){this.analyticsManager&&this.analyticsManager.reset();}async getVisitorId(){if(!this.fingerprintManager)throw new Error("Fingerprint not enabled. Set fingerprint.enabled: true in init()");return this.fingerprintManager.getVisitorId()}async getDeviceSignals(){if(!this.fingerprintManager)throw new Error("Fingerprint not enabled. Set fingerprint.enabled: true in init()");return this.fingerprintManager.getDeviceSignals()}async getFraudCheck(){if(!this.fingerprintManager)throw new Error("Fingerprint not enabled. Set fingerprint.enabled: true in init()");return this.fingerprintManager.getFraudCheck()}startReplay(){return this.replayManager?this.replayManager.start():(this.log("Replay not enabled. Set replay.enabled: true in init()"),false)}stopReplay(){this.replayManager&&this.replayManager.stop();}isReplayRecording(){return this.replayManager?.isRecording()??false}getReplaySessionId(){return this.replayManager?.getSessionId()??null}startWatchtowerCapture(e){if(!k.createWatchtowerCapture)return this.log("Watchtower capture not available on this platform (web only)."),false;if(!this.initialized||!this.config.apiKey)return this.log("Watchtower capture requires init() to be called first."),false;let t={...this.watchtowerOptions,...e};return t.projectId?(this.watchtowerCapture&&(this.watchtowerCapture.stop(),this.watchtowerCapture=null),this.watchtowerCapture=k.createWatchtowerCapture({apiKey:this.config.apiKey,projectId:t.projectId,endpoint:t.endpoint||this.config.endpoint||v,appVersion:this.config.release||void 0,maxBatchSize:t.maxBatchSize,flushInterval:t.flushInterval,blockSelector:t.blockSelector,maskSelector:t.maskSelector,debug:this.config.debug}),this.watchtowerCapture.start(this.analyticsManager?.getAutocaptureModule()??null),true):(this.log("Watchtower capture requires watchtower.projectId."),false)}stopWatchtowerCapture(){this.watchtowerCapture&&(this.watchtowerCapture.stop(),this.watchtowerCapture=null);}startTransaction(e,t){return this.performanceManager?this.performanceManager.startTransaction(e,t):(this.log("Performance not enabled. Set performance.enabled: true in init()"),"")}endTransaction(e,t="ok"){this.performanceManager&&this.performanceManager.endTransaction(e,t);}startSpan(e,t,n){return this.performanceManager?this.performanceManager.startSpan(e,t,n):""}endSpan(e,t,n="ok"){this.performanceManager&&this.performanceManager.endSpan(e,t,n);}getWebVitals(){return this.performanceManager?this.performanceManager.getVitals():{}}cronCheckin(e,t){return this.cronManager?this.cronManager.checkin(e,t):(this.log("Cron monitoring not enabled. Set crons.enabled: true in init()"),Promise.resolve())}cronStart(e,t){return this.cronManager?this.cronManager.start(e,t):(this.log("Cron monitoring not enabled. Set crons.enabled: true in init()"),{ok:()=>Promise.resolve(),error:()=>Promise.resolve()})}cronWrap(e,t,n){return this.cronManager?this.cronManager.wrap(e,t,n):t()}metricIncrement(e,t,n){if(!this.metricsManager){this.log("Metrics not enabled. Set metrics.enabled: true in init()");return}this.metricsManager.increment(e,t,n);}metricGauge(e,t,n){this.metricsManager&&this.metricsManager.gauge(e,t,n);}metricHistogram(e,t,n){this.metricsManager&&this.metricsManager.histogram(e,t,n);}metricDistribution(e,t,n){this.metricsManager&&this.metricsManager.distribution(e,t,n);}async metricTime(e,t,n){return this.metricsManager?this.metricsManager.time(e,t,n):t()}metricStartTimer(e,t){return this.metricsManager?this.metricsManager.startTimer(e,t):{stop:()=>{}}}async flushMetrics(){if(this.metricsManager)return this.metricsManager.flush()}async dbTrack(e,t,n){return this.databaseTracker?this.databaseTracker.track(e,t,n):t()}dbTrackSync(e,t,n){return this.databaseTracker?this.databaseTracker.trackSync(e,t,n):t()}getDbQueryCount(){return this.databaseTracker?this.databaseTracker.getQueryCount():0}resetDbQueryCount(){this.databaseTracker&&this.databaseTracker.resetQueryCount();}getDbNPlusOnePatterns(){return this.databaseTracker?this.databaseTracker.getNPlusOnePatterns():[]}async profile(e,t,n){return this.profiler?this.profiler.profile(e,t,n):t()}startProfileSpan(e,t){return this.profiler?this.profiler.startSpan(e,t):()=>{}}getProfiles(){return this.profiler?this.profiler.getProfiles():[]}getLatestProfile(){return this.profiler?this.profiler.getLatestProfile():null}async flushProfiles(){if(this.profiler)return this.profiler.flush()}getRemoteConfig(){return this.remoteConfigManager?.getConfig()??null}isRemoteConfigFeatureEnabled(e,t=true){return this.remoteConfigManager?.isFeatureEnabled(e,t)??t}onRemoteConfigChange(e){return this.remoteConfigManager?this.remoteConfigManager.onChange(e):()=>{}}setContext(e){this.context={...this.context,...e};}setUser(e){this.context.user=e,this.replayManager&&this.replayManager.setUser(e?{id:e.id}:null);}setTags(e){this.context.tags={...this.context.tags,...e};}clearUser(){this.context.user=void 0,this.replayManager&&this.replayManager.setUser(null),this.watchtowerCapture?.setDistinctId(null);}addBreadcrumb(e){this.log("Breadcrumb added:",e);}captureError(e,t){if(!this.initialized){console.warn("[SitePong] SDK not initialized. Call init() first.");return}let n=this.formatError(e,t);this.errorQueue.push(n),this.log("Captured error:",n.message),this.replayManager?.isRecording()&&this.replayManager.flushOnError().catch(i=>{this.log("Failed to flush replay on error:",i);}),this.errorQueue.length>=this.config.maxBatchSize&&this.flush();}captureMessage(e,t="info",n){if(!this.initialized){console.warn("[SitePong] SDK not initialized. Call init() first.");return}let i={message:e,type:t,timestamp:new Date().toISOString(),url:this.getUrl(),userAgent:this.getUserAgent(),environment:this.config.environment,release:this.config.release,context:{...this.context,...n},replaySessionId:this.replayManager?.isRecording()&&this.replayManager.getSessionId()||void 0};this.errorQueue.push(i),this.log("Captured message:",e),this.errorQueue.length>=this.config.maxBatchSize&&this.flush();}async flush(){if(this.errorQueue.length===0)return;if(this.disabled){this.errorQueue=[];return}let e=[...this.errorQueue];this.errorQueue=[];try{let t=await fetch(`${this.config.endpoint}/api/errors/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({errors:e})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.flushFailures=0,this.log(`Flushed ${e.length} errors`);}catch(t){if(this.flushFailures++,this.flushFailures>=je){this.disabled=true,console.warn(`[SitePong] SDK disabled after ${je} consecutive failures. Events will no longer be sent. This may be due to CORS issues or network problems. Check that ${this.config.endpoint} is accessible and has proper CORS headers.`);return}this.errorQueue.unshift(...e),this.log(`Failed to flush errors (attempt ${this.flushFailures}/${je}):`,t);}}formatError(e,t){let n=e instanceof Error,i=n?e.message:String(e),o=n?e.stack:new Error(i).stack,s=n?e.name:"Error";return {message:i,stack:o,type:s,timestamp:new Date().toISOString(),url:this.getUrl(),userAgent:this.getUserAgent(),environment:this.config.environment,release:this.config.release,context:{...this.context,...t},fingerprint:this.generateFingerprint(i,o,s),replaySessionId:this.replayManager?.isRecording()&&this.replayManager.getSessionId()||void 0}}generateFingerprint(e,t,n){let i=n||"Error",o=this.normalizeMessage(e),s=t?this.extractTopFrame(t):"",a=[i,o,s].join(`
2
2
  `),c=2166136261;for(let u=0;u<a.length;u++)c^=a.charCodeAt(u),c=Math.imul(c,16777619);return (c>>>0).toString(16).padStart(8,"0")}normalizeMessage(e){return e.replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,"<uuid>").replace(/\b0x[0-9a-f]{4,}\b/gi,"<hex>").replace(/\b[0-9a-f]{8,}\b/gi,"<hex>").replace(/https?:\/\/[^\s)"']+/g,"<url>").replace(/\b\d+(\.\d+)?\b/g,"<n>").replace(/\s+/g," ").trim()}extractTopFrame(e){let t=e.split(`
3
3
  `);for(let n=1;n<t.length;n++){let i=t[n].trim();if(i&&(i.startsWith("at ")||/^\w+@/.test(i)))return i.replace(/:\d+\)?\s*$/,")")}return ""}setupAutoCapture(){let e=S();e&&(this.envUnsubs.push(e.onUncaughtError(t=>{let n=t instanceof Error?t:new Error(String(t));this.captureError(n);})),this.envUnsubs.push(e.onUnhandledRejection(t=>{let n=t instanceof Error?t:new Error(String(t));this.captureError(n);})),this.log("Auto-capture enabled for",e.platform));}startFlushTimer(){this.flushTimer&&clearInterval(this.flushTimer),this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval);let e=S();e&&(this.envUnsubs.push(e.onBeforeTerminate(()=>this.flush())),this.envUnsubs.push(e.onVisibilityHidden(()=>this.flushWithBeacon())));}flushWithBeacon(){if(this.errorQueue.length===0)return;let e=S();if(!e||!e.sendBeacon)return;let t=[...this.errorQueue];this.errorQueue=[];let n=JSON.stringify({errors:t,apiKey:this.config.apiKey});e.sendBeacon(`${this.config.endpoint}/api/errors/batch`,n)?this.log(`Flushed ${t.length} errors via beacon`):this.errorQueue.unshift(...t);}setCurrentScreen(e){this.currentScreen=e,Le(()=>this.currentScreen);}getUrl(){let e=S();return e?e.getCurrentUrl()??this.currentScreen??void 0:this.currentScreen??void 0}getUserAgent(){let e=S();if(e)return e.getUserAgent()}log(...e){this.config.debug&&console.log("[SitePong]",...e);}},l=new Ge,zo=l.init.bind(l),Vo=l.initRN.bind(l),Ko=l.captureError.bind(l),Wo=l.captureMessage.bind(l),qo=l.setContext.bind(l),jo=l.setUser.bind(l),Go=l.setTags.bind(l),Xo=l.flush.bind(l),Qo=l.isInitialized.bind(l),Yo=l.clearUser.bind(l),Jo=l.addBreadcrumb.bind(l),Zo=l.setCurrentScreen.bind(l);var es=l.getFlag.bind(l),ts=l.getAllFlags.bind(l),ns=l.getVariant.bind(l),rs=l.getVariantPayload.bind(l),is=l.waitForFlags.bind(l),os=l.areFlagsReady.bind(l),ss=l.refreshFlags.bind(l),as=l.track.bind(l),cs=l.trackPageView.bind(l),ls=l.identify.bind(l),us=l.group.bind(l),ds=l.resetAnalytics.bind(l),ps=l.getVisitorId.bind(l),fs=l.getDeviceSignals.bind(l),hs=l.getFraudCheck.bind(l),gs=l.startReplay.bind(l),ms=l.stopReplay.bind(l),vs=l.startWatchtowerCapture.bind(l),ys=l.stopWatchtowerCapture.bind(l),bs=l.isReplayRecording.bind(l),ws=l.getReplaySessionId.bind(l),Ss=l.startTransaction.bind(l),Ts=l.endTransaction.bind(l),ks=l.startSpan.bind(l),xs=l.endSpan.bind(l),Es=l.getWebVitals.bind(l),Cs=l.dbTrack.bind(l),Ms=l.dbTrackSync.bind(l),Rs=l.getDbQueryCount.bind(l),Is=l.resetDbQueryCount.bind(l),Ps=l.getDbNPlusOnePatterns.bind(l),Ls=l.cronCheckin.bind(l),_s=l.cronStart.bind(l),Ds=l.cronWrap.bind(l),Fs=l.metricIncrement.bind(l),As=l.metricGauge.bind(l),Ns=l.metricHistogram.bind(l),Os=l.metricDistribution.bind(l),Hs=l.metricTime.bind(l),Us=l.metricStartTimer.bind(l),Bs=l.flushMetrics.bind(l),$s=l.profile.bind(l),zs=l.startProfileSpan.bind(l),Vs=l.getProfiles.bind(l),Ks=l.getLatestProfile.bind(l),Ws=l.flushProfiles.bind(l),qs=l.getRemoteConfig.bind(l),js=l.isRemoteConfigFeatureEnabled.bind(l),Gs=l.onRemoteConfigChange.bind(l),Xs=l.registerIdentifyHook.bind(l),mr=l;var en=0,Jt=new WeakMap;function Xe(){en=0;}function y(r){let e=Jt.get(r);return e===void 0&&(e=++en,Jt.set(r,e)),e}var tn=new Set(["script","noscript"]),vr=new Set(["src","href","action","poster"]),nn=["display","visibility","opacity","position","top","right","bottom","left","z-index","float","clear","width","height","min-width","min-height","max-width","max-height","margin-top","margin-right","margin-bottom","margin-left","padding-top","padding-right","padding-bottom","padding-left","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-style","border-right-style","border-bottom-style","border-left-style","border-top-color","border-right-color","border-bottom-color","border-left-color","border-radius","background-color","background-image","background-size","background-position","color","font-family","font-size","font-weight","font-style","line-height","letter-spacing","text-align","text-decoration","text-transform","overflow","overflow-x","overflow-y","flex-direction","flex-wrap","justify-content","align-items","align-self","flex-grow","flex-shrink","flex-basis","gap","grid-template-columns","grid-template-rows","transform","box-shadow","text-shadow","cursor","white-space","word-break","box-sizing"],Y=null,x=null;function yr(r){if(typeof document>"u")return {};Y||(Y=new Map);let e=Y.get(r);if(e)return e;try{x||(x=document.createElement("iframe"),x.style.cssText="position:fixed;top:-9999px;left:-9999px;width:0;height:0;border:none;visibility:hidden;",document.body.appendChild(x));let t=x.contentDocument;if(!t)return {};let n=t.createElement(r);t.body.appendChild(n);let i=t.defaultView.getComputedStyle(n),o={};for(let s of nn)o[s]=i.getPropertyValue(s);return t.body.removeChild(n),Y.set(r,o),o}catch{return {}}}function Qe(r){if(typeof window>"u")return null;try{let e=r.tagName.toLowerCase();if(tn.has(e)||e==="head"||e==="html"||e==="meta"||e==="link"||e==="title")return null;let t=window.getComputedStyle(r),n=yr(e),i=[];for(let o of nn){let s=t.getPropertyValue(o);s&&s!==n[o]&&i.push(`${o}:${s}`);}return i.length>0?i.join(";"):null}catch{return null}}var L=new Map;async function rn(r){if(L.has(r))return L.get(r)??null;try{let e=await fetch(r,{mode:"cors"});if(!e.ok)return L.set(r,null),null;let t=await e.text(),n=ye(t,r);return L.set(r,n),n}catch{return L.set(r,null),null}}function br(r){return L.get(r)??null}function on(){x&&x.parentNode&&x.parentNode.removeChild(x),x=null,Y=null,L.clear();}function sn(r,e){if(!r||r.startsWith("data:")||r.startsWith("blob:")||r.startsWith("#"))return r;try{return new URL(r,e).href}catch{return r}}function ye(r,e){return r.replace(/url\(\s*(['"]?)([^'")]+)\1\s*\)/g,(t,n,i)=>{let o=i.trim();if(o.startsWith("data:")||o.startsWith("blob:")||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("//"))return `url(${n}${o}${n})`;try{let s=new URL(o,e).href;return `url(${n}${s}${n})`}catch{return `url(${n}${o}${n})`}})}function Zt(r){try{let e=r.cssRules,t="";for(let n=0;n<e.length;n++)t+=e[n].cssText+`
4
4
  `;return t}catch{return null}}function be(r){let e=r.tagName.toLowerCase(),t=location.href;if(e==="style"){let n=r;if(n.sheet){let o=Zt(n.sheet);if(o!==null)return ye(o,t)}let i=r.textContent||"";return i?ye(i,t):null}if(e==="link"){let n=r;if(n.rel!=="stylesheet")return null;let i=n.href||t;if(n.sheet){let o=Zt(n.sheet);if(o!==null)return ye(o,i)}if(n.href){let o=br(n.href);if(o)return o}return null}return null}function wr(r,e){return r.split(",").map(t=>{let n=t.trim().split(/\s+/);return n[0]&&(n[0]=sn(n[0],e)),n.join(" ")}).join(", ")}function H(r,e,t=false){let n=y(r);if(r.nodeType===Node.TEXT_NODE){let i=r.parentElement,o=r.textContent||"";return i&&e.maskSelector&&i.matches(e.maskSelector)&&(o=o.replace(/\S/g,"*")),{id:n,type:"text",textContent:o}}if(r.nodeType===Node.COMMENT_NODE)return {id:n,type:"comment",textContent:""};if(r.nodeType===Node.ELEMENT_NODE){let i=r,o=i;if(e.blockSelector&&i.matches(e.blockSelector))return {id:n,type:"element",tagName:"div",attributes:{"data-blocked":"true",style:`width:${o.offsetWidth}px;height:${o.offsetHeight}px;background:#f0f0f0;`}};let s=i.tagName.toLowerCase();if(tn.has(s))return null;let a=t||s==="svg"||i instanceof SVGElement,c={},u=location.href;for(let d=0;d<i.attributes.length;d++){let f=i.attributes[d],g=f.name,m=f.value;g.startsWith("on")||m&&m.toLowerCase().startsWith("javascript:")||(vr.has(g)&&(m=sn(m,u)),g==="srcset"&&(m=wr(m,u)),c[g]=m);}if(s==="style"||s==="link"&&i.getAttribute("rel")==="stylesheet"){let d=be(i);d&&(c._cssText=d);}if(!a&&s!=="style"&&s!=="link"){let d=Qe(i);d&&(c._computedStyle=d);}if(s==="input"){let d=i,f=(d.type||"").toLowerCase();if(f==="checkbox"||f==="radio")c._checked=String(d.checked);else {let g=e.maskInputs?"***":d.value;g&&(c._value=g);}}else if(s==="textarea"){let d=i,f=e.maskInputs?"***":d.value;f&&(c._value=f);}else if(s==="select"){let d=i;c._selectedIndex=String(d.selectedIndex);}if(s==="canvas")try{let f=i.toDataURL("image/webp",.4);f&&f!=="data:,"&&(c._canvasDataUrl=f);}catch{}e.maskSelector&&i.matches(e.maskSelector);let p=[];for(let d of Array.from(i.childNodes)){let f=H(d,e,a);f&&p.push(f);}let h={id:n,type:"element",tagName:s,attributes:Object.keys(c).length>0?c:void 0,children:p.length>0?p:void 0};return a&&(h.isSVG=true),h}return null}function we(r){if(typeof document>"u")return null;Xe();let e=H(document.documentElement,r);return e?{_version:2,doctype:document.doctype?`<!DOCTYPE ${document.doctype.name}>`:void 0,html:e,width:window.innerWidth,height:window.innerHeight}:null}var Se=["authorization","cookie","set-cookie","x-api-key","x-auth-token"],J=class{constructor(e,t){this.originalFetch=null;this.originalXhrOpen=null;this.originalXhrSend=null;this.active=false;this.callback=e,this.captureHeaders=t?.captureHeaders??false,this.urlFilter=t?.urlFilter;}start(){this.active||typeof window>"u"||(this.active=true,this.interceptFetch(),this.interceptXHR());}stop(){this.active&&(this.active=false,this.originalFetch&&(window.fetch=this.originalFetch,this.originalFetch=null),this.originalXhrOpen&&(XMLHttpRequest.prototype.open=this.originalXhrOpen,this.originalXhrOpen=null),this.originalXhrSend&&(XMLHttpRequest.prototype.send=this.originalXhrSend,this.originalXhrSend=null));}interceptFetch(){if(typeof window.fetch!="function")return;this.originalFetch=window.fetch;let e=this;window.fetch=async function(t,n){let i=typeof t=="string"?t:t instanceof URL?t.toString():t.url;if(e.urlFilter&&!e.urlFilter(i))return e.originalFetch.call(window,t,n);let o=Date.now(),s=n?.method||(t instanceof Request?t.method:"GET"),a;n?.body&&(typeof n.body=="string"?a=n.body.length:n.body instanceof Blob&&(a=n.body.size));try{let c=await e.originalFetch.call(window,t,n),u=Date.now()-o,p={method:s.toUpperCase(),url:e.truncateUrl(i),status:c.status,statusText:c.statusText,duration:u,requestSize:a,initiator:"fetch"};return e.captureHeaders&&(p.requestHeaders=e.safeHeaders(n?.headers),p.responseHeaders=e.headersToObject(c.headers)),e.emit(p),c}catch(c){let u=Date.now()-o;throw e.emit({method:s.toUpperCase(),url:e.truncateUrl(i),duration:u,requestSize:a,error:c instanceof Error?c.message:"Network error",initiator:"fetch"}),c}};}interceptXHR(){if(typeof XMLHttpRequest>"u")return;this.originalXhrOpen=XMLHttpRequest.prototype.open,this.originalXhrSend=XMLHttpRequest.prototype.send;let e=this;XMLHttpRequest.prototype.open=function(t,n,...i){return this._spMethod=t,this._spUrl=typeof n=="string"?n:n.toString(),e.originalXhrOpen.apply(this,[t,n,...i])},XMLHttpRequest.prototype.send=function(t){let n=this,i=n._spUrl;if(e.urlFilter&&!e.urlFilter(i))return e.originalXhrSend.call(this,t);let o=Date.now(),s;typeof t=="string"&&(s=t.length);let a=()=>{let c=Date.now()-o,u;try{n.responseType===""||n.responseType==="text"?u=n.responseText?.length:n.responseType==="json"&&n.response!=null?u=JSON.stringify(n.response).length:n.responseType==="arraybuffer"&&n.response?u=n.response.byteLength:n.responseType==="blob"&&n.response&&(u=n.response.size);}catch{}let p={method:(n._spMethod||"GET").toUpperCase(),url:e.truncateUrl(i),status:n.status,statusText:n.statusText,duration:c,requestSize:s,responseSize:u,initiator:"xhr"};n.status===0&&(p.error="Network error"),e.emit(p),n.removeEventListener("loadend",a);};return n.addEventListener("loadend",a),e.originalXhrSend.call(this,t)};}emit(e){this.active&&this.callback({type:"network",timestamp:Date.now(),data:e});}truncateUrl(e){try{let t=new URL(e,window.location.origin),n=t.pathname+t.search;return n.length>500?n.slice(0,500)+"...":t.origin+n}catch{return e.length>500?e.slice(0,500)+"...":e}}safeHeaders(e){if(!e)return;let t={};if(e instanceof Headers)e.forEach((n,i)=>{t[i]=Se.includes(i.toLowerCase())?"[REDACTED]":n;});else if(Array.isArray(e))for(let[n,i]of e)t[n]=Se.includes(n.toLowerCase())?"[REDACTED]":i;else for(let[n,i]of Object.entries(e))t[n]=Se.includes(n.toLowerCase())?"[REDACTED]":i;return t}headersToObject(e){let t={};return e.forEach((n,i)=>{t[i]=Se.includes(i.toLowerCase())?"[REDACTED]":n;}),t}};var Z=class{constructor(e,t){this.originals={};this.active=false;this.callback=e,this.levels=t?.levels||["log","info","warn","error","debug"];}start(){if(!(this.active||typeof console>"u")){this.active=true;for(let e of this.levels)this.originals[e]=console[e].bind(console),console[e]=(...t)=>{this.originals[e](...t),this.record(e,t);};}}stop(){if(this.active){this.active=false;for(let e of this.levels)this.originals[e]&&(console[e]=this.originals[e]);this.originals={};}}record(e,t){if(!this.active||t.length>0&&typeof t[0]=="string"&&t[0].startsWith("[SitePong"))return;let n=t.slice(0,10).map(o=>this.serialize(o)),i={level:e,args:n};if(e==="error"){let o=this.getStackTrace();o&&(i.trace=o.slice(0,2e3));}this.callback({type:"console",timestamp:Date.now(),data:i});}serialize(e){if(e===null)return "null";if(e===void 0)return "undefined";if(e instanceof Error)return `Error: ${e.message}${e.stack?`