@indiegems/gem-web-sdk 24.0.0 → 24.0.1

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
- globalThis.__gemWebSdkVersion="[gem-web-sdk:sdkVersion:24.0.0]";function hn(){let t=globalThis.__gemWebSdkVersion;if(typeof t!="string")return "";let e=t.lastIndexOf(":"),n=t.lastIndexOf("]");return e<0||n<=e+1?"":t.slice(e+1,n)}function u(t){let e=String(t);if(!/^[A-Za-z0-9_.-]{1,128}$/.test(e)||e==="."||e==="..")throw new TypeError(`${JSON.stringify(e)} is not a usable path segment \u2014 it is interpolated into a URL`);return encodeURIComponent(e)}async function _n(t,e,n){let r=`/v1/inventory/transfers/${u(e)}/accept`;return t.client.post(r,void 0,n?.signal)}async function bn(t,e,n,r,i,a){let s=`/v1/inventory/${u(e)}/${u(n)}/progressions/${u(r)}/add`;return t.client.post(s,i,a?.signal)}async function Rn(t,e,n){let r=`/v1/inventory/transfers/${u(e)}/cancel`;return t.client.post(r,void 0,n?.signal)}async function wn(t,e,n,r,i,a){let s=`/v1/inventory/${u(e)}/${u(n)}/progressions/${u(r)}/claim`;return t.client.post(s,i,a?.signal)}async function vn(t,e,n){return t.client.post("/v1/characters",e,n?.signal)}async function xn(t,e,n,r,i){let a=`/v1/inventory/${u(e)}/${u(n)}/orders/batch`;return t.client.post(a,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function Sn(t,e,n,r,i){let a=`/v1/inventory/${u(e)}/${u(n)}/orders`;return t.client.post(a,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function kn(t,e,n,r,i){let a=`/v1/settings/${u(e)}/${u(n)}/${u(r)}`;return t.client.delete(a,i?.signal)}async function An(t,e,n,r,i){let a=`/v1/saves/${u(e)}/${u(n)}/${u(r)}`;return t.client.delete(a,i?.signal)}async function Pn(t,e,n,r){let i=`/v1/showcase/players/${u(e)}/${u(n)}`;return t.client.delete(i,r?.signal)}async function On(t,e,n,r,i){let a=`/v1/inventory/${u(e)}/${u(n)}/recipes/execute`;return t.client.post(a,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function In(t,e,n,r,i,a){let s=`/v1/saves/${u(e)}/${u(n)}/${u(r)}/finalize`;return t.client.post(s,i,a?.signal)}async function Gn(t,e,n){let r=`/v1/characters/${u(e)}`;return t.client.get(r,n?.signal)}async function Cn(t,e,n,r,i){let a=`/v1/settings/${u(e)}/${u(n)}/${u(r)}`;return t.client.getWithEtag(a,{...i?.signal===void 0?{}:{signal:i.signal},...i?.ifNoneMatch===void 0?{}:{ifNoneMatch:i.ifNoneMatch}})}async function Tn(t,e,n,r){let i=new URLSearchParams;r?.include_buckets!==void 0&&i.set("include_buckets",String(r?.include_buckets)),r?.include_custom_data!==void 0&&i.set("include_custom_data",String(r?.include_custom_data)),r?.currency_limit!==void 0&&i.set("currency_limit",String(r?.currency_limit)),r?.currency_cursor!==void 0&&i.set("currency_cursor",String(r?.currency_cursor)),r?.item_limit!==void 0&&i.set("item_limit",String(r?.item_limit)),r?.item_cursor!==void 0&&i.set("item_cursor",String(r?.item_cursor)),r?.progression_limit!==void 0&&i.set("progression_limit",String(r?.progression_limit)),r?.progression_cursor!==void 0&&i.set("progression_cursor",String(r?.progression_cursor));let a=i.toString(),s=`/v1/inventory/${u(e)}/${u(n)}`+(a?`?${a}`:"");return t.client.get(s,r?.signal)}async function En(t,e,n,r,i){let a=`/v1/inventory/${u(e)}/${u(n)}/items/${u(r)}`;return t.client.get(a,i?.signal)}async function Ln(t,e,n,r,i){let a=new URLSearchParams;i?.bucket_1!==void 0&&a.set("bucket_1",String(i?.bucket_1)),i?.bucket_2!==void 0&&a.set("bucket_2",String(i?.bucket_2)),i?.limit!==void 0&&a.set("limit",String(i?.limit)),i?.periods_back!==void 0&&a.set("periods_back",String(i?.periods_back)),i?.period!==void 0&&a.set("period",String(i?.period)),i?.player_id!==void 0&&a.set("player_id",String(i?.player_id));let s=a.toString(),o=`/v1/leaderboards/${u(e)}/${u(n)}/${u(r)}`+(s?`?${s}`:"");return t.client.get(o,i?.signal)}async function Mn(t,e,n,r,i){let a=`/v1/inventory/${u(e)}/${u(n)}/orders/${u(r)}`;return t.client.get(a,i?.signal)}async function qn(t,e,n,r,i){let a=`/v1/inventory/${u(e)}/${u(n)}/progressions/${u(r)}`;return t.client.get(a,i?.signal)}async function Fn(t,e,n,r,i,a){let s=`/v1/inventory/${u(e)}/${u(n)}/catalogs/${u(r)}/recipes/${u(i)}/availability`;return t.client.get(s,a?.signal)}async function $n(t,e,n,r){let i=new URLSearchParams;i.set("limit",String(r?.limit));let a=i.toString(),s=`/v1/inventory/${u(e)}/${u(n)}/recipe-usage`+(a?`?${a}`:"");return t.client.get(s,r?.signal)}async function je(t,e,n,r,i){let a=`/v1/saves/${u(e)}/${u(n)}/${u(r)}`;return t.client.getWithEtag(a,{...i?.signal===void 0?{}:{signal:i.signal},...i?.ifNoneMatch===void 0?{}:{ifNoneMatch:i.ifNoneMatch}})}async function jn(t,e,n){let r=new URLSearchParams;n?.bucket_1!==void 0&&r.set("bucket_1",String(n?.bucket_1)),n?.bucket_2!==void 0&&r.set("bucket_2",String(n?.bucket_2)),n?.periods_back!==void 0&&r.set("periods_back",String(n?.periods_back)),n?.period!==void 0&&r.set("period",String(n?.period)),n?.player_id!==void 0&&r.set("player_id",String(n?.player_id));let i=r.toString(),a=`/v1/leaderboards/${u(e)}/friends`+(i?`?${i}`:"");return t.client.get(a,n?.signal)}async function Dn(t,e,n){let r=`/v1/showcase/friends/${u(e)}`;return t.client.get(r,n?.signal)}async function Nn(t,e,n){let r=`/v1/inbox/friend-challenges/${u(e)}`;return t.client.get(r,n?.signal)}async function Bn(t,e,n){let r=new URLSearchParams;n?.bucket_1!==void 0&&r.set("bucket_1",String(n?.bucket_1)),n?.bucket_2!==void 0&&r.set("bucket_2",String(n?.bucket_2)),n?.periods_back!==void 0&&r.set("periods_back",String(n?.periods_back)),n?.period!==void 0&&r.set("period",String(n?.period)),n?.player_id!==void 0&&r.set("player_id",String(n?.player_id));let i=r.toString(),a=`/v1/leaderboards/${u(e)}`+(i?`?${i}`:"");return t.client.get(a,n?.signal)}async function Un(t,e){let n=`/v1/games/${u(t.gameId())}/players/me/earn-allowance`;return t.client.get(n,e?.signal)}async function Vn(t,e){let n=`/v1/games/${u(t.gameId())}/players/me/passes`;return t.client.get(n,e?.signal)}async function Re(t,e){return t.client.get("/v1/inventory/players/me/platform-currencies",e?.signal)}async function Wn(t,e,n){let r=`/v1/profiles/players/${u(e)}`;return t.client.get(r,n?.signal)}async function Hn(t,e){let n=new URLSearchParams;e?.config_version!==void 0&&n.set("config_version",String(e?.config_version));let r=n.toString(),i="/v1/inventory/platform-funded-game-inventory-purchase-catalog"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function Jn(t,e,n,r){let i=`/v1/showcase/players/${u(e)}/${u(n)}`;return t.client.get(i,r?.signal)}async function zn(t,e){return t.client.get("/v1/characters/slots",e?.signal)}async function Kn(t,e,n){let r=`/v1/inventory/transfers/${u(e)}`;return t.client.get(r,n?.signal)}async function Yn(t,e,n){let r=`/v1/games/${u(t.gameId())}/analytics/events`;return t.client.post(r,e,n?.signal,{...n?.keepalive===void 0?{}:{keepalive:n.keepalive},replaySafe:true,retryRateLimited:false})}async function Xn(t,e,n){return t.client.post("/v1/inventory/transfers",e,n?.signal)}async function Qn(t,e,n,r,i){let a=`/v1/inventory/${u(e)}/${u(n)}/platform-funded-game-inventory-purchases`;return t.client.post(a,r,i?.signal)}async function Zn(t,e){let n=new URLSearchParams;e?.periods_back!==void 0&&n.set("periods_back",String(e?.periods_back)),e?.player_id!==void 0&&n.set("player_id",String(e?.player_id));let r=n.toString(),i="/v1/challenges"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function et(t,e){return t.client.get("/v1/characters",e?.signal)}async function nt(t,e,n,r){let i=`/v1/settings/${u(e)}/${u(n)}`;return t.client.get(i,r?.signal)}async function tt(t,e,n,r){let i=new URLSearchParams;r?.limit!==void 0&&i.set("limit",String(r?.limit)),r?.cursor!==void 0&&i.set("cursor",String(r?.cursor));let a=i.toString(),s=`/v1/inventory/${u(e)}/${u(n)}/orders`+(a?`?${a}`:"");return t.client.get(s,r?.signal)}async function rt(t,e,n,r){let i=new URLSearchParams;r?.limit!==void 0&&i.set("limit",String(r?.limit)),r?.cursor!==void 0&&i.set("cursor",String(r?.cursor));let a=i.toString(),s=`/v1/saves/${u(e)}/${u(n)}`+(a?`?${a}`:"");return t.client.get(s,r?.signal)}async function it(t,e){let n=new URLSearchParams;e?.cursor!==void 0&&n.set("cursor",String(e?.cursor)),e?.limit!==void 0&&n.set("limit",String(e?.limit));let r=n.toString(),i="/v1/inbox/friend-challenges"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function at(t,e){let n=new URLSearchParams;e?.limit!==void 0&&n.set("limit",String(e?.limit)),e?.cursor!==void 0&&n.set("cursor",String(e?.cursor));let r=n.toString(),i="/v1/friends"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function st(t,e){let n=new URLSearchParams;e.entity_type!==void 0&&n.set("entity_type",String(e.entity_type)),e.entity_id!==void 0&&n.set("entity_id",String(e.entity_id)),e?.direction!==void 0&&n.set("direction",String(e?.direction)),e?.status!==void 0&&n.set("status",String(e?.status)),e?.cursor!==void 0&&n.set("cursor",String(e?.cursor)),e?.limit!==void 0&&n.set("limit",String(e?.limit));let r=n.toString(),i="/v1/inventory/transfers"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function ot(t,e,n){let r=`/v1/inbox/friend-challenges/${u(e)}/answered`;return t.client.post(r,void 0,n?.signal)}async function lt(t,e,n,r,i,a){let s=`/v1/inventory/${u(e)}/${u(n)}/progressions/${u(r)}/max`;return t.client.post(s,i,a?.signal)}async function dt(t,e,n,r,i,a){let s=`/v1/settings/${u(e)}/${u(n)}/${u(r)}`;return t.client.put(s,i,a?.signal,{...a?.ifMatch===void 0?{}:{ifMatch:a.ifMatch}})}async function ut(t,e,n,r,i){let a=`/v1/showcase/players/${u(e)}/${u(n)}`;return t.client.put(a,r,i?.signal)}async function ct(t,e,n){let r=`/v1/inventory/transfers/${u(e)}/reject`;return t.client.post(r,void 0,n?.signal)}async function pt(t,e,n,r){let i=`/v1/characters/${u(e)}`;return t.client.patch(i,n,r?.signal)}async function gt(t,e,n,r,i,a){let s=`/v1/saves/${u(e)}/${u(n)}/${u(r)}/upload-url`;return t.client.post(s,i,a?.signal,{replaySafe:true})}async function mt(t,e,n,r,i,a){let s=`/v1/inventory/${u(e)}/${u(n)}/progressions/${u(r)}/reset`;return t.client.post(s,i,a?.signal)}async function yt(t,e,n){let r=`/v1/characters/${u(e)}`;return t.client.delete(r,n?.signal)}function ft(t,e){let n=e?.retryAfterSeconds,r=typeof n=="number"&&Number.isFinite(n)&&n>0?n*1e3:0,i=1e4*2**Math.min(Math.max(0,t-1),16);return Math.min(Math.max(r,i),3e5)}var xr="gem_";function De(t){return t.startsWith(xr)}function Sr(t){let e=2166136261;for(let n of new TextEncoder().encode(t))e^=n,e=Math.imul(e,16777619);return e>>>0}function kr(t){let e=t;return e^=e>>>16,e=Math.imul(e,2246822507),e^=e>>>13,e=Math.imul(e,3266489909),e^=e>>>16,e>>>0}function Ne(t,e,n){if(Be(t,n),typeof e!="string"||e==="")throw new TypeError("[gem] experiment: playerId must be a non-empty string");let r=typeof n=="number"?n:n.length,i=kr(Sr(`${t}:${e}`))%r;return typeof n=="number"?i:n[i]}function Be(t,e){if(typeof t!="string"||t==="")throw new TypeError("[gem] experiment: key must be a non-empty string");if(typeof e=="number"){if(!Number.isInteger(e)||e<1||e>2048)throw new RangeError(`[gem] experiment '${t}': the count must be an integer from 1 to 2048; got ${String(e)}`);return}if(!Array.isArray(e))throw new TypeError(`[gem] experiment '${t}': pass a count or a list of strings; got ${typeof e}`);let n=e;if(n.length<1||n.length>2048)throw new RangeError(`[gem] experiment '${t}': the list must hold 1 to 2048 strings; got ${n.length}`);if(!n.every(r=>typeof r=="string"))throw new TypeError(`[gem] experiment '${t}': every option must be a string`)}var ht=1e4,_t=50,Or=500,Ir=65536-4*1024,Gr=24*1024;function bt(t){let e={},n={};for(let[r,i]of Object.entries(t))typeof i=="string"?e[r]=i:typeof i=="number"&&Number.isFinite(i)&&(n[r]=i);return {dimensions:e,measures:n}}var Cr=6e4;function Tr(t){let e=new Map;for(let n of t??[]){let r=new Set;for(let[i,a]of Object.entries(n.dimensions??{})){let s=a?.range;typeof s=="object"&&s!==null&&r.add(i);}r.size>0&&e.set(n.id,r);}return e}function Er(t,e){if(e===void 0)return t;let n=null,r={};for(let[i,a]of Object.entries(t.measures))e.has(i)?(n??={...t.dimensions})[i]=String(a):r[i]=a;return n===null?t:{dimensions:n,measures:r}}var Rt=t=>typeof t=="number"?t:0,Lr=t=>typeof t=="string"?t:"";function we(t=0){return {accepted:0,rejected:[],dropped:t,duplicate:false}}function Mr(t,e){let n=t??{},r=Array.isArray(n.rejected)?n.rejected.map(i=>{let a=i??{};return {index:Rt(a.index),code:Lr(a.code)}}):[];return {accepted:Rt(n.accepted),rejected:r,dropped:e,duplicate:n.duplicate===true}}function Ue(){let t=globalThis.crypto;return typeof t?.randomUUID=="function"?t.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let n=Math.floor(Math.random()*16);return (e==="x"?n:n&3|8).toString(16)})}function qr(t){return t?.retryable===true}var J=class{#e;#t;#i;#o;#n=[];#_={};#s=0;#l=null;#b=false;#R=false;#g=0;#w=0;#v=0;#r=false;#x=null;#d=null;#c=false;#a=false;#m=false;#S=false;#k=false;#y=void 0;#A=false;#P=0;constructor(e){this.#e=e,this.#t=e.options?.enabled!==false,this.#i=Math.max(ht,e.options?.flushIntervalMs??ht),this.#o=Math.max(1,Math.floor(e.options?.maxQueue??Or));}track(e,n={}){if(!this.#t||this.#r)return;if(De(e)){this.#k||(this.#k=true,this.#h(`[gem] analytics: '${e}' was not recorded \u2014 the gem_ prefix is reserved for the platform's own events, which the SDK emits for you. Name your event something else.`));return}this.#O(e,bt({...this.#_,...n}));let r=this.#C();this.#y===void 0&&!this.#A&&r!==null&&r!==""&&(this.#A=true,this.#T());}setContext(e){this.#_={...this.#_,...e};}async experiment(e,n){Be(e,n);let r=this.#e.awaitPlayerId===void 0?this.#e.playerId():await this.#e.awaitPlayerId();if(r===null)throw new Error(`[gem] experiment '${e}': no player to select for \u2014 this call was not made by a player.`);return typeof n=="number"?Ne(e,r,n):Ne(e,r,n)}get environment(){let e=this.#e.environment;return {...typeof e=="function"?e():e??{}}}async flush(e={}){if(this.#a)return we();let n=this.#C();if(n===null||n==="")return this.#n.length>0&&!this.#S&&(this.#S=true,this.#h("[gem] analytics: events are being recorded but no play session has been established, so nothing is being sent. Outside the arcade this is expected.")),we();let r=e.keepalive===true;if(!r&&this.#e.declarations!==void 0&&this.#n.some(c=>!De(c.name))&&await this.#T(),this.#G(),this.#n.length===0||this.#g>0&&!r)return we();this.#p();let i=this.#n.splice(0,this.#L(r)),a=this.#s;this.#s=0;let s=Math.round(this.#e.clock.now()),o={batch_id:Ue(),sent_at_ms:s,events:i.map(c=>wt(c,s,this.#y?.get(c.name)))},l={client:this.#e.client(),gameId:()=>n};this.#g+=1;try{let c=await Yn(l,o,{...e.signal===void 0?{}:{signal:e.signal},...r?{keepalive:!0}:{}}),g=Mr(c,a);return this.#w=0,this.#v=0,this.#M(g),g}catch(c){throw qr(c)?(this.#E(i,a),this.#w+=1,this.#v=this.#e.clock.now()+ft(this.#w,c)):this.#h(`[gem] analytics: ${i.length} event(s) were discarded \u2014 the platform refused the batch and will refuse it again: ${String(c)}`),c}finally{this.#g-=1,this.#n.length>0&&this.#u();}}trackPlatform(e,n={}){this.#r||this.#a&&(e==="gem_pause"||e==="gem_resume")||this.#O(e,bt(n));}hold(){this.#r||this.#d!==null||(this.#a=true,this.#p());}release(){if(!this.#a||this.#r)return;this.#a=false;let e=this.#e.clock.now(),n=this.#n.map(r=>({...r,atMs:e}));this.#n=n,this.#m&&(this.#m=false,this.#d=e,this.#c=false,this.#n.unshift({uid:Ue(),name:"gem_session_start",atMs:e,dimensions:{},measures:{}})),this.#n.length>=_t?this.#f():this.#n.length>0&&this.#u();}get held(){return this.#a}startSession(){if(!(this.#r||this.#d!==null)){if(this.#a){this.#m=true;return}this.#d=this.#e.clock.now(),this.#c=false,this.trackPlatform("gem_session_start");}}endSession(e){if(this.#r||this.#c)return;if(this.#c=true,this.#a){this.#m=false,this.#n=[],this.#s=0;return}let n=this.#d;this.trackPlatform("gem_session_end",{reason:e,...n===null?{}:{duration_ms:Math.max(0,Math.round(this.#e.clock.now()-n))}}),this.#f({keepalive:true});}setPaused(e){this.#r||e===this.#b||(this.#b=e,this.trackPlatform(e?"gem_pause":"gem_resume"),e?this.#p():this.#n.length>0&&this.#u());}setHidden(e){this.#r||e===this.#R||(this.#R=e,e?this.#p():this.#n.length>0&&this.#u());}dispose(){this.#r=true,this.#p(),this.#n=[],this.#s=0;}get pending(){return this.#n.length}#O(e,n){let{dimensions:r,measures:i}=n;for(this.#G();this.#n.length>=this.#o;)this.#n.shift(),this.#s+=1;this.#n.push({uid:Ue(),name:e,atMs:this.#e.clock.now(),dimensions:r,measures:i}),this.#n.length>=_t?this.#f():this.#u();}#f(e={}){if(e.keepalive!==true&&this.#I()>0){this.#u();return}this.flush(e).catch(()=>{});}#I(){return Math.max(0,this.#v-this.#e.clock.now())}#E(e,n){for(this.#n=[...e,...this.#n],this.#s+=n;this.#n.length>this.#o;)this.#n.shift(),this.#s+=1;}#L(e){let n=e?Gr:Ir,r=Math.min(this.#n.length,100),i=128;for(let a=0;a<r;a+=1){let s=this.#n[a];if(s===void 0)break;if(i+=JSON.stringify(wt(s,0,this.#y?.get(s.name))).length+1,i>n)return Math.max(1,a)}return r}#u(){this.#l!==null||this.#b||this.#R||this.#a||this.#r||this.#g>0||(this.#l=this.#e.clock.setTimeout(()=>{this.#l=null,this.#f();},Math.max(this.#i,this.#I())));}#p(){this.#l!==null&&(this.#e.clock.clearTimeout(this.#l),this.#l=null);}#G(){let e=this.#q();e===null||e===""||(this.#x!==null&&this.#x!==e&&(this.#n=[],this.#s=0,this.#d=null,this.#c=false),this.#x=e);}#M(e){for(let n of e.rejected)this.#h(`[gem] analytics: an event was refused (${n.code}). `+Fr(n.code));}#h(e){let n=this.#e.log;n!==null&&(n===void 0?console.warn(e):n(e));}#C(){try{return this.#e.gameId()}catch{return null}}#q(){try{return this.#e.playerId()}catch{return null}}async#T(){let e=this.#e.declarations;if(e!==void 0&&!(this.#e.clock.now()<this.#P))try{this.#y=Tr(await e());}catch{this.#P=this.#e.clock.now()+Cr;}}};function wt(t,e,n){let{dimensions:r,measures:i}=Er(t,n);return {event_uid:t.uid,name:t.name,offset_ms:Math.round(t.atMs)-e,dimensions:r,measures:i}}function Fr(t){switch(t){case "analytics_not_declared":return "This channel has no analytics_events section at all \u2014 promote a game config that declares one. The gem_* events in the same batch were still recorded.";case "unknown_event":return "This channel declares a set of events and this name is not in it \u2014 check the spelling, or declare it in analytics_events.";case "unknown_dimension":return "A string property on this event is not declared as one of its dimensions.";case "missing_dimension":return "A dimension this event declares was not supplied.";case "dimension_value_not_declared":return "A dimension value is outside the closed set the config declares for it.";case "unknown_measure":return "A numeric property on this event is not declared as one of its measures.";case "measure_wrong_type":return "A measure was the wrong shape \u2014 an int measure refuses a fractional value.";case "source_not_permitted":return "This event is declared for the server only, so a client may not emit it.";default:return "See the analytics_events section of your game config."}}var $r={initialDelayMs:2e3,maxDelayMs:6e4};function jr(t,e){return e!==void 0?!e:t==="chain_exhausted"}var ve=class{constructor(e){this.options=e;}options;grant=null;state="pending";failure=null;generation=0;inFlight=null;rejected=false;retry=null;failures=0;notBefore=0;disposed=false;get currentState(){return this.state}get lastFailure(){return this.failure}async get(){if(this.state==="lost")throw new x(this.failure??"unavailable","the session cannot be renewed");let e=this.seconds();if(this.grant&&e<this.grant.expiresAt-this.renewBefore())return this.grant.token;if(this.pastChainCeiling())throw new x("chain_exhausted","the token chain reached its ceiling");if(this.inFlight===null&&this.options.clock.now()<this.notBefore)throw new x(this.failure??"unavailable","the embedder asked for no new token yet; one is asked for when that wait is over");return this.refresh(this.nextReason())}pastChainCeiling(){return this.grant===null||this.seconds()<this.grant.chainEndsAt?false:(this.enter("lost","chain_exhausted"),true)}nextReason(){return this.rejected?"rejected":this.grant?"expiring":"initial"}invalidate(e){e!==void 0&&this.grant!==null&&this.grant.token!==e||this.rejected&&this.grant===null||(this.grant=null,this.generation+=1,this.inFlight=null,this.rejected=true,this.state!=="lost"&&this.enter("pending"));}accept(e){this.state!=="lost"&&(this.grant=e,this.rejected=false,this.enter("ready"));}close(e="unavailable"){this.grant=null,this.generation+=1,this.inFlight=null,this.enter("lost",e);}dispose(){this.disposed=true,this.cancelRetry();}scheduleRetry(e){if(this.cancelRetry(),this.failures+=1,this.notBefore=e===void 0?0:this.options.clock.now()+e,this.disposed)return;let{initialDelayMs:n,maxDelayMs:r}=$r,i=Math.min(r,n*2**(this.failures-1)),a=Math.max(i/2,e??0)+Math.random()*(i/2);this.retry={handle:this.options.clock.setTimeout(()=>this.retryNow(),a)};}retryNow(){this.retry=null,this.notBefore=0,!(this.state==="lost"||this.pastChainCeiling())&&this.refresh(this.nextReason()).catch(()=>{});}cancelRetry(){this.retry!==null&&(this.options.clock.clearTimeout(this.retry.handle),this.retry=null);}refresh(e){if(this.inFlight)return this.inFlight;this.cancelRetry();let n=this.generation;this.enter("pending");let r=this.options.request(e).then(i=>{if(n!==this.generation)throw new x("internal","token arrived for a superseded generation");return this.grant=i,this.rejected=false,this.enter("ready"),i.token}).catch(i=>{let a=Dr(i),{retryable:s,retryAfterMs:o}=i??{};throw n===this.generation&&(jr(a,typeof s=="boolean"?s:void 0)?this.enter("lost",a):(this.scheduleRetry(typeof o=="number"&&Number.isFinite(o)&&o>0?o:void 0),this.enter("degraded",a))),i instanceof x?i:new x(a,String(i))}).finally(()=>{this.inFlight===r&&(this.inFlight=null);});return this.inFlight=r,r}enter(e,n){(e==="ready"||e==="lost")&&this.cancelRetry(),e==="ready"&&(this.failures=0,this.notBefore=0),this.failure=n??(e==="ready"?null:this.failure),this.state!==e&&(this.state=e,this.options.onStateChange?.(e,n));}renewBefore(){return this.options.renewBeforeSeconds??60}seconds(){return Math.floor(this.options.clock.now()/1e3)}},x=class t extends Error{constructor(n,r){super(`auth ${n}: ${r}`);this.reason=n;this.name="AuthError";}reason;static isAuthError(n){if(n instanceof t)return true;let r=n;return r?.name==="AuthError"&&typeof r.reason=="string"}};function Dr(t){if(t instanceof x)return t.reason;let e=t?.reason;return typeof e=="string"&&["chain_exhausted","unavailable","timeout","internal"].includes(e)?e:"internal"}var v=class t extends Error{retryable=false;constructor(e){super(e),this.name="TransportRefusal";}static isRefusal(e){if(e instanceof t)return true;let n=e;return n?.name==="TransportRefusal"&&n.retryable===false}},N=["if-match","if-none-match"],vt=4096;function Nr(t){if(!t)return;let e={};for(let[n,r]of Object.entries(t)){let i=n.toLowerCase();if(!N.includes(i)||r===void 0)continue;let a=typeof r=="string"?Br(r):r;if(typeof a!="string"||a.length>vt||!Ur(a))throw new v(`the ${i} header value cannot be sent \u2014 it is not a string, is longer than ${vt} characters, or contains a character outside the range an HTTP header value may carry. This is a malformed request, not a server failure; the value is withheld here rather than written to logs.`);a!==""&&(e[i]=a);}return Object.freeze(e)}function Br(t){let e=i=>i===32||i===9||i===10||i===13,n=0,r=t.length;for(;n<r&&e(t.charCodeAt(n));)n++;for(;r>n&&e(t.charCodeAt(r-1));)r--;return t.slice(n,r)}function Ur(t){for(let e=0;e<t.length;e++){let n=t.charCodeAt(e);if(n!==9&&(n<32||n===127||n>255))return false}return true}function Vr(t){let{bytes:e}=t;if(e!==void 0){if(Object.prototype.toString.call(e)!=="[object Uint8Array]")throw new v("the raw body is not a Uint8Array, so it cannot be sent as bytes. This is a malformed request, not a server failure.");if(t.body!==void 0)throw new v("the request carries both a JSON body and a raw body, and only one can be sent. This is a malformed request, not a server failure.");return new Uint8Array(e)}}function xt(t,e){let n=e.replayUnauthorizedOnce??true;return {async request(r){let i={...r},a=Nr(i.headers),s=Vr(i),o=Object.freeze({...i,headers:a,...s===void 0?{}:{bytes:s}}),l=await e.tokenSource.get(),c=await t(o,l);if(c.status!==401||!n)return c;e.tokenSource.invalidate(l);let g=await e.tokenSource.get(),p=await t(o,g);if(p.status===401)throw e.tokenSource.close("unavailable"),new x("unavailable","the server refused a freshly minted token");return p}}}function xe(t){let e=typeof t=="string"?new TextEncoder().encode(t):t;return btoa(Wr(e))}function St(t){let e=atob(t),n=new Uint8Array(e.length);for(let r=0;r<e.length;r+=1)n[r]=e.charCodeAt(r);return n}function Ve(t){return new TextDecoder().decode(St(t))}function Wr(t){let n="";for(let r=0;r<t.length;r+=32768)n+=String.fromCharCode(...t.subarray(r,r+32768));return n}var f=class extends Error{constructor(n,r,i,a,s){super(`${n} (${r}): ${i}`);this.reason=n;this.status=r;this.detail=i;this.retryAfterSeconds=a;this.code=s;this.name="GemApiError";}reason;status;detail;retryAfterSeconds;code;get retryable(){return this.reason==="unavailable"||this.reason==="rate_limited"}},Hr=new WeakMap;var Jr=new Set([408,429,500,502,503,504]),zr=6e4,Pt=new WeakMap;function Ot(t,e){Pt.set(t,e);}function kt(t){return t!==null&&(t.reason==="rate_limited"||t.retryAfterSeconds!==void 0)}function Kr(t){if(t===void 0)return 2;if(!Number.isInteger(t)||t<0||t>10)throw new v(`maxRetries must be a whole number between 0 and 10; received ${JSON.stringify(t)}. This is a configuration fault, not a server failure.`);return t}var K=class{constructor(e){this.options=e;}options;async get(e,n){return this.send({method:"GET",path:e,signal:n},true)}async getWithEtag(e,n={}){let r=await this.sendRaw({method:"GET",path:e,...n.signal===void 0?{}:{signal:n.signal},...n.ifNoneMatch===void 0?{}:{headers:{"if-none-match":n.ifNoneMatch}}},true),i=r.etag===void 0?{}:{etag:r.etag};return r.status===304?{modified:false,...i}:{modified:true,body:r.body,...i}}async put(e,n,r,i={}){return this.send({method:"PUT",path:e,body:n,signal:r,...z(i)},i.replaySafe===true,i.retryRateLimited!==false)}async post(e,n,r,i={}){return this.send({method:"POST",path:e,body:n,signal:r,...z(i)},i.replaySafe===true,i.retryRateLimited!==false)}async postBytes(e,n,r,i={}){let a=await this.sendRaw({method:"POST",path:e,bytes:n,responseType:"bytes",signal:r,...z(i)},i.replaySafe===true,i.retryRateLimited!==false);return {bytes:Yr(a.body),...a.invocationId===void 0?{}:{invocationId:a.invocationId}}}async patch(e,n,r,i={}){return this.send({method:"PATCH",path:e,body:n,signal:r,...z(i)},i.replaySafe===true,i.retryRateLimited!==false)}async delete(e,n,r={}){return this.send({method:"DELETE",path:e,signal:n,...z(r)},r.replaySafe===true,r.retryRateLimited!==false)}async send(e,n,r=true){return (await this.sendRaw(e,n,r)).body}async sendRaw(e,n,r=true){let i=n?Kr(this.options.maxRetries)+1:1,a=null;if(e.signal?.aborted)throw At(e.signal);let s=e.signal===void 0?void 0:Pt.get(e.signal);for(let o=0;o<i;o++){if(o>0){let g=this.backoffMs(o,a);if(kt(a)&&s!==void 0&&g>=s())throw a;await this.backoff(g,e.signal);}if(e.signal?.aborted)throw kt(a)&&s!==void 0&&s()<=0?a:At(e.signal);let l;try{l=await this.options.transport.request(e);}catch(g){if(x.isAuthError(g)||v.isRefusal(g)||e.signal?.aborted||Xr(g))throw g;a=new f("unavailable",0,String(g));continue}if(l.status>=200&&l.status<300||l.status===304)return l;let c=Qr(l);if(!Jr.has(l.status)||l.status===429&&!r)throw c;a=c;}throw a??new f("unavailable",0,"no attempt was made")}backoffMs(e,n){let r=n?.retryAfterSeconds,i=r!==void 0?r*1e3:2**(e-1)*250,a=2**(e-1)*250;return Math.min(Math.max(i,a),zr)}backoff(e,n){return n?.aborted?Promise.resolve():new Promise(r=>{let i=this.options.clock,a=false,s=false,o,l=()=>{a||(a=true,s&&i.clearTimeout(o),n?.removeEventListener("abort",l),r());};n?.addEventListener("abort",l,{once:true}),o=i.setTimeout(l,e),s=true,a&&i.clearTimeout(o);})}};function Yr(t){if(t instanceof Uint8Array)return t;if(t==null)return new Uint8Array(0);let e=typeof t=="string"?t:JSON.stringify(t);return new TextEncoder().encode(e)}function z(t){return {...t.keepalive===void 0?{}:{keepalive:t.keepalive},...t.ifMatch===void 0?{}:{headers:{"if-match":t.ifMatch}}}}function At(t){return t.reason!==void 0?t.reason:new DOMException("The operation was aborted.","AbortError")}function Xr(t){let e=t?.name;return e==="AbortError"||e==="TimeoutError"}function Qr(t){let e=ei(t),n=ti(t.body),r={...n===void 0?{}:{details:n},...t.invocationId===void 0?{}:{invocationId:t.invocationId}};return Object.keys(r).length>0&&Hr.set(e,r),e}var Zr=new Map([["insufficient_funds","insufficient_funds"]]);function ei(t){let{status:e,body:n}=t,r=ni(n),i=t.retryAfterSeconds??ii(n),a=ri(n),s=a===void 0?void 0:Zr.get(a);if(s!==void 0)return new f(s,e,r,void 0,a);switch(e){case 304:return new f("not_modified",e,r);case 400:case 422:return new f("invalid",e,r,void 0,a);case 403:return new f("forbidden",e,r,void 0,a);case 404:return new f("not_found",e,r,void 0,a);case 402:return new f("insufficient_funds",e,r,void 0,a);case 409:return new f("conflict",e,r,void 0,a);case 412:return new f("precondition_failed",e,r,void 0,a);case 413:return new f("too_large",e,r,void 0,a);case 429:return new f("rate_limited",e,r,i,a);default:return new f("unavailable",e,r,i,a)}}function ni(t){if(typeof t=="string")return t;let e=t?.message;if(typeof e=="string")return e;let n=t?.error;if(typeof n=="string")return n;let r=n?.message;return typeof r=="string"?r:"no detail"}function ti(t){let n=t?.error?.details;return n===null?void 0:n}function ri(t){let n=t?.error?.code;return typeof n=="string"&&n.length>0?n:void 0}function ii(t){let e=t?.retryAfterSeconds;return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function ai(t){let e=t.lastIndexOf("@");return (e===-1?t:`***@${t.slice(e+1)}`).slice(0,200)}var si=new Set(N);function oi(t){if(!t)return {};let e={};for(let[n,r]of Object.entries(t))si.has(n.toLowerCase())&&(e[n.toLowerCase()]=r);return e}function It(t){let e=t.fetch??globalThis.fetch.bind(globalThis);return xt(async(n,r)=>{let i;try{i=new URL(t.baseUrl.replace(/\/+$/,""));}catch{throw new v("the configured baseUrl is not a valid URL. Its value is withheld here rather than written to logs. This is a configuration fault, not a server failure.")}let a;try{a=new URL(i.href.replace(/\/+$/,"")+n.path);}catch{throw new v(`${JSON.stringify(typeof n.path=="string"?ai(n.path):"(a non-string path)")} does not form a valid URL against ${i.protocol}//${i.host}. This is a malformed request, not a server failure.`)}if(a.protocol!==i.protocol||a.host!==i.host)throw new v(`${JSON.stringify(a.pathname)} resolves to ${a.protocol}//${a.host}, not ${i.protocol}//${i.host}. A request path may not change the request's origin \u2014 it carries the play token.`);if(a.username!==""||a.password!==""){let y=i.username!==""||i.password!=="",R=a.username!==i.username||a.password!==i.password,L=y?R?"baseUrl (and possibly the request path)":"baseUrl":"request path";throw new v(`the ${L} puts credentials in the URL, which cannot be fetched (${n.method} ${a.pathname}). The value is withheld here rather than written to logs. This is a malformed request, not a server failure.`)}for(let[y,R]of Object.entries(t.defaultQuery??{}))a.searchParams.has(y)||a.searchParams.set(y,R);let s=n.bytes,o=n.bytes===void 0?void 0:"application/octet-stream";try{n.body!==void 0&&(s=JSON.stringify(n.body),o="application/json");}catch(y){throw new v(`the body of ${n.method} ${JSON.stringify(a.pathname)} could not be serialised to JSON: ${String(y)}. This is a bug in the request, not a server failure \u2014 retrying sends the same unserialisable value.`)}let l=await e(a.toString(),{method:n.method,headers:{authorization:`Bearer ${r}`,...o===void 0?{}:{"content-type":o},...oi(n.headers)},body:s,signal:n.signal,...n.keepalive===void 0?{}:{keepalive:n.keepalive},credentials:"omit",mode:"cors",redirect:"error",cache:"no-store",referrerPolicy:"no-referrer"}),c=null;if(n.responseType==="bytes"&&l.status>=200&&l.status<300)c=new Uint8Array(await l.arrayBuffer());else {let y=await l.text();if(y.length>0)try{c=JSON.parse(y);}catch{c=y;}}let g=l.headers.get("etag"),p=We(l.headers.get("retry-after")),h=l.headers.get("x-gem-invocation-id");return {status:l.status,body:c,...g===null?{}:{etag:g},...p===void 0?{}:{retryAfterSeconds:p},...h===null||h===""?{}:{invocationId:h}}},t)}function We(t){if(t===null)return;let e=t.trim();if(!/^\d+$/.test(e))return;let n=Number(e);return Number.isFinite(n)?n:void 0}var Gt=400,P=t=>typeof t=="string"?t:"",li=/(?:Z|[+-]\d{2}:?\d{2})$/i;function q(t){let e=P(t);if(!li.test(e))return 0;let n=Date.parse(e);return Number.isFinite(n)?Math.floor(n/1e3):0}var di=/^[0-9a-f]{1,64}$/,ui=/^[0-9a-f]{16}$/,ci=/^[A-Za-z][A-Za-z0-9_+\-/]{0,63}$/,pi=/^(?:[01]\d|2[0-3]):[0-5]\d$/;function He(t){let e=P(t),n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!n)return;let[r,i,a]=[Number(n[1]),Number(n[2]),Number(n[3])],s=new Date(Date.UTC(r,i-1,a));return s.getUTCFullYear()===r&&s.getUTCMonth()===i-1&&s.getUTCDate()===a?e:void 0}var gi=4096,mi=new TextEncoder;function yi(t){let e=P(t.challenge_data),n=P(t.challenge_data_hash);return e===""||!ui.test(n)?{}:mi.encode(e).length>gi?{}:{data:e,dataHash:n}}function fi(t){let e=t??{},n=q(e.period_start_at),r=q(e.period_ends_at);if(n===0||r===0)return;let i=P(e.slug),a=P(e.seed),s=He(e.period_local_date),o=P(e.boundary),l=P(e.reset_time);return {id:P(e.progression_definition_id),...i===""?{}:{slug:i},window:P(e.window),periodStartAt:n,periodEndsAt:r,...s===void 0?{}:{periodLocalDate:s},boundary:ci.test(o)?o:"",resetTime:pi.test(l)?l:"",seed:di.test(a)?a:"",...yi(e)}}function Se(t){if(t!==void 0&&(!Number.isInteger(t)||t<0||t>400))throw new TypeError(`periodsBack must be an integer between 0 and 400, got ${String(t)}`)}function Ct(t){let e=t??{};return Array.isArray(e.challenges)?e.challenges.map(fi).filter(n=>n!==void 0):[]}var Y=class{#e;constructor(e){this.#e=e;}async list(e={}){let{periodsBack:n}=e;Se(n);let r=await Zn(this.#e,{...n===void 0?{}:{periods_back:n},...e.signal===void 0?{}:{signal:e.signal}});return Ct(r)}};var hi="gem-web-bridge";var _i=65536,Tt=8,ke=5e3,Et=1024;var Ae=Object.create(null);var Lt=Object.create(null);function bi(t){let e=/^([a-z][a-z0-9+.-]*):\/\/([a-z0-9.-]+|\[[0-9a-f:.]+\])(:([0-9]{1,5}))?$/i.exec(t);return e===null?false:e[4]===void 0||Number(e[4])<=65535}function Ri(t){let e;try{e=new URL(t);}catch{return false}return e.username!==""||e.password!==""?false:e.protocol==="https:"?true:e.protocol==="http:"&&(e.hostname==="localhost"||e.hostname==="127.0.0.1")}function wi(t){return /^[a-z]{2,8}(-[a-z0-9]{1,8})*$/i.test(t)}function vi(t){return /^[a-z_]+$/.test(t)}function xi(t){return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t)||/^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$/.test(t)&&!t.includes("--")}function Je(t,e,n){if(e>Tt)return `nesting deeper than ${Tt}`;if(++n.nodes>ke)return `more than ${ke} values`;if(n.bytes>n.cap)return `over the ${n.cap} byte limit`;if(t==null)return n.bytes+=4,null;let r=typeof t;if(r==="boolean")return n.bytes+=5,null;if(r==="number")return n.bytes+=8,null;if(r==="string")return n.bytes+=t.length*3+2,null;if(r!=="object")return `${r} is not plain data`;let i=t;if(n.seen.has(i))return "a repeated or cyclic object reference";if(n.seen.add(i),Array.isArray(t)){if(t.length>Et)return `an array of ${t.length} entries, over the ${Et} limit`;n.bytes+=2;for(let o of t){let l=Je(o,e+1,n);if(l)return l}return null}let a=Object.getPrototypeOf(t);if(a!==Object.prototype&&a!==null)return "a value that is not a plain object";n.bytes+=2;let s=t;for(let o in s){if(!Object.prototype.hasOwnProperty.call(s,o))continue;if(++n.nodes>ke)return `more than ${ke} values`;if(n.bytes+=o.length*3+4,n.bytes>n.cap)return `over the ${n.cap} byte limit`;let l=Je(s[o],e+1,n);if(l)return l}return null}function Si(t,e=_i){let n={nodes:0,bytes:0,seen:new Set,cap:e},r=Je(t,0,n);return r?`message contains ${r}`:n.bytes>e?`message is over the ${e} byte limit`:null}var ki={origin:[bi,"not a well-formed origin"],url:[Ri,"not a safe absolute http(s) URL"],bcp47:[wi,"not a well-formed BCP 47 tag"],code:[vi,"not a code of lower-case letters and underscores"],gameRef:[xi,"not a game id or web address"]};function Mt(t,e,n){for(let r of e){let i=n===""?r[0]:`${n}.${r[0]}`,a=t[r[0]];if(a==null){if(r[1]<"a")continue;return `${i}: required`}let s=ze(a,r,i);if(s)return s}return null}function ze(t,e,n){let r=e[1].toLowerCase();switch(r){case "u":return typeof t=="boolean"?null:ze(t,typeof t=="string"?[e[0],"s",e[2]]:[e[0],"n",e[3],e[4]],n);case "s":{if(typeof t!="string")return `${n}: expected string`;if(t.length>e[2])return `${n}: exceeds ${e[2]} characters`;if(e[3]){let[i,a]=ki[e[3]];if(!i(t))return `${n}: ${a}`}return null}case "n":case "i":return typeof t!="number"||!(r=="i"?Number.isInteger:Number.isFinite)(t)?`${n}: expected ${r=="i"?"integer":"number"}`:t<e[2]||t>e[3]?`${n}: out of range ${e[2]}..${e[3]}`:null;case "b":return typeof t=="boolean"?null:`${n}: expected boolean`;case "e":{let i=e[2];return i.includes(t)?null:`${n}: not one of ${i.join("|")}`}case "o":return typeof t!="object"||t===null||Array.isArray(t)?`${n}: expected object`:Mt(t,e[2],n);case "j":return typeof t!="object"||t===null||Array.isArray(t)?`${n}: expected a plain object`:null;case "a":{if(!Array.isArray(t))return `${n}: expected array`;if(t.length>e[2])return `${n}: exceeds ${e[2]} items`;let i=e[3],a=`${n}[]`;for(let s of t){if(s==null){if(i[1]<"a")continue;return `${a}: required`}let o=ze(s,i,a);if(o)return o}return null}default:return `${n}: unknown kind ${String(r)}`}}var qt=Object.create(null);function d(t,e,n,r,i){return Ae[t]=n,r&&(Lt[t]=r),qt[t]=a=>{let s=Si(a,i);if(s)return s;if(typeof a!="object"||a===null||Array.isArray(a))return "message: expected object";let o=a;return o.gem!==hi?"gem: wrong protocol marker":o.type!==t?`type: expected ${t}`:Mt(o,e,"")}}var X=["","s",64],m=["requestId","s",64],Q=["currencySlug","s",32],Z=["matchId","s",64],C=["reason","S",64,"code"],M=["outcome","e",["ok","declined","unavailable"]];d("gem.handshake",[["versions","o",[["min","i",1,1e3],["max","i",1,1e3]]],["capabilities","A",64,X],["embedder","s",2048,"origin"],["unbidden","B"]],30);d("gem.handshake.accept",[["v","i",1,1e3],["capabilities","A",64,X]],5);d("gem.token",[["token","s",4096],["requestId","S",64],["generation","i",0,2147483647],["apiBaseUrl","S",512,"url"],["playerId","s",64],["gameId","s",64],["channel","e",["dev","test","release"]],["gameVersion","S",64],["expiresAt","i",0,4102444800],["chainEndsAt","i",0,4102444800],["allowDevTools","B"]],30);d("gem.token.denied",[m,["retryable","b"],["retryAfterMs","I",0,36e5],["reason","e",["chain_exhausted","unavailable"]],["correlationId","s",64]],30);d("gem.player",[["untrusted","o",[["displayName","s",64],["displayTag","S",80],["displayHandle","s",80]]],["playerId","S",64],["discriminator","S",8],["avatarIconUrl","S",2048,"url"],["avatarIconId","S",64],["avatar3dId","S",64],["avatar3dModelUrl","S",2048,"url"],["avatar3dIconUrl","S",2048,"url"],["avatars3d","A",8,["","o",[["family","s",32],["id","s",64],["modelUrl","s",256,"url"],["iconUrl","s",256,"url"]]]],["badges","A",2,["","o",[["itemId","s",64],["iconUrl","s",2048,"url"]]]],["displayTag","s",8],["avatarUrl","S",2048,"url"],["boost","O",[["multipliers","a",8,["","o",[["currencyId","s",64],Q,["multiplierBp","i",1e4,1e6]]]],["expiresInDays","I",1,7]]],["signInAvailable","B"]],12);d("gem.pause",[["paused","b"]],120);d("gem.prefs",[["reducedMotion","b"],["muted","b"],["showFrameStats","B"],["music","B"],["sounds","B"],["locale","s",35,"bcp47"],["recommended","O",[["volume","i",0,100],["batterySaver","b"],["keyboardLayout","e",["wasd","arrows"]],["gamepadConfirm","e",["south","east"]],["vibration","b"],["lookSensitivity","I",20,400],["gamepadLookSensitivity","I",20,400],["invertLookY","B"],["touchMovement","S",16,"code"],["graphicsQuality","S",16,"code"],["graphicsQualityAuto","B"],["colorHelp","B"],["textScale","I",100,200]]]],60);d("gem.cohorts",[["cohorts","a",8,["","o",[["experimentId","s",36],["variantKey","s",32]]]]],12,"cohorts");d("gem.earnAllowanceChanged",[],30,"earnAllowance");d("gem.inventoryChanged",[],30,"inventoryChanged");d("gem.viewport",[["insets","o",[["top","i",0,4096],["right","i",0,4096],["bottom","i",0,4096],["left","i",0,4096]]],["reserved","A",4,["","o",[["x","i",0,16384],["y","i",0,16384],["width","i",0,16384],["height","i",0,16384],["control","O",[["x","i",0,16384],["y","i",0,16384],["width","i",0,16384],["height","i",0,16384]]]]]]],60,"viewport");d("gem.deviceSettings",[["settings","J"]],12,"deviceSettings");d("gem.willTerminate",[["reason","e",["grant_expiring","session_ended","navigating","kill_switch"]],["graceMs","i",0,6e4]],10);d("gem.roomEvent",[["event","e",["updated","match_started","match_ready","match_failed","version_stale"]],["roomId","s",64],["matchId","S",64],["version","I",0,2147483647],["reason","S",64],["platform","E",["universal","mobile"]]],120,"rooms");d("gem.socketState",[["connected","b"],["reason","E",["connecting","dropped","watchdog","terminal"]]],12,"socketState");d("gem.seatedEvent",[["roomId","s",64]],60,"partySeating");d("gem.autoStartFailedEvent",[["roomId","s",64],["code","s",64]],30,"autoStartFailure");d("gem.ticketEvent",[["event","e",["queued","matched","expired","cancelled","failed"]],["ticketId","s",64],["partySize","I",1,64],["queuedAt","I",0,4102444800],["expiresAt","I",0,4102444800],["reason","S",64],["roomId","S",64]],60,"ticketEvents");d("gem.signalEvent",[["event","e",["hello","offer","answer","ice","peerJoined","peerLeft","migration","matchEnded","error"]],Z,["data","j"]],1800,"p2p");d("gem.relayDraining",[Z,["clusterTargetId","s",64],["relayIps","a",16,X],["drainingSince","s",40],["deadline","s",40]],60,"p2pRelayDrain");d("gem.dedicatedEvent",[["event","e",["answer","error","matchEnded"]],Z,["sdp","S",10240],["sessionId","S",64],["code","S",64],["message","S",256],["reason","S",64]],120,"dedicated");d("gem.partyResult",[m,["partyId","S",64]],30,"parties");d("gem.clusterTarget",[["clusterTargetId","s",64],["clusterTargetIds","A",3,X]],12,"clusterTarget");d("gem.graphicsRoutes",[["entries","a",32,["","o",[["gpu","s",32],["route","S",32],["host","S",32]]]]],12,"graphicsRoutes");d("gem.devtools",[["action","e",["open","close","toggle"]]],30,"devtools");d("gem.screenshot",[["maxWidth","i",1,7680],["maxHeight","i",1,4320]],6,"screenshot");d("gem.screenshot.denied",[["reason","e",["not_wired","no_source","unsupported","unreadable","tainted","too_large","busy","declined","failed"]],["retryable","b"]],12,"screenshot");d("gem.requestContext",[],12,"feedbackContext");d("gem.gameContext",[["context","j"]],12,"feedbackContext");d("gem.signal",[["signal","e",["join","offer","answer","ice","migrationAck","hostUnreachable"]],Z,["data","j"]],1200,"p2p");d("gem.dedicatedOffer",[Z,["sdp","s",10240],["intent","e",["initial","ice_restart","full_reconnect"]]],60,"dedicated");d("gem.partyRequest",[m],12,"parties");d("gem.ready",[],5);d("gem.engaged",[],5,"engagement");d("gem.progress",[["loaded","i",0,1099511627776],["total","i",0,1099511627776]],600);d("gem.requestToken",[m,["reason","e",["initial","expiring","rejected"]]],12);d("gem.requestLocalServer",[m,["gameRoomId","s",64]],6,"localHost");d("gem.localServer",[m,["serverId","S",128]],30,"localHost");d("gem.localServer.denied",[m,["retryable","b"],["reason","e",["refused","unavailable"]]],30,"localHost");d("gem.exit",[["reason","S",64]],5);d("gem.openExternal",[["url","s",2048,"url"]],6);d("gem.requestFullscreen",[["enabled","b"]],30);d("gem.audioState",[["muted","b"]],120,"audioState");d("gem.rewardCue",[Q,["cueId","S",64],["expected","I",1,1e9],["origin","O",[["x","i",0,16384],["y","i",0,16384]]]],60,"rewardCue");d("gem.rewardPresentation",[["mode","e",["arcade","game"]]],12,"rewardPresentation");d("gem.walletDisplay",[["visible","b"],["currencies","A",8,X],["score","B"]],60,"walletDisplay");d("gem.controlsDeclare",[["uses","o",[["lookSensitivity","S",16,"code"],["gamepadLookSensitivity","S",16,"code"],["invertLookY","S",16,"code"],["touchMovement","S",16,"code"]]]],60,"controls");d("gem.menu",[["settings","b"],["items","A",4,["","o",[["id","s",32],["label","s",40]]]]],60,"gameMenu");d("gem.menuSelect",[["entry","e",["settings","item"]],["id","S",32]],60,"gameMenu");d("gem.gemCorner",[["corner","e",["top-left","top-right","bottom-left","bottom-right"]]],12,"gemCorner");d("gem.menuStyle",[["ground","S",7],["accent","S",7]],12,"menuStyle");d("gem.settingsDeclare",[["settings","a",8,["","o",[["id","s",40],["label","s",40],["kind","e",["toggle","slider","choice"]],["value","u",40,-1e6,1e6],["quick","B"],["icon","S",16,"code"],["min","N",-1e6,1e6],["max","N",-1e6,1e6],["step","N",0,1e6],["options","A",4,["","o",[["id","s",40],["label","s",40]]]]]]]],120,"gameSettings");d("gem.settingChange",[["id","s",40],["value","u",40,-1e6,1e6]],120,"gameSettings");d("gem.requestShare",[["requestId","S",64],["params","a",16,["","o",[["key","s",64],["value","s",512]]]]],6,"share");d("gem.shareResult",[m,["outcome","e",["accepted","refused"]],C,["key","S",64]],30,"shareResult");d("gem.requestAvatarPicker",[["tab","E",["2d","3d"]]],6,"avatarPicker");d("gem.vibrate",[["pattern","a",99,["","i",0,1e4]]],600,"vibration");d("gem.frameStats",[["fps","i",0,1e3],["frameTimeP95Ms","i",0,1e5],["counts","E",["pageFrames","gameDraws"]]],120,"frameStats");d("gem.portraitBorders",[["name","S",40]],60,"portraitBorders");d("gem.error",[["code","e",["version_mismatch","handshake_timeout","handshake_duplicate","invalid_message","rate_limited","token_unavailable","unsupported","unsupported_capability","internal"]],["message","S",256]],60);d("gem.requestPurchase",[m,["purchaseKind","e",["item","recipe"]],["targetId","s",64],Q,["quantity","I",1,10],["catalogId","S",64],["origin","E",["sheet","direct_refused"]]],12,"purchases");d("gem.requestAvatar3dPurchase",[m,["itemId","s",64],Q],12,"avatar3dPurchases");d("gem.purchaseResult",[m,M,C,["purchaseId","S",64]],30,"purchases");d("gem.purchaseSettled",[["purchaseKind","e",["item","recipe"]],["targetId","s",64],["catalogId","S",64],["quantity","i",1,10],["purchaseId","S",64]],30,"purchaseSettled");d("gem.deviceSettings.put",[m,["settings","j"]],30,"deviceSettings");d("gem.deviceSettings.result",[m,["outcome","e",["stored","too_large","unavailable"]]],30,"deviceSettings");d("gem.requestAd",[m,["placement","s",32],["format","e",["interstitial","rewarded"]]],6,"ads");d("gem.adResult",[m,["outcome","e",["shown","no_ad","unavailable"]]],12,"ads");d("gem.signalMoment",[m,["kind","e",["level_end","run_end","match_end","menu_return","other_break"]],["placement","S",32],["wall","B"]],6,"moments");d("gem.momentResult",[m,["shown","b"]],12,"moments");d("gem.requestSignIn",[m],6,"signIn");d("gem.signInResult",[m,["outcome","e",["signed_in","declined","unavailable"]]],12,"signIn");d("gem.requestFriendChallenge",[m,["playerId","s",64],["template","s",64],["params","J"]],12,"friendChallenges");d("gem.friendChallengeResult",[m,["outcome","e",["accepted","cancelled","refused","unavailable","rate_limited","invalid"]],["code","S",64],["param","S",64],["channel","S",16],["configVersion","I",0,9007199254740991],["retryAfterMs","I",0,864e5],["detail","S",300]],30,"friendChallenges");d("gem.requestPlayInvite",[m,["params","A",16,["","o",[["key","s",64],["value","s",512]]]]],6,"playInvites");d("gem.playInviteResult",[m,["shown","b"]],12,"playInvites");d("gem.inviteParams",[["params","A",16,["","o",[["key","s",64],["value","s",512]]]]],30,"playInvites");d("gem.requestAppLinks",[m],12,"appLinks");d("gem.appLinksResult",[m,M,C,["arcade","O",[["store","e",["app_store","google_play"]]]],["game","O",[["store","e",["app_store","google_play"]]]]],30,"appLinks");d("gem.requestOpenApp",[m,["target","e",["arcade","game"]]],6,"appLinks");d("gem.openAppResult",[m,M,C],30,"appLinks");d("gem.requestOpenGame",[m,["ref","s",40,"gameRef"]],6,"openGame");d("gem.openGameResult",[m,M,C],30,"openGame");d("gem.requestSimilarGames",[m,["limit","I",1,24]],12,"openGame");d("gem.similarGamesResult",[m,M,C,["games","a",24,["","o",[["gameId","s",36,"gameRef"],["slug","S",40,"gameRef"],["iconUrl","s",1024,"url"],["capsuleLandscapeUrl","s",1024,"url"],["capsulePortraitUrl","s",1024,"url"],["previewVideoUrl","S",1024,"url"],["previewPosterUrl","S",1024,"url"],["untrusted","o",[["name","s",64],["tagline","s",64],["shortDescription","s",320],["tags","a",10,["","s",32]]]]]]]],30,"openGame",524288);d("gem.requestStoreOffers",[m],12,"store");d("gem.storeOffersResult",[m,M,C,["offers","a",32,["","o",[["skuId","s",64],["kind","e",["gem_pack","boost","pass","bundle"]],["name","s",80],["description","s",400],["imageUrl","S",1024,"url"],["priceDisplay","s",32],["grant","O",[["currency","s",32],["amount","i",1,1e9]]],["pass","S",64],["earnMultipliers","A",8,["","o",[Q,["multiplierBp","i",1e4,1e6]]]]]]]],30,"store",262144);d("gem.requestStorePurchase",[m,["skuId","s",64]],12,"store");d("gem.storePurchaseResult",[m,M,C],30,"store");d("gem.storePurchaseSettled",[["skuId","s",64]],30,"store");d("gem.requestStoreOfferSheet",[m,["skuId","s",64]],12,"storeOfferSheet");d("gem.storeOfferSheetResult",[m,M,C],30,"storeOfferSheet");Object.freeze(qt);Ae.__malformed=60;Object.freeze(Ae);Object.freeze(Lt);var F={now:()=>Date.now(),setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)};function Ft(t){let e=t.toLowerCase();return e==="localhost"||e.endsWith(".localhost")||e==="[::1]"||e==="::1"?true:/^127(\.\d{1,3}){3}$/.test(e)}var ee=class{constructor(e,n){this.inventory=e;this.resolveCurrencyId=n;}inventory;resolveCurrencyId;async list(e={}){return (await this.inventory.snapshot({buckets:e.buckets})).currencies.data.map(r=>({currencyId:r.currencyId,total:r.total,...r.buckets===void 0?{}:{buckets:r.buckets}}))}async get(e,n={}){let i=(await this.inventory.snapshot({buckets:n.buckets})).currencies.data,a=i.find(o=>o.currencyId===e),s;return !a&&this.resolveCurrencyId&&(s=await this.resolveCurrencyId(e).catch(()=>{}),s!==void 0&&(a=i.find(o=>o.currencyId===s))),{currencyId:a?a.currencyId:s??e,total:a?a.total:null,...a?.buckets===void 0?{}:{buckets:a.buckets}}}};function Ye(t){let e=Array.isArray(t.achievements)?t.achievements:[],n=[];for(let r of e){let i=r??{};typeof i.id!="string"||i.id===""||typeof i.threshold!="number"||!Number.isFinite(i.threshold)||n.push({id:i.id,threshold:i.threshold,points:typeof i.points=="number"?i.points:0,hidden:i.hidden===true,...typeof i.unlocked_at=="number"&&Number.isFinite(i.unlocked_at)?{unlockedAt:i.unlocked_at}:{},...i.revoked===true?{revoked:true}:{}});}return {...n.length>0?{achievements:n}:{},...t.achievements_unavailable===true?{achievementsUnavailable:true}:{}}}var $t="inventory",B=t=>typeof t=="number"?t:0,ne=t=>typeof t=="string"?t:"";function Ke(t,e){let n=t??{},r=typeof n.next_cursor=="string"?n.next_cursor:void 0;return {data:Array.isArray(n.data)?n.data.map(e):[],...r===void 0?{}:{nextCursor:r}}}function jt(t){let e=t??{};return {itemDefinitionId:ne(e.item_definition_id),instanceId:ne(e.instance_id),quantity:B(e.quantity),acquiredAt:B(e.acquired_at),...e.properties===void 0?{}:{properties:e.properties},...e.custom_data===void 0?{}:{customData:e.custom_data}}}function Ai(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0;return {currencies:Ke(e.currencies,r=>{let i=r??{},a=Array.isArray(i.buckets)?i.buckets.map(s=>{let o=s??{};return {bucket:ne(o.bucket),balance:B(o.balance)}}):void 0;return {currencyId:ne(i.currency_id),total:B(i.total),...a===void 0?{}:{buckets:a}}}),items:Ke(e.items,jt),progressions:Ke(e.progressions,r=>{let i=r??{};return {progressionDefinitionId:ne(i.progression_definition_id),currentValue:B(i.current_value),completionCount:B(i.completion_count),isCompleted:i.is_completed===true,...Ye(i)}}),...n===void 0?{}:{etag:n}}}var te=class{constructor(e,n,r){this.api=e;this.entity=n;this.cache=r;}api;entity;cache;snapshot(e={}){let n=e.buckets?`${$t}#buckets`:$t;return this.cache.read(n,[],()=>this.fetch({includeBuckets:e.buckets}))}async instances(e,n){let r=await this.snapshot();if(r.items.nextCursor===void 0){let a=r.items.data.filter(s=>s.itemDefinitionId===e);if(a.length>0)return a}let i=await En(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return Array.isArray(i)?i.map(jt):[]}page(e){return this.fetch(e)}refresh(){this.invalidate();}onChanged(e){return this.cache.onInvalidate(e)}invalidate(){this.cache.invalidate();}async fetch(e){let n=await Tn(this.api,this.entity.type,this.entity.id,{...e.includeBuckets?{include_buckets:true}:{},...e.currencyCursor===void 0?{}:{currency_cursor:e.currencyCursor},...e.itemCursor===void 0?{}:{item_cursor:e.itemCursor},...e.progressionCursor===void 0?{}:{progression_cursor:e.progressionCursor},...e.currencyLimit===void 0?{}:{currency_limit:e.currencyLimit},...e.itemLimit===void 0?{}:{item_limit:e.itemLimit},...e.progressionLimit===void 0?{}:{progression_limit:e.progressionLimit},...e.signal===void 0?{}:{signal:e.signal}});return Ai(n)}};var Pi={unknown_currency:1,currency_not_in_game_payable:1,not_purchasable:1,no_price_in_currency:1,busy:1,cancelled:1,insufficient_funds:1,price_mismatch:1,config_version_stale:1,platform_currency_unavailable:1,not_available:1,recipe_locked:1,already_owned:1,guest_upgrade_required:1,recipe_on_cooldown:1,recipe_max_uses_exceeded:1,item_max_stack_exceeded:1,recipe_costs_unmet:1,quantity_invalid:1,error:1};new Set(Object.keys(Pi));var $=class extends RangeError{constructor(n,r){super(r);this.code=n;this.name="PurchaseRefusal";}code;retryable=false};var _=t=>typeof t=="string"?t:"",Oi=t=>typeof t=="string"?t:_(t&&typeof t=="object"?t.type:void 0),O=t=>typeof t=="number"?t:0;function Ii(t){let e=t??{};return {prerequisiteType:_(e.prerequisite_type),referenceId:_(e.reference_id),required:O(e.required),current:O(e.current)}}function re(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0;return {orderId:_(e.order_id),status:_(e.status),...n===void 0?{}:{etag:n}}}function Pe(){return crypto.randomUUID()}var Gi="recipe-usage",Dt=100;function Oe(t){let e=t??{};switch(e.type){case "currency":return {kind:"currency",currencyId:_(e.currency_id),bucket:_(e.bucket),delta:O(e.delta),balanceAfter:O(e.balance_after)};case "item":return {kind:"item",itemDefinitionId:_(e.item_definition_id),instanceId:_(e.instance_id),delta:O(e.delta),quantityAfter:O(e.quantity_after)};case "progression":return {kind:"progression",progressionDefinitionId:_(e.progression_definition_id),delta:O(e.delta),valueAfter:O(e.value_after),completed:e.completed===true};default:return {kind:"other",type:_(e.type)}}}function Ci(t){let e=t??{},n=typeof e.rarity_tier=="string"?e.rarity_tier:void 0;return {entryId:_(e.entry_id),...n===void 0?{}:{rarityTier:n},rollNumber:O(e.roll_number),wasReplacement:e.was_replacement===true,grants:Array.isArray(e.grants)?e.grants.map(Oe):[]}}function Ti(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0,r=Array.isArray(e.loot_results)?e.loot_results.map(Ci):void 0;return {orderId:_(e.order_id),status:_(e.status),...n===void 0?{}:{etag:n},granted:Array.isArray(e.granted)?e.granted.map(Oe):[],consumed:Array.isArray(e.consumed)?e.consumed.map(Oe):[],autoClaimedRewards:Array.isArray(e.auto_claimed_rewards)?e.auto_claimed_rewards.map(Oe):[],...r===void 0||r.length===0?{}:{lootResults:r}}}function Ei(t){let e=t??{},n=e.price??{};return {payment:"platform_currency",orderId:_(e.target_order_id)||_(e.source_order_id),status:_(e.status),purchaseId:_(e.purchase_id),sourceOrderId:_(e.source_order_id),price:{currencyId:_(n.platform_currency_id),amount:O(n.price)}}}function Li(t){let e=t??{},n=typeof e.last_used_at=="string"?e.last_used_at:void 0,r=typeof e.cooldown_expires_at=="string"?e.cooldown_expires_at:void 0;return {recipeId:_(e.recipe_id),useCount:typeof e.use_count=="number"?e.use_count:0,isOnCooldown:e.is_on_cooldown===true,...n===void 0?{}:{lastUsedAt:n},...r===void 0?{}:{cooldownExpiresAt:r}}}function Nt(t){switch(t.type){case "currency_grant":case "currency_consume":return {type:t.type,currency_id:t.currencyId,amount:t.amount};default:return {type:t.type,item_definition_id:t.itemDefinitionId,quantity:t.quantity}}}var ie=class{constructor(e,n,r,i){this.api=e;this.entity=n;this.cache=r;this.handOffRefused=i;}api;entity;cache;handOffRefused;async create(e,n={}){let r=await this.write(()=>Sn(this.api,this.entity.type,this.entity.id,{operations:e.map(Nt),source:n.source??"play",nonce:Pe()},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}));return re(r)}async createMany(e,n={}){return this.write(()=>xn(this.api,this.entity.type,this.entity.id,{orders:e.map(r=>({operations:r.map(Nt),nonce:Pe()})),source:n.source??"play"},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}))}async recipeAvailability(e,n,r){let a=await Fn(this.api,this.entity.type,this.entity.id,e,n,r===void 0?{}:{signal:r})??{},s=typeof a.uses_remaining=="number"?a.uses_remaining:void 0,o=typeof a.cooldown_expires_at=="string"?a.cooldown_expires_at:void 0,l=Array.isArray(a.lock_reasons)?a.lock_reasons.map(Ii):[];return {canExecute:a.can_execute===true,locked:a.locked===true||l.length>0,lockReasons:l,reasons:Array.isArray(a.reasons)?a.reasons.map(c=>Oi(c)):[],...s===void 0?{}:{usesRemaining:s},...o===void 0?{}:{cooldownExpiresAt:o}}}async recipeUsageAll(){return this.cache.read(Gi,[],async()=>{let n=await $n(this.api,this.entity.type,this.entity.id,{limit:Dt})??{},r=Array.isArray(n.usages)?n.usages:[];return {usages:r.map(Li),truncated:r.length>=Dt}})}async recipeUsage(e){return (await this.recipeUsageAll()).usages.find(r=>r.recipeId===e)??null}async purchase(e,n={}){if(e.payment.kind==="configured"){let p=e,h=await this.write(()=>On(this.api,this.entity.type,this.entity.id,{catalog_id:p.catalogId,recipe_id:p.targetId,game_id:this.api.gameId(),nonce:Pe()},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}));return {payment:"configured",...Ti(h)}}if(this.entity.type!=="players"||this.entity.id!=="me")throw new TypeError("platform-currency purchases are available only on gem.me.mutations");let[r,i]=await Promise.all([Hn(this.api,n.signal===void 0?{}:{signal:n.signal}),Re(this.api,n.signal===void 0?{}:{signal:n.signal})]),a=e.payment.currencySlug.toLowerCase(),s=i.currencies.find(p=>p.currency_id.toLowerCase()===a||p.slug.toLowerCase()===a);if(s===void 0){let p=i.currencies.map(h=>h.slug);throw new $("unknown_currency",`platform currency ${JSON.stringify(e.payment.currencySlug)} is not an active platform currency. Active: ${p.length===0?"none":p.join(", ")}`)}let o=e.kind==="item"?r.items.find(p=>p.item_id===e.targetId):r.recipes.find(p=>p.recipe_id===e.targetId&&p.catalog_id===e.catalogId);if(o===void 0)throw new $("not_purchasable",`purchase target ${JSON.stringify(e.targetId)}`+(e.kind==="recipe"?` in catalog ${JSON.stringify(e.catalogId)}`:"")+` is not purchasable in config version ${r.config_version} on this channel. Send the ${e.kind==="item"?"item":"recipe"} id (not its slug), and check that it has platform_prices and that this config version is promoted`);let l=o.platform_prices.find(p=>p.platform_currency_id===s.currency_id);if(l===void 0){let p=y=>i.currencies.find(R=>R.currency_id===y)?.slug??y,h=o.platform_prices.map(y=>`${p(y.platform_currency_id)} ${y.price}`);throw new $("no_price_in_currency",`purchase target ${JSON.stringify(e.targetId)} has no ${s.slug} price. It is priced in: ${h.length===0?"nothing":h.join(", ")}`)}let c=e.kind==="item"?e.quantity??1:1;if(!Number.isInteger(c)||c<1||c>10)throw new $("quantity_invalid","item purchase quantity must be an integer from 1 through 10");let g;try{g=await this.write(()=>Qn(this.api,this.entity.type,this.entity.id,{purchase_kind:e.kind,target_id:e.targetId,...e.kind==="recipe"?{catalog_id:e.catalogId}:{},quantity:c,expected_price:{platform_currency_id:s.currency_id,price:l.price*c},expected_config_version:r.config_version,nonce:Pe(),confirmation:"none"},n.signal===void 0?{}:{signal:n.signal}));}catch(p){if(this.handOffRefused!==void 0&&p instanceof f&&p.status===403&&p.code==="guest_upgrade_required")try{this.handOffRefused({kind:e.kind,targetId:e.targetId,...e.kind==="recipe"?{catalogId:e.catalogId}:{},currencySlug:s.slug,quantity:c});}catch{}throw p}return Ei(g)}async executeRecipe(e,n,r={}){return await this.purchase({kind:"recipe",catalogId:e,targetId:n,payment:{kind:"configured"}},r)}async addProgression(e,n,r){let i=await this.write(()=>bn(this.api,this.entity.type,this.entity.id,e,{amount:n,game_id:this.api.gameId()},r===void 0?{}:{signal:r}));return re(i)}async maxProgression(e,n,r){let i=await this.write(()=>lt(this.api,this.entity.type,this.entity.id,e,{value:n,game_id:this.api.gameId()},r===void 0?{}:{signal:r}));return re(i)}async claimProgression(e,n){let r=await this.write(()=>wn(this.api,this.entity.type,this.entity.id,e,{game_id:this.api.gameId()},n===void 0?{}:{signal:n}));return re(r)}async resetProgression(e,n){let r=await this.write(()=>mt(this.api,this.entity.type,this.entity.id,e,{game_id:this.api.gameId()},n===void 0?{}:{signal:n}));return re(r)}async write(e){return this.cache.invalidate(),e()}};var Xe=t=>typeof t=="string"?t:"",Mi=t=>typeof t=="number"?t:0;function Bt(t){let e=t??{};return {orderId:Xe(e.order_id),status:Xe(e.status),source:Xe(e.source),createdAt:Mi(e.created_at)}}var ae=class{constructor(e,n){this.api=e;this.entity=n;}api;entity;async list(e={}){let r=await tt(this.api,this.entity.type,this.entity.id,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}})??{},i=typeof r.next_cursor=="string"?r.next_cursor:void 0;return {data:Array.isArray(r.orders)?r.orders.map(Bt):[],...i===void 0?{}:{nextCursor:i}}}async get(e,n){let r=await Mn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return Bt(r)}};function qi(t,e){return Math.min(7,Math.max(1,Math.ceil((t-e)/864e5)))}function Fi(t,e,n,r){if(!t)return 0;if(typeof e=="number"&&Number.isInteger(e))return Math.min(7,Math.max(1,e));if(n===null)return 7;let i=Date.parse(n);return Number.isFinite(i)?qi(i,r):7}function Ut(t,e){let n=t?.passes;if(!Array.isArray(n))return Object.freeze([]);let r=n.flatMap(i=>{let a=i??{};if(typeof a.pass!="string"||a.pass==="")return [];let s=a.held===true,o=s&&typeof a.ends_at=="string"?a.ends_at:null,l=Fi(s,a.days_left,o,e);return [Object.freeze({pass:a.pass,held:s,daysLeft:l,endsAt:o})]});return Object.freeze(r)}var $i=["live"],Qe=6e4,Vt=864e5;function ji(t){return Object.freeze({pass:t,held:false,daysLeft:0,endsAt:null})}var Wt=Object.freeze([]);function Di(t){let n=t.flatMap(r=>r.endsAt===null?[]:[Date.parse(r.endsAt)]).filter(r=>Number.isFinite(r));return n.length===0?null:Math.min(...n)}function Ht(t,e,n={}){let{watch:r,isGuest:i}=n,a=n.now??(r===void 0?()=>Date.now():()=>r.clock.now()),s=new Set,o=null,l=0,c=null,g=Qe,p=()=>{c!==null&&r?.clock.clearTimeout(c.handle),c=null;},h=w=>{p(),!(r===void 0||s.size===0)&&(c={handle:r.clock.setTimeout(fn,w)});},y=w=>{let A=Di(w);if(A===null||r===void 0){p();return}let k=A-r.clock.now();h(k>0?Math.min(k,Vt):Qe);},R=w=>{r?.log?.(`[gem] a passes 'changed' listener threw: ${w instanceof Error?w.message:String(w)}`);},L=w=>{let A=o!==null&&JSON.stringify(o)!==JSON.stringify(w);if(o=w,g=Qe,y(w),!!A)for(let k of [...s])try{let be=k(w);typeof be?.then=="function"&&be.then(void 0,R);}catch(be){R(be);}},G=()=>{if(i?.()===true)return L(Wt),Promise.resolve(Wt);let w=l;return e.read("passes",$i,()=>Vn(t)).then(A=>{if(w!==l)return G();let k=Ut(A,a());return L(k),k})},yn=()=>{G().catch(()=>{h(g),g=Math.min(g*2,Vt);});};function fn(){l+=1,e.invalidate(),p(),r!==void 0&&s.size>0&&yn();}return {api:{list:G,async get(w){return (await G()).find(k=>k.pass===w)??ji(w)},on(w,A){let k=s.size===0;return s.add(A),k&&r!==void 0&&(o===null?yn():y(o)),()=>{s.delete(A),s.size===0&&p();}}},recheck:fn}}var Jt=t=>typeof t=="number"?t:0,Ni=t=>typeof t=="string"?t:"";function Bi(t){let e=t??{};return {progressionDefinitionId:Ni(e.progression_definition_id),currentValue:Jt(e.current_value),completionCount:Jt(e.completion_count),isCompleted:e.is_completed===true,...Ye(e)}}var se=class{constructor(e,n,r){this.api=e;this.entity=n;this.inventory=r;}api;entity;inventory;async list(){return (await this.inventory.snapshot()).progressions.data}async get(e,n){let i=(await this.inventory.snapshot()).progressions.data.find(a=>a.progressionDefinitionId===e);if(i&&i.achievementsUnavailable!==true)return i;try{let a=await qn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return Bi(a)}catch{return i??null}}};var oe=class{constructor(e,n){this.clock=e;this.identity=n;}clock;identity;generation=0;slots=new Map;listeners=new Set;boundTo=null;read(e,n,r,i){this.rebind();let a=n.length===0,s=a?e:e+"\0"+n.join("\0"),o=this.slots.get(s);if(o){let p=o.filledAt;if(p!==void 0&&(i===void 0||this.clock.now()-p<=i))return Promise.resolve(o.value);if(o.inFlight)return o.inFlight}let l=o??{};this.slots.set(s,l);let c=this.generation,g=r().then(p=>(a&&this.generation===c&&(l.value=p,l.filledAt=this.clock.now()),p)).finally(()=>{l.inFlight===g&&(l.inFlight=void 0,l.filledAt===void 0&&this.slots.get(s)===l&&this.slots.delete(s));});return l.inFlight=g,g}invalidate(){this.slots.clear(),this.generation+=1;for(let e of [...this.listeners])e();}onInvalidate(e){return this.listeners.add(e),()=>{this.listeners.delete(e);}}rebind(){if(!this.identity)return;let e=this.identity();e!==this.boundTo&&(this.boundTo=e,this.invalidate());}};function Ui(t){let e=i=>new RegExp(`<${i}>([^<]{0,300})</${i}>`).exec(t)?.[1]?.trim()||void 0,n=[e("Code"),e("AuthenticationErrorDetail")??e("Message")].filter(Boolean);if(n.length>0)return n.join(" \u2014 ");let r=t.trim();return r?r.slice(0,300):""}async function Ie(t){try{let e=Ui(await t.text());return e?`Storage said: ${e}`:""}catch{return ""}}var b=class extends Error{constructor(n,r){super(r);this.reason=n;this.name="GemSaveError";}reason},Vi=3e4,Wi=5e3,zt=6e4,Hi=2**31-1,Kt="the save payload could not reach storage. From a browser this is almost always the storage account's CORS rule, which the platform owns and your game cannot change. If every save fails this way, report it rather than working around it",Ji=/^[A-Za-z0-9_]{1,64}$/;function T(t){let e=t.length===0?"a save key cannot be empty":t.length>64?`it is ${t.length} characters; a save key is at most 64`:t.startsWith("_")||t.startsWith("$")?`it begins with ${JSON.stringify(t[0])}, and \`_\` and \`$\` are reserved prefixes`:"a save key is ASCII letters, digits and underscores only \u2014 no hyphens, spaces or other punctuation, unlike a template slug";if(!Ji.test(t)||t.startsWith("_"))throw new TypeError(`${JSON.stringify(t)} is not a usable save key: ${e}.`);return t}function Yt(t,e){let n=new AbortController,r=Date.now()+e;Ot(n.signal,()=>r-Date.now());let i=AbortSignal.timeout(e),a=()=>n.abort(i.reason),s=()=>n.abort(t?.reason);return t?.aborted?n.abort(t.reason):(i.addEventListener("abort",a,{once:true}),t?.addEventListener("abort",s,{once:true})),{signal:n.signal,release:()=>{i.removeEventListener("abort",a),t?.removeEventListener("abort",s);}}}function Ze(t,e){return t.aborted&&e?.aborted!==true}var zi=new Set(["x-ms-blob-type"]),Ki=/^[ -~]+$/;function Yi(t,e){if(t==null)return {};if(typeof t!="object"||Array.isArray(t))throw new b("save_malformed",`the grant for save ${JSON.stringify(e)} described its upload headers as ${Array.isArray(t)?"a list":typeof t}, which is not a set of headers.`);let n={};for(let[r,i]of Object.entries(t)){let a=r.toLowerCase();if(!zi.has(a))throw new b("save_malformed",`the grant for save ${JSON.stringify(e)} asked the upload to send ${JSON.stringify(r)}, which this SDK does not put on a storage request. Report it \u2014 a platform that needs a new upload header needs an SDK release too.`);if(typeof i!="string"||!Ki.test(i))throw new b("save_malformed",`the grant for save ${JSON.stringify(e)} gave header ${JSON.stringify(r)} a value that is not usable as one.`);if(a in n)throw new b("save_malformed",`the grant for save ${JSON.stringify(e)} named ${JSON.stringify(a)} twice.`);n[a]=i;}return n}function en(t){let e=typeof t.metadata=="object"&&t.metadata!==null&&!Array.isArray(t.metadata)?t.metadata:void 0;return {key:t.key,sizeBytes:t.size_bytes,etag:t.etag,...e===void 0?{}:{metadata:e},createdAt:t.created_at,updatedAt:t.updated_at}}function nn(t){return t?.reason==="not_found"}function Xi(t){return t?.code==="save_conflict"}function Xt(t){return t instanceof f&&t.reason==="rate_limited"}async function Qt(t,e){let n=await Ie(e);return new f("rate_limited",429,`the save ${t} answered 429: too many save calls. ${n}`.trim(),We(e.headers.get("retry-after")))}function Ge(t){return t.reason!==void 0?t.reason:new DOMException("The operation was aborted.","AbortError")}function Qi(t,e,n,r,i){let a=false,s=()=>a?false:(a=true,o.detach?.(),true),o={signal:n.signal,budget:r,deadlineAt:Date.now()+r,teardown:n.teardown===true,overwrite:n.overwrite===true,identity:i,resolve:l=>{s()&&t(l);},reject:l=>{s()&&e(l);},detach:void 0};return o}function Zt(t,e){return t!==null&&e!==null&&e!==t}function er(t){return new b("save_conflict",`save ${JSON.stringify(t)} was not written: the signed-in player changed while it waited for the write before it, and it holds the last player's progress.`)}var le=class{constructor(e,n,r={},i){this.api=e;this.entity=n;this.options=r;this.identity=i;}api;entity;options;identity;versions=new Map;seq=0;versionsOf=null;writes=new Map;holdUntil=0;async put(e,n,r={}){let i;try{i=JSON.stringify(n);}catch(a){throw new b("save_malformed",`save ${JSON.stringify(e)} could not be serialised to JSON: ${String(a)}. Retrying stores the same unserialisable value.`)}if(i===void 0)throw new b("save_malformed",`save ${JSON.stringify(e)} is undefined, which is not JSON. Use delete() to remove one.`);return this.putBytes(e,new TextEncoder().encode(i),{...r,contentType:"application/json"})}async putBytes(e,n,r={}){if(T(e),r.signal?.aborted)throw Ge(r.signal);let i=this.budget(r.timeoutMs),a=this.slotWrites(e);return new Promise((s,o)=>{let l=a.queued;l?.release();let c=l?.waiters[l.waiters.length-1];c!==void 0&&this.holdOwn(a,c);let g=this.identity?.()??null;for(let p of l?.waiters.slice()??[])Zt(p.identity,g)&&this.drop(a,p,er(e));a.queued=this.queue(a,n,r,Qi(s,o,r,i,g),l?.waiters??[]),a.wake?.(),this.pump(e,a);})}holdOwn(e,n){let{signal:r}=n,i=n.deadlineAt-Date.now();if(r?.aborted)return this.drop(e,n,Ge(r));if(i<=0)return this.drop(e,n,this.timeout("save",n.budget));let a=AbortSignal.timeout(i),s=()=>this.drop(e,n,this.timeout("save",n.budget)),o=()=>{r&&this.drop(e,n,Ge(r));};a.addEventListener("abort",s,{once:true}),r?.addEventListener("abort",o,{once:true}),n.detach=()=>{a.removeEventListener("abort",s),r?.removeEventListener("abort",o);};}drop(e,n,r){let i=e.queued?.waiters,a=i?.indexOf(n)??-1;a>=0&&i?.splice(a,1),n.reject(r),e.wake?.();}queue(e,n,r,i,a){let{budget:s}=i,o=[...a,i],l=AbortSignal.timeout(s),c=y=>{if(e.queued===h){this.take(e,h);for(let R of o)R.reject(y);e.wake?.();}},g=()=>c(this.timeout("save",s)),p=()=>{r.signal&&c(Ge(r.signal));};l.addEventListener("abort",g,{once:true}),r.signal?.addEventListener("abort",p,{once:true});let h={bytes:n,options:r,budget:s,deadlineAt:i.deadlineAt,identity:i.identity,waiters:o,release:()=>{l.removeEventListener("abort",g),r.signal?.removeEventListener("abort",p);}};return h}async pump(e,n){if(!n.running){n.running=true;try{for(let r=n.queued;r!==void 0;r=n.queued){let i=Date.now(),a=this.holdUntil-i;if(a>0){if(a>=r.deadlineAt-i){this.take(n,r);for(let l of r.waiters)l.reject(this.held(e,a));continue}for(let l of r.waiters.slice(0,-1))a>=l.deadlineAt-i&&this.drop(n,l,this.held(e,a));}let s=Math.max(a,this.spacing(n,r,i));if(s>0){await this.pause(n,s);continue}this.take(n,r);let o;try{o=this.precondition(e,r);}catch(l){for(let c of r.waiters)c.reject(l);continue}n.lastSentAt=i;try{let l=await this.send(e,r,o);for(let c of r.waiters)c.resolve(l);}catch(l){for(let c of r.waiters)c.reject(l);}}}finally{n.running=false;}}}spacing(e,n,r){if(e.lastSentAt===void 0||n.waiters.some(s=>s.teardown))return 0;let i=this.options.minWriteIntervalMs??Wi,a=Math.min(...n.waiters.map(s=>s.deadlineAt-s.budget/2));return Math.min(e.lastSentAt+i,a)-r}pause(e,n){return new Promise(r=>{let i=()=>{clearTimeout(a),e.wake===i&&(e.wake=void 0),r();},a=setTimeout(i,Math.min(n,Hi));e.wake=i;})}take(e,n){e.queued===n&&(e.queued=void 0),n.release();}slotWrites(e){let n=this.writes.get(e);return n===void 0&&(n={running:false,queued:void 0,lastSentAt:void 0,wake:void 0},this.writes.set(e,n)),n}noteRateLimit(e){if(!Xt(e))return;let n=e.retryAfterSeconds,r=n===void 0?zt:Math.min(n*1e3,zt);this.holdUntil=Math.max(this.holdUntil,Date.now()+r);}held(e,n){let r=Math.ceil(n/1e3);return new f("rate_limited",429,`save ${JSON.stringify(e)} was not sent: the platform refused a save call for the rate, and the wait it asked for ends in ${r}s, after this call's timeoutMs. Keep the state and write once the wait is over.`,r)}async send(e,n,r){let{bytes:i,options:a,budget:s}=n,o=a.contentType??"application/octet-stream",l=Yt(a.signal,Math.max(0,n.deadlineAt-Date.now()));try{let c=await gt(this.api,this.entity.type,this.entity.id,e,{size_bytes:i.byteLength,content_type:o,...r,...a.metadata===void 0?{}:{metadata:a.metadata}},{signal:l.signal});if(typeof c.upload_url!="string"||typeof c.session_id!="string")throw new b("save_malformed",`the grant for save ${JSON.stringify(e)} named nowhere to put the bytes.`);let g=Yi(c.upload_headers,e),p,h=this.options.fetch??globalThis.fetch.bind(globalThis);try{p=await h(c.upload_url,{method:"PUT",headers:{"content-type":o,...g},body:i,credentials:"omit",signal:l.signal});}catch(R){throw Ze(l.signal,a.signal)?this.timeout("upload",s):new b("upload_failed",`${Kt} for PUT. Underlying error: ${R}`)}if(p.status===429)throw await Qt("upload",p);if(!p.ok){let R=await Ie(p);throw new b("upload_failed",p.status===400?"the save upload answered 400. The platform and the service holding the bytes disagree about what this upload must carry, which is not something your game can fix and not worth retrying \u2014 report it. "+R:`the save upload answered ${p.status}. `+(p.status===403?"An upload URL is short-lived, so this is most likely an expired one \u2014 start the save again rather than retrying the upload. ":"")+R)}let y=en(await In(this.api,this.entity.type,this.entity.id,e,{session_id:c.session_id},{signal:l.signal}));return this.remember(e,y.etag?{kind:"etag",etag:y.etag}:void 0),y}catch(c){throw Xi(c)?new b("save_conflict",`save ${JSON.stringify(e)} was not written: the stored save changed since this game last loaded or wrote it, so another device or tab saved in between. Load it again and decide what to write from what is stored, rather than resending this write.`):(this.noteRateLimit(c),this.rethrow(c,a.signal,l.signal,"save",s))}finally{l.release();}}async get(e,n={}){let r=await this.getBytes(e,n);if(r===null)return null;try{return JSON.parse(new TextDecoder().decode(r))}catch(i){throw new b("save_malformed",`the stored save ${JSON.stringify(e)} is not JSON, so put() did not write it. Read it with getBytes() and decode it yourself. Underlying error: ${i}`)}}async getBytes(e,n={}){T(e);let r=this.budget(n.timeoutMs),i=Yt(n.signal,r),a=this.seq;try{let s;try{let g=await je(this.api,this.entity.type,this.entity.id,e,{signal:i.signal});if(!g.modified)return this.remember(e,{kind:"empty"},a),null;s=g.body;}catch(g){if(nn(g))return this.remember(e,{kind:"empty"},a),null;throw g}if(typeof s.download_url!="string")throw new b("save_malformed",`the record for save ${JSON.stringify(e)} named no link to its stored bytes.`);let o=this.options.fetch??globalThis.fetch.bind(globalThis),l;try{l=await o(s.download_url,{credentials:"omit",signal:i.signal});}catch(g){throw Ze(i.signal,n.signal)?this.timeout("download",r):new b("download_failed",`${Kt} for GET. Underlying error: ${g}`)}if(l.status===429)throw await Qt("download",l);if(!l.ok){let g=await Ie(l);throw new b("download_failed",`the save download answered ${l.status}. `+(l.status===403?"A download link lasts 15 minutes, so this is most likely an expired one \u2014 call get() again for a fresh one. ":"")+g)}let c=new Uint8Array(await l.arrayBuffer());return this.remember(e,s.etag?{kind:"etag",etag:s.etag}:void 0,a),c}catch(s){throw this.slots().get(e)===void 0&&this.remember(e,{kind:"failed"}),this.noteRateLimit(s),this.rethrow(s,n.signal,i.signal,"load",r)}finally{i.release();}}async describe(e,n={}){try{let r=await je(this.api,this.entity.type,this.entity.id,T(e),{...n.signal===void 0?{}:{signal:n.signal},...n.ifNoneMatch===void 0?{}:{ifNoneMatch:n.ifNoneMatch}});return r.modified?en(r.body):null}catch(r){if(nn(r))return null;throw r}}async list(e={}){let n=await rt(this.api,this.entity.type,this.entity.id,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}}),r=n.next_cursor;return {saves:(n.data??[]).map(en),...typeof r=="string"&&r.length>0?{nextCursor:r}:{}}}async delete(e,n){try{await An(this.api,this.entity.type,this.entity.id,T(e),{...n===void 0?{}:{signal:n}});}catch(r){if(!nn(r))throw r}this.remember(e,{kind:"empty"});}precondition(e,n){if(Zt(n.identity,this.identity?.()??null))throw er(e);if(n.waiters.some(i=>i.overwrite))return {};let r=this.slots().get(e);if(r===void 0)return {};if(r.kind==="etag")return {if_match:r.etag};if(r.kind==="empty")return {if_none_match:"*"};throw new b("load_failed",`save ${JSON.stringify(e)} was not written: the last load of this slot failed, so what this write would replace is unknown, and it could be the player's real progress. Load it again before saving, or pass overwrite: true if replacing whatever is stored is what you mean.`)}remember(e,n,r){let i=this.slots(),a=i.get(e);r!==void 0&&a!==void 0&&a.kind!=="failed"&&a.seq>r||(this.seq+=1,n===void 0?i.delete(e):i.set(e,{...n,seq:this.seq}));}slots(){let e=this.identity?.()??null;return e!==null&&e!==this.versionsOf&&(this.versionsOf!==null&&this.versions.clear(),this.versionsOf=e),this.versions}budget(e){return e??this.options.timeoutMs??Vi}timeout(e,n){return new b("save_timeout",`the save ${e} did not finish within ${n}ms`)}rethrow(e,n,r,i,a){return e instanceof b||Xt(e)?e:Ze(r,n)?this.timeout(i,a):e}};function Zi(t){try{return Ve(t)}catch{return t}}function tn(t,e){let n=t??{},r=typeof n.etag=="string"?n.etag:e;return {key:typeof n.key=="string"?n.key:"",value:typeof n.value=="string"?Zi(n.value):"",...r===void 0?{}:{etag:r},updatedAt:typeof n.updated_at=="number"?n.updated_at:0}}var de=class{constructor(e,n){this.api=e;this.entity=n;}api;entity;async list(e){let r=(await nt(this.api,this.entity.type,this.entity.id,e===void 0?{}:{signal:e}))?.settings;return Array.isArray(r)?r.map(i=>tn(i)):[]}async get(e,n={}){try{let r=await Cn(this.api,this.entity.type,this.entity.id,e,{...n.signal===void 0?{}:{signal:n.signal},...n.ifNoneMatch===void 0?{}:{ifNoneMatch:n.ifNoneMatch}});return r.modified?tn(r.body,r.etag):null}catch(r){if(nr(r))return null;throw r}}async put(e,n,r={}){let i=await dt(this.api,this.entity.type,this.entity.id,e,{value:xe(n)},{...r.signal===void 0?{}:{signal:r.signal},...r.ifMatch===void 0?{}:{ifMatch:r.ifMatch}});return tn(i)}async delete(e,n){try{await kn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});}catch(r){if(!nr(r))throw r}}};function nr(t){return t?.reason==="not_found"}function rn(t,e,n={}){let r=new oe(F,n.identity);n.onInventoryChanged&&r.onInvalidate(n.onInventoryChanged);let i=new te(t,e,r);return {settings:new de(t,e),inventory:i,saves:new le(t,e,n.saves??{},n.identity),currencies:new ee(i,n.resolveCurrencyId),mutations:new ie(t,e,r,n.handOffRefusedPurchase),orders:new ae(t,e),progressions:new se(t,e,i)}}function tr(t,e,n={}){let r=new oe(F,n.identity),i=Ht(t,r,n);return {scope:{...rn(t,e,n),passes:i.api},recheckPasses:i.recheck}}var j=t=>typeof t=="string"?t:"",U=t=>typeof t=="number"?t:0;function Ce(t,e){let n=e??{},r=j(n.character_id);if(r==="")throw new Error("[gem] a character response carried no character_id");return {...t(r),id:r,playerId:j(n.player_id),gameId:j(n.game_id),channel:j(n.channel)||"release",name:j(n.name),slotIndex:U(n.slot_index),isActive:n.is_active!==false,createdAt:j(n.created_at),updatedAt:j(n.updated_at)}}var ue=class{constructor(e,n,r,i){this.api=e;this.saves=n;this.identity=r;this.resolveCurrencyId=i;}api;saves;identity;resolveCurrencyId;scopes=new Map;scope=e=>{let n=this.scopes.get(e);return n||(n=rn(this.api,{type:"characters",id:e},{saves:this.saves,identity:this.identity,resolveCurrencyId:this.resolveCurrencyId}),this.scopes.set(e,n)),n};refreshHeld(){for(let e of this.scopes.values())e.inventory.refresh();}async list(e){let r=(await et(this.api,e===void 0?{}:{signal:e}))?.characters;return Array.isArray(r)?r.map(i=>Ce(this.scope,i)):[]}async get(e,n){let r=await Gn(this.api,e,n===void 0?{}:{signal:n});return Ce(this.scope,r)}async create(e){let n=await vn(this.api,{name:e.name},e.signal===void 0?{}:{signal:e.signal});return Ce(this.scope,n)}async update(e,n,r){let i=await pt(this.api,e,{name:n},r===void 0?{}:{signal:r});return Ce(this.scope,i)}async delete(e,n){await yt(this.api,e,n===void 0?{}:{signal:n});}async slots(e){let r=await zn(this.api,e===void 0?{}:{signal:e})??{};return {totalSlots:U(r?.total_slots),availableSlots:U(r?.available_slots),activeCharacterCount:U(r?.active_character_count),defaultMaxSlots:U(r?.default_max_slots),purchasedExtraSlots:U(r?.purchased_extra_slots),canPurchaseMore:r?.can_purchase_more===true}}};var ar="[gem: use gem.text.toPlain()]",rr=new Set,ir;function ea(t){try{if(rr.has(t))return;let e=globalThis.location;if(ir??=!!e?.port&&Ft(e.hostname??""),!ir)return;rr.add(t),console.warn(`[gem] ${t} is PlayerText, turned into a string: players see ${ar}. Render text.toPlain(value) (text is in @indiegems/gem-web-sdk/sdk).
1
+ globalThis.__gemWebSdkVersion="[gem-web-sdk:sdkVersion:24.0.1]";function hn(){let t=globalThis.__gemWebSdkVersion;if(typeof t!="string")return "";let e=t.lastIndexOf(":"),n=t.lastIndexOf("]");return e<0||n<=e+1?"":t.slice(e+1,n)}function u(t){let e=String(t);if(!/^[A-Za-z0-9_.-]{1,128}$/.test(e)||e==="."||e==="..")throw new TypeError(`${JSON.stringify(e)} is not a usable path segment \u2014 it is interpolated into a URL`);return encodeURIComponent(e)}async function _n(t,e,n){let r=`/v1/inventory/transfers/${u(e)}/accept`;return t.client.post(r,void 0,n?.signal)}async function bn(t,e,n,r,i,a){let s=`/v1/inventory/${u(e)}/${u(n)}/progressions/${u(r)}/add`;return t.client.post(s,i,a?.signal)}async function Rn(t,e,n){let r=`/v1/inventory/transfers/${u(e)}/cancel`;return t.client.post(r,void 0,n?.signal)}async function wn(t,e,n,r,i,a){let s=`/v1/inventory/${u(e)}/${u(n)}/progressions/${u(r)}/claim`;return t.client.post(s,i,a?.signal)}async function vn(t,e,n){return t.client.post("/v1/characters",e,n?.signal)}async function xn(t,e,n,r,i){let a=`/v1/inventory/${u(e)}/${u(n)}/orders/batch`;return t.client.post(a,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function Sn(t,e,n,r,i){let a=`/v1/inventory/${u(e)}/${u(n)}/orders`;return t.client.post(a,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function kn(t,e,n,r,i){let a=`/v1/settings/${u(e)}/${u(n)}/${u(r)}`;return t.client.delete(a,i?.signal)}async function An(t,e,n,r,i){let a=`/v1/saves/${u(e)}/${u(n)}/${u(r)}`;return t.client.delete(a,i?.signal)}async function Pn(t,e,n,r){let i=`/v1/showcase/players/${u(e)}/${u(n)}`;return t.client.delete(i,r?.signal)}async function On(t,e,n,r,i){let a=`/v1/inventory/${u(e)}/${u(n)}/recipes/execute`;return t.client.post(a,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function In(t,e,n,r,i,a){let s=`/v1/saves/${u(e)}/${u(n)}/${u(r)}/finalize`;return t.client.post(s,i,a?.signal)}async function Gn(t,e,n){let r=`/v1/characters/${u(e)}`;return t.client.get(r,n?.signal)}async function Cn(t,e,n,r,i){let a=`/v1/settings/${u(e)}/${u(n)}/${u(r)}`;return t.client.getWithEtag(a,{...i?.signal===void 0?{}:{signal:i.signal},...i?.ifNoneMatch===void 0?{}:{ifNoneMatch:i.ifNoneMatch}})}async function Tn(t,e,n,r){let i=new URLSearchParams;r?.include_buckets!==void 0&&i.set("include_buckets",String(r?.include_buckets)),r?.include_custom_data!==void 0&&i.set("include_custom_data",String(r?.include_custom_data)),r?.currency_limit!==void 0&&i.set("currency_limit",String(r?.currency_limit)),r?.currency_cursor!==void 0&&i.set("currency_cursor",String(r?.currency_cursor)),r?.item_limit!==void 0&&i.set("item_limit",String(r?.item_limit)),r?.item_cursor!==void 0&&i.set("item_cursor",String(r?.item_cursor)),r?.progression_limit!==void 0&&i.set("progression_limit",String(r?.progression_limit)),r?.progression_cursor!==void 0&&i.set("progression_cursor",String(r?.progression_cursor));let a=i.toString(),s=`/v1/inventory/${u(e)}/${u(n)}`+(a?`?${a}`:"");return t.client.get(s,r?.signal)}async function En(t,e,n,r,i){let a=`/v1/inventory/${u(e)}/${u(n)}/items/${u(r)}`;return t.client.get(a,i?.signal)}async function Ln(t,e,n,r,i){let a=new URLSearchParams;i?.bucket_1!==void 0&&a.set("bucket_1",String(i?.bucket_1)),i?.bucket_2!==void 0&&a.set("bucket_2",String(i?.bucket_2)),i?.limit!==void 0&&a.set("limit",String(i?.limit)),i?.periods_back!==void 0&&a.set("periods_back",String(i?.periods_back)),i?.period!==void 0&&a.set("period",String(i?.period)),i?.player_id!==void 0&&a.set("player_id",String(i?.player_id));let s=a.toString(),o=`/v1/leaderboards/${u(e)}/${u(n)}/${u(r)}`+(s?`?${s}`:"");return t.client.get(o,i?.signal)}async function Mn(t,e,n,r,i){let a=`/v1/inventory/${u(e)}/${u(n)}/orders/${u(r)}`;return t.client.get(a,i?.signal)}async function qn(t,e,n,r,i){let a=`/v1/inventory/${u(e)}/${u(n)}/progressions/${u(r)}`;return t.client.get(a,i?.signal)}async function Fn(t,e,n,r,i,a){let s=`/v1/inventory/${u(e)}/${u(n)}/catalogs/${u(r)}/recipes/${u(i)}/availability`;return t.client.get(s,a?.signal)}async function $n(t,e,n,r){let i=new URLSearchParams;i.set("limit",String(r?.limit));let a=i.toString(),s=`/v1/inventory/${u(e)}/${u(n)}/recipe-usage`+(a?`?${a}`:"");return t.client.get(s,r?.signal)}async function je(t,e,n,r,i){let a=`/v1/saves/${u(e)}/${u(n)}/${u(r)}`;return t.client.getWithEtag(a,{...i?.signal===void 0?{}:{signal:i.signal},...i?.ifNoneMatch===void 0?{}:{ifNoneMatch:i.ifNoneMatch}})}async function jn(t,e,n){let r=new URLSearchParams;n?.bucket_1!==void 0&&r.set("bucket_1",String(n?.bucket_1)),n?.bucket_2!==void 0&&r.set("bucket_2",String(n?.bucket_2)),n?.periods_back!==void 0&&r.set("periods_back",String(n?.periods_back)),n?.period!==void 0&&r.set("period",String(n?.period)),n?.player_id!==void 0&&r.set("player_id",String(n?.player_id));let i=r.toString(),a=`/v1/leaderboards/${u(e)}/friends`+(i?`?${i}`:"");return t.client.get(a,n?.signal)}async function Dn(t,e,n){let r=`/v1/showcase/friends/${u(e)}`;return t.client.get(r,n?.signal)}async function Nn(t,e,n){let r=`/v1/inbox/friend-challenges/${u(e)}`;return t.client.get(r,n?.signal)}async function Bn(t,e,n){let r=new URLSearchParams;n?.bucket_1!==void 0&&r.set("bucket_1",String(n?.bucket_1)),n?.bucket_2!==void 0&&r.set("bucket_2",String(n?.bucket_2)),n?.periods_back!==void 0&&r.set("periods_back",String(n?.periods_back)),n?.period!==void 0&&r.set("period",String(n?.period)),n?.player_id!==void 0&&r.set("player_id",String(n?.player_id));let i=r.toString(),a=`/v1/leaderboards/${u(e)}`+(i?`?${i}`:"");return t.client.get(a,n?.signal)}async function Un(t,e){let n=`/v1/games/${u(t.gameId())}/players/me/earn-allowance`;return t.client.get(n,e?.signal)}async function Vn(t,e){let n=`/v1/games/${u(t.gameId())}/players/me/passes`;return t.client.get(n,e?.signal)}async function Re(t,e){return t.client.get("/v1/inventory/players/me/platform-currencies",e?.signal)}async function Wn(t,e,n){let r=`/v1/profiles/players/${u(e)}`;return t.client.get(r,n?.signal)}async function Hn(t,e){let n=new URLSearchParams;e?.config_version!==void 0&&n.set("config_version",String(e?.config_version));let r=n.toString(),i="/v1/inventory/platform-funded-game-inventory-purchase-catalog"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function Jn(t,e,n,r){let i=`/v1/showcase/players/${u(e)}/${u(n)}`;return t.client.get(i,r?.signal)}async function zn(t,e){return t.client.get("/v1/characters/slots",e?.signal)}async function Kn(t,e,n){let r=`/v1/inventory/transfers/${u(e)}`;return t.client.get(r,n?.signal)}async function Yn(t,e,n){let r=`/v1/games/${u(t.gameId())}/analytics/events`;return t.client.post(r,e,n?.signal,{...n?.keepalive===void 0?{}:{keepalive:n.keepalive},replaySafe:true,retryRateLimited:false})}async function Xn(t,e,n){return t.client.post("/v1/inventory/transfers",e,n?.signal)}async function Qn(t,e,n,r,i){let a=`/v1/inventory/${u(e)}/${u(n)}/platform-funded-game-inventory-purchases`;return t.client.post(a,r,i?.signal)}async function Zn(t,e){let n=new URLSearchParams;e?.periods_back!==void 0&&n.set("periods_back",String(e?.periods_back)),e?.player_id!==void 0&&n.set("player_id",String(e?.player_id));let r=n.toString(),i="/v1/challenges"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function et(t,e){return t.client.get("/v1/characters",e?.signal)}async function nt(t,e,n,r){let i=`/v1/settings/${u(e)}/${u(n)}`;return t.client.get(i,r?.signal)}async function tt(t,e,n,r){let i=new URLSearchParams;r?.limit!==void 0&&i.set("limit",String(r?.limit)),r?.cursor!==void 0&&i.set("cursor",String(r?.cursor));let a=i.toString(),s=`/v1/inventory/${u(e)}/${u(n)}/orders`+(a?`?${a}`:"");return t.client.get(s,r?.signal)}async function rt(t,e,n,r){let i=new URLSearchParams;r?.limit!==void 0&&i.set("limit",String(r?.limit)),r?.cursor!==void 0&&i.set("cursor",String(r?.cursor));let a=i.toString(),s=`/v1/saves/${u(e)}/${u(n)}`+(a?`?${a}`:"");return t.client.get(s,r?.signal)}async function it(t,e){let n=new URLSearchParams;e?.cursor!==void 0&&n.set("cursor",String(e?.cursor)),e?.limit!==void 0&&n.set("limit",String(e?.limit));let r=n.toString(),i="/v1/inbox/friend-challenges"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function at(t,e){let n=new URLSearchParams;e?.limit!==void 0&&n.set("limit",String(e?.limit)),e?.cursor!==void 0&&n.set("cursor",String(e?.cursor));let r=n.toString(),i="/v1/friends"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function st(t,e){let n=new URLSearchParams;e.entity_type!==void 0&&n.set("entity_type",String(e.entity_type)),e.entity_id!==void 0&&n.set("entity_id",String(e.entity_id)),e?.direction!==void 0&&n.set("direction",String(e?.direction)),e?.status!==void 0&&n.set("status",String(e?.status)),e?.cursor!==void 0&&n.set("cursor",String(e?.cursor)),e?.limit!==void 0&&n.set("limit",String(e?.limit));let r=n.toString(),i="/v1/inventory/transfers"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function ot(t,e,n){let r=`/v1/inbox/friend-challenges/${u(e)}/answered`;return t.client.post(r,void 0,n?.signal)}async function lt(t,e,n,r,i,a){let s=`/v1/inventory/${u(e)}/${u(n)}/progressions/${u(r)}/max`;return t.client.post(s,i,a?.signal)}async function dt(t,e,n,r,i,a){let s=`/v1/settings/${u(e)}/${u(n)}/${u(r)}`;return t.client.put(s,i,a?.signal,{...a?.ifMatch===void 0?{}:{ifMatch:a.ifMatch}})}async function ut(t,e,n,r,i){let a=`/v1/showcase/players/${u(e)}/${u(n)}`;return t.client.put(a,r,i?.signal)}async function ct(t,e,n){let r=`/v1/inventory/transfers/${u(e)}/reject`;return t.client.post(r,void 0,n?.signal)}async function pt(t,e,n,r){let i=`/v1/characters/${u(e)}`;return t.client.patch(i,n,r?.signal)}async function gt(t,e,n,r,i,a){let s=`/v1/saves/${u(e)}/${u(n)}/${u(r)}/upload-url`;return t.client.post(s,i,a?.signal,{replaySafe:true})}async function mt(t,e,n,r,i,a){let s=`/v1/inventory/${u(e)}/${u(n)}/progressions/${u(r)}/reset`;return t.client.post(s,i,a?.signal)}async function yt(t,e,n){let r=`/v1/characters/${u(e)}`;return t.client.delete(r,n?.signal)}function ft(t,e){let n=e?.retryAfterSeconds,r=typeof n=="number"&&Number.isFinite(n)&&n>0?n*1e3:0,i=1e4*2**Math.min(Math.max(0,t-1),16);return Math.min(Math.max(r,i),3e5)}var xr="gem_";function De(t){return t.startsWith(xr)}function Sr(t){let e=2166136261;for(let n of new TextEncoder().encode(t))e^=n,e=Math.imul(e,16777619);return e>>>0}function kr(t){let e=t;return e^=e>>>16,e=Math.imul(e,2246822507),e^=e>>>13,e=Math.imul(e,3266489909),e^=e>>>16,e>>>0}function Ne(t,e,n){if(Be(t,n),typeof e!="string"||e==="")throw new TypeError("[gem] experiment: playerId must be a non-empty string");let r=typeof n=="number"?n:n.length,i=kr(Sr(`${t}:${e}`))%r;return typeof n=="number"?i:n[i]}function Be(t,e){if(typeof t!="string"||t==="")throw new TypeError("[gem] experiment: key must be a non-empty string");if(typeof e=="number"){if(!Number.isInteger(e)||e<1||e>2048)throw new RangeError(`[gem] experiment '${t}': the count must be an integer from 1 to 2048; got ${String(e)}`);return}if(!Array.isArray(e))throw new TypeError(`[gem] experiment '${t}': pass a count or a list of strings; got ${typeof e}`);let n=e;if(n.length<1||n.length>2048)throw new RangeError(`[gem] experiment '${t}': the list must hold 1 to 2048 strings; got ${n.length}`);if(!n.every(r=>typeof r=="string"))throw new TypeError(`[gem] experiment '${t}': every option must be a string`)}var ht=1e4,_t=50,Or=500,Ir=65536-4*1024,Gr=24*1024;function bt(t){let e={},n={};for(let[r,i]of Object.entries(t))typeof i=="string"?e[r]=i:typeof i=="number"&&Number.isFinite(i)&&(n[r]=i);return {dimensions:e,measures:n}}var Cr=6e4;function Tr(t){let e=new Map;for(let n of t??[]){let r=new Set;for(let[i,a]of Object.entries(n.dimensions??{})){let s=a?.range;typeof s=="object"&&s!==null&&r.add(i);}r.size>0&&e.set(n.id,r);}return e}function Er(t,e){if(e===void 0)return t;let n=null,r={};for(let[i,a]of Object.entries(t.measures))e.has(i)?(n??={...t.dimensions})[i]=String(a):r[i]=a;return n===null?t:{dimensions:n,measures:r}}var Rt=t=>typeof t=="number"?t:0,Lr=t=>typeof t=="string"?t:"";function we(t=0){return {accepted:0,rejected:[],dropped:t,duplicate:false}}function Mr(t,e){let n=t??{},r=Array.isArray(n.rejected)?n.rejected.map(i=>{let a=i??{};return {index:Rt(a.index),code:Lr(a.code)}}):[];return {accepted:Rt(n.accepted),rejected:r,dropped:e,duplicate:n.duplicate===true}}function Ue(){let t=globalThis.crypto;return typeof t?.randomUUID=="function"?t.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let n=Math.floor(Math.random()*16);return (e==="x"?n:n&3|8).toString(16)})}function qr(t){return t?.retryable===true}var J=class{#e;#t;#i;#o;#n=[];#_={};#s=0;#l=null;#b=false;#R=false;#g=0;#w=0;#v=0;#r=false;#x=null;#d=null;#c=false;#a=false;#m=false;#S=false;#k=false;#y=void 0;#A=false;#P=0;constructor(e){this.#e=e,this.#t=e.options?.enabled!==false,this.#i=Math.max(ht,e.options?.flushIntervalMs??ht),this.#o=Math.max(1,Math.floor(e.options?.maxQueue??Or));}track(e,n={}){if(!this.#t||this.#r)return;if(De(e)){this.#k||(this.#k=true,this.#h(`[gem] analytics: '${e}' was not recorded \u2014 the gem_ prefix is reserved for the platform's own events, which the SDK emits for you. Name your event something else.`));return}this.#O(e,bt({...this.#_,...n}));let r=this.#C();this.#y===void 0&&!this.#A&&r!==null&&r!==""&&(this.#A=true,this.#T());}setContext(e){this.#_={...this.#_,...e};}async experiment(e,n){Be(e,n);let r=this.#e.awaitPlayerId===void 0?this.#e.playerId():await this.#e.awaitPlayerId();if(r===null)throw new Error(`[gem] experiment '${e}': no player to select for \u2014 this call was not made by a player.`);return typeof n=="number"?Ne(e,r,n):Ne(e,r,n)}get environment(){let e=this.#e.environment;return {...typeof e=="function"?e():e??{}}}async flush(e={}){if(this.#a)return we();let n=this.#C();if(n===null||n==="")return this.#n.length>0&&!this.#S&&(this.#S=true,this.#h("[gem] analytics: events are being recorded but no play session has been established, so nothing is being sent. Outside the arcade this is expected.")),we();let r=e.keepalive===true;if(!r&&this.#e.declarations!==void 0&&this.#n.some(c=>!De(c.name))&&await this.#T(),this.#G(),this.#n.length===0||this.#g>0&&!r)return we();this.#p();let i=this.#n.splice(0,this.#L(r)),a=this.#s;this.#s=0;let s=Math.round(this.#e.clock.now()),o={batch_id:Ue(),sent_at_ms:s,events:i.map(c=>wt(c,s,this.#y?.get(c.name)))},l={client:this.#e.client(),gameId:()=>n};this.#g+=1;try{let c=await Yn(l,o,{...e.signal===void 0?{}:{signal:e.signal},...r?{keepalive:!0}:{}}),g=Mr(c,a);return this.#w=0,this.#v=0,this.#M(g),g}catch(c){throw qr(c)?(this.#E(i,a),this.#w+=1,this.#v=this.#e.clock.now()+ft(this.#w,c)):this.#h(`[gem] analytics: ${i.length} event(s) were discarded \u2014 the platform refused the batch and will refuse it again: ${String(c)}`),c}finally{this.#g-=1,this.#n.length>0&&this.#u();}}trackPlatform(e,n={}){this.#r||this.#a&&(e==="gem_pause"||e==="gem_resume")||this.#O(e,bt(n));}hold(){this.#r||this.#d!==null||(this.#a=true,this.#p());}release(){if(!this.#a||this.#r)return;this.#a=false;let e=this.#e.clock.now(),n=this.#n.map(r=>({...r,atMs:e}));this.#n=n,this.#m&&(this.#m=false,this.#d=e,this.#c=false,this.#n.unshift({uid:Ue(),name:"gem_session_start",atMs:e,dimensions:{},measures:{}})),this.#n.length>=_t?this.#f():this.#n.length>0&&this.#u();}get held(){return this.#a}startSession(){if(!(this.#r||this.#d!==null)){if(this.#a){this.#m=true;return}this.#d=this.#e.clock.now(),this.#c=false,this.trackPlatform("gem_session_start");}}endSession(e){if(this.#r||this.#c)return;if(this.#c=true,this.#a){this.#m=false,this.#n=[],this.#s=0;return}let n=this.#d;this.trackPlatform("gem_session_end",{reason:e,...n===null?{}:{duration_ms:Math.max(0,Math.round(this.#e.clock.now()-n))}}),this.#f({keepalive:true});}setPaused(e){this.#r||e===this.#b||(this.#b=e,this.trackPlatform(e?"gem_pause":"gem_resume"),e?this.#p():this.#n.length>0&&this.#u());}setHidden(e){this.#r||e===this.#R||(this.#R=e,e?this.#p():this.#n.length>0&&this.#u());}dispose(){this.#r=true,this.#p(),this.#n=[],this.#s=0;}get pending(){return this.#n.length}#O(e,n){let{dimensions:r,measures:i}=n;for(this.#G();this.#n.length>=this.#o;)this.#n.shift(),this.#s+=1;this.#n.push({uid:Ue(),name:e,atMs:this.#e.clock.now(),dimensions:r,measures:i}),this.#n.length>=_t?this.#f():this.#u();}#f(e={}){if(e.keepalive!==true&&this.#I()>0){this.#u();return}this.flush(e).catch(()=>{});}#I(){return Math.max(0,this.#v-this.#e.clock.now())}#E(e,n){for(this.#n=[...e,...this.#n],this.#s+=n;this.#n.length>this.#o;)this.#n.shift(),this.#s+=1;}#L(e){let n=e?Gr:Ir,r=Math.min(this.#n.length,100),i=128;for(let a=0;a<r;a+=1){let s=this.#n[a];if(s===void 0)break;if(i+=JSON.stringify(wt(s,0,this.#y?.get(s.name))).length+1,i>n)return Math.max(1,a)}return r}#u(){this.#l!==null||this.#b||this.#R||this.#a||this.#r||this.#g>0||(this.#l=this.#e.clock.setTimeout(()=>{this.#l=null,this.#f();},Math.max(this.#i,this.#I())));}#p(){this.#l!==null&&(this.#e.clock.clearTimeout(this.#l),this.#l=null);}#G(){let e=this.#q();e===null||e===""||(this.#x!==null&&this.#x!==e&&(this.#n=[],this.#s=0,this.#d=null,this.#c=false),this.#x=e);}#M(e){for(let n of e.rejected)this.#h(`[gem] analytics: an event was refused (${n.code}). `+Fr(n.code));}#h(e){let n=this.#e.log;n!==null&&(n===void 0?console.warn(e):n(e));}#C(){try{return this.#e.gameId()}catch{return null}}#q(){try{return this.#e.playerId()}catch{return null}}async#T(){let e=this.#e.declarations;if(e!==void 0&&!(this.#e.clock.now()<this.#P))try{this.#y=Tr(await e());}catch{this.#P=this.#e.clock.now()+Cr;}}};function wt(t,e,n){let{dimensions:r,measures:i}=Er(t,n);return {event_uid:t.uid,name:t.name,offset_ms:Math.round(t.atMs)-e,dimensions:r,measures:i}}function Fr(t){switch(t){case "analytics_not_declared":return "This channel has no analytics_events section at all \u2014 promote a game config that declares one. The gem_* events in the same batch were still recorded.";case "unknown_event":return "This channel declares a set of events and this name is not in it \u2014 check the spelling, or declare it in analytics_events.";case "unknown_dimension":return "A string property on this event is not declared as one of its dimensions.";case "missing_dimension":return "A dimension this event declares was not supplied.";case "dimension_value_not_declared":return "A dimension value is outside the closed set the config declares for it.";case "unknown_measure":return "A numeric property on this event is not declared as one of its measures.";case "measure_wrong_type":return "A measure was the wrong shape \u2014 an int measure refuses a fractional value.";case "source_not_permitted":return "This event is declared for the server only, so a client may not emit it.";default:return "See the analytics_events section of your game config."}}var $r={initialDelayMs:2e3,maxDelayMs:6e4};function jr(t,e){return e!==void 0?!e:t==="chain_exhausted"}var ve=class{constructor(e){this.options=e;}options;grant=null;state="pending";failure=null;generation=0;inFlight=null;rejected=false;retry=null;failures=0;notBefore=0;disposed=false;get currentState(){return this.state}get lastFailure(){return this.failure}async get(){if(this.state==="lost")throw new x(this.failure??"unavailable","the session cannot be renewed");let e=this.seconds();if(this.grant&&e<this.grant.expiresAt-this.renewBefore())return this.grant.token;if(this.pastChainCeiling())throw new x("chain_exhausted","the token chain reached its ceiling");if(this.inFlight===null&&this.options.clock.now()<this.notBefore)throw new x(this.failure??"unavailable","the embedder asked for no new token yet; one is asked for when that wait is over");return this.refresh(this.nextReason())}pastChainCeiling(){return this.grant===null||this.seconds()<this.grant.chainEndsAt?false:(this.enter("lost","chain_exhausted"),true)}nextReason(){return this.rejected?"rejected":this.grant?"expiring":"initial"}invalidate(e){e!==void 0&&this.grant!==null&&this.grant.token!==e||this.rejected&&this.grant===null||(this.grant=null,this.generation+=1,this.inFlight=null,this.rejected=true,this.state!=="lost"&&this.enter("pending"));}accept(e){this.state!=="lost"&&(this.grant=e,this.rejected=false,this.enter("ready"));}close(e="unavailable"){this.grant=null,this.generation+=1,this.inFlight=null,this.enter("lost",e);}dispose(){this.disposed=true,this.cancelRetry();}scheduleRetry(e){if(this.cancelRetry(),this.failures+=1,this.notBefore=e===void 0?0:this.options.clock.now()+e,this.disposed)return;let{initialDelayMs:n,maxDelayMs:r}=$r,i=Math.min(r,n*2**(this.failures-1)),a=Math.max(i/2,e??0)+Math.random()*(i/2);this.retry={handle:this.options.clock.setTimeout(()=>this.retryNow(),a)};}retryNow(){this.retry=null,this.notBefore=0,!(this.state==="lost"||this.pastChainCeiling())&&this.refresh(this.nextReason()).catch(()=>{});}cancelRetry(){this.retry!==null&&(this.options.clock.clearTimeout(this.retry.handle),this.retry=null);}refresh(e){if(this.inFlight)return this.inFlight;this.cancelRetry();let n=this.generation;this.enter("pending");let r=this.options.request(e).then(i=>{if(n!==this.generation)throw new x("internal","token arrived for a superseded generation");return this.grant=i,this.rejected=false,this.enter("ready"),i.token}).catch(i=>{let a=Dr(i),{retryable:s,retryAfterMs:o}=i??{};throw n===this.generation&&(jr(a,typeof s=="boolean"?s:void 0)?this.enter("lost",a):(this.scheduleRetry(typeof o=="number"&&Number.isFinite(o)&&o>0?o:void 0),this.enter("degraded",a))),i instanceof x?i:new x(a,String(i))}).finally(()=>{this.inFlight===r&&(this.inFlight=null);});return this.inFlight=r,r}enter(e,n){(e==="ready"||e==="lost")&&this.cancelRetry(),e==="ready"&&(this.failures=0,this.notBefore=0),this.failure=n??(e==="ready"?null:this.failure),this.state!==e&&(this.state=e,this.options.onStateChange?.(e,n));}renewBefore(){return this.options.renewBeforeSeconds??60}seconds(){return Math.floor(this.options.clock.now()/1e3)}},x=class t extends Error{constructor(n,r){super(`auth ${n}: ${r}`);this.reason=n;this.name="AuthError";}reason;static isAuthError(n){if(n instanceof t)return true;let r=n;return r?.name==="AuthError"&&typeof r.reason=="string"}};function Dr(t){if(t instanceof x)return t.reason;let e=t?.reason;return typeof e=="string"&&["chain_exhausted","unavailable","timeout","internal"].includes(e)?e:"internal"}var v=class t extends Error{retryable=false;constructor(e){super(e),this.name="TransportRefusal";}static isRefusal(e){if(e instanceof t)return true;let n=e;return n?.name==="TransportRefusal"&&n.retryable===false}},N=["if-match","if-none-match"],vt=4096;function Nr(t){if(!t)return;let e={};for(let[n,r]of Object.entries(t)){let i=n.toLowerCase();if(!N.includes(i)||r===void 0)continue;let a=typeof r=="string"?Br(r):r;if(typeof a!="string"||a.length>vt||!Ur(a))throw new v(`the ${i} header value cannot be sent \u2014 it is not a string, is longer than ${vt} characters, or contains a character outside the range an HTTP header value may carry. This is a malformed request, not a server failure; the value is withheld here rather than written to logs.`);a!==""&&(e[i]=a);}return Object.freeze(e)}function Br(t){let e=i=>i===32||i===9||i===10||i===13,n=0,r=t.length;for(;n<r&&e(t.charCodeAt(n));)n++;for(;r>n&&e(t.charCodeAt(r-1));)r--;return t.slice(n,r)}function Ur(t){for(let e=0;e<t.length;e++){let n=t.charCodeAt(e);if(n!==9&&(n<32||n===127||n>255))return false}return true}function Vr(t){let{bytes:e}=t;if(e!==void 0){if(Object.prototype.toString.call(e)!=="[object Uint8Array]")throw new v("the raw body is not a Uint8Array, so it cannot be sent as bytes. This is a malformed request, not a server failure.");if(t.body!==void 0)throw new v("the request carries both a JSON body and a raw body, and only one can be sent. This is a malformed request, not a server failure.");return new Uint8Array(e)}}function xt(t,e){let n=e.replayUnauthorizedOnce??true;return {async request(r){let i={...r},a=Nr(i.headers),s=Vr(i),o=Object.freeze({...i,headers:a,...s===void 0?{}:{bytes:s}}),l=await e.tokenSource.get(),c=await t(o,l);if(c.status!==401||!n)return c;e.tokenSource.invalidate(l);let g=await e.tokenSource.get(),p=await t(o,g);if(p.status===401)throw e.tokenSource.close("unavailable"),new x("unavailable","the server refused a freshly minted token");return p}}}function xe(t){let e=typeof t=="string"?new TextEncoder().encode(t):t;return btoa(Wr(e))}function St(t){let e=atob(t),n=new Uint8Array(e.length);for(let r=0;r<e.length;r+=1)n[r]=e.charCodeAt(r);return n}function Ve(t){return new TextDecoder().decode(St(t))}function Wr(t){let n="";for(let r=0;r<t.length;r+=32768)n+=String.fromCharCode(...t.subarray(r,r+32768));return n}var f=class extends Error{constructor(n,r,i,a,s){super(`${n} (${r}): ${i}`);this.reason=n;this.status=r;this.detail=i;this.retryAfterSeconds=a;this.code=s;this.name="GemApiError";}reason;status;detail;retryAfterSeconds;code;get retryable(){return this.reason==="unavailable"||this.reason==="rate_limited"}},Hr=new WeakMap;var Jr=new Set([408,429,500,502,503,504]),zr=6e4,Pt=new WeakMap;function Ot(t,e){Pt.set(t,e);}function kt(t){return t!==null&&(t.reason==="rate_limited"||t.retryAfterSeconds!==void 0)}function Kr(t){if(t===void 0)return 2;if(!Number.isInteger(t)||t<0||t>10)throw new v(`maxRetries must be a whole number between 0 and 10; received ${JSON.stringify(t)}. This is a configuration fault, not a server failure.`);return t}var K=class{constructor(e){this.options=e;}options;async get(e,n){return this.send({method:"GET",path:e,signal:n},true)}async getWithEtag(e,n={}){let r=await this.sendRaw({method:"GET",path:e,...n.signal===void 0?{}:{signal:n.signal},...n.ifNoneMatch===void 0?{}:{headers:{"if-none-match":n.ifNoneMatch}}},true),i=r.etag===void 0?{}:{etag:r.etag};return r.status===304?{modified:false,...i}:{modified:true,body:r.body,...i}}async put(e,n,r,i={}){return this.send({method:"PUT",path:e,body:n,signal:r,...z(i)},i.replaySafe===true,i.retryRateLimited!==false)}async post(e,n,r,i={}){return this.send({method:"POST",path:e,body:n,signal:r,...z(i)},i.replaySafe===true,i.retryRateLimited!==false)}async postBytes(e,n,r,i={}){let a=await this.sendRaw({method:"POST",path:e,bytes:n,responseType:"bytes",signal:r,...z(i)},i.replaySafe===true,i.retryRateLimited!==false);return {bytes:Yr(a.body),...a.invocationId===void 0?{}:{invocationId:a.invocationId}}}async patch(e,n,r,i={}){return this.send({method:"PATCH",path:e,body:n,signal:r,...z(i)},i.replaySafe===true,i.retryRateLimited!==false)}async delete(e,n,r={}){return this.send({method:"DELETE",path:e,signal:n,...z(r)},r.replaySafe===true,r.retryRateLimited!==false)}async send(e,n,r=true){return (await this.sendRaw(e,n,r)).body}async sendRaw(e,n,r=true){let i=n?Kr(this.options.maxRetries)+1:1,a=null;if(e.signal?.aborted)throw At(e.signal);let s=e.signal===void 0?void 0:Pt.get(e.signal);for(let o=0;o<i;o++){if(o>0){let g=this.backoffMs(o,a);if(kt(a)&&s!==void 0&&g>=s())throw a;await this.backoff(g,e.signal);}if(e.signal?.aborted)throw kt(a)&&s!==void 0&&s()<=0?a:At(e.signal);let l;try{l=await this.options.transport.request(e);}catch(g){if(x.isAuthError(g)||v.isRefusal(g)||e.signal?.aborted||Xr(g))throw g;a=new f("unavailable",0,String(g));continue}if(l.status>=200&&l.status<300||l.status===304)return l;let c=Qr(l);if(!Jr.has(l.status)||l.status===429&&!r)throw c;a=c;}throw a??new f("unavailable",0,"no attempt was made")}backoffMs(e,n){let r=n?.retryAfterSeconds,i=r!==void 0?r*1e3:2**(e-1)*250,a=2**(e-1)*250;return Math.min(Math.max(i,a),zr)}backoff(e,n){return n?.aborted?Promise.resolve():new Promise(r=>{let i=this.options.clock,a=false,s=false,o,l=()=>{a||(a=true,s&&i.clearTimeout(o),n?.removeEventListener("abort",l),r());};n?.addEventListener("abort",l,{once:true}),o=i.setTimeout(l,e),s=true,a&&i.clearTimeout(o);})}};function Yr(t){if(t instanceof Uint8Array)return t;if(t==null)return new Uint8Array(0);let e=typeof t=="string"?t:JSON.stringify(t);return new TextEncoder().encode(e)}function z(t){return {...t.keepalive===void 0?{}:{keepalive:t.keepalive},...t.ifMatch===void 0?{}:{headers:{"if-match":t.ifMatch}}}}function At(t){return t.reason!==void 0?t.reason:new DOMException("The operation was aborted.","AbortError")}function Xr(t){let e=t?.name;return e==="AbortError"||e==="TimeoutError"}function Qr(t){let e=ei(t),n=ti(t.body),r={...n===void 0?{}:{details:n},...t.invocationId===void 0?{}:{invocationId:t.invocationId}};return Object.keys(r).length>0&&Hr.set(e,r),e}var Zr=new Map([["insufficient_funds","insufficient_funds"]]);function ei(t){let{status:e,body:n}=t,r=ni(n),i=t.retryAfterSeconds??ii(n),a=ri(n),s=a===void 0?void 0:Zr.get(a);if(s!==void 0)return new f(s,e,r,void 0,a);switch(e){case 304:return new f("not_modified",e,r);case 400:case 422:return new f("invalid",e,r,void 0,a);case 403:return new f("forbidden",e,r,void 0,a);case 404:return new f("not_found",e,r,void 0,a);case 402:return new f("insufficient_funds",e,r,void 0,a);case 409:return new f("conflict",e,r,void 0,a);case 412:return new f("precondition_failed",e,r,void 0,a);case 413:return new f("too_large",e,r,void 0,a);case 429:return new f("rate_limited",e,r,i,a);default:return new f("unavailable",e,r,i,a)}}function ni(t){if(typeof t=="string")return t;let e=t?.message;if(typeof e=="string")return e;let n=t?.error;if(typeof n=="string")return n;let r=n?.message;return typeof r=="string"?r:"no detail"}function ti(t){let n=t?.error?.details;return n===null?void 0:n}function ri(t){let n=t?.error?.code;return typeof n=="string"&&n.length>0?n:void 0}function ii(t){let e=t?.retryAfterSeconds;return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function ai(t){let e=t.lastIndexOf("@");return (e===-1?t:`***@${t.slice(e+1)}`).slice(0,200)}var si=new Set(N);function oi(t){if(!t)return {};let e={};for(let[n,r]of Object.entries(t))si.has(n.toLowerCase())&&(e[n.toLowerCase()]=r);return e}function It(t){let e=t.fetch??globalThis.fetch.bind(globalThis);return xt(async(n,r)=>{let i;try{i=new URL(t.baseUrl.replace(/\/+$/,""));}catch{throw new v("the configured baseUrl is not a valid URL. Its value is withheld here rather than written to logs. This is a configuration fault, not a server failure.")}let a;try{a=new URL(i.href.replace(/\/+$/,"")+n.path);}catch{throw new v(`${JSON.stringify(typeof n.path=="string"?ai(n.path):"(a non-string path)")} does not form a valid URL against ${i.protocol}//${i.host}. This is a malformed request, not a server failure.`)}if(a.protocol!==i.protocol||a.host!==i.host)throw new v(`${JSON.stringify(a.pathname)} resolves to ${a.protocol}//${a.host}, not ${i.protocol}//${i.host}. A request path may not change the request's origin \u2014 it carries the play token.`);if(a.username!==""||a.password!==""){let y=i.username!==""||i.password!=="",R=a.username!==i.username||a.password!==i.password,L=y?R?"baseUrl (and possibly the request path)":"baseUrl":"request path";throw new v(`the ${L} puts credentials in the URL, which cannot be fetched (${n.method} ${a.pathname}). The value is withheld here rather than written to logs. This is a malformed request, not a server failure.`)}for(let[y,R]of Object.entries(t.defaultQuery??{}))a.searchParams.has(y)||a.searchParams.set(y,R);let s=n.bytes,o=n.bytes===void 0?void 0:"application/octet-stream";try{n.body!==void 0&&(s=JSON.stringify(n.body),o="application/json");}catch(y){throw new v(`the body of ${n.method} ${JSON.stringify(a.pathname)} could not be serialised to JSON: ${String(y)}. This is a bug in the request, not a server failure \u2014 retrying sends the same unserialisable value.`)}let l=await e(a.toString(),{method:n.method,headers:{authorization:`Bearer ${r}`,...o===void 0?{}:{"content-type":o},...oi(n.headers)},body:s,signal:n.signal,...n.keepalive===void 0?{}:{keepalive:n.keepalive},credentials:"omit",mode:"cors",redirect:"error",cache:"no-store",referrerPolicy:"no-referrer"}),c=null;if(n.responseType==="bytes"&&l.status>=200&&l.status<300)c=new Uint8Array(await l.arrayBuffer());else {let y=await l.text();if(y.length>0)try{c=JSON.parse(y);}catch{c=y;}}let g=l.headers.get("etag"),p=We(l.headers.get("retry-after")),h=l.headers.get("x-gem-invocation-id");return {status:l.status,body:c,...g===null?{}:{etag:g},...p===void 0?{}:{retryAfterSeconds:p},...h===null||h===""?{}:{invocationId:h}}},t)}function We(t){if(t===null)return;let e=t.trim();if(!/^\d+$/.test(e))return;let n=Number(e);return Number.isFinite(n)?n:void 0}var Gt=400,P=t=>typeof t=="string"?t:"",li=/(?:Z|[+-]\d{2}:?\d{2})$/i;function q(t){let e=P(t);if(!li.test(e))return 0;let n=Date.parse(e);return Number.isFinite(n)?Math.floor(n/1e3):0}var di=/^[0-9a-f]{1,64}$/,ui=/^[0-9a-f]{16}$/,ci=/^[A-Za-z][A-Za-z0-9_+\-/]{0,63}$/,pi=/^(?:[01]\d|2[0-3]):[0-5]\d$/;function He(t){let e=P(t),n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!n)return;let[r,i,a]=[Number(n[1]),Number(n[2]),Number(n[3])],s=new Date(Date.UTC(r,i-1,a));return s.getUTCFullYear()===r&&s.getUTCMonth()===i-1&&s.getUTCDate()===a?e:void 0}var gi=4096,mi=new TextEncoder;function yi(t){let e=P(t.challenge_data),n=P(t.challenge_data_hash);return e===""||!ui.test(n)?{}:mi.encode(e).length>gi?{}:{data:e,dataHash:n}}function fi(t){let e=t??{},n=q(e.period_start_at),r=q(e.period_ends_at);if(n===0||r===0)return;let i=P(e.slug),a=P(e.seed),s=He(e.period_local_date),o=P(e.boundary),l=P(e.reset_time);return {id:P(e.progression_definition_id),...i===""?{}:{slug:i},window:P(e.window),periodStartAt:n,periodEndsAt:r,...s===void 0?{}:{periodLocalDate:s},boundary:ci.test(o)?o:"",resetTime:pi.test(l)?l:"",seed:di.test(a)?a:"",...yi(e)}}function Se(t){if(t!==void 0&&(!Number.isInteger(t)||t<0||t>400))throw new TypeError(`periodsBack must be an integer between 0 and 400, got ${String(t)}`)}function Ct(t){let e=t??{};return Array.isArray(e.challenges)?e.challenges.map(fi).filter(n=>n!==void 0):[]}var Y=class{#e;constructor(e){this.#e=e;}async list(e={}){let{periodsBack:n}=e;Se(n);let r=await Zn(this.#e,{...n===void 0?{}:{periods_back:n},...e.signal===void 0?{}:{signal:e.signal}});return Ct(r)}};var hi="gem-web-bridge";var _i=65536,Tt=8,ke=5e3,Et=1024;var Ae=Object.create(null);var Lt=Object.create(null);function bi(t){let e=/^([a-z][a-z0-9+.-]*):\/\/([a-z0-9.-]+|\[[0-9a-f:.]+\])(:([0-9]{1,5}))?$/i.exec(t);return e===null?false:e[4]===void 0||Number(e[4])<=65535}function Ri(t){let e;try{e=new URL(t);}catch{return false}return e.username!==""||e.password!==""?false:e.protocol==="https:"?true:e.protocol==="http:"&&(e.hostname==="localhost"||e.hostname==="127.0.0.1")}function wi(t){return /^[a-z]{2,8}(-[a-z0-9]{1,8})*$/i.test(t)}function vi(t){return /^[a-z_]+$/.test(t)}function xi(t){return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t)||/^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$/.test(t)&&!t.includes("--")}function Je(t,e,n){if(e>Tt)return `nesting deeper than ${Tt}`;if(++n.nodes>ke)return `more than ${ke} values`;if(n.bytes>n.cap)return `over the ${n.cap} byte limit`;if(t==null)return n.bytes+=4,null;let r=typeof t;if(r==="boolean")return n.bytes+=5,null;if(r==="number")return n.bytes+=8,null;if(r==="string")return n.bytes+=t.length*3+2,null;if(r!=="object")return `${r} is not plain data`;let i=t;if(n.seen.has(i))return "a repeated or cyclic object reference";if(n.seen.add(i),Array.isArray(t)){if(t.length>Et)return `an array of ${t.length} entries, over the ${Et} limit`;n.bytes+=2;for(let o of t){let l=Je(o,e+1,n);if(l)return l}return null}let a=Object.getPrototypeOf(t);if(a!==Object.prototype&&a!==null)return "a value that is not a plain object";n.bytes+=2;let s=t;for(let o in s){if(!Object.prototype.hasOwnProperty.call(s,o))continue;if(++n.nodes>ke)return `more than ${ke} values`;if(n.bytes+=o.length*3+4,n.bytes>n.cap)return `over the ${n.cap} byte limit`;let l=Je(s[o],e+1,n);if(l)return l}return null}function Si(t,e=_i){let n={nodes:0,bytes:0,seen:new Set,cap:e},r=Je(t,0,n);return r?`message contains ${r}`:n.bytes>e?`message is over the ${e} byte limit`:null}var ki={origin:[bi,"not a well-formed origin"],url:[Ri,"not a safe absolute http(s) URL"],bcp47:[wi,"not a well-formed BCP 47 tag"],code:[vi,"not a code of lower-case letters and underscores"],gameRef:[xi,"not a game id or web address"]};function Mt(t,e,n){for(let r of e){let i=n===""?r[0]:`${n}.${r[0]}`,a=t[r[0]];if(a==null){if(r[1]<"a")continue;return `${i}: required`}let s=ze(a,r,i);if(s)return s}return null}function ze(t,e,n){let r=e[1].toLowerCase();switch(r){case "u":return typeof t=="boolean"?null:ze(t,typeof t=="string"?[e[0],"s",e[2]]:[e[0],"n",e[3],e[4]],n);case "s":{if(typeof t!="string")return `${n}: expected string`;if(t.length>e[2])return `${n}: exceeds ${e[2]} characters`;if(e[3]){let[i,a]=ki[e[3]];if(!i(t))return `${n}: ${a}`}return null}case "n":case "i":return typeof t!="number"||!(r=="i"?Number.isInteger:Number.isFinite)(t)?`${n}: expected ${r=="i"?"integer":"number"}`:t<e[2]||t>e[3]?`${n}: out of range ${e[2]}..${e[3]}`:null;case "b":return typeof t=="boolean"?null:`${n}: expected boolean`;case "e":{let i=e[2];return i.includes(t)?null:`${n}: not one of ${i.join("|")}`}case "o":return typeof t!="object"||t===null||Array.isArray(t)?`${n}: expected object`:Mt(t,e[2],n);case "j":return typeof t!="object"||t===null||Array.isArray(t)?`${n}: expected a plain object`:null;case "a":{if(!Array.isArray(t))return `${n}: expected array`;if(t.length>e[2])return `${n}: exceeds ${e[2]} items`;let i=e[3],a=`${n}[]`;for(let s of t){if(s==null){if(i[1]<"a")continue;return `${a}: required`}let o=ze(s,i,a);if(o)return o}return null}default:return `${n}: unknown kind ${String(r)}`}}var qt=Object.create(null);function d(t,e,n,r,i){return Ae[t]=n,r&&(Lt[t]=r),qt[t]=a=>{let s=Si(a,i);if(s)return s;if(typeof a!="object"||a===null||Array.isArray(a))return "message: expected object";let o=a;return o.gem!==hi?"gem: wrong protocol marker":o.type!==t?`type: expected ${t}`:Mt(o,e,"")}}var X=["","s",64],m=["requestId","s",64],Q=["currencySlug","s",32],Z=["matchId","s",64],C=["reason","S",64,"code"],M=["outcome","e",["ok","declined","unavailable"]];d("gem.handshake",[["versions","o",[["min","i",1,1e3],["max","i",1,1e3]]],["capabilities","A",64,X],["embedder","s",2048,"origin"],["unbidden","B"]],30);d("gem.handshake.accept",[["v","i",1,1e3],["capabilities","A",64,X]],5);d("gem.token",[["token","s",4096],["requestId","S",64],["generation","i",0,2147483647],["apiBaseUrl","S",512,"url"],["playerId","s",64],["gameId","s",64],["channel","e",["dev","test","release"]],["gameVersion","S",64],["expiresAt","i",0,4102444800],["chainEndsAt","i",0,4102444800],["allowDevTools","B"]],30);d("gem.token.denied",[m,["retryable","b"],["retryAfterMs","I",0,36e5],["reason","e",["chain_exhausted","unavailable"]],["correlationId","s",64]],30);d("gem.player",[["untrusted","o",[["displayName","s",64],["displayTag","S",80],["displayHandle","s",80]]],["playerId","S",64],["discriminator","S",8],["avatarIconUrl","S",2048,"url"],["avatarIconId","S",64],["avatar3dId","S",64],["avatar3dModelUrl","S",2048,"url"],["avatar3dIconUrl","S",2048,"url"],["avatars3d","A",8,["","o",[["family","s",32],["id","s",64],["modelUrl","s",256,"url"],["iconUrl","s",256,"url"]]]],["badges","A",2,["","o",[["itemId","s",64],["iconUrl","s",2048,"url"]]]],["displayTag","s",8],["avatarUrl","S",2048,"url"],["boost","O",[["multipliers","a",8,["","o",[["currencyId","s",64],Q,["multiplierBp","i",1e4,1e6]]]],["expiresInDays","I",1,7]]],["signInAvailable","B"]],12);d("gem.pause",[["paused","b"]],120);d("gem.prefs",[["reducedMotion","b"],["muted","b"],["showFrameStats","B"],["music","B"],["sounds","B"],["locale","s",35,"bcp47"],["recommended","O",[["volume","i",0,100],["batterySaver","b"],["keyboardLayout","e",["wasd","arrows"]],["gamepadConfirm","e",["south","east"]],["vibration","b"],["lookSensitivity","I",20,400],["gamepadLookSensitivity","I",20,400],["invertLookY","B"],["touchMovement","S",16,"code"],["graphicsQuality","S",16,"code"],["graphicsQualityAuto","B"],["colorHelp","B"],["textScale","I",100,200]]]],60);d("gem.cohorts",[["cohorts","a",8,["","o",[["experimentId","s",36],["variantKey","s",32]]]]],12,"cohorts");d("gem.earnAllowanceChanged",[],30,"earnAllowance");d("gem.inventoryChanged",[],30,"inventoryChanged");d("gem.viewport",[["insets","o",[["top","i",0,4096],["right","i",0,4096],["bottom","i",0,4096],["left","i",0,4096]]],["reserved","A",4,["","o",[["x","i",0,16384],["y","i",0,16384],["width","i",0,16384],["height","i",0,16384],["control","O",[["x","i",0,16384],["y","i",0,16384],["width","i",0,16384],["height","i",0,16384]]]]]]],60,"viewport");d("gem.deviceSettings",[["settings","J"]],12,"deviceSettings");d("gem.willTerminate",[["reason","e",["grant_expiring","session_ended","navigating","kill_switch"]],["graceMs","i",0,6e4]],10);d("gem.roomEvent",[["event","e",["updated","match_started","match_ready","match_failed","version_stale"]],["roomId","s",64],["matchId","S",64],["version","I",0,2147483647],["reason","S",64],["platform","E",["universal","mobile"]]],120,"rooms");d("gem.socketState",[["connected","b"],["reason","E",["connecting","dropped","watchdog","terminal"]]],12,"socketState");d("gem.seatedEvent",[["roomId","s",64]],60,"partySeating");d("gem.autoStartFailedEvent",[["roomId","s",64],["code","s",64]],30,"autoStartFailure");d("gem.ticketEvent",[["event","e",["queued","matched","expired","cancelled","failed"]],["ticketId","s",64],["partySize","I",1,64],["queuedAt","I",0,4102444800],["expiresAt","I",0,4102444800],["reason","S",64],["roomId","S",64]],60,"ticketEvents");d("gem.signalEvent",[["event","e",["hello","offer","answer","ice","peerJoined","peerLeft","migration","matchEnded","error"]],Z,["data","j"]],1800,"p2p");d("gem.relayDraining",[Z,["clusterTargetId","s",64],["relayIps","a",16,X],["drainingSince","s",40],["deadline","s",40]],60,"p2pRelayDrain");d("gem.dedicatedEvent",[["event","e",["answer","error","matchEnded"]],Z,["sdp","S",10240],["sessionId","S",64],["code","S",64],["message","S",256],["reason","S",64]],120,"dedicated");d("gem.partyResult",[m,["partyId","S",64]],30,"parties");d("gem.clusterTarget",[["clusterTargetId","s",64],["clusterTargetIds","A",3,X]],12,"clusterTarget");d("gem.graphicsRoutes",[["entries","a",32,["","o",[["gpu","s",32],["route","S",32],["host","S",32]]]]],12,"graphicsRoutes");d("gem.devtools",[["action","e",["open","close","toggle"]]],30,"devtools");d("gem.screenshot",[["maxWidth","i",1,7680],["maxHeight","i",1,4320]],6,"screenshot");d("gem.screenshot.denied",[["reason","e",["not_wired","no_source","unsupported","unreadable","tainted","too_large","busy","declined","failed"]],["retryable","b"]],12,"screenshot");d("gem.requestContext",[],12,"feedbackContext");d("gem.gameContext",[["context","j"]],12,"feedbackContext");d("gem.signal",[["signal","e",["join","offer","answer","ice","migrationAck","hostUnreachable"]],Z,["data","j"]],1200,"p2p");d("gem.dedicatedOffer",[Z,["sdp","s",10240],["intent","e",["initial","ice_restart","full_reconnect"]]],60,"dedicated");d("gem.partyRequest",[m],12,"parties");d("gem.ready",[],5);d("gem.engaged",[],5,"engagement");d("gem.progress",[["loaded","i",0,1099511627776],["total","i",0,1099511627776]],600);d("gem.requestToken",[m,["reason","e",["initial","expiring","rejected"]]],12);d("gem.requestLocalServer",[m,["gameRoomId","s",64]],6,"localHost");d("gem.localServer",[m,["serverId","S",128]],30,"localHost");d("gem.localServer.denied",[m,["retryable","b"],["reason","e",["refused","unavailable"]]],30,"localHost");d("gem.exit",[["reason","S",64]],5);d("gem.openExternal",[["url","s",2048,"url"]],6);d("gem.requestFullscreen",[["enabled","b"]],30);d("gem.audioState",[["muted","b"]],120,"audioState");d("gem.rewardCue",[Q,["cueId","S",64],["expected","I",1,1e9],["origin","O",[["x","i",0,16384],["y","i",0,16384]]]],60,"rewardCue");d("gem.rewardPresentation",[["mode","e",["arcade","game"]]],12,"rewardPresentation");d("gem.walletDisplay",[["visible","b"],["currencies","A",8,X],["score","B"]],60,"walletDisplay");d("gem.controlsDeclare",[["uses","o",[["lookSensitivity","S",16,"code"],["gamepadLookSensitivity","S",16,"code"],["invertLookY","S",16,"code"],["touchMovement","S",16,"code"]]]],60,"controls");d("gem.menu",[["settings","b"],["items","A",4,["","o",[["id","s",32],["label","s",40]]]]],60,"gameMenu");d("gem.menuSelect",[["entry","e",["settings","item"]],["id","S",32]],60,"gameMenu");d("gem.gemCorner",[["corner","e",["top-left","top-right","bottom-left","bottom-right"]]],12,"gemCorner");d("gem.menuStyle",[["ground","S",7],["accent","S",7]],12,"menuStyle");d("gem.settingsDeclare",[["settings","a",8,["","o",[["id","s",40],["label","s",40],["kind","e",["toggle","slider","choice"]],["value","u",40,-1e6,1e6],["quick","B"],["icon","S",16,"code"],["min","N",-1e6,1e6],["max","N",-1e6,1e6],["step","N",0,1e6],["options","A",4,["","o",[["id","s",40],["label","s",40]]]]]]]],120,"gameSettings");d("gem.settingChange",[["id","s",40],["value","u",40,-1e6,1e6]],120,"gameSettings");d("gem.requestShare",[["requestId","S",64],["params","a",16,["","o",[["key","s",64],["value","s",512]]]]],6,"share");d("gem.shareResult",[m,["outcome","e",["accepted","refused"]],C,["key","S",64]],30,"shareResult");d("gem.requestAvatarPicker",[["tab","E",["2d","3d"]]],6,"avatarPicker");d("gem.vibrate",[["pattern","a",99,["","i",0,1e4]]],600,"vibration");d("gem.frameStats",[["fps","i",0,1e3],["frameTimeP95Ms","i",0,1e5],["counts","E",["pageFrames","gameDraws"]]],120,"frameStats");d("gem.portraitBorders",[["name","S",40]],60,"portraitBorders");d("gem.error",[["code","e",["version_mismatch","handshake_timeout","handshake_duplicate","invalid_message","rate_limited","token_unavailable","unsupported","unsupported_capability","internal"]],["message","S",256]],60);d("gem.requestPurchase",[m,["purchaseKind","e",["item","recipe"]],["targetId","s",64],Q,["quantity","I",1,10],["catalogId","S",64],["origin","E",["sheet","direct_refused"]]],12,"purchases");d("gem.requestAvatar3dPurchase",[m,["itemId","s",64],Q],12,"avatar3dPurchases");d("gem.purchaseResult",[m,M,C,["purchaseId","S",64]],30,"purchases");d("gem.purchaseSettled",[["purchaseKind","e",["item","recipe"]],["targetId","s",64],["catalogId","S",64],["quantity","i",1,10],["purchaseId","S",64]],30,"purchaseSettled");d("gem.deviceSettings.put",[m,["settings","j"]],30,"deviceSettings");d("gem.deviceSettings.result",[m,["outcome","e",["stored","too_large","unavailable"]]],30,"deviceSettings");d("gem.requestAd",[m,["placement","s",32],["format","e",["interstitial","rewarded"]]],6,"ads");d("gem.adResult",[m,["outcome","e",["shown","no_ad","unavailable"]]],12,"ads");d("gem.signalMoment",[m,["kind","e",["level_end","run_end","match_end","menu_return","other_break"]],["placement","S",32],["wall","B"]],6,"moments");d("gem.momentResult",[m,["shown","b"]],12,"moments");d("gem.requestSignIn",[m],6,"signIn");d("gem.signInResult",[m,["outcome","e",["signed_in","declined","unavailable"]]],12,"signIn");d("gem.requestFriendChallenge",[m,["playerId","s",64],["template","s",64],["params","J"]],12,"friendChallenges");d("gem.friendChallengeResult",[m,["outcome","e",["accepted","cancelled","refused","unavailable","rate_limited","invalid"]],["code","S",64],["param","S",64],["channel","S",16],["configVersion","I",0,9007199254740991],["retryAfterMs","I",0,864e5],["detail","S",300]],30,"friendChallenges");d("gem.requestPlayInvite",[m,["params","A",16,["","o",[["key","s",64],["value","s",512]]]]],6,"playInvites");d("gem.playInviteResult",[m,["shown","b"]],12,"playInvites");d("gem.inviteParams",[["params","A",16,["","o",[["key","s",64],["value","s",512]]]]],30,"playInvites");d("gem.requestAppLinks",[m],12,"appLinks");d("gem.appLinksResult",[m,M,C,["arcade","O",[["store","e",["app_store","google_play"]]]],["game","O",[["store","e",["app_store","google_play"]]]]],30,"appLinks");d("gem.requestOpenApp",[m,["target","e",["arcade","game"]]],6,"appLinks");d("gem.openAppResult",[m,M,C],30,"appLinks");d("gem.requestOpenGame",[m,["ref","s",40,"gameRef"]],6,"openGame");d("gem.openGameResult",[m,M,C],30,"openGame");d("gem.requestSimilarGames",[m,["limit","I",1,24]],12,"openGame");d("gem.similarGamesResult",[m,M,C,["games","a",24,["","o",[["gameId","s",36,"gameRef"],["slug","S",40,"gameRef"],["iconUrl","s",1024,"url"],["capsuleLandscapeUrl","s",1024,"url"],["capsulePortraitUrl","s",1024,"url"],["previewVideoUrl","S",1024,"url"],["previewPosterUrl","S",1024,"url"],["untrusted","o",[["name","s",64],["tagline","s",64],["shortDescription","s",320],["tags","a",10,["","s",32]]]]]]]],30,"openGame",524288);d("gem.requestStoreOffers",[m],12,"store");d("gem.storeOffersResult",[m,M,C,["offers","a",32,["","o",[["skuId","s",64],["kind","e",["gem_pack","boost","pass","bundle"]],["name","s",80],["description","s",400],["imageUrl","S",1024,"url"],["priceDisplay","s",32],["grant","O",[["currency","s",32],["amount","i",1,1e9]]],["pass","S",64],["earnMultipliers","A",8,["","o",[Q,["multiplierBp","i",1e4,1e6]]]]]]]],30,"store",262144);d("gem.requestStorePurchase",[m,["skuId","s",64]],12,"store");d("gem.storePurchaseResult",[m,M,C],30,"store");d("gem.storePurchaseSettled",[["skuId","s",64]],30,"store");d("gem.requestStoreOfferSheet",[m,["skuId","s",64]],12,"storeOfferSheet");d("gem.storeOfferSheetResult",[m,M,C],30,"storeOfferSheet");Object.freeze(qt);Ae.__malformed=60;Object.freeze(Ae);Object.freeze(Lt);var F={now:()=>Date.now(),setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)};function Ft(t){let e=t.toLowerCase();return e==="localhost"||e.endsWith(".localhost")||e==="[::1]"||e==="::1"?true:/^127(\.\d{1,3}){3}$/.test(e)}var ee=class{constructor(e,n){this.inventory=e;this.resolveCurrencyId=n;}inventory;resolveCurrencyId;async list(e={}){return (await this.inventory.snapshot({buckets:e.buckets})).currencies.data.map(r=>({currencyId:r.currencyId,total:r.total,...r.buckets===void 0?{}:{buckets:r.buckets}}))}async get(e,n={}){let i=(await this.inventory.snapshot({buckets:n.buckets})).currencies.data,a=i.find(o=>o.currencyId===e),s;return !a&&this.resolveCurrencyId&&(s=await this.resolveCurrencyId(e).catch(()=>{}),s!==void 0&&(a=i.find(o=>o.currencyId===s))),{currencyId:a?a.currencyId:s??e,total:a?a.total:null,...a?.buckets===void 0?{}:{buckets:a.buckets}}}};function Ye(t){let e=Array.isArray(t.achievements)?t.achievements:[],n=[];for(let r of e){let i=r??{};typeof i.id!="string"||i.id===""||typeof i.threshold!="number"||!Number.isFinite(i.threshold)||n.push({id:i.id,threshold:i.threshold,points:typeof i.points=="number"?i.points:0,hidden:i.hidden===true,...typeof i.unlocked_at=="number"&&Number.isFinite(i.unlocked_at)?{unlockedAt:i.unlocked_at}:{},...i.revoked===true?{revoked:true}:{}});}return {...n.length>0?{achievements:n}:{},...t.achievements_unavailable===true?{achievementsUnavailable:true}:{}}}var $t="inventory",B=t=>typeof t=="number"?t:0,ne=t=>typeof t=="string"?t:"";function Ke(t,e){let n=t??{},r=typeof n.next_cursor=="string"?n.next_cursor:void 0;return {data:Array.isArray(n.data)?n.data.map(e):[],...r===void 0?{}:{nextCursor:r}}}function jt(t){let e=t??{};return {itemDefinitionId:ne(e.item_definition_id),instanceId:ne(e.instance_id),quantity:B(e.quantity),acquiredAt:B(e.acquired_at),...e.properties===void 0?{}:{properties:e.properties},...e.custom_data===void 0?{}:{customData:e.custom_data}}}function Ai(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0;return {currencies:Ke(e.currencies,r=>{let i=r??{},a=Array.isArray(i.buckets)?i.buckets.map(s=>{let o=s??{};return {bucket:ne(o.bucket),balance:B(o.balance)}}):void 0;return {currencyId:ne(i.currency_id),total:B(i.total),...a===void 0?{}:{buckets:a}}}),items:Ke(e.items,jt),progressions:Ke(e.progressions,r=>{let i=r??{};return {progressionDefinitionId:ne(i.progression_definition_id),currentValue:B(i.current_value),completionCount:B(i.completion_count),isCompleted:i.is_completed===true,...Ye(i)}}),...n===void 0?{}:{etag:n}}}var te=class{constructor(e,n,r){this.api=e;this.entity=n;this.cache=r;}api;entity;cache;snapshot(e={}){let n=e.buckets?`${$t}#buckets`:$t;return this.cache.read(n,[],()=>this.fetch({includeBuckets:e.buckets}))}async instances(e,n){let r=await this.snapshot();if(r.items.nextCursor===void 0){let a=r.items.data.filter(s=>s.itemDefinitionId===e);if(a.length>0)return a}let i=await En(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return Array.isArray(i)?i.map(jt):[]}page(e){return this.fetch(e)}refresh(){this.invalidate();}onChanged(e){return this.cache.onInvalidate(e)}invalidate(){this.cache.invalidate();}async fetch(e){let n=await Tn(this.api,this.entity.type,this.entity.id,{...e.includeBuckets?{include_buckets:true}:{},...e.currencyCursor===void 0?{}:{currency_cursor:e.currencyCursor},...e.itemCursor===void 0?{}:{item_cursor:e.itemCursor},...e.progressionCursor===void 0?{}:{progression_cursor:e.progressionCursor},...e.currencyLimit===void 0?{}:{currency_limit:e.currencyLimit},...e.itemLimit===void 0?{}:{item_limit:e.itemLimit},...e.progressionLimit===void 0?{}:{progression_limit:e.progressionLimit},...e.signal===void 0?{}:{signal:e.signal}});return Ai(n)}};var Pi={unknown_currency:1,currency_not_in_game_payable:1,not_purchasable:1,no_price_in_currency:1,busy:1,cancelled:1,insufficient_funds:1,price_mismatch:1,config_version_stale:1,platform_currency_unavailable:1,not_available:1,recipe_locked:1,already_owned:1,guest_upgrade_required:1,recipe_on_cooldown:1,recipe_max_uses_exceeded:1,item_max_stack_exceeded:1,recipe_costs_unmet:1,quantity_invalid:1,error:1};new Set(Object.keys(Pi));var $=class extends RangeError{constructor(n,r){super(r);this.code=n;this.name="PurchaseRefusal";}code;retryable=false};var _=t=>typeof t=="string"?t:"",Oi=t=>typeof t=="string"?t:_(t&&typeof t=="object"?t.type:void 0),O=t=>typeof t=="number"?t:0;function Ii(t){let e=t??{};return {prerequisiteType:_(e.prerequisite_type),referenceId:_(e.reference_id),required:O(e.required),current:O(e.current)}}function re(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0;return {orderId:_(e.order_id),status:_(e.status),...n===void 0?{}:{etag:n}}}function Pe(){return crypto.randomUUID()}var Gi="recipe-usage",Dt=100;function Oe(t){let e=t??{};switch(e.type){case "currency":return {kind:"currency",currencyId:_(e.currency_id),bucket:_(e.bucket),delta:O(e.delta),balanceAfter:O(e.balance_after)};case "item":return {kind:"item",itemDefinitionId:_(e.item_definition_id),instanceId:_(e.instance_id),delta:O(e.delta),quantityAfter:O(e.quantity_after)};case "progression":return {kind:"progression",progressionDefinitionId:_(e.progression_definition_id),delta:O(e.delta),valueAfter:O(e.value_after),completed:e.completed===true};default:return {kind:"other",type:_(e.type)}}}function Ci(t){let e=t??{},n=typeof e.rarity_tier=="string"?e.rarity_tier:void 0;return {entryId:_(e.entry_id),...n===void 0?{}:{rarityTier:n},rollNumber:O(e.roll_number),wasReplacement:e.was_replacement===true,grants:Array.isArray(e.grants)?e.grants.map(Oe):[]}}function Ti(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0,r=Array.isArray(e.loot_results)?e.loot_results.map(Ci):void 0;return {orderId:_(e.order_id),status:_(e.status),...n===void 0?{}:{etag:n},granted:Array.isArray(e.granted)?e.granted.map(Oe):[],consumed:Array.isArray(e.consumed)?e.consumed.map(Oe):[],autoClaimedRewards:Array.isArray(e.auto_claimed_rewards)?e.auto_claimed_rewards.map(Oe):[],...r===void 0||r.length===0?{}:{lootResults:r}}}function Ei(t){let e=t??{},n=e.price??{};return {payment:"platform_currency",orderId:_(e.target_order_id)||_(e.source_order_id),status:_(e.status),purchaseId:_(e.purchase_id),sourceOrderId:_(e.source_order_id),price:{currencyId:_(n.platform_currency_id),amount:O(n.price)}}}function Li(t){let e=t??{},n=typeof e.last_used_at=="string"?e.last_used_at:void 0,r=typeof e.cooldown_expires_at=="string"?e.cooldown_expires_at:void 0;return {recipeId:_(e.recipe_id),useCount:typeof e.use_count=="number"?e.use_count:0,isOnCooldown:e.is_on_cooldown===true,...n===void 0?{}:{lastUsedAt:n},...r===void 0?{}:{cooldownExpiresAt:r}}}function Nt(t){switch(t.type){case "currency_grant":case "currency_consume":return {type:t.type,currency_id:t.currencyId,amount:t.amount};default:return {type:t.type,item_definition_id:t.itemDefinitionId,quantity:t.quantity}}}var ie=class{constructor(e,n,r,i){this.api=e;this.entity=n;this.cache=r;this.handOffRefused=i;}api;entity;cache;handOffRefused;async create(e,n={}){let r=await this.write(()=>Sn(this.api,this.entity.type,this.entity.id,{operations:e.map(Nt),source:n.source??"play",nonce:Pe()},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}));return re(r)}async createMany(e,n={}){return this.write(()=>xn(this.api,this.entity.type,this.entity.id,{orders:e.map(r=>({operations:r.map(Nt),nonce:Pe()})),source:n.source??"play"},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}))}async recipeAvailability(e,n,r){let a=await Fn(this.api,this.entity.type,this.entity.id,e,n,r===void 0?{}:{signal:r})??{},s=typeof a.uses_remaining=="number"?a.uses_remaining:void 0,o=typeof a.cooldown_expires_at=="string"?a.cooldown_expires_at:void 0,l=Array.isArray(a.lock_reasons)?a.lock_reasons.map(Ii):[];return {canExecute:a.can_execute===true,locked:a.locked===true||l.length>0,lockReasons:l,reasons:Array.isArray(a.reasons)?a.reasons.map(c=>Oi(c)):[],...s===void 0?{}:{usesRemaining:s},...o===void 0?{}:{cooldownExpiresAt:o}}}async recipeUsageAll(){return this.cache.read(Gi,[],async()=>{let n=await $n(this.api,this.entity.type,this.entity.id,{limit:Dt})??{},r=Array.isArray(n.usages)?n.usages:[];return {usages:r.map(Li),truncated:r.length>=Dt}})}async recipeUsage(e){return (await this.recipeUsageAll()).usages.find(r=>r.recipeId===e)??null}async purchase(e,n={}){if(e.payment.kind==="configured"){let p=e,h=await this.write(()=>On(this.api,this.entity.type,this.entity.id,{catalog_id:p.catalogId,recipe_id:p.targetId,game_id:this.api.gameId(),nonce:Pe()},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}));return {payment:"configured",...Ti(h)}}if(this.entity.type!=="players"||this.entity.id!=="me")throw new TypeError("platform-currency purchases are available only on gem.me.mutations");let[r,i]=await Promise.all([Hn(this.api,n.signal===void 0?{}:{signal:n.signal}),Re(this.api,n.signal===void 0?{}:{signal:n.signal})]),a=e.payment.currencySlug.toLowerCase(),s=i.currencies.find(p=>p.currency_id.toLowerCase()===a||p.slug.toLowerCase()===a);if(s===void 0){let p=i.currencies.map(h=>h.slug);throw new $("unknown_currency",`platform currency ${JSON.stringify(e.payment.currencySlug)} is not an active platform currency. Active: ${p.length===0?"none":p.join(", ")}`)}let o=e.kind==="item"?r.items.find(p=>p.item_id===e.targetId):r.recipes.find(p=>p.recipe_id===e.targetId&&p.catalog_id===e.catalogId);if(o===void 0)throw new $("not_purchasable",`purchase target ${JSON.stringify(e.targetId)}`+(e.kind==="recipe"?` in catalog ${JSON.stringify(e.catalogId)}`:"")+` is not purchasable in config version ${r.config_version} on this channel. Send the ${e.kind==="item"?"item":"recipe"} id (not its slug), and check that it has platform_prices and that this config version is promoted`);let l=o.platform_prices.find(p=>p.platform_currency_id===s.currency_id);if(l===void 0){let p=y=>i.currencies.find(R=>R.currency_id===y)?.slug??y,h=o.platform_prices.map(y=>`${p(y.platform_currency_id)} ${y.price}`);throw new $("no_price_in_currency",`purchase target ${JSON.stringify(e.targetId)} has no ${s.slug} price. It is priced in: ${h.length===0?"nothing":h.join(", ")}`)}let c=e.kind==="item"?e.quantity??1:1;if(!Number.isInteger(c)||c<1||c>10)throw new $("quantity_invalid","item purchase quantity must be an integer from 1 through 10");let g;try{g=await this.write(()=>Qn(this.api,this.entity.type,this.entity.id,{purchase_kind:e.kind,target_id:e.targetId,...e.kind==="recipe"?{catalog_id:e.catalogId}:{},quantity:c,expected_price:{platform_currency_id:s.currency_id,price:l.price*c},expected_config_version:r.config_version,nonce:Pe(),confirmation:"none"},n.signal===void 0?{}:{signal:n.signal}));}catch(p){if(this.handOffRefused!==void 0&&p instanceof f&&p.status===403&&p.code==="guest_upgrade_required")try{this.handOffRefused({kind:e.kind,targetId:e.targetId,...e.kind==="recipe"?{catalogId:e.catalogId}:{},currencySlug:s.slug,quantity:c});}catch{}throw p}return Ei(g)}async executeRecipe(e,n,r={}){return await this.purchase({kind:"recipe",catalogId:e,targetId:n,payment:{kind:"configured"}},r)}async addProgression(e,n,r){let i=await this.write(()=>bn(this.api,this.entity.type,this.entity.id,e,{amount:n,game_id:this.api.gameId()},r===void 0?{}:{signal:r}));return re(i)}async maxProgression(e,n,r){let i=await this.write(()=>lt(this.api,this.entity.type,this.entity.id,e,{value:n,game_id:this.api.gameId()},r===void 0?{}:{signal:r}));return re(i)}async claimProgression(e,n){let r=await this.write(()=>wn(this.api,this.entity.type,this.entity.id,e,{game_id:this.api.gameId()},n===void 0?{}:{signal:n}));return re(r)}async resetProgression(e,n){let r=await this.write(()=>mt(this.api,this.entity.type,this.entity.id,e,{game_id:this.api.gameId()},n===void 0?{}:{signal:n}));return re(r)}async write(e){return this.cache.invalidate(),e()}};var Xe=t=>typeof t=="string"?t:"",Mi=t=>typeof t=="number"?t:0;function Bt(t){let e=t??{};return {orderId:Xe(e.order_id),status:Xe(e.status),source:Xe(e.source),createdAt:Mi(e.created_at)}}var ae=class{constructor(e,n){this.api=e;this.entity=n;}api;entity;async list(e={}){let r=await tt(this.api,this.entity.type,this.entity.id,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}})??{},i=typeof r.next_cursor=="string"?r.next_cursor:void 0;return {data:Array.isArray(r.orders)?r.orders.map(Bt):[],...i===void 0?{}:{nextCursor:i}}}async get(e,n){let r=await Mn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return Bt(r)}};function qi(t,e){return Math.min(7,Math.max(1,Math.ceil((t-e)/864e5)))}function Fi(t,e,n,r){if(!t)return 0;if(typeof e=="number"&&Number.isInteger(e))return Math.min(7,Math.max(1,e));if(n===null)return 7;let i=Date.parse(n);return Number.isFinite(i)?qi(i,r):7}function Ut(t,e){let n=t?.passes;if(!Array.isArray(n))return Object.freeze([]);let r=n.flatMap(i=>{let a=i??{};if(typeof a.pass!="string"||a.pass==="")return [];let s=a.held===true,o=s&&typeof a.ends_at=="string"?a.ends_at:null,l=Fi(s,a.days_left,o,e);return [Object.freeze({pass:a.pass,held:s,daysLeft:l,endsAt:o})]});return Object.freeze(r)}var $i=["live"],Qe=6e4,Vt=864e5;function ji(t){return Object.freeze({pass:t,held:false,daysLeft:0,endsAt:null})}var Wt=Object.freeze([]);function Di(t){let n=t.flatMap(r=>r.endsAt===null?[]:[Date.parse(r.endsAt)]).filter(r=>Number.isFinite(r));return n.length===0?null:Math.min(...n)}function Ht(t,e,n={}){let{watch:r,isGuest:i}=n,a=n.now??(r===void 0?()=>Date.now():()=>r.clock.now()),s=new Set,o=null,l=0,c=null,g=Qe,p=()=>{c!==null&&r?.clock.clearTimeout(c.handle),c=null;},h=w=>{p(),!(r===void 0||s.size===0)&&(c={handle:r.clock.setTimeout(fn,w)});},y=w=>{let A=Di(w);if(A===null||r===void 0){p();return}let k=A-r.clock.now();h(k>0?Math.min(k,Vt):Qe);},R=w=>{r?.log?.(`[gem] a passes 'changed' listener threw: ${w instanceof Error?w.message:String(w)}`);},L=w=>{let A=o!==null&&JSON.stringify(o)!==JSON.stringify(w);if(o=w,g=Qe,y(w),!!A)for(let k of [...s])try{let be=k(w);typeof be?.then=="function"&&be.then(void 0,R);}catch(be){R(be);}},G=()=>{if(i?.()===true)return L(Wt),Promise.resolve(Wt);let w=l;return e.read("passes",$i,()=>Vn(t)).then(A=>{if(w!==l)return G();let k=Ut(A,a());return L(k),k})},yn=()=>{G().catch(()=>{h(g),g=Math.min(g*2,Vt);});};function fn(){l+=1,e.invalidate(),p(),r!==void 0&&s.size>0&&yn();}return {api:{list:G,async get(w){return (await G()).find(k=>k.pass===w)??ji(w)},on(w,A){let k=s.size===0;return s.add(A),k&&r!==void 0&&(o===null?yn():y(o)),()=>{s.delete(A),s.size===0&&p();}}},recheck:fn}}var Jt=t=>typeof t=="number"?t:0,Ni=t=>typeof t=="string"?t:"";function Bi(t){let e=t??{};return {progressionDefinitionId:Ni(e.progression_definition_id),currentValue:Jt(e.current_value),completionCount:Jt(e.completion_count),isCompleted:e.is_completed===true,...Ye(e)}}var se=class{constructor(e,n,r){this.api=e;this.entity=n;this.inventory=r;}api;entity;inventory;async list(){return (await this.inventory.snapshot()).progressions.data}async get(e,n){let i=(await this.inventory.snapshot()).progressions.data.find(a=>a.progressionDefinitionId===e);if(i&&i.achievementsUnavailable!==true)return i;try{let a=await qn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return Bi(a)}catch{return i??null}}};var oe=class{constructor(e,n){this.clock=e;this.identity=n;}clock;identity;generation=0;slots=new Map;listeners=new Set;boundTo=null;read(e,n,r,i){this.rebind();let a=n.length===0,s=a?e:e+"\0"+n.join("\0"),o=this.slots.get(s);if(o){let p=o.filledAt;if(p!==void 0&&(i===void 0||this.clock.now()-p<=i))return Promise.resolve(o.value);if(o.inFlight)return o.inFlight}let l=o??{};this.slots.set(s,l);let c=this.generation,g=r().then(p=>(a&&this.generation===c&&(l.value=p,l.filledAt=this.clock.now()),p)).finally(()=>{l.inFlight===g&&(l.inFlight=void 0,l.filledAt===void 0&&this.slots.get(s)===l&&this.slots.delete(s));});return l.inFlight=g,g}invalidate(){this.slots.clear(),this.generation+=1;for(let e of [...this.listeners])e();}onInvalidate(e){return this.listeners.add(e),()=>{this.listeners.delete(e);}}rebind(){if(!this.identity)return;let e=this.identity();e!==this.boundTo&&(this.boundTo=e,this.invalidate());}};function Ui(t){let e=i=>new RegExp(`<${i}>([^<]{0,300})</${i}>`).exec(t)?.[1]?.trim()||void 0,n=[e("Code"),e("AuthenticationErrorDetail")??e("Message")].filter(Boolean);if(n.length>0)return n.join(" \u2014 ");let r=t.trim();return r?r.slice(0,300):""}async function Ie(t){try{let e=Ui(await t.text());return e?`Storage said: ${e}`:""}catch{return ""}}var b=class extends Error{constructor(n,r){super(r);this.reason=n;this.name="GemSaveError";}reason},Vi=3e4,Wi=5e3,zt=6e4,Hi=2**31-1,Kt="the save payload could not reach storage. From a browser this is almost always the storage account's CORS rule, which the platform owns and your game cannot change. If every save fails this way, report it rather than working around it",Ji=/^[A-Za-z0-9_]{1,64}$/;function T(t){let e=t.length===0?"a save key cannot be empty":t.length>64?`it is ${t.length} characters; a save key is at most 64`:t.startsWith("_")||t.startsWith("$")?`it begins with ${JSON.stringify(t[0])}, and \`_\` and \`$\` are reserved prefixes`:"a save key is ASCII letters, digits and underscores only \u2014 no hyphens, spaces or other punctuation, unlike a template slug";if(!Ji.test(t)||t.startsWith("_"))throw new TypeError(`${JSON.stringify(t)} is not a usable save key: ${e}.`);return t}function Yt(t,e){let n=new AbortController,r=Date.now()+e;Ot(n.signal,()=>r-Date.now());let i=AbortSignal.timeout(e),a=()=>n.abort(i.reason),s=()=>n.abort(t?.reason);return t?.aborted?n.abort(t.reason):(i.addEventListener("abort",a,{once:true}),t?.addEventListener("abort",s,{once:true})),{signal:n.signal,release:()=>{i.removeEventListener("abort",a),t?.removeEventListener("abort",s);}}}function Ze(t,e){return t.aborted&&e?.aborted!==true}var zi=new Set(["x-ms-blob-type"]),Ki=/^[ -~]+$/;function Yi(t,e){if(t==null)return {};if(typeof t!="object"||Array.isArray(t))throw new b("save_malformed",`the grant for save ${JSON.stringify(e)} described its upload headers as ${Array.isArray(t)?"a list":typeof t}, which is not a set of headers.`);let n={};for(let[r,i]of Object.entries(t)){let a=r.toLowerCase();if(!zi.has(a))throw new b("save_malformed",`the grant for save ${JSON.stringify(e)} asked the upload to send ${JSON.stringify(r)}, which this SDK does not put on a storage request. Report it \u2014 a platform that needs a new upload header needs an SDK release too.`);if(typeof i!="string"||!Ki.test(i))throw new b("save_malformed",`the grant for save ${JSON.stringify(e)} gave header ${JSON.stringify(r)} a value that is not usable as one.`);if(a in n)throw new b("save_malformed",`the grant for save ${JSON.stringify(e)} named ${JSON.stringify(a)} twice.`);n[a]=i;}return n}function en(t){let e=typeof t.metadata=="object"&&t.metadata!==null&&!Array.isArray(t.metadata)?t.metadata:void 0;return {key:t.key,sizeBytes:t.size_bytes,etag:t.etag,...e===void 0?{}:{metadata:e},createdAt:t.created_at,updatedAt:t.updated_at}}function nn(t){return t?.reason==="not_found"}function Xi(t){return t?.code==="save_conflict"}function Xt(t){return t instanceof f&&t.reason==="rate_limited"}async function Qt(t,e){let n=await Ie(e);return new f("rate_limited",429,`the save ${t} answered 429: too many save calls. ${n}`.trim(),We(e.headers.get("retry-after")))}function Ge(t){return t.reason!==void 0?t.reason:new DOMException("The operation was aborted.","AbortError")}function Qi(t,e,n,r,i){let a=false,s=()=>a?false:(a=true,o.detach?.(),true),o={signal:n.signal,budget:r,deadlineAt:Date.now()+r,teardown:n.teardown===true,overwrite:n.overwrite===true,identity:i,resolve:l=>{s()&&t(l);},reject:l=>{s()&&e(l);},detach:void 0};return o}function Zt(t,e){return t!==null&&e!==null&&e!==t}function er(t){return new b("save_conflict",`save ${JSON.stringify(t)} was not written: the signed-in player changed while it waited for the write before it, and it holds the last player's progress.`)}var le=class{constructor(e,n,r={},i){this.api=e;this.entity=n;this.options=r;this.identity=i;}api;entity;options;identity;versions=new Map;seq=0;versionsOf=null;writes=new Map;holdUntil=0;async put(e,n,r={}){let i;try{i=JSON.stringify(n);}catch(a){throw new b("save_malformed",`save ${JSON.stringify(e)} could not be serialised to JSON: ${String(a)}. Retrying stores the same unserialisable value.`)}if(i===void 0)throw new b("save_malformed",`save ${JSON.stringify(e)} is undefined, which is not JSON. Use delete() to remove one.`);return this.putBytes(e,new TextEncoder().encode(i),{...r,contentType:"application/json"})}async putBytes(e,n,r={}){if(T(e),r.signal?.aborted)throw Ge(r.signal);let i=this.budget(r.timeoutMs),a=this.slotWrites(e);return new Promise((s,o)=>{let l=a.queued;l?.release();let c=l?.waiters[l.waiters.length-1];c!==void 0&&this.holdOwn(a,c);let g=this.identity?.()??null;for(let p of l?.waiters.slice()??[])Zt(p.identity,g)&&this.drop(a,p,er(e));a.queued=this.queue(a,n,r,Qi(s,o,r,i,g),l?.waiters??[]),a.wake?.(),this.pump(e,a);})}holdOwn(e,n){let{signal:r}=n,i=n.deadlineAt-Date.now();if(r?.aborted)return this.drop(e,n,Ge(r));if(i<=0)return this.drop(e,n,this.timeout("save",n.budget));let a=AbortSignal.timeout(i),s=()=>this.drop(e,n,this.timeout("save",n.budget)),o=()=>{r&&this.drop(e,n,Ge(r));};a.addEventListener("abort",s,{once:true}),r?.addEventListener("abort",o,{once:true}),n.detach=()=>{a.removeEventListener("abort",s),r?.removeEventListener("abort",o);};}drop(e,n,r){let i=e.queued?.waiters,a=i?.indexOf(n)??-1;a>=0&&i?.splice(a,1),n.reject(r),e.wake?.();}queue(e,n,r,i,a){let{budget:s}=i,o=[...a,i],l=AbortSignal.timeout(s),c=y=>{if(e.queued===h){this.take(e,h);for(let R of o)R.reject(y);e.wake?.();}},g=()=>c(this.timeout("save",s)),p=()=>{r.signal&&c(Ge(r.signal));};l.addEventListener("abort",g,{once:true}),r.signal?.addEventListener("abort",p,{once:true});let h={bytes:n,options:r,budget:s,deadlineAt:i.deadlineAt,identity:i.identity,waiters:o,release:()=>{l.removeEventListener("abort",g),r.signal?.removeEventListener("abort",p);}};return h}async pump(e,n){if(!n.running){n.running=true;try{for(let r=n.queued;r!==void 0;r=n.queued){let i=Date.now(),a=this.holdUntil-i;if(a>0){if(a>=r.deadlineAt-i){this.take(n,r);for(let l of r.waiters)l.reject(this.held(e,a));continue}for(let l of r.waiters.slice(0,-1))a>=l.deadlineAt-i&&this.drop(n,l,this.held(e,a));}let s=Math.max(a,this.spacing(n,r,i));if(s>0){await this.pause(n,s);continue}this.take(n,r);let o;try{o=this.precondition(e,r);}catch(l){for(let c of r.waiters)c.reject(l);continue}n.lastSentAt=i;try{let l=await this.send(e,r,o);for(let c of r.waiters)c.resolve(l);}catch(l){for(let c of r.waiters)c.reject(l);}}}finally{n.running=false;}}}spacing(e,n,r){if(e.lastSentAt===void 0||n.waiters.some(s=>s.teardown))return 0;let i=this.options.minWriteIntervalMs??Wi,a=Math.min(...n.waiters.map(s=>s.deadlineAt-s.budget/2));return Math.min(e.lastSentAt+i,a)-r}pause(e,n){return new Promise(r=>{let i=()=>{clearTimeout(a),e.wake===i&&(e.wake=void 0),r();},a=setTimeout(i,Math.min(n,Hi));e.wake=i;})}take(e,n){e.queued===n&&(e.queued=void 0),n.release();}slotWrites(e){let n=this.writes.get(e);return n===void 0&&(n={running:false,queued:void 0,lastSentAt:void 0,wake:void 0},this.writes.set(e,n)),n}noteRateLimit(e){if(!Xt(e))return;let n=e.retryAfterSeconds,r=n===void 0?zt:Math.min(n*1e3,zt);this.holdUntil=Math.max(this.holdUntil,Date.now()+r);}held(e,n){let r=Math.ceil(n/1e3);return new f("rate_limited",429,`save ${JSON.stringify(e)} was not sent: the platform refused a save call for the rate, and the wait it asked for ends in ${r}s, after this call's timeoutMs. Keep the state and write once the wait is over.`,r)}async send(e,n,r){let{bytes:i,options:a,budget:s}=n,o=a.contentType??"application/octet-stream",l=Yt(a.signal,Math.max(0,n.deadlineAt-Date.now()));try{let c=await gt(this.api,this.entity.type,this.entity.id,e,{size_bytes:i.byteLength,content_type:o,...r,...a.metadata===void 0?{}:{metadata:a.metadata}},{signal:l.signal});if(typeof c.upload_url!="string"||typeof c.session_id!="string")throw new b("save_malformed",`the grant for save ${JSON.stringify(e)} named nowhere to put the bytes.`);let g=Yi(c.upload_headers,e),p,h=this.options.fetch??globalThis.fetch.bind(globalThis);try{p=await h(c.upload_url,{method:"PUT",headers:{"content-type":o,...g},body:i,credentials:"omit",signal:l.signal});}catch(R){throw Ze(l.signal,a.signal)?this.timeout("upload",s):new b("upload_failed",`${Kt} for PUT. Underlying error: ${R}`)}if(p.status===429)throw await Qt("upload",p);if(!p.ok){let R=await Ie(p);throw new b("upload_failed",p.status===400?"the save upload answered 400. The platform and the service holding the bytes disagree about what this upload must carry, which is not something your game can fix and not worth retrying \u2014 report it. "+R:`the save upload answered ${p.status}. `+(p.status===403?"An upload URL is short-lived, so this is most likely an expired one \u2014 start the save again rather than retrying the upload. ":"")+R)}let y=en(await In(this.api,this.entity.type,this.entity.id,e,{session_id:c.session_id},{signal:l.signal}));return this.remember(e,y.etag?{kind:"etag",etag:y.etag}:void 0),y}catch(c){throw Xi(c)?new b("save_conflict",`save ${JSON.stringify(e)} was not written: the stored save changed since this game last loaded or wrote it, so another device or tab saved in between. Load it again and decide what to write from what is stored, rather than resending this write.`):(this.noteRateLimit(c),this.rethrow(c,a.signal,l.signal,"save",s))}finally{l.release();}}async get(e,n={}){let r=await this.getBytes(e,n);if(r===null)return null;try{return JSON.parse(new TextDecoder().decode(r))}catch(i){throw new b("save_malformed",`the stored save ${JSON.stringify(e)} is not JSON, so put() did not write it. Read it with getBytes() and decode it yourself. Underlying error: ${i}`)}}async getBytes(e,n={}){T(e);let r=this.budget(n.timeoutMs),i=Yt(n.signal,r),a=this.seq;try{let s;try{let g=await je(this.api,this.entity.type,this.entity.id,e,{signal:i.signal});if(!g.modified)return this.remember(e,{kind:"empty"},a),null;s=g.body;}catch(g){if(nn(g))return this.remember(e,{kind:"empty"},a),null;throw g}if(typeof s.download_url!="string")throw new b("save_malformed",`the record for save ${JSON.stringify(e)} named no link to its stored bytes.`);let o=this.options.fetch??globalThis.fetch.bind(globalThis),l;try{l=await o(s.download_url,{credentials:"omit",signal:i.signal});}catch(g){throw Ze(i.signal,n.signal)?this.timeout("download",r):new b("download_failed",`${Kt} for GET. Underlying error: ${g}`)}if(l.status===429)throw await Qt("download",l);if(!l.ok){let g=await Ie(l);throw new b("download_failed",`the save download answered ${l.status}. `+(l.status===403?"A download link lasts 15 minutes, so this is most likely an expired one \u2014 call get() again for a fresh one. ":"")+g)}let c=new Uint8Array(await l.arrayBuffer());return this.remember(e,s.etag?{kind:"etag",etag:s.etag}:void 0,a),c}catch(s){throw this.slots().get(e)===void 0&&this.remember(e,{kind:"failed"}),this.noteRateLimit(s),this.rethrow(s,n.signal,i.signal,"load",r)}finally{i.release();}}async describe(e,n={}){try{let r=await je(this.api,this.entity.type,this.entity.id,T(e),{...n.signal===void 0?{}:{signal:n.signal},...n.ifNoneMatch===void 0?{}:{ifNoneMatch:n.ifNoneMatch}});return r.modified?en(r.body):null}catch(r){if(nn(r))return null;throw r}}async list(e={}){let n=await rt(this.api,this.entity.type,this.entity.id,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}}),r=n.next_cursor;return {saves:(n.data??[]).map(en),...typeof r=="string"&&r.length>0?{nextCursor:r}:{}}}async delete(e,n){try{await An(this.api,this.entity.type,this.entity.id,T(e),{...n===void 0?{}:{signal:n}});}catch(r){if(!nn(r))throw r}this.remember(e,{kind:"empty"});}precondition(e,n){if(Zt(n.identity,this.identity?.()??null))throw er(e);if(n.waiters.some(i=>i.overwrite))return {};let r=this.slots().get(e);if(r===void 0)return {};if(r.kind==="etag")return {if_match:r.etag};if(r.kind==="empty")return {if_none_match:"*"};throw new b("load_failed",`save ${JSON.stringify(e)} was not written: the last load of this slot failed, so what this write would replace is unknown, and it could be the player's real progress. Load it again before saving, or pass overwrite: true if replacing whatever is stored is what you mean.`)}remember(e,n,r){let i=this.slots(),a=i.get(e);r!==void 0&&a!==void 0&&a.kind!=="failed"&&a.seq>r||(this.seq+=1,n===void 0?i.delete(e):i.set(e,{...n,seq:this.seq}));}slots(){let e=this.identity?.()??null;return e!==null&&e!==this.versionsOf&&(this.versionsOf!==null&&this.versions.clear(),this.versionsOf=e),this.versions}budget(e){return e??this.options.timeoutMs??Vi}timeout(e,n){return new b("save_timeout",`the save ${e} did not finish within ${n}ms`)}rethrow(e,n,r,i,a){return e instanceof b||Xt(e)?e:Ze(r,n)?this.timeout(i,a):e}};function Zi(t){try{return Ve(t)}catch{return t}}function tn(t,e){let n=t??{},r=typeof n.etag=="string"?n.etag:e;return {key:typeof n.key=="string"?n.key:"",value:typeof n.value=="string"?Zi(n.value):"",...r===void 0?{}:{etag:r},updatedAt:typeof n.updated_at=="number"?n.updated_at:0}}var de=class{constructor(e,n){this.api=e;this.entity=n;}api;entity;async list(e){let r=(await nt(this.api,this.entity.type,this.entity.id,e===void 0?{}:{signal:e}))?.settings;return Array.isArray(r)?r.map(i=>tn(i)):[]}async get(e,n={}){try{let r=await Cn(this.api,this.entity.type,this.entity.id,e,{...n.signal===void 0?{}:{signal:n.signal},...n.ifNoneMatch===void 0?{}:{ifNoneMatch:n.ifNoneMatch}});return r.modified?tn(r.body,r.etag):null}catch(r){if(nr(r))return null;throw r}}async put(e,n,r={}){let i=await dt(this.api,this.entity.type,this.entity.id,e,{value:xe(n)},{...r.signal===void 0?{}:{signal:r.signal},...r.ifMatch===void 0?{}:{ifMatch:r.ifMatch}});return tn(i)}async delete(e,n){try{await kn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});}catch(r){if(!nr(r))throw r}}};function nr(t){return t?.reason==="not_found"}function rn(t,e,n={}){let r=new oe(F,n.identity);n.onInventoryChanged&&r.onInvalidate(n.onInventoryChanged);let i=new te(t,e,r);return {settings:new de(t,e),inventory:i,saves:new le(t,e,n.saves??{},n.identity),currencies:new ee(i,n.resolveCurrencyId),mutations:new ie(t,e,r,n.handOffRefusedPurchase),orders:new ae(t,e),progressions:new se(t,e,i)}}function tr(t,e,n={}){let r=new oe(F,n.identity),i=Ht(t,r,n);return {scope:{...rn(t,e,n),passes:i.api},recheckPasses:i.recheck}}var j=t=>typeof t=="string"?t:"",U=t=>typeof t=="number"?t:0;function Ce(t,e){let n=e??{},r=j(n.character_id);if(r==="")throw new Error("[gem] a character response carried no character_id");return {...t(r),id:r,playerId:j(n.player_id),gameId:j(n.game_id),channel:j(n.channel)||"release",name:j(n.name),slotIndex:U(n.slot_index),isActive:n.is_active!==false,createdAt:j(n.created_at),updatedAt:j(n.updated_at)}}var ue=class{constructor(e,n,r,i){this.api=e;this.saves=n;this.identity=r;this.resolveCurrencyId=i;}api;saves;identity;resolveCurrencyId;scopes=new Map;scope=e=>{let n=this.scopes.get(e);return n||(n=rn(this.api,{type:"characters",id:e},{saves:this.saves,identity:this.identity,resolveCurrencyId:this.resolveCurrencyId}),this.scopes.set(e,n)),n};refreshHeld(){for(let e of this.scopes.values())e.inventory.refresh();}async list(e){let r=(await et(this.api,e===void 0?{}:{signal:e}))?.characters;return Array.isArray(r)?r.map(i=>Ce(this.scope,i)):[]}async get(e,n){let r=await Gn(this.api,e,n===void 0?{}:{signal:n});return Ce(this.scope,r)}async create(e){let n=await vn(this.api,{name:e.name},e.signal===void 0?{}:{signal:e.signal});return Ce(this.scope,n)}async update(e,n,r){let i=await pt(this.api,e,{name:n},r===void 0?{}:{signal:r});return Ce(this.scope,i)}async delete(e,n){await yt(this.api,e,n===void 0?{}:{signal:n});}async slots(e){let r=await zn(this.api,e===void 0?{}:{signal:e})??{};return {totalSlots:U(r?.total_slots),availableSlots:U(r?.available_slots),activeCharacterCount:U(r?.active_character_count),defaultMaxSlots:U(r?.default_max_slots),purchasedExtraSlots:U(r?.purchased_extra_slots),canPurchaseMore:r?.can_purchase_more===true}}};var ar="[gem: use gem.text.toPlain()]",rr=new Set,ir;function ea(t){try{if(rr.has(t))return;let e=globalThis.location;if(ir??=!!e?.port&&Ft(e.hostname??""),!ir)return;rr.add(t),console.warn(`[gem] ${t} is PlayerText, turned into a string: players see ${ar}. Render text.toPlain(value) (text is in @indiegems/gem-web-sdk/sdk).
2
2
  ${new Error().stack}`);}catch{}}var S=class{#e;#t;constructor(e,n="player text"){this.#e=e,this.#t=n,Object.freeze(this);}toString(){return ea(this.#t),ar}toJSON(){return this.toString()}get[Symbol.toStringTag](){return "PlayerText"}static unwrap(e){return e.#e}};function V(t,e){return new S(t,e)}var na={toPlain(t){return S.unwrap(t)},compare(t,e,n){let r=t instanceof S?S.unwrap(t):t,i=e instanceof S?S.unwrap(e):e;if(typeof Intl>"u"||typeof Intl.Collator!="function")return r<i?-1:r>i?1:0;let a;try{a=new Intl.Collator(n);}catch{a=new Intl.Collator;}return a.compare(r,i)},equals(t,e){let n=t instanceof S?S.unwrap(t):t,r=e instanceof S?S.unwrap(e):e;return n.normalize("NFC")===r.normalize("NFC")}};var W=t=>typeof t=="string"?t:"";function Te(t){let e=t??{},n=typeof e.message=="string"&&e.message.length>0?e.message:void 0,r=typeof e.resolved_at=="string"?e.resolved_at:void 0;return {id:W(e.transfer_id),status:W(e.status),sourceEntityId:W(e.source_entity_id),targetEntityId:W(e.target_entity_id),...n===void 0?{}:{message:V(n,"transfer.message")},createdAt:W(e.created_at),expiresAt:W(e.expires_at),...r===void 0?{}:{resolvedAt:r}}}function ta(){return crypto.randomUUID()}var ce=class{constructor(e,n,r){this.api=e;this.self=n;this.inventory=r;}api;self;inventory;async initiate(e){this.inventory.invalidate();let n=await Xn(this.api,{source_entity_type:this.self.type,source_entity_id:this.self.id,target_entity_type:e.to.type,target_entity_id:e.to.id,items:(e.items??[]).map(r=>({item_definition_id:r.itemDefinitionId,quantity:r.quantity})),currencies:(e.currencies??[]).map(r=>({currency_id:r.currencyId,amount:r.amount})),...e.message===void 0?{}:{message:e.message},nonce:ta()},e.signal===void 0?{}:{signal:e.signal});return Te(n)}async list(e={}){let r=await st(this.api,{entity_type:this.self.type,entity_id:this.self.id,...e.direction===void 0?{}:{direction:e.direction},...e.status===void 0?{}:{status:e.status},...e.cursor===void 0?{}:{cursor:e.cursor},...e.limit===void 0?{}:{limit:e.limit},...e.signal===void 0?{}:{signal:e.signal}})??{},i=typeof r.next_cursor=="string"?r.next_cursor:void 0;return {transfers:Array.isArray(r.transfers)?r.transfers.map(Te):[],...i===void 0?{}:{nextCursor:i}}}async get(e,n){let r=await Kn(this.api,e,n===void 0?{}:{signal:n});return Te(r)}async accept(e,n){return this.resolve(()=>_n(this.api,e,n===void 0?{}:{signal:n}))}async reject(e,n){return this.resolve(()=>ct(this.api,e,n===void 0?{}:{signal:n}))}async cancel(e,n){return this.resolve(()=>Rn(this.api,e,n===void 0?{}:{signal:n}))}async resolve(e){return this.inventory.invalidate(),Te(await e())}};function I(t){return typeof t=="string"&&t!==""?t:void 0}var sr=new Set(["localhost","127.0.0.1","[::1]"]);function D(t){return ra(t)}function ra(t){let e=I(t);if(e===void 0)return;let n;try{n=new URL(e);}catch{return}if(!(n.username!==""||n.password!=="")&&(n.protocol==="https:"||n.protocol==="http:"&&sr.has(n.hostname)))return e}var ia=/^[\da-f]{8}(-[\da-f]{4}){3}-[\da-f]{12}$/i,aa=/^[a-z][a-z0-9_]{0,31}$/;function sa(t){if(!Array.isArray(t))return;let e=[],n=new Set;for(let r of t.slice(0,8)){let i=r??{},a=I(i.family),s=I(i.avatar_3d_id),o=D(i.model_url),l=D(i.icon_url);a===void 0||!aa.test(a)||n.has(a)||s===void 0||!ia.test(s)||o===void 0||l===void 0||(n.add(a),e.push({family:a,id:s,modelUrl:o,iconUrl:l}));}return e}function oa(t){if(!Array.isArray(t))return [];let e=[];for(let n of t){let r=n??{},i=I(r.item_id),a=D(r.icon_url);i!==void 0&&a!==void 0&&e.push({itemId:i,iconUrl:a});}return e}function E(t){let e=t??{},n=I(e.player_id),r=I(e.display_name),i=I(e.discriminator),a=I(e.display_tag),s=I(e.avatar_icon_id),o=D(e.avatar_icon_url),l=I(e.avatar_3d_id),c=D(e.avatar_3d_model_url),g=D(e.avatar_3d_icon_url),p=sa(e.avatars_3d);return {...n===void 0?{}:{playerId:n},...r===void 0?{}:{displayName:V(r,"displayName")},...i===void 0?{}:{discriminator:i},...a===void 0?{}:{displayTag:V(a,"displayTag")},...s===void 0?{}:{avatarIconId:s},...o===void 0?{}:{avatarIconUrl:o},...l===void 0?{}:{avatar3dId:l},...c===void 0?{}:{avatar3dModelUrl:c},...g===void 0?{}:{avatar3dIconUrl:g},...p===void 0?{}:{avatars3d:p},badges:oa(e.badges)}}var la=new Set(["https://downloads.gemarcade.com","https://cdn.gemarcade.com"]);function da(t){if(t===void 0)return;let e=D(t);if(e===void 0)return;let n=new URL(e);return sr.has(n.hostname)||la.has(n.origin)?e:void 0}var or=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;var sn=class extends f{constructor(e,n={}){super(e.reason,e.status,e.detail,e.retryAfterSeconds,e.code),this.name="FriendChallengeError";for(let[r,i]of Object.entries(n))i!==void 0&&Object.assign(this,{[r]:i});}},Ee=t=>typeof t=="string"?t:void 0;function lr(t){let e=t??{};return {...E(e),playerId:Ee(e.player_id)??""}}function dr(t){let e=t.has_more===true?Ee(t.next_cursor):void 0;return e===void 0?{}:{nextCursor:e}}function ua(t){let e=t??{};return {friends:Array.isArray(e.data)?e.data.map(lr):[],...dr(e)}}var an=t=>typeof t=="number"&&Number.isFinite(t)?t:void 0;function ca(t){return typeof t!="object"||t===null||Array.isArray(t)?{}:Object.fromEntries(Object.entries(t).filter(e=>typeof e[1]=="string"||typeof e[1]=="number"&&Number.isFinite(e[1])))}function ur(t){let e=t??{},n=an(e.opened_at),r=an(e.answered_at);return {id:Ee(e.item_id)??"",from:lr(e.sender),template:Ee(e.template)??"",params:ca(e.params),createdAt:an(e.created_at)??0,...n===void 0?{}:{openedAt:n},...r===void 0?{}:{answeredAt:r}}}function pa(t){let e=t??{};return {challenges:Array.isArray(e.data)?e.data.map(ur):[],...dr(e)}}function ga(t){let e=t;return e?.reason==="not_found"&&e.code==="inbox_item_not_found"}var pe=class{#e;#t;#i;#o;#n;constructor(e,n={}){this.#e=e,this.#t=n.challenge,this.#i=n.inviteToPlay,this.#o=n.setInviteParams,this.#n=n.launchedChallengeId;}async list(e={}){let n=await at(this.#e,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}});return ua(n)}challenge(e){return this.#t===void 0?Promise.resolve({outcome:"unavailable"}):this.#t(e)}inviteToPlay(e){return this.#i===void 0?Promise.resolve(false):this.#i(e)}setInviteParams(e){return this.#o===void 0?false:this.#o(e)}async inbox(e={}){let n=await it(this.#e,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}});return pa(n)}async launchedChallenge(e={}){let n=this.#n;if(n===void 0||!or.test(n))return null;try{return ur(await Nn(this.#e,n,{...e.signal===void 0?{}:{signal:e.signal}}))}catch(r){if(ga(r))return null;throw r}}async markAnswered(e){if(typeof e!="string"||!or.test(e))throw new f("invalid",400,"id must be a FriendChallenge.id, as gem.friends.launchedChallenge() or inbox() returned it",void 0,"bad_request");await ot(this.#e,e);}};var cr=100,mr=/^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}Z)?$/;function on(t){let{periodsBack:e,period:n,playerId:r}=t;if(Se(e),e!==void 0&&n!==void 0)throw new TypeError("pass periodsBack or period, not both");if(n!==void 0&&(typeof n!="string"||!mr.test(n)))throw new TypeError(`period must be a period id such as 2026-10-02 (a result's period.id), got ${String(n)}`);if(r!==void 0&&(typeof r!="string"||r===""))throw new TypeError("playerId must be a player id");return {...e===void 0?{}:{periods_back:e},...n===void 0?{}:{period:n},...r===void 0?{}:{player_id:r}}}function yr(t){let e=typeof t.period_id=="string"?t.period_id:"";if(!mr.test(e))return;let n=He(t.period_local_date),r=q(t.period_start_at),i=q(t.period_ends_at),a=r>0&&i>0;return {id:e,...n===void 0?{}:{localDate:n},...a?{startAt:r,endsAt:i}:{},opensAt:q(t.opens_at),closesAt:q(t.closes_at),final:t.final===true}}var ge=t=>typeof t=="string"?t:"",H=t=>typeof t=="number"?t:0,me=t=>typeof t=="string"?t:void 0,ma=t=>typeof t=="number"?t:void 0,fr={player:"players",character:"characters"};function ya(t,e){let n=t??{},r=me(n.entity_id),i=typeof n.entity_type=="string"&&Object.hasOwn(fr,n.entity_type)?n.entity_type:void 0,a=hr(n.stats),s=n.properties!==null&&typeof n.properties=="object"?n.properties:void 0,o=e?n.is_viewer===true:void 0;return {...E(n),rank:H(n.rank),occurredAt:H(n.occurred_at),...o===void 0?{}:{isViewer:o},...r===void 0?{}:{entityId:r},...i===void 0?{}:{entityType:i},...a===void 0?{}:{stats:a},...s===void 0?{}:{properties:s}}}function pr(t,e){let n=t??{},r=me(n.bucket_1),i=me(n.bucket_2),a=ma(n.update_frequency_seconds),s=yr(n);return {leaderboardType:ge(n.leaderboard_type),runType:ge(n.run_type),...r===void 0?{}:{bucket1:r},...i===void 0?{}:{bucket2:i},entries:Array.isArray(n.entries)?n.entries.map(o=>ya(o,e)):[],generatedAt:H(n.generated_at),...a===void 0?{}:{updateFrequencySeconds:a},...s===void 0?{}:{period:s}}}function gr(t){if(t===null||typeof t!="object"||Array.isArray(t))return;let e=t;if(!Number.isFinite(e.rank))return;let n=hr(e.stats),r=e.properties!==null&&typeof e.properties=="object"?e.properties:void 0;return {rank:e.rank,occurredAt:H(e.occurred_at),...n===void 0?{}:{stats:n},...r===void 0?{}:{properties:r}}}function hr(t){if(t===null||typeof t!="object")return;let e={};for(let[n,r]of Object.entries(t))typeof r=="number"&&(e[n]=r);return e}function fa(t,e,n){let r=t??{},i=me(r.bucket_1),a=me(r.bucket_2),s=yr(r);return {leaderboardType:ge(r.leaderboard_type),runType:ge(r.run_type),entityType:e,entityId:n,...i===void 0?{}:{bucket1:i},...a===void 0?{}:{bucket2:a},entries:Array.isArray(r.entries)?r.entries.map(gr).filter(o=>o!==void 0):[],personalBest:gr(r.personal_best)??null,totalRuns:H(r.total_runs),totalRunsExact:r.total_runs_exact!==false,generatedAt:H(r.generated_at),...s===void 0?{}:{period:s}}}var ye=class{#e;constructor(e){this.#e=e;}async get(e,n={}){let r=on(n),i=await Bn(this.#e,e,{...r,...n.bucket1===void 0?{}:{bucket_1:n.bucket1},...n.bucket2===void 0?{}:{bucket_2:n.bucket2},...n.signal===void 0?{}:{signal:n.signal}});return pr(i,false)}async friends(e,n={}){let r=on(n),i=await jn(this.#e,e,{...r,...n.bucket1===void 0?{}:{bucket_1:n.bucket1},...n.bucket2===void 0?{}:{bucket_2:n.bucket2},...n.signal===void 0?{}:{signal:n.signal}});return pr(i,true)}async mine(e,n={}){return this.#t(e,"player","me",n)}async character(e,n,r={}){return this.#t(e,"character",n,r)}async#t(e,n,r,i){if(i.limit!==void 0){let{limit:l}=i;if(!Number.isInteger(l)||l<1||l>cr)throw new TypeError(`limit must be an integer between 1 and ${cr}, got ${String(l)}`)}let a=on(i),s=await Ln(this.#e,e,fr[n],r,{...a,...i.bucket1===void 0?{}:{bucket_1:i.bucket1},...i.bucket2===void 0?{}:{bucket_2:i.bucket2},...i.limit===void 0?{}:{limit:i.limit},...i.signal===void 0?{}:{signal:i.signal}}),o=n==="player"&&r==="me"&&ge((s??{}).entity_id)||r;return fa(s,n,o)}};var Le=t=>typeof t=="string"?t:void 0;function ha(t){let e=t??{},n=Le(e.currency_id);if(n===void 0||n==="")return;let r=typeof e.balance=="number"&&Number.isFinite(e.balance)?e.balance:0;return {slug:Le(e.slug)??"",currencyId:n,balance:r,access:e.access==="spend"?"spend":"read"}}var Me=class{#e;constructor(e){this.#e=e;}async get(e={}){let r=(await Re(this.#e,e))?.currencies;if(!Array.isArray(r))return [];let i=[];for(let a of r){let s=ha(a);s!==void 0&&i.push(s);}return i}},ln=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?Math.floor(t):0;function _a(t){let e=t??{},n=Le(e.currency_id);if(n===void 0||n==="")return;let r=ln(e.limit),i=Math.min(ln(e.earned),r),a=Math.min(ln(e.remaining),r-i),s=e.period_days,o=typeof s=="number"&&Number.isInteger(s)&&s>=1?s:1,l=e.resets_at,c=typeof l=="number"&&Number.isFinite(l)&&l>0?Math.round(l*1e3):void 0;return {currencySlug:Le(e.currency_slug)??"",currencyId:n,limit:r,earned:i,remaining:a,period:e.period==="day"?"day":"window",periodDays:o,...c===void 0?{}:{resetsAt:c}}}var qe=class{#e;#t;#i;constructor(e,n,r){this.#e=e,this.#t=n,this.#i=r;}async get(e={}){let r=(await Un(this.#e,e))?.currencies;if(!Array.isArray(r))return [];let i=[];for(let a of r){let s=_a(a);s!==void 0&&i.push(s);}return i}on(e,n){return e!=="changed"?(this.#i?.(`[gem] unknown earnAllowance event '${String(e)}'; the only event is 'changed'`),()=>{}):this.#t?.on(n)??(()=>{})}},fe=class{currencies;earnAllowance;constructor(e,n,r){this.currencies=new Me(e),this.earnAllowance=new qe(e,n,r);}};var un=t=>t!==null&&typeof t=="object"?t:{},cn=t=>typeof t=="string"&&t!==""?t:void 0,dn=t=>typeof t=="number"&&Number.isSafeInteger(t)?t:void 0;function ba(t,e){let n=un(t);if(n.type!=="platform_grant")return null;let r=cn(n.target_currency_id),i=dn(n.granted);if(r===void 0||i===void 0)return null;let a=dn(n.requested)??i,s=Math.max(0,Math.min(dn(n.base_granted)??Math.min(a,i),i)),o=i-s,l=un(n.boost_source),c=cn(l.pass),g=e(r);return {...g===void 0?{}:{currencySlug:g},currencyId:r,base:s,total:i,breakdown:o<=0?[]:[c===void 0?{source:"boost",amount:o}:{source:"pass",pass:c,amount:o}]}}function _r(t){return {async fromReceipt(e){let n=cn(un(e).target_currency_id),r=n===void 0?void 0:t.knownSlug(n);return n!==void 0&&r===void 0&&(r=await t.readSlugs().then(i=>i.get(n)||void 0,()=>{})),ba(e,()=>r)}}}var pn=t=>typeof t=="string"?t:"",br=t=>typeof t=="number"?t:0;function Ra(t){let e=t??{};return {key:pn(e.key),visibility:pn(e.visibility),value:e.value,updatedAt:br(e.updated_at)}}function wa(t){let e=t??{};return {...E(e),playerId:pn(e.player_id),showcase:Array.isArray(e.showcase)?e.showcase.map(Ra):[],generatedAt:br(e.generated_at)}}function va(t){return t?.reason==="not_found"}var he=class{#e;constructor(e){this.#e=e;}async of(e,n={}){try{return wa(await Wn(this.#e,e,{...n.signal===void 0?{}:{signal:n.signal}}))}catch(r){if(va(r))return null;throw r}}};var Fe=t=>typeof t=="string"?t:"",gn=t=>typeof t=="number"?t:0;function Rr(t){let e=t??{};return {playerId:Fe(e.player_id),key:Fe(e.key),value:e.value,updatedAt:gn(e.updated_at)}}function xa(t){let e=t??{};return {...E(e),playerId:Fe(e.player_id),value:e.value,isViewer:e.is_viewer===true,updatedAt:gn(e.updated_at)}}function Sa(t){return t?.reason==="not_found"}var _e=class{constructor(e,n){this.api=e;this.selfPlayerId=n;}api;selfPlayerId;async friends(e,n={}){let i=await Dn(this.api,T(e),{...n.signal===void 0?{}:{signal:n.signal}})??{};return {key:Fe(i.key),entries:Array.isArray(i.entries)?i.entries.map(xa):[],generatedAt:gn(i.generated_at)}}async of(e,n,r={}){try{return Rr(await Jn(this.api,e,T(n),{...r.signal===void 0?{}:{signal:r.signal}}))}catch(i){if(Sa(i))return null;throw i}}async set(e,n,r={}){if(T(e),n===void 0)throw new TypeError(`showcase value for ${JSON.stringify(e)} is undefined, which is not JSON. Use clear() to remove one.`);try{JSON.stringify(n);}catch(a){throw new TypeError(`showcase value for ${JSON.stringify(e)} could not be serialised to JSON: ${String(a)}.`,{cause:a})}let i=await this.selfPlayerId();return Rr(await ut(this.api,i,e,{value:n},{...r.signal===void 0?{}:{signal:r.signal}}))}async clear(e,n={}){let r=await this.selfPlayerId();await Pn(this.api,r,T(e),{...n.signal===void 0?{}:{signal:n.signal}});}};var ka="https://function.gem.invalid",wr={token:"function",expiresAt:Number.POSITIVE_INFINITY,chainEndsAt:Number.POSITIVE_INFINITY},Aa="createGem() from @indiegems/gem-web-sdk/function only runs inside a serverless function; in a browser import @indiegems/gem-web-sdk/sdk",$e="gem.me is unavailable: this function was invoked by a game server, not a player",Pa="gem.functions is unavailable inside a serverless function",Oa="gem.gameConfig is unavailable inside a serverless function",Ia="conditional requests are unavailable inside a serverless function: the platform call carries no headers, so an ifMatch or ifNoneMatch cannot travel. Drop the option, or keep the compare-and-set in the browser.";function Ga(t){let e=new Set(N);return {async request(n){let r={...n},i=r.headers;if(i){for(let[a,s]of Object.entries(i))if(s!==void 0&&e.has(a.toLowerCase()))throw new v(Ia)}return t.request(r)}}}function vr(t,e,n){Object.defineProperty(t,e,{get(){throw new Error(n)},enumerable:false});}function Ca(t){let e=globalThis.__gemFunctionHost;if(e===void 0)throw new Error(Aa);let n=e.context(),r=new ve({clock:F,request:()=>Promise.resolve(wr)});r.accept(wr);let i=Ga(It({baseUrl:ka,tokenSource:r,defaultQuery:{game_id:n.gameId,channel:n.channel}})),a=new K({transport:i,clock:F,maxRetries:0}),s={client:a,gameId:()=>n.gameId},o=n.caller.type==="player"?n.caller.playerId:null,l=o===null?null:{playerId:o,gameId:n.gameId,channel:n.channel},c=o===null?null:{type:"players",id:o},g=c===null?null:tr(s,c).scope,p=c===null||g===null?null:new ce(s,c,g.inventory),h=G=>console.info(G),y=new J({client:()=>a,clock:F,gameId:()=>n.gameId,playerId:()=>o,environment:{sdk_version:hn()},log:h}),R=new fe(s,void 0,h),L={context:n,identity:l,awaitIdentity:()=>l===null?Promise.reject(new Error($e)):Promise.resolve(l),awaitBridge:()=>Promise.resolve("connected"),client:a,get me(){if(g===null)throw new Error($e);return g},characters:new ue(s),get transfers(){if(p===null)throw new Error($e);return p},analytics:y,leaderboards:new ye(s),challenges:new Y(s),showcase:new _e(s,()=>o===null?Promise.reject(new Error($e)):Promise.resolve(o)),friends:new pe(s),platform:R,earnings:_r({knownSlug:()=>{},readSlugs:async()=>new Map((await R.currencies.get()).map(G=>[G.currencyId,G.slug]))}),profiles:new he(s)};return vr(L,"functions",Pa),vr(L,"gameConfig",Oa),L}var Ta=new Map([["function_error",false],["function_failed",false],["function_timeout",false],["function_not_published",false],["function_input_too_large",false],["invalid_cue_id",false],["functions_not_configured",false],["forbidden",false],["function_capacity_unavailable",true],["function_host_unreachable",true],["function_host_error",true],["rate_limited",true],["service_unavailable",true]]),mn=class extends f{constructor(e,n){super(e.reason,e.status,e.detail,e.retryAfterSeconds,e.code),this.name="GemFunctionError",Object.assign(this,n);}get retryable(){return (this.code===void 0?void 0:Ta.get(this.code))??super.retryable}};
3
3
  export{J as AnalyticsApi,x as AuthError,N as CONDITIONAL_HEADERS,Y as ChallengesApi,ue as CharactersApi,ee as CurrenciesApi,sn as FriendChallengeError,pe as FriendsApi,f as GemApiError,K as GemClient,mn as GemFunctionError,b as GemSaveError,te as InventoryApi,ye as LeaderboardsApi,Gt as MAX_PERIODS_BACK,ie as MutationsApi,ae as OrdersApi,fe as PlatformApi,Me as PlatformCurrenciesApi,qe as PlatformEarnAllowanceApi,S as PlayerText,he as ProfilesApi,se as ProgressionsApi,le as SavesApi,de as SettingsApi,_e as ShowcaseApi,ce as TransfersApi,v as TransportRefusal,V as asPlayerText,Ca as createGem,E as mapIdentity,da as platformIconUrl,na as text,xe as toBase64};//# sourceMappingURL=gem-web-sdk.function.js.map
4
4
  //# sourceMappingURL=gem-web-sdk.function.js.map