Files
zCode-CLI-X/~/.npm-cache/@growthbook/growthbook@1.6.5@@@1/dist/bundles/esm.min.js
admin 875c7f9b91 feat: Complete zCode CLI X with Telegram bot integration
- Add full Telegram bot functionality with Z.AI API integration
- Implement 4 tools: Bash, FileEdit, WebSearch, Git
- Add 3 agents: Code Reviewer, Architect, DevOps Engineer
- Add 6 skills for common coding tasks
- Add systemd service file for 24/7 operation
- Add nginx configuration for HTTPS webhook
- Add comprehensive documentation
- Implement WebSocket server for real-time updates
- Add logging system with Winston
- Add environment validation

🤖 zCode CLI X - Agentic coder with Z.AI + Telegram integration
2026-05-05 09:01:26 +00:00

3 lines
47 KiB
JavaScript

const t={fetch:globalThis.fetch?globalThis.fetch.bind(globalThis):void 0,SubtleCrypto:globalThis.crypto?globalThis.crypto.subtle:void 0,EventSource:globalThis.EventSource};function e(){return t}function n(t){let e=2166136261;const n=t.length;for(let i=0;i<n;i++)e^=t.charCodeAt(i),e+=(e<<1)+(e<<4)+(e<<7)+(e<<8)+(e<<24);return e>>>0}function i(t,e,i){return 2===i?n(n(t+e)+"")%1e4/1e4:1===i?n(e+t)%1e3/1e3:null}function r(t,e){return t>=e[0]&&t<e[1]}function s(t){try{const e=t.replace(/([^\\])\//g,"$1\\/");return new RegExp(e)}catch(t){return void console.error(t)}}function o(t,e){if(!e.length)return!1;let n=!1,i=!1;for(let r=0;r<e.length;r++){const s=u(t,e[r].type,e[r].pattern);if(!1===e[r].include){if(s)return!1}else n=!0,s&&(i=!0)}return i||!n}function u(t,e,n){try{const i=new URL(t,"https://_");if("regex"===e){const t=s(n);return!!t&&(t.test(i.href)||t.test(i.href.substring(i.origin.length)))}return"simple"===e&&function(t,e){try{const n=new URL(e.replace(/^([^:/?]*)\./i,"https://$1.").replace(/\*/g,"_____"),"https://_____"),i=[[t.host,n.host,!1],[t.pathname,n.pathname,!0]];return n.hash&&i.push([t.hash,n.hash,!1]),n.searchParams.forEach(((e,n)=>{i.push([t.searchParams.get(n)||"",e,!1])})),!i.some((t=>!function(t,e,n){try{let i=e.replace(/[*.+?^${}()|[\]\\]/g,"\\$&").replace(/_____/g,".*");return n&&(i="\\/?"+i.replace(/(^\/|\/$)/g,"")+"\\/?"),new RegExp("^"+i+"$","i").test(t)}catch(t){return!1}}(t[0],t[1],t[2])))}catch(t){return!1}}(i,n)}catch(t){return!1}}const a=t=>Uint8Array.from(atob(t),(t=>t.charCodeAt(0)));async function c(e,n,i){if(n=n||"",!(i=i||globalThis.crypto&&globalThis.crypto.subtle||t.SubtleCrypto))throw new Error("No SubtleCrypto implementation found");try{const t=await i.importKey("raw",a(n),{name:"AES-CBC",length:128},!0,["encrypt","decrypt"]),[r,s]=e.split("."),o=await i.decrypt({name:"AES-CBC",iv:a(r)},t,a(s));return(new TextDecoder).decode(o)}catch(t){throw new Error("Failed to decrypt")}}function h(t){return"string"==typeof t?t:JSON.stringify(t)}function l(t){"number"==typeof t&&(t+=""),t&&"string"==typeof t||(t="0");const e=t.replace(/(^v|\+.*$)/g,"").split(/[-.]/);return 3===e.length&&e.push("~"),e.map((t=>t.match(/^[0-9]+$/)?t.padStart(5," "):t)).join("-")}function f(){let t;try{t="1.6.5"}catch(e){t=""}return t}function d(t){return"object"==typeof t&&null!==t}function y(t){return t.urlPatterns&&t.variations.some((t=>d(t)&&"urlRedirect"in t))?"redirect":t.variations.some((t=>d(t)&&(t.domMutations||"js"in t||"css"in t)))?"visual":"unknown"}async function g(t,e){return new Promise((n=>{let i,r=!1;const s=t=>{r||(r=!0,i&&clearTimeout(i),n(t||null))};e&&(i=setTimeout((()=>s()),e)),t.then((t=>s(t))).catch((()=>s()))}))}const p={staleTTL:6e4,maxAge:144e5,cacheKey:"gbFeaturesCache",backgroundSync:!0,maxEntries:10,disableIdleStreams:!1,idleStreamInterval:2e4,disableCache:!1},w=e(),v={fetchFeaturesCall:({host:t,clientKey:e,headers:n})=>w.fetch(`${t}/api/features/${e}`,{headers:n}),fetchRemoteEvalCall:({host:t,clientKey:e,payload:n,headers:i})=>{const r={method:"POST",headers:{"Content-Type":"application/json",...i},body:JSON.stringify(n)};return w.fetch(`${t}/api/eval/${e}`,r)},eventSourceCall:({host:t,clientKey:e,headers:n})=>n?new w.EventSource(`${t}/sub/${e}`,{headers:n}):new w.EventSource(`${t}/sub/${e}`),startIdleListener:()=>{let t;if("undefined"==typeof window||"undefined"==typeof document)return;const e=()=>{"visible"===document.visibilityState?(window.clearTimeout(t),V()):"hidden"===document.visibilityState&&(t=window.setTimeout(F,p.idleStreamInterval))};return document.addEventListener("visibilitychange",e),()=>document.removeEventListener("visibilitychange",e)},stopIdleListener:()=>{}};try{globalThis.localStorage&&(w.localStorage=globalThis.localStorage)}catch(t){}const m=new Map;let b=!1;const k=new Map,S=new Map,A=new Map,x=new Set;function $(t){Object.assign(w,t)}function E(t){Object.assign(p,t),p.backgroundSync||j()}async function C(){k.clear(),S.clear(),j(),b=!1,await D()}async function O({instance:t,timeout:e,skipCache:n,allowStale:i,backgroundSync:r}){return r||(p.backgroundSync=!1),async function({instance:t,allowStale:e,timeout:n,skipCache:i}){const r=N(t),s=T(t),o=new Date,u=new Date(o.getTime()-p.maxAge+p.staleTTL);await async function(){if(!b){b=!0;try{if(w.localStorage){const t=await w.localStorage.getItem(p.cacheKey);if(!p.disableCache&&t){const e=JSON.parse(t);e&&Array.isArray(e)&&e.forEach((([t,e])=>{k.set(t,{...e,staleAt:new Date(e.staleAt)})})),M()}}}catch(t){}if(!p.disableIdleStreams){const t=v.startIdleListener();t&&(v.stopIdleListener=t)}}}();const a=p.disableCache||i?void 0:k.get(s);return a&&(e||a.staleAt>o)&&a.staleAt>u?(a.sse&&x.add(r),a.staleAt<o?R(t):U(t),{data:a.data,success:!0,source:"cache"}):await g(R(t),n)||{data:null,success:!1,source:"timeout",error:new Error("Timeout")}}({instance:t,allowStale:i,timeout:e,skipCache:n})}function _(t){m.forEach((e=>e.delete(t)))}function F(){A.forEach((t=>{t&&(t.state="idle",J(t))}))}function V(){A.forEach((t=>{t&&"idle"===t.state&&L(t)}))}async function D(){try{if(!w.localStorage)return;await w.localStorage.setItem(p.cacheKey,JSON.stringify(Array.from(k.entries())))}catch(t){}}function N(t){const[e,n]=t.getApiInfo();return`${e}||${n}`}function T(t){const e=N(t);if(!("isRemoteEval"in t)||!t.isRemoteEval())return e;const n=t.getAttributes(),i=t.getCacheKeyAttributes()||Object.keys(t.getAttributes()),r={};i.forEach((t=>{r[t]=n[t]}));const s=t.getForcedVariations(),o=t.getUrl();return`${e}||${JSON.stringify({ca:r,fv:s,url:o})}`}function M(){const t=Array.from(k.entries()).map((([t,e])=>({key:t,staleAt:e.staleAt.getTime()}))).sort(((t,e)=>t.staleAt-e.staleAt)),e=Math.min(Math.max(0,k.size-p.maxEntries),k.size);for(let n=0;n<e;n++)k.delete(t[n].key)}function B(t,e,n){const i=n.dateUpdated||"",r=new Date(Date.now()+p.staleTTL),s=p.disableCache?void 0:k.get(e);if(s&&i&&s.version===i)return s.staleAt=r,void D();p.disableCache||(k.set(e,{data:n,version:i,staleAt:r,sse:x.has(t)}),M()),D();const o=m.get(t);o&&o.forEach((t=>async function(t,e){await t.setPayload(e||t.getPayload())}(t,n)))}async function R(t){const{apiHost:e,apiRequestHeaders:n}=t.getApiHosts(),i=t.getClientKey(),r="isRemoteEval"in t&&t.isRemoteEval(),s=N(t),o=T(t);let u=S.get(o);return u||(u=(r?v.fetchRemoteEvalCall({host:e,clientKey:i,payload:{attributes:t.getAttributes(),forcedVariations:t.getForcedVariations(),forcedFeatures:Array.from(t.getForcedFeatures().entries()),url:t.getUrl()},headers:n}):v.fetchFeaturesCall({host:e,clientKey:i,headers:n})).then((t=>{if(!t.ok)throw new Error(`HTTP error: ${t.status}`);return"enabled"===t.headers.get("x-sse-support")&&x.add(s),t.json()})).then((e=>(B(s,o,e),U(t),S.delete(o),{data:e,success:!0,source:"network"}))).catch((t=>(S.delete(o),{data:null,source:"error",success:!1,error:t}))),S.set(o,u)),u}function U(t,e=!1){const n=N(t),i=T(t),{streamingHost:r,streamingHostRequestHeaders:s}=t.getApiHosts(),o=t.getClientKey();if(e&&x.add(n),p.backgroundSync&&x.has(n)&&w.EventSource){if(A.has(n))return;const t={src:null,host:r,clientKey:o,headers:s,cb:e=>{try{if("features-updated"===e.type){const t=m.get(n);t&&t.forEach((t=>{R(t)}))}else if("features"===e.type){const t=JSON.parse(e.data);B(n,i,t)}t.errors=0}catch(e){I(t)}},errors:0,state:"active"};A.set(n,t),L(t)}}function I(t){if("idle"!==t.state&&(t.errors++,t.errors>3||t.src&&2===t.src.readyState)){const e=Math.pow(3,t.errors-3)*(1e3+1e3*Math.random());J(t),setTimeout((()=>{["idle","active"].includes(t.state)||L(t)}),Math.min(e,3e5))}}function J(t){t.src&&(t.src.onopen=null,t.src.onerror=null,t.src.close(),t.src=null,"active"===t.state&&(t.state="disabled"))}function L(t){t.src=v.eventSourceCall({host:t.host,clientKey:t.clientKey,headers:t.headers}),t.state="active",t.src.addEventListener("features",t.cb),t.src.addEventListener("features-updated",t.cb),t.src.onerror=()=>I(t),t.src.onopen=()=>{t.errors=0}}function K(t,e){J(t),A.delete(e)}function j(){x.clear(),A.forEach(K),m.clear(),v.stopIdleListener()}function P(t,e){if(e.streaming){if(!t.getClientKey())throw new Error("Must specify clientKey to enable streaming");e.payload&&U(t,!0),function(t){const e=N(t),n=m.get(e)||new Set;n.add(t),m.set(e,n)}(t)}}var q=/^[a-zA-Z:_][a-zA-Z0-9:_.-]*$/,H={revert:function(){}},G=new Map,z=new Set;function Z(t){var e=G.get(t);return e||G.set(t,e={element:t,attributes:{}}),e}function Q(t,e,n,i,r){var s=n(t),o={isDirty:!1,originalValue:s,virtualValue:s,mutations:[],el:t,t:null,observer:new MutationObserver((function(){if("position"!==e||!o.t){"position"===e&&(o.t=setTimeout((function(){o.t=null}),1e3));var i=n(t);"position"===e&&i.parentNode===o.virtualValue.parentNode&&i.insertBeforeNode===o.virtualValue.insertBeforeNode||i!==o.virtualValue&&(o.originalValue=i,r(o))}})),mutationRunner:r,setValue:i,getCurrentValue:n};return"position"===e&&t.parentNode?o.observer.observe(t.parentNode,{childList:!0,subtree:!0,attributes:!1,characterData:!1}):o.observer.observe(t,function(t){return"html"===t?{childList:!0,subtree:!0,attributes:!0,characterData:!0}:{childList:!1,subtree:!1,attributes:!0,attributeFilter:[t]}}(e)),o}function W(t,e){var n=e.getCurrentValue(e.el);e.virtualValue=t,t&&"string"!=typeof t?n&&t.parentNode===n.parentNode&&t.insertBeforeNode===n.insertBeforeNode||(e.isDirty=!0,pt()):t!==n&&(e.isDirty=!0,pt())}function X(t){var e=t.originalValue;t.mutations.forEach((function(t){return e=t.mutate(e)})),W(function(t){return at||(at=document.createElement("div")),at.innerHTML=t,at.innerHTML}(e),t)}function Y(t){var e=new Set(t.originalValue.split(/\s+/).filter(Boolean));t.mutations.forEach((function(t){return t.mutate(e)})),W(Array.from(e).filter(Boolean).join(" "),t)}function tt(t){var e=t.originalValue;t.mutations.forEach((function(t){return e=t.mutate(e)})),W(e,t)}function et(t){var e=t.originalValue;t.mutations.forEach((function(t){var n=function(t){var e=t.insertBeforeSelector,n=document.querySelector(t.parentSelector);if(!n)return null;var i=e?document.querySelector(e):null;return e&&!i?null:{parentNode:n,insertBeforeNode:i}}(t.mutate());e=n||e})),W(e,t)}var nt=function(t){return t.innerHTML},it=function(t,e){return t.innerHTML=e};function rt(t){var e=Z(t);return e.html||(e.html=Q(t,"html",nt,it,X)),e.html}var st=function(t){return{parentNode:t.parentElement,insertBeforeNode:t.nextElementSibling}},ot=function(t,e){e.insertBeforeNode&&!e.parentNode.contains(e.insertBeforeNode)||e.parentNode.insertBefore(t,e.insertBeforeNode)};function ut(t){var e=Z(t);return e.position||(e.position=Q(t,"position",st,ot,et)),e.position}var at,ct,ht=function(t,e){return e?t.className=e:t.removeAttribute("class")},lt=function(t){return t.className};function ft(t){var e=Z(t);return e.classes||(e.classes=Q(t,"class",lt,ht,Y)),e.classes}function dt(t,e){var n,i=Z(t);return i.attributes[e]||(i.attributes[e]=Q(t,e,(n=e,function(t){var e;return null!=(e=t.getAttribute(n))?e:null}),function(t){return function(e,n){return null!==n?e.setAttribute(t,n):e.removeAttribute(t)}}(e),tt)),i.attributes[e]}function yt(t,e,n){if(n.isDirty){n.isDirty=!1;var i=n.virtualValue;n.mutations.length||function(t,e){var n,i,r=G.get(t);if(r)if("html"===e)null==(n=r.html)||null==(i=n.observer)||i.disconnect(),delete r.html;else if("class"===e){var s,o;null==(s=r.classes)||null==(o=s.observer)||o.disconnect(),delete r.classes}else if("position"===e){var u,a;null==(u=r.position)||null==(a=u.observer)||a.disconnect(),delete r.position}else{var c,h,l;null==(c=r.attributes)||null==(h=c[e])||null==(l=h.observer)||l.disconnect(),delete r.attributes[e]}}(t,e),n.setValue(t,i)}}function gt(t,e){t.html&&yt(e,"html",t.html),t.classes&&yt(e,"class",t.classes),t.position&&yt(e,"position",t.position),Object.keys(t.attributes).forEach((function(n){yt(e,n,t.attributes[n])}))}function pt(){G.forEach(gt)}function wt(t){if("position"!==t.kind||1!==t.elements.size){var e=new Set(t.elements);document.querySelectorAll(t.selector).forEach((function(n){e.has(n)||(t.elements.add(n),function(t,e){var n=null;"html"===t.kind?n=rt(e):"class"===t.kind?n=ft(e):"attribute"===t.kind?n=dt(e,t.attribute):"position"===t.kind&&(n=ut(e)),n&&(n.mutations.push(t),n.mutationRunner(n))}(t,n))}))}}function vt(){z.forEach(wt)}function mt(t){return"undefined"==typeof document?H:(z.add(t),wt(t),{revert:function(){var e;(e=t).elements.forEach((function(t){return function(t,e){var n=null;if("html"===t.kind?n=rt(e):"class"===t.kind?n=ft(e):"attribute"===t.kind?n=dt(e,t.attribute):"position"===t.kind&&(n=ut(e)),n){var i=n.mutations.indexOf(t);-1!==i&&n.mutations.splice(i,1),n.mutationRunner(n)}}(e,t)})),e.elements.clear(),z.delete(e)}})}function bt(t,e){return mt({kind:"html",elements:new Set,mutate:e,selector:t})}function kt(t,e){return mt({kind:"class",elements:new Set,mutate:e,selector:t})}function St(t,e,n){return q.test(e)?"class"===e||"className"===e?kt(t,(function(t){var e=n(Array.from(t).join(" "));t.clear(),e&&e.split(/\s+/g).filter(Boolean).forEach((function(e){return t.add(e)}))})):mt({kind:"attribute",attribute:e,elements:new Set,mutate:n,selector:t}):H}"undefined"!=typeof document&&(ct||(ct=new MutationObserver((function(){vt()}))),vt(),ct.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!1,characterData:!1}));const At={};function xt(t,e,n){n=n||{};for(const[i,r]of Object.entries(e))switch(i){case"$or":if(!Dt(t,r,n))return!1;break;case"$nor":if(Dt(t,r,n))return!1;break;case"$and":if(!Nt(t,r,n))return!1;break;case"$not":if(xt(t,r,n))return!1;break;default:if(!Ct(r,$t(t,i),n))return!1}return!0}function $t(t,e){const n=e.split(".");let i=t;for(let t=0;t<n.length;t++){if(!i||"object"!=typeof i||!(n[t]in i))return null;i=i[n[t]]}return i}function Et(t,e=!1){const n=`${t}${e?"/i":""}`;return At[n]||(At[n]=new RegExp(t.replace(/([^\\])\//g,"$1\\/"),e?"i":void 0)),At[n]}function Ct(t,e,n,i=!1){if("string"==typeof t)return i?String(e).toLowerCase()===t.toLowerCase():e+""===t;if("number"==typeof t)return 1*e===t;if("boolean"==typeof t)return null!==e&&!!e===t;if(null===t)return null===e;if(Array.isArray(t)||!Ot(t))return JSON.stringify(e)===JSON.stringify(t);for(const i in t)if(!Vt(i,e,t[i],n))return!1;return!0}function Ot(t){const e=Object.keys(t);return e.length>0&&e.filter((t=>"$"===t[0])).length===e.length}function _t(t,e,n=!1){if(n){const n=t=>"string"==typeof t?t.toLowerCase():t;return Array.isArray(t)?t.some((t=>e.some((e=>n(t)===n(e))))):e.some((e=>n(t)===n(e)))}return Array.isArray(t)?t.some((t=>e.includes(t))):e.includes(t)}function Ft(t,e,n,i=!1){if(!Array.isArray(t))return!1;for(let r=0;r<e.length;r++){let s=!1;for(let o=0;o<t.length;o++)if(Ct(e[r],t[o],n,i)){s=!0;break}if(!s)return!1}return!0}function Vt(t,e,n,i){switch(t){case"$veq":return l(e)===l(n);case"$vne":return l(e)!==l(n);case"$vgt":return l(e)>l(n);case"$vgte":return l(e)>=l(n);case"$vlt":return l(e)<l(n);case"$vlte":return l(e)<=l(n);case"$eq":return e===n;case"$ne":return e!==n;case"$lt":return e<n;case"$lte":return e<=n;case"$gt":return e>n;case"$gte":return e>=n;case"$exists":return n?null!=e:null==e;case"$in":return!!Array.isArray(n)&&_t(e,n);case"$ini":return!!Array.isArray(n)&&_t(e,n,!0);case"$inGroup":return _t(e,i[n]||[]);case"$notInGroup":return!_t(e,i[n]||[]);case"$nin":return!!Array.isArray(n)&&!_t(e,n);case"$nini":return!!Array.isArray(n)&&!_t(e,n,!0);case"$not":return!Ct(n,e,i);case"$size":return!!Array.isArray(e)&&Ct(n,e.length,i);case"$elemMatch":return function(t,e,n){if(!Array.isArray(t))return!1;const i=Ot(e)?t=>Ct(e,t,n):t=>xt(t,e,n);for(let e=0;e<t.length;e++)if(t[e]&&i(t[e]))return!0;return!1}(e,n,i);case"$all":return!!Array.isArray(n)&&Ft(e,n,i);case"$alli":return!!Array.isArray(n)&&Ft(e,n,i,!0);case"$regex":try{return Et(n).test(e)}catch(t){return!1}case"$regexi":try{return Et(n,!0).test(e)}catch(t){return!1}case"$type":return function(t){if(null===t)return"null";if(Array.isArray(t))return"array";const e=typeof t;return["string","number","boolean","object","undefined"].includes(e)?e:"unknown"}(e)===n;default:return console.error("Unknown operator: "+t),!1}}function Dt(t,e,n){if(!e.length)return!0;for(let i=0;i<e.length;i++)if(xt(t,e[i],n))return!0;return!1}function Nt(t,e,n){for(let i=0;i<e.length;i++)if(!xt(t,e[i],n))return!1;return!0}const Tt="Feature Evaluated",Mt="Experiment Viewed";async function Bt(t){try{await t()}catch(t){}}function Rt(t,e,n){if(t.user.trackedExperiments){const i=Yt(e,n);if(t.user.trackedExperiments.has(i))return[];t.user.trackedExperiments.add(i)}t.user.enableDevMode&&t.user.devLogs&&t.user.devLogs.push({experiment:e,result:n,timestamp:Date.now().toString(),logType:"experiment"});const i=[];if(t.global.trackingCallback){const r=t.global.trackingCallback;i.push(Bt((()=>r(e,n,t.user))))}if(t.user.trackingCallback){const r=t.user.trackingCallback;i.push(Bt((()=>r(e,n))))}if(t.global.eventLogger){const r=t.global.eventLogger;i.push(Bt((()=>r("Experiment Viewed",{experimentId:e.key,variationId:n.key,hashAttribute:n.hashAttribute,hashValue:n.hashValue},t.user))))}return i}function Ut(t,e){if(e.stack.evaluatedFeatures.has(t))return Jt(e,t,null,"cyclicPrerequisite");e.stack.evaluatedFeatures.add(t),e.stack.id=t;const n=function(t){const e=new Map;return t.global.forcedFeatureValues&&t.global.forcedFeatureValues.forEach(((t,n)=>e.set(n,t))),t.user.forcedFeatureValues&&t.user.forcedFeatureValues.forEach(((t,n)=>e.set(n,t))),e}(e);if(n.has(t))return Jt(e,t,n.get(t),"override");if(!e.global.features||!e.global.features[t])return Jt(e,t,null,"unknownFeature");const i=e.global.features[t];if(i.rules){const n=new Set(e.stack.evaluatedFeatures);t:for(const r of i.rules){if(r.parentConditions)for(const i of r.parentConditions){e.stack.evaluatedFeatures=new Set(n);const r=Ut(i.id,e);if("cyclicPrerequisite"===r.source)return Jt(e,t,null,"cyclicPrerequisite");if(!xt({value:r.value},i.condition||{})){if(i.gate)return Jt(e,t,null,"prerequisite");continue t}}if(r.filters&&jt(r.filters,e))continue;if("force"in r){if(r.condition&&!Kt(r.condition,e))continue;if(!Pt(e,r.seed||t,r.hashAttribute,e.user.saveStickyBucketAssignmentDoc&&!r.disableStickyBucketing?r.fallbackAttribute:void 0,r.range,r.coverage,r.hashVersion))continue;return r.tracks&&r.tracks.forEach((t=>{!Rt(e,t.experiment,t.result).length&&e.global.saveDeferredTrack&&e.global.saveDeferredTrack({experiment:t.experiment,result:t.result})})),Jt(e,t,r.force,"force",r.id)}if(!r.variations)continue;const i={variations:r.variations,key:r.key||t};"coverage"in r&&(i.coverage=r.coverage),r.weights&&(i.weights=r.weights),r.hashAttribute&&(i.hashAttribute=r.hashAttribute),r.fallbackAttribute&&(i.fallbackAttribute=r.fallbackAttribute),r.disableStickyBucketing&&(i.disableStickyBucketing=r.disableStickyBucketing),void 0!==r.bucketVersion&&(i.bucketVersion=r.bucketVersion),void 0!==r.minBucketVersion&&(i.minBucketVersion=r.minBucketVersion),r.namespace&&(i.namespace=r.namespace),r.meta&&(i.meta=r.meta),r.ranges&&(i.ranges=r.ranges),r.name&&(i.name=r.name),r.phase&&(i.phase=r.phase),r.seed&&(i.seed=r.seed),r.hashVersion&&(i.hashVersion=r.hashVersion),r.filters&&(i.filters=r.filters),r.condition&&(i.condition=r.condition);const{result:s}=It(i,t,e);if(e.global.onExperimentEval&&e.global.onExperimentEval(i,s),s.inExperiment&&!s.passthrough)return Jt(e,t,s.value,"experiment",r.id,i,s)}}return Jt(e,t,void 0===i.defaultValue?null:i.defaultValue,"defaultValue")}function It(t,e,n){const u=t.key,a=t.variations.length;if(a<2)return{result:qt(n,t,-1,!1,e)};if(!1===n.global.enabled||!1===n.user.enabled)return{result:qt(n,t,-1,!1,e)};if(t=function(t,e){const n=t.key,i=e.global.overrides;return i&&i[n]&&"string"==typeof(t=Object.assign({},t,i[n])).url&&(t.url=s(t.url)),t}(t,n),t.urlPatterns&&!o(n.user.url||"",t.urlPatterns))return{result:qt(n,t,-1,!1,e)};const c=function(t,e,n){if(!e)return null;const i=e.split("?")[1];if(!i)return null;const r=i.replace(/#.*/,"").split("&").map((t=>t.split("=",2))).filter((([e])=>e===t)).map((([,t])=>parseInt(t)));return r.length>0&&r[0]>=0&&r[0]<n?r[0]:null}(u,n.user.url||"",a);if(null!==c)return{result:qt(n,t,c,!1,e)};const l=function(t){return t.global.forcedVariations&&t.user.forcedVariations?{...t.global.forcedVariations,...t.user.forcedVariations}:t.global.forcedVariations?t.global.forcedVariations:t.user.forcedVariations?t.user.forcedVariations:{}}(n);if(u in l)return{result:qt(n,t,l[u],!1,e)};if("draft"===t.status||!1===t.active)return{result:qt(n,t,-1,!1,e)};const{hashAttribute:f,hashValue:d}=Ht(n,t.hashAttribute,n.user.saveStickyBucketAssignmentDoc&&!t.disableStickyBucketing?t.fallbackAttribute:void 0);if(!d)return{result:qt(n,t,-1,!1,e)};let y=-1,g=!1,p=!1;if(n.user.saveStickyBucketAssignmentDoc&&!t.disableStickyBucketing){const{variation:e,versionIsBlocked:i}=function({ctx:t,expKey:e,expBucketVersion:n,expHashAttribute:i,expFallbackAttribute:r,expMinBucketVersion:s,expMeta:o}){s=s||0,i=i||"id",o=o||[];const u=Gt(e,n=n||0),a=function(t,e,n){if(!t.user.stickyBucketAssignmentDocs)return{};const{hashAttribute:i,hashValue:r}=Ht(t,e),s=zt(i,h(r)),{hashAttribute:o,hashValue:u}=Ht(t,n),a=u?zt(o,h(u)):null,c={};return a&&t.user.stickyBucketAssignmentDocs[a]&&Object.assign(c,t.user.stickyBucketAssignmentDocs[a].assignments||{}),t.user.stickyBucketAssignmentDocs[s]&&Object.assign(c,t.user.stickyBucketAssignmentDocs[s].assignments||{}),c}(t,i,r);if(s>0)for(let t=0;t<s;t++)if(void 0!==a[Gt(e,t)])return{variation:-1,versionIsBlocked:!0};const c=a[u];if(void 0===c)return{variation:-1};const l=o.findIndex((t=>t.key===c));return l<0?{variation:-1}:{variation:l}}({ctx:n,expKey:t.key,expBucketVersion:t.bucketVersion,expHashAttribute:t.hashAttribute,expFallbackAttribute:t.fallbackAttribute,expMinBucketVersion:t.minBucketVersion,expMeta:t.meta});g=e>=0,y=e,p=!!i}if(!g){if(t.filters){if(jt(t.filters,n))return{result:qt(n,t,-1,!1,e)}}else if(t.namespace&&!function(t,e){const n=i("__"+e[0],t,1);return null!==n&&n>=e[1]&&n<e[2]}(d,t.namespace))return{result:qt(n,t,-1,!1,e)};if(t.include&&!function(t){try{return t()}catch(t){return console.error(t),!1}}(t.include))return{result:qt(n,t,-1,!1,e)};if(t.condition&&!Kt(t.condition,n))return{result:qt(n,t,-1,!1,e)};if(t.parentConditions){const i=new Set(n.stack.evaluatedFeatures);for(const r of t.parentConditions){n.stack.evaluatedFeatures=new Set(i);const s=Ut(r.id,n);if("cyclicPrerequisite"===s.source)return{result:qt(n,t,-1,!1,e)};if(!xt({value:s.value},r.condition||{}))return{result:qt(n,t,-1,!1,e)}}}if(t.groups&&!function(t,e){const n=e.global.groups||{};for(let e=0;e<t.length;e++)if(n[t[e]])return!0;return!1}(t.groups,n))return{result:qt(n,t,-1,!1,e)}}if(t.url&&!function(t,e){const n=e.user.url;if(!n)return!1;const i=n.replace(/^https?:\/\//,"").replace(/^[^/]*\//,"/");return!!t.test(n)||!!t.test(i)}(t.url,n))return{result:qt(n,t,-1,!1,e)};const w=i(t.seed||u,d,t.hashVersion||1);if(null===w)return{result:qt(n,t,-1,!1,e)};if(g||(y=function(t,e){for(let n=0;n<e.length;n++)if(r(t,e[n]))return n;return-1}(w,t.ranges||function(t,e,n){(e=void 0===e?1:e)<0?e=0:e>1&&(e=1);const i=(r=t)<=0?[]:new Array(r).fill(1/r);var r;(n=n||i).length!==t&&(n=i);const s=n.reduce(((t,e)=>e+t),0);(s<.99||s>1.01)&&(n=i);let o=0;return n.map((t=>{const n=o;return o+=t,[n,n+e*t]}))}(a,void 0===t.coverage?1:t.coverage,t.weights))),p)return{result:qt(n,t,-1,!1,e,void 0,!0)};if(y<0)return{result:qt(n,t,-1,!1,e)};if("force"in t)return{result:qt(n,t,void 0===t.force?-1:t.force,!1,e)};if(n.global.qaMode||n.user.qaMode)return{result:qt(n,t,-1,!1,e)};if("stopped"===t.status)return{result:qt(n,t,-1,!1,e)};const v=qt(n,t,y,!0,e,w,g);if(n.user.saveStickyBucketAssignmentDoc&&!t.disableStickyBucketing){const{changed:e,key:i,doc:r}=function(t,e,n,i){const r=zt(e,n),s=t.user.stickyBucketAssignmentDocs&&t.user.stickyBucketAssignmentDocs[r]&&t.user.stickyBucketAssignmentDocs[r].assignments||{},o={...s,...i};return{key:r,doc:{attributeName:e,attributeValue:n,assignments:o},changed:JSON.stringify(s)!==JSON.stringify(o)}}(n,f,h(d),{[Gt(t.key,t.bucketVersion)]:v.key});e&&(n.user.stickyBucketAssignmentDocs=n.user.stickyBucketAssignmentDocs||{},n.user.stickyBucketAssignmentDocs[i]=r,n.user.saveStickyBucketAssignmentDoc(r))}const m=Rt(n,t,v);0===m.length&&n.global.saveDeferredTrack&&n.global.saveDeferredTrack({experiment:t,result:v});const b=m.length?1===m.length?m[0]:Promise.all(m).then((()=>{})):void 0;return"changeId"in t&&t.changeId&&n.global.recordChangeId&&n.global.recordChangeId(t.changeId),{result:v,trackingCall:b}}function Jt(t,e,n,i,r,s,o){const u={value:n,on:!!n,off:!n,source:i,ruleId:r||""};return s&&(u.experiment=s),o&&(u.experimentResult=o),"override"!==i&&function(t,e,n){if(t.user.trackedFeatureUsage){const i=JSON.stringify(n.value);if(t.user.trackedFeatureUsage[e]===i)return;t.user.trackedFeatureUsage[e]=i,t.user.enableDevMode&&t.user.devLogs&&t.user.devLogs.push({featureKey:e,result:n,timestamp:Date.now().toString(),logType:"feature"})}if(t.global.onFeatureUsage){const i=t.global.onFeatureUsage;Bt((()=>i(e,n,t.user)))}if(t.user.onFeatureUsage){const i=t.user.onFeatureUsage;Bt((()=>i(e,n)))}if(t.global.eventLogger){const i=t.global.eventLogger;Bt((()=>i("Feature Evaluated",{feature:e,source:n.source,value:n.value,ruleId:"defaultValue"===n.source?"$default":n.ruleId||"",variationId:n.experimentResult?n.experimentResult.key:""},t.user)))}}(t,e,u),u}function Lt(t){return{...t.user.attributes,...t.user.attributeOverrides}}function Kt(t,e){return xt(Lt(e),t,e.global.savedGroups||{})}function jt(t,e){return t.some((t=>{const{hashValue:n}=Ht(e,t.attribute);if(!n)return!0;const s=i(t.seed,n,t.hashVersion||2);return null===s||!t.ranges.some((t=>r(s,t)))}))}function Pt(t,e,n,s,o,u,a){if(!o&&void 0===u)return!0;if(!o&&0===u)return!1;const{hashValue:c}=Ht(t,n,s);if(!c)return!1;const h=i(e,c,a||1);return null!==h&&(o?r(h,o):void 0===u||h<=u)}function qt(t,e,n,i,r,s,o){let u=!0;(n<0||n>=e.variations.length)&&(n=0,u=!1);const{hashAttribute:a,hashValue:c}=Ht(t,e.hashAttribute,t.user.saveStickyBucketAssignmentDoc&&!e.disableStickyBucketing?e.fallbackAttribute:void 0),h=e.meta?e.meta[n]:{},l={key:h.key||""+n,featureId:r,inExperiment:u,hashUsed:i,variationId:n,value:e.variations[n],hashAttribute:a,hashValue:c,stickyBucketUsed:!!o};return h.name&&(l.name=h.name),void 0!==s&&(l.bucket=s),h.passthrough&&(l.passthrough=h.passthrough),l}function Ht(t,e,n){let i=e||"id",r="";const s=Lt(t);return s[i]&&(r=s[i]),!r&&n&&(s[n]&&(r=s[n]),r&&(i=n)),{hashAttribute:i,hashValue:r}}function Gt(t,e){return`${t}__${e=e||0}`}function zt(t,e){return`${t}||${e}`}async function Zt(t,e,n){const i=Qt(t,n);return e.getAllAssignments(i)}function Qt(t,e){const n={},i=function(t,e){const n=new Set,i=e&&e.features?e.features:t.global.features||{},r=e&&e.experiments?e.experiments:t.global.experiments||[];return Object.keys(i).forEach((t=>{const e=i[t];if(e.rules)for(const t of e.rules)t.variations&&(n.add(t.hashAttribute||"id"),t.fallbackAttribute&&n.add(t.fallbackAttribute))})),r.map((t=>{n.add(t.hashAttribute||"id"),t.fallbackAttribute&&n.add(t.fallbackAttribute)})),Array.from(n)}(t,e);return i.forEach((e=>{const{hashValue:i}=Ht(t,e);n[e]=h(i)})),n}async function Wt(t,e,n){if((t={...t}).encryptedFeatures){try{t.features=JSON.parse(await c(t.encryptedFeatures,e,n))}catch(t){console.error(t)}delete t.encryptedFeatures}if(t.encryptedExperiments){try{t.experiments=JSON.parse(await c(t.encryptedExperiments,e,n))}catch(t){console.error(t)}delete t.encryptedExperiments}if(t.encryptedSavedGroups){try{t.savedGroups=JSON.parse(await c(t.encryptedSavedGroups,e,n))}catch(t){console.error(t)}delete t.encryptedSavedGroups}return t}function Xt(t){const e=t.apiHost||"https://cdn.growthbook.io";return{apiHost:e.replace(/\/*$/,""),streamingHost:(t.streamingHost||e).replace(/\/*$/,""),apiRequestHeaders:t.apiHostRequestHeaders,streamingHostRequestHeaders:t.streamingHostRequestHeaders}}function Yt(t,e){return e.hashAttribute+e.hashValue+t.key+e.variationId}const te="undefined"!=typeof window&&"undefined"!=typeof document,ee=f();class ne{constructor(t){if(t=t||{},this.version=ee,this.i=this.context=t,this.o=t.renderer||null,this.u=new Set,this.h=new Set,this.l={},this.debug=!!t.debug,this.g=new Set,this.ready=!1,this.p=new Map,this.v=new Map,this.m=new Set,this.k=!1,this.S="",this.A=new Map,this.$=!t.disableExperimentsOnLoad,this.C=[],this.logs=[],this.log=this.log.bind(this),this.O=this.O.bind(this),this._=this._.bind(this),this.F=this.F.bind(this),this.V=this.V.bind(this),t.remoteEval){if(t.decryptionKey)throw new Error("Encryption is not available for remoteEval");if(!t.clientKey)throw new Error("Missing clientKey");let e=!1;try{e=!!new URL(t.apiHost||"").hostname.match(/growthbook\.io$/i)}catch(t){}if(e)throw new Error("Cannot use remoteEval on GrowthBook Cloud")}else if(t.cacheKeyAttributes)throw new Error("cacheKeyAttributes are only used for remoteEval");if(t.stickyBucketService){const e=t.stickyBucketService;this.D=t=>e.saveAssignments(t)}if(t.plugins)for(const e of t.plugins)e(this);if(t.features&&(this.ready=!0),te&&t.enableDevMode&&(window._growthbook=this,document.dispatchEvent(new Event("gbloaded"))),t.experiments&&(this.ready=!0,this.N()),this.i.stickyBucketService&&this.i.stickyBucketAssignmentDocs)for(const t in this.i.stickyBucketAssignmentDocs){const e=this.i.stickyBucketAssignmentDocs[t];e&&this.i.stickyBucketService.saveAssignments(e).catch((()=>{}))}this.ready&&this.refreshStickyBuckets(this.getPayload())}async setPayload(t){this.T=t;const e=await Wt(t,this.i.decryptionKey);this.M=e,await this.refreshStickyBuckets(e),e.features&&(this.i.features=e.features),e.savedGroups&&(this.i.savedGroups=e.savedGroups),e.experiments&&(this.i.experiments=e.experiments,this.N()),this.ready=!0,this.B()}initSync(t){this.k=!0;const e=t.payload;if(e.encryptedExperiments||e.encryptedFeatures)throw new Error("initSync does not support encrypted payloads");return this.i.stickyBucketService&&!this.i.stickyBucketAssignmentDocs&&(this.i.stickyBucketAssignmentDocs=this.generateStickyBucketAssignmentDocsSync(this.i.stickyBucketService,e)),this.T=e,this.M=e,e.features&&(this.i.features=e.features),e.experiments&&(this.i.experiments=e.experiments,this.N()),this.ready=!0,P(this,t),this}async init(t){if(this.k=!0,(t=t||{}).cacheSettings&&E(t.cacheSettings),t.payload)return await this.setPayload(t.payload),P(this,t),{success:!0,source:"init"};{const{data:e,...n}=await this.R({...t,allowStale:!0});return P(this,t),await this.setPayload(e||{}),n}}async loadFeatures(t){t=t||{},await this.init({skipCache:t.skipCache,timeout:t.timeout,streaming:(this.i.backgroundSync??!0)&&(t.autoRefresh||this.i.subscribeToChanges)})}async refreshFeatures(t){const e=await this.R({...t||{},allowStale:!1});e.data&&await this.setPayload(e.data)}getApiInfo(){return[this.getApiHosts().apiHost,this.getClientKey()]}getApiHosts(){return Xt(this.i)}getClientKey(){return this.i.clientKey||""}getPayload(){return this.T||{features:this.getFeatures(),experiments:this.getExperiments()}}getDecryptedPayload(){return this.M||this.getPayload()}isRemoteEval(){return this.i.remoteEval||!1}getCacheKeyAttributes(){return this.i.cacheKeyAttributes}async R({timeout:t,skipCache:e,allowStale:n,streaming:i}){if(!this.i.clientKey)throw new Error("Missing clientKey");return O({instance:this,timeout:t,skipCache:e||this.i.disableCache,allowStale:n,backgroundSync:i??this.i.backgroundSync??!0})}B(){if(this.o)try{this.o()}catch(t){console.error("Failed to render",t)}}setFeatures(t){this.i.features=t,this.ready=!0,this.B()}async setEncryptedFeatures(t,e,n){const i=await c(t,e||this.i.decryptionKey,n);this.setFeatures(JSON.parse(i))}setExperiments(t){this.i.experiments=t,this.ready=!0,this.N()}async setEncryptedExperiments(t,e,n){const i=await c(t,e||this.i.decryptionKey,n);this.setExperiments(JSON.parse(i))}async setAttributes(t){this.i.attributes=t,this.i.stickyBucketService&&await this.refreshStickyBuckets(),this.i.remoteEval?await this.U():(this.B(),this.N())}async updateAttributes(t){return this.setAttributes({...this.i.attributes,...t})}async setAttributeOverrides(t){this.i.attributeOverrides=t,this.i.stickyBucketService&&await this.refreshStickyBuckets(),this.i.remoteEval?await this.U():(this.B(),this.N())}async setForcedVariations(t){this.i.forcedVariations=t||{},this.i.remoteEval?await this.U():(this.B(),this.N())}setForcedFeatures(t){this.i.forcedFeatureValues=t,this.B()}async setURL(t){if(t!==this.i.url){if(this.i.url=t,this.S="",this.i.remoteEval)return await this.U(),void this.N(!0);this.N(!0)}}getAttributes(){return{...this.i.attributes,...this.i.attributeOverrides}}getForcedVariations(){return this.i.forcedVariations||{}}getForcedFeatures(){return this.i.forcedFeatureValues||new Map}getStickyBucketAssignmentDocs(){return this.i.stickyBucketAssignmentDocs||{}}getUrl(){return this.i.url||""}getFeatures(){return this.i.features||{}}getExperiments(){return this.i.experiments||[]}getCompletedChangeIds(){return Array.from(this.h)}subscribe(t){return this.g.add(t),()=>{this.g.delete(t)}}async U(){if(!this.i.remoteEval)return;if(!this.k)return;const t=await this.R({allowStale:!1});t.data&&await this.setPayload(t.data)}getAllResults(){return new Map(this.p)}onDestroy(t){this.C.push(t)}isDestroyed(){return!!this.I}destroy(t){t=t||{},this.I=!0,this.C.forEach((t=>{try{t()}catch(t){console.error(t)}})),this.g.clear(),this.p.clear(),this.u.clear(),this.h.clear(),this.A.clear(),this.l={},this.C=[],this.T=void 0,this.D=void 0,_(this),t.destroyAllStreams&&j(),this.logs=[],te&&window._growthbook===this&&delete window._growthbook,this.v.forEach((t=>{t.undo()})),this.v.clear(),this.m.clear()}setRenderer(t){this.o=t}forceVariation(t,e){this.i.forcedVariations=this.i.forcedVariations||{},this.i.forcedVariations[t]=e,this.i.remoteEval?this.U():(this.N(),this.B())}run(t){const{result:e}=It(t,null,this.J());return this._(t,e),e}triggerExperiment(t){return this.m.add(t),this.i.experiments?this.i.experiments.filter((e=>e.key===t)).map((t=>this.L(t))).filter((t=>null!==t)):null}triggerAutoExperiments(){this.$=!0,this.N(!0)}J(){return{user:this.K(),global:this.j(),stack:{evaluatedFeatures:new Set}}}K(){return{attributes:this.i.user?{...this.i.user,...this.i.attributes}:this.i.attributes,enableDevMode:this.i.enableDevMode,blockedChangeIds:this.i.blockedChangeIds,stickyBucketAssignmentDocs:this.i.stickyBucketAssignmentDocs,url:this.P(),forcedVariations:this.i.forcedVariations,forcedFeatureValues:this.i.forcedFeatureValues,attributeOverrides:this.i.attributeOverrides,saveStickyBucketAssignmentDoc:this.D,trackingCallback:this.i.trackingCallback,onFeatureUsage:this.i.onFeatureUsage,devLogs:this.logs,trackedExperiments:this.u,trackedFeatureUsage:this.l}}j(){return{features:this.i.features,experiments:this.i.experiments,log:this.log,enabled:this.i.enabled,qaMode:this.i.qaMode,savedGroups:this.i.savedGroups,groups:this.i.groups,overrides:this.i.overrides,onExperimentEval:this._,recordChangeId:this.V,saveDeferredTrack:this.O,eventLogger:this.i.eventLogger}}L(t,e){const n=this.v.get(t);if(t.manual&&!this.m.has(t.key)&&!n)return null;let i,r;this.q(t)?i=qt(this.J(),t,-1,!1,""):(({result:i,trackingCall:r}=It(t,null,this.J())),this._(t,i));const s=JSON.stringify(i.value);if(!e&&i.inExperiment&&n&&n.valueHash===s)return i;if(n&&this.H(t),i.inExperiment){const e=y(t);if("redirect"===e&&i.value.urlRedirect&&t.urlPatterns){const e=t.persistQueryString?function(t,e){let n,i;try{n=new URL(t),i=new URL(e)}catch(t){return console.error(`Unable to merge query strings: ${t}`),e}return n.searchParams.forEach(((t,e)=>{i.searchParams.has(e)||i.searchParams.set(e,t)})),i.toString()}(this.P(),i.value.urlRedirect):i.value.urlRedirect;if(o(e,t.urlPatterns))return this.log("Skipping redirect because original URL matches redirect URL",{id:t.key}),i;this.S=e;const{navigate:n,delay:s}=this.G();if(n)if(te)Promise.all([...r?[g(r,this.i.maxNavigateDelay??1e3)]:[],new Promise((t=>window.setTimeout(t,this.i.navigateDelay??s)))]).then((()=>{try{n(e)}catch(t){console.error(t)}}));else try{n(e)}catch(t){console.error(t)}}else if("visual"===e){const e=this.i.applyDomChangesCallback?this.i.applyDomChangesCallback(i.value):this.Z(i.value);e&&this.v.set(t,{undo:e,valueHash:s})}}return i}H(t){const e=this.v.get(t);e&&(e.undo(),this.v.delete(t))}N(t){if(!this.$)return;const e=this.i.experiments||[],n=new Set(e);this.v.forEach(((t,e)=>{n.has(e)||(t.undo(),this.v.delete(e))}));for(const n of e){const e=this.L(n,t);if(e&&e.inExperiment&&"redirect"===y(n))break}}_(t,e){const n=this.p.get(t.key);this.p.set(t.key,{experiment:t,result:e}),this.g.size>0&&this.F(t,e,n)}F(t,e,n){n&&n.result.inExperiment===e.inExperiment&&n.result.variationId===e.variationId||this.g.forEach((n=>{try{n(t,e)}catch(t){console.error(t)}}))}V(t){this.h.add(t)}isOn(t){return this.evalFeature(t).on}isOff(t){return this.evalFeature(t).off}getFeatureValue(t,e){const n=this.evalFeature(t).value;return null===n?e:n}feature(t){return this.evalFeature(t)}evalFeature(t){return Ut(t,this.J())}log(t,e){this.debug&&(this.i.log?this.i.log(t,e):console.log(t,e))}getDeferredTrackingCalls(){return Array.from(this.A.values())}setDeferredTrackingCalls(t){this.A=new Map(t.filter((t=>t&&t.experiment&&t.result)).map((t=>[Yt(t.experiment,t.result),t])))}async fireDeferredTrackingCalls(){if(!this.i.trackingCallback)return;const t=[];this.A.forEach((e=>{e&&e.experiment&&e.result?t.push(this.i.trackingCallback(e.experiment,e.result)):console.error("Invalid deferred tracking call",{call:e})})),this.A.clear(),await Promise.all(t)}setTrackingCallback(t){this.i.trackingCallback=t,this.fireDeferredTrackingCalls()}setFeatureUsageCallback(t){this.i.onFeatureUsage=t}setEventLogger(t){this.i.eventLogger=t}async logEvent(t,e){if(this.I)console.error("Cannot log event to destroyed GrowthBook instance");else if(this.i.enableDevMode&&this.logs.push({eventName:t,properties:e,timestamp:Date.now().toString(),logType:"event"}),this.i.eventLogger)try{await this.i.eventLogger(t,e||{},this.K())}catch(t){console.error(t)}else console.error("No event logger configured")}O(t){this.A.set(Yt(t.experiment,t.result),t)}P(){return this.i.url||(te?window.location.href:"")}q(t){const e=y(t);if("visual"===e){if(this.i.disableVisualExperiments)return!0;if(this.i.disableJsInjection&&t.variations.some((t=>t.js)))return!0}else{if("redirect"!==e)return!0;if(this.i.disableUrlRedirectExperiments)return!0;try{const e=new URL(this.P());for(const n of t.variations){if(!n||!n.urlRedirect)continue;const t=new URL(n.urlRedirect);if(this.i.disableCrossOriginUrlRedirectExperiments){if(t.protocol!==e.protocol)return!0;if(t.host!==e.host)return!0}}}catch(e){return this.log("Error parsing current or redirect URL",{id:t.key,error:e}),!0}}return!(!t.changeId||!(this.i.blockedChangeIds||[]).includes(t.changeId))}getRedirectUrl(){return this.S}G(){return this.i.navigate?{navigate:this.i.navigate,delay:0}:te?{navigate:t=>{window.location.replace(t)},delay:100}:{navigate:null,delay:0}}Z(t){if(!te)return;const e=[];if(t.css){const n=document.createElement("style");n.innerHTML=t.css,document.head.appendChild(n),e.push((()=>n.remove()))}if(t.js){const n=document.createElement("script");n.innerHTML=t.js,this.i.jsInjectionNonce&&(n.nonce=this.i.jsInjectionNonce),document.head.appendChild(n),e.push((()=>n.remove()))}return t.domMutations&&t.domMutations.forEach((t=>{e.push(function(t){var e=t.selector,n=t.action,i=t.value,r=t.attribute,s=t.parentSelector,o=t.insertBeforeSelector;if("html"===r){if("append"===n)return bt(e,(function(t){return t+(null!=i?i:"")}));if("set"===n)return bt(e,(function(){return null!=i?i:""}))}else if("class"===r){if("append"===n)return kt(e,(function(t){i&&t.add(i)}));if("remove"===n)return kt(e,(function(t){i&&t.delete(i)}));if("set"===n)return kt(e,(function(t){t.clear(),i&&t.add(i)}))}else if("position"===r){if("set"===n&&s)return function(t,e){return mt({kind:"position",elements:new Set,mutate:function(){return{insertBeforeSelector:o,parentSelector:s}},selector:t})}(e)}else{if("append"===n)return St(e,r,(function(t){return null!==t?t+(null!=i?i:""):null!=i?i:""}));if("set"===n)return St(e,r,(function(){return null!=i?i:""}));if("remove"===n)return St(e,r,(function(){return null}))}return H}(t).revert)})),()=>{e.forEach((t=>t()))}}async refreshStickyBuckets(t){if(this.i.stickyBucketService){const e=this.J(),n=await Zt(e,this.i.stickyBucketService,t);this.i.stickyBucketAssignmentDocs=n}}generateStickyBucketAssignmentDocsSync(t,e){if(!("getAllAssignmentsSync"in t))return void console.error("generating StickyBucketAssignmentDocs docs requires StickyBucketServiceSync");const n=Qt(this.J(),e);return t.getAllAssignmentsSync(n)}inDevMode(){return!!this.i.enableDevMode}}async function ie(t){const e=new ne(t);await O({instance:e,skipCache:t.skipCache,allowStale:!1,backgroundSync:t.streaming}),e.destroy()}const re=f();class se{constructor(t){if(t=t||{},this.version=re,this.i=t,this.debug=!!t.debug,this.ready=!1,this.W={},this.X=[],this.log=this.log.bind(this),t.plugins)for(const e of t.plugins)e(this)}async setPayload(t){this.T=t;const e=await Wt(t,this.i.decryptionKey);this.M=e,e.features&&(this.W=e.features),e.experiments&&(this.X=e.experiments),e.savedGroups&&(this.i.savedGroups=e.savedGroups),this.ready=!0}initSync(t){const e=t.payload;if(e.encryptedExperiments||e.encryptedFeatures)throw new Error("initSync does not support encrypted payloads");return this.T=e,this.M=e,e.features&&(this.W=e.features),e.experiments&&(this.X=e.experiments),this.ready=!0,P(this,t),this}async init(t){if((t=t||{}).cacheSettings&&E(t.cacheSettings),t.payload)return await this.setPayload(t.payload),P(this,t),{success:!0,source:"init"};{const{data:e,...n}=await this.R({...t,allowStale:!0});return P(this,t),await this.setPayload(e||{}),n}}async refreshFeatures(t){const e=await this.R({...t||{},allowStale:!1});e.data&&await this.setPayload(e.data)}getApiInfo(){return[this.getApiHosts().apiHost,this.getClientKey()]}getApiHosts(){return Xt(this.i)}getClientKey(){return this.i.clientKey||""}getPayload(){return this.T||{features:this.getFeatures(),experiments:this.X||[]}}getDecryptedPayload(){return this.M||this.getPayload()}async R({timeout:t,skipCache:e,allowStale:n,streaming:i}){if(!this.i.clientKey)throw new Error("Missing clientKey");return O({instance:this,timeout:t,skipCache:e||this.i.disableCache,allowStale:n,backgroundSync:i??!0})}getFeatures(){return this.W||{}}getGlobalAttributes(){return this.i.globalAttributes||{}}setGlobalAttributes(t){this.i.globalAttributes=t}destroy(t){t=t||{},this.I=!0,_(this),t.destroyAllStreams&&j(),this.W={},this.X=[],this.M=void 0,this.T=void 0,this.i={}}isDestroyed(){return!!this.I}setEventLogger(t){this.i.eventLogger=t}logEvent(t,e,n){if(this.i.eventLogger){const i=this.J(n);this.i.eventLogger(t,e,i.user)}}runInlineExperiment(t,e){const{result:n}=It(t,null,this.J(e));return n}J(t){return this.i.globalAttributes&&(t={...t,attributes:{...this.i.globalAttributes,...t.attributes}}),{user:t,global:this.j(),stack:{evaluatedFeatures:new Set}}}j(){return{features:this.W,experiments:this.X,log:this.log,enabled:this.i.enabled,qaMode:this.i.qaMode,savedGroups:this.i.savedGroups,forcedFeatureValues:this.i.forcedFeatureValues,forcedVariations:this.i.forcedVariations,trackingCallback:this.i.trackingCallback,onFeatureUsage:this.i.onFeatureUsage}}isOn(t,e){return this.evalFeature(t,e).on}isOff(t,e){return this.evalFeature(t,e).off}getFeatureValue(t,e,n){const i=this.evalFeature(t,n).value;return null===i?e:i}evalFeature(t,e){return Ut(t,this.J(e))}log(t,e){this.debug&&(this.i.log?this.i.log(t,e):console.log(t,e))}setTrackingCallback(t){this.i.trackingCallback=t}setFeatureUsageCallback(t){this.i.onFeatureUsage=t}async applyStickyBuckets(t,e){const n=this.J(t),i=await Zt(n,e);return{...t,stickyBucketAssignmentDocs:i,saveStickyBucketAssignmentDoc:t=>e.saveAssignments(t)}}createScopedInstance(t,e){return new oe(this,t,[...this.i.plugins||[],...e||[]])}}class oe{constructor(t,e,n){if(this.Y=t,this.tt=e,this.logs=[],this.tt.trackedExperiments=this.tt.trackedExperiments||new Set,this.tt.trackedFeatureUsage=this.tt.trackedFeatureUsage||{},this.tt.devLogs=this.logs,n)for(const t of n)t(this)}runInlineExperiment(t){return this.Y.runInlineExperiment(t,this.tt)}isOn(t){return this.Y.isOn(t,this.tt)}isOff(t){return this.Y.isOff(t,this.tt)}getFeatureValue(t,e){return this.Y.getFeatureValue(t,e,this.tt)}evalFeature(t){return this.Y.evalFeature(t,this.tt)}logEvent(t,e){this.tt.enableDevMode&&this.logs.push({eventName:t,properties:e,timestamp:Date.now().toString(),logType:"event"}),this.Y.logEvent(t,e||{},this.tt)}setTrackingCallback(t){this.tt.trackingCallback=t}getApiInfo(){return this.Y.getApiInfo()}getClientKey(){return this.Y.getClientKey()}setURL(t){this.tt.url=t}updateAttributes(t){this.tt.attributes={...this.tt.attributes,...t}}setAttributeOverrides(t){this.tt.attributeOverrides=t}async setForcedVariations(t){this.tt.forcedVariations=t||{}}setForcedFeatures(t){this.tt.forcedFeatureValues=t}getUserContext(){return this.tt}getVersion(){return re}getDecryptedPayload(){return this.Y.getDecryptedPayload()}inDevMode(){return!!this.tt.enableDevMode}}class ue{constructor(t){this.prefix=(t=t||{}).prefix||""}async getAllAssignments(t){const e={};return(await Promise.all(Object.entries(t).map((([t,e])=>this.getAssignments(t,e))))).forEach((t=>{if(t){const n=zt(t.attributeName,t.attributeValue);e[n]=t}})),e}getKey(t,e){return`${this.prefix}${t}||${e}`}}class ae extends ue{async getAssignments(t,e){return this.getAssignmentsSync(t,e)}async saveAssignments(t){this.saveAssignmentsSync(t)}getAllAssignmentsSync(t){const e={};return Object.entries(t).map((([t,e])=>this.getAssignmentsSync(t,e))).forEach((t=>{if(t){const n=zt(t.attributeName,t.attributeValue);e[n]=t}})),e}}class ce extends ue{constructor(t){t=t||{},super(),this.prefix=t.prefix||"gbStickyBuckets__";try{this.localStorage=t.localStorage||globalThis.localStorage}catch(t){}}async getAssignments(t,e){const n=this.getKey(t,e);let i=null;if(!this.localStorage)return i;try{const t=await this.localStorage.getItem(n)||"{}",e=JSON.parse(t);e.attributeName&&e.attributeValue&&e.assignments&&(i=e)}catch(t){}return i}async saveAssignments(t){const e=this.getKey(t.attributeName,t.attributeValue);if(this.localStorage)try{await this.localStorage.setItem(e,JSON.stringify(t))}catch(t){}}}class he extends ae{constructor({prefix:t="gbStickyBuckets__",req:e,res:n,cookieAttributes:i={maxAge:15552e6}}){super(),this.prefix=t,this.req=e,this.res=n,this.cookieAttributes=i}getAssignmentsSync(t,e){const n=this.getKey(t,e);let i=null;if(!this.req)return i;try{const t=JSON.parse(this.req.cookies[n]||"{}");t.attributeName&&t.attributeValue&&t.assignments&&(i=t)}catch(t){}return i}saveAssignmentsSync(t){const e=this.getKey(t.attributeName,t.attributeValue);if(!this.res)return;const n=JSON.stringify(t);this.res.cookie(encodeURIComponent(e),encodeURIComponent(n),this.cookieAttributes)}}class le extends ae{constructor({prefix:t="gbStickyBuckets__",jsCookie:e,cookieAttributes:n={expires:180}}){super(),this.prefix=t,this.jsCookie=e,this.cookieAttributes=n}getAssignmentsSync(t,e){const n=this.getKey(t,e);let i=null;if(!this.jsCookie)return i;try{const t=this.jsCookie.get(n),e=JSON.parse(t||"{}");e.attributeName&&e.attributeValue&&e.assignments&&(i=e)}catch(t){}return i}async saveAssignmentsSync(t){const e=this.getKey(t.attributeName,t.attributeValue);if(!this.jsCookie)return;const n=JSON.stringify(t);this.jsCookie.set(e,n,this.cookieAttributes)}}class fe extends ue{constructor({redis:t}){super(),this.redis=t}async getAllAssignments(t){const e={},n=Object.entries(t).map((([t,e])=>zt(t,e)));return this.redis?(await this.redis.mget(...n).then((t=>{t.forEach((t=>{try{const n=JSON.parse(t||"{}");if(n.attributeName&&"attributeValue"in n&&n.assignments){const t=zt(n.attributeName,h(n.attributeValue));e[t]=n}}catch(t){}}))})),e):e}async getAssignments(t,e){return null}async saveAssignments(t){const e=this.getKey(t.attributeName,t.attributeValue);this.redis&&await this.redis.set(e,JSON.stringify(t))}}export{le as BrowserCookieStickyBucketService,Mt as EVENT_EXPERIMENT_VIEWED,Tt as EVENT_FEATURE_EVALUATED,he as ExpressCookieStickyBucketService,ne as GrowthBook,se as GrowthBookClient,se as GrowthBookMultiUser,ce as LocalStorageStickyBucketService,fe as RedisStickyBucketService,ue as StickyBucketService,ae as StickyBucketServiceSync,oe as UserScopedGrowthBook,C as clearCache,E as configureCache,xt as evalCondition,y as getAutoExperimentChangeType,e as getPolyfills,v as helpers,o as isURLTargeted,F as onHidden,V as onVisible,l as paddedVersionString,ie as prefetchPayload,$ as setPolyfills};
//# sourceMappingURL=esm.min.js.map