@jolibox/sdk 1.0.16 → 1.0.17-beta.0
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.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.iife.js +1 -1
- package/dist/index.iife.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var f=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var J=Object.prototype.hasOwnProperty;var L=(i,o)=>{for(var t in o)f(i,t,{get:o[t],enumerable:!0})},v=(i,o,t,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of j(o))!J.call(i,e)&&e!==t&&f(i,e,{get:()=>o[e],enumerable:!(a=S(o,e))||a.enumerable});return i};var k=i=>v(f({},"__esModule",{value:!0}),i);var m=(i,o,t)=>new Promise((a,e)=>{var l=r=>{try{n(t.next(r))}catch(d){e(d)}},s=r=>{try{n(t.throw(r))}catch(d){e(d)}},n=r=>r.done?a(r.value):Promise.resolve(r.value).then(l,s);n((t=t.apply(i,o)).next())});var _={};L(_,{JoliboxSDK:()=>p,default:()=>A});module.exports=k(_);var x=i=>{var n,r,d;let o=i.split("-")[1];o&&(i=i.replace(`-${o}`,""));let t=i.split("+")[1];t&&(i=i.replace(`+${t}`,""));let a=i.split(".").slice(0,3),[e,l,s]=[(n=a[0])!=null?n:"0",(r=a[1])!=null?r:"0",(d=a[2])!=null?d:"0"];return{major:e,minor:l,patch:s,prerelease:o,build:t}},w=i=>parseInt(x(i).major,10),I=(i,o)=>{let{major:t,minor:a,patch:e}=x(i),{major:l,minor:s,patch:n}=x(o);return t!==l?t>l?1:-1:a!==s?a>s?1:-1:e!==n?e>n?1:-1:0};var y="jolibox-sdk-loader-metadata",g=class{constructor({loaderMetadata:o}={}){this.computeLoaderMetaData=()=>{var e,l;let o=this.currentVersion,t=null;try{if(t=JSON.parse((e=localStorage.getItem(y))!=null?e:"null"),!t||!t.version)throw new Error("Invalid loader metadata")}catch(s){t=this.defaultMetadata}let a=(l=t==null?void 0:t.version)!=null?l:o;return w(a)!==w(o)?t=this.defaultMetadata:I(a,o)<0&&(t=this.defaultMetadata),t};this.loadScript=()=>{if(this.loaderMetadata.syncScriptUrl){let o=new XMLHttpRequest;o.open("GET",this.loaderMetadata.syncScriptUrl,!1),o.send();let t=document.createElement("script");t.type="text/javascript",t.innerHTML=o.responseText,document.head.appendChild(t)}if(this.loaderMetadata.asyncScriptUrl){let o=document.createElement("script");o.type="text/javascript",o.src=this.loaderMetadata.asyncScriptUrl,o.async=!0,document.head.appendChild(o)}};this.fetchUpdateLoaderMetadata=(...l)=>m(this,[...l],function*(o=this.currentVersion,t=this.loaderMetadata.version,a=(e=>(e=window.JOLIBOX_ENV)!=null?e:"WEB")()){var n,r,d;let s=`${(r=(n=window.joliboxenv)==null?void 0:n.apiBaseURL)!=null?r:"https://api.jolibox.com"}/frontend/js-sdk/loader-metadata`;try{let b=yield(yield fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({installedSDKVersion:o,localSDKVersion:t,env:a})})).json();if(b.code!=="SUCCESS")throw new Error(b.message);this.loaderMetadata=(d=b.data)!=null?d:this.defaultMetadata,localStorage.setItem(y,JSON.stringify(this.loaderMetadata))}catch(c){console.warn("Failed to fetch loader metadata: ",c)}});console.log("Loading Jolibox SDK..."),this.loaderMetadata=o!=null?o:this.computeLoaderMetaData(),this.loadScript(),this.fetchUpdateLoaderMetadata(),console.log("Jolibox SDK loaded.")}get currentVersion(){return window.__JOLIBOX_LOCAL_SDK_VERSION__}get defaultMetadata(){let o=this.currentVersion,t=w(o);return{version:o,syncScriptUrl:`https://cdn.jsdelivr.net/npm/@jolibox/web-sync-sdk@${t}/dist/index.iife.js`,asyncScriptUrl:`https://cdn.jsdelivr.net/npm/@jolibox/web-async-sdk@${t}/dist/index.iife.js`}}};window.JoliboxSDKLoader=g;var u=class{constructor(){this.init=o=>{window.joliboxsdk._commandPipe.push({cmd:"ads.init",params:o})};this.adConfig=o=>{window.joliboxsdk._commandPipe.push({cmd:"ads.adConfig",params:o})};this.adBreak=o=>{window.joliboxsdk._commandPipe.push({cmd:"ads.adBreak",params:o})};this.adUnit=o=>m(this,null,function*(){window.joliboxsdk._commandPipe.push({cmd:"ads.adUnit",params:o})})}};window.JoliboxAds=u;var h=class{constructor(){this.trackEvent=(o,t)=>{if(typeof o!="string")throw new Error("eventName must be a string");if(t!==null&&typeof t!="object"&&t!==void 0)throw new Error("extra must be an object or null or undefined");if(t){for(let a in t)if(typeof t[a]=="object")throw new Error("extra must not have nested objects")}window.joliboxsdk._commandPipe.push({cmd:"analytics.trackEvent",params:[o,t]})}}};window.JoliboxAnalytics=h;var N=require("@jolibox/web-sync-sdk");window.__JOLIBOX_LOCAL_SDK_VERSION__="1.0.
|
|
1
|
+
"use strict";var f=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var J=Object.prototype.hasOwnProperty;var L=(i,o)=>{for(var t in o)f(i,t,{get:o[t],enumerable:!0})},v=(i,o,t,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of j(o))!J.call(i,e)&&e!==t&&f(i,e,{get:()=>o[e],enumerable:!(a=S(o,e))||a.enumerable});return i};var k=i=>v(f({},"__esModule",{value:!0}),i);var m=(i,o,t)=>new Promise((a,e)=>{var l=r=>{try{n(t.next(r))}catch(d){e(d)}},s=r=>{try{n(t.throw(r))}catch(d){e(d)}},n=r=>r.done?a(r.value):Promise.resolve(r.value).then(l,s);n((t=t.apply(i,o)).next())});var _={};L(_,{JoliboxSDK:()=>p,default:()=>A});module.exports=k(_);var x=i=>{var n,r,d;let o=i.split("-")[1];o&&(i=i.replace(`-${o}`,""));let t=i.split("+")[1];t&&(i=i.replace(`+${t}`,""));let a=i.split(".").slice(0,3),[e,l,s]=[(n=a[0])!=null?n:"0",(r=a[1])!=null?r:"0",(d=a[2])!=null?d:"0"];return{major:e,minor:l,patch:s,prerelease:o,build:t}},w=i=>parseInt(x(i).major,10),I=(i,o)=>{let{major:t,minor:a,patch:e}=x(i),{major:l,minor:s,patch:n}=x(o);return t!==l?t>l?1:-1:a!==s?a>s?1:-1:e!==n?e>n?1:-1:0};var y="jolibox-sdk-loader-metadata",g=class{constructor({loaderMetadata:o}={}){this.computeLoaderMetaData=()=>{var e,l;let o=this.currentVersion,t=null;try{if(t=JSON.parse((e=localStorage.getItem(y))!=null?e:"null"),!t||!t.version)throw new Error("Invalid loader metadata")}catch(s){t=this.defaultMetadata}let a=(l=t==null?void 0:t.version)!=null?l:o;return w(a)!==w(o)?t=this.defaultMetadata:I(a,o)<0&&(t=this.defaultMetadata),t};this.loadScript=()=>{if(this.loaderMetadata.syncScriptUrl){let o=new XMLHttpRequest;o.open("GET",this.loaderMetadata.syncScriptUrl,!1),o.send();let t=document.createElement("script");t.type="text/javascript",t.innerHTML=o.responseText,document.head.appendChild(t)}if(this.loaderMetadata.asyncScriptUrl){let o=document.createElement("script");o.type="text/javascript",o.src=this.loaderMetadata.asyncScriptUrl,o.async=!0,document.head.appendChild(o)}};this.fetchUpdateLoaderMetadata=(...l)=>m(this,[...l],function*(o=this.currentVersion,t=this.loaderMetadata.version,a=(e=>(e=window.JOLIBOX_ENV)!=null?e:"WEB")()){var n,r,d;let s=`${(r=(n=window.joliboxenv)==null?void 0:n.apiBaseURL)!=null?r:"https://api.jolibox.com"}/frontend/js-sdk/loader-metadata`;try{let b=yield(yield fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({installedSDKVersion:o,localSDKVersion:t,env:a})})).json();if(b.code!=="SUCCESS")throw new Error(b.message);this.loaderMetadata=(d=b.data)!=null?d:this.defaultMetadata,localStorage.setItem(y,JSON.stringify(this.loaderMetadata))}catch(c){console.warn("Failed to fetch loader metadata: ",c)}});console.log("Loading Jolibox SDK..."),this.loaderMetadata=o!=null?o:this.computeLoaderMetaData(),this.loadScript(),this.fetchUpdateLoaderMetadata(),console.log("Jolibox SDK loaded.")}get currentVersion(){return window.__JOLIBOX_LOCAL_SDK_VERSION__}get defaultMetadata(){let o=this.currentVersion,t=w(o);return{version:o,syncScriptUrl:`https://cdn.jsdelivr.net/npm/@jolibox/web-sync-sdk@${t}/dist/index.iife.js`,asyncScriptUrl:`https://cdn.jsdelivr.net/npm/@jolibox/web-async-sdk@${t}/dist/index.iife.js`}}};window.JoliboxSDKLoader=g;var u=class{constructor(){this.init=o=>{window.joliboxsdk._commandPipe.push({cmd:"ads.init",params:o})};this.adConfig=o=>{window.joliboxsdk._commandPipe.push({cmd:"ads.adConfig",params:o})};this.adBreak=o=>{window.joliboxsdk._commandPipe.push({cmd:"ads.adBreak",params:o})};this.adUnit=o=>m(this,null,function*(){window.joliboxsdk._commandPipe.push({cmd:"ads.adUnit",params:o})})}};window.JoliboxAds=u;var h=class{constructor(){this.trackEvent=(o,t)=>{if(typeof o!="string")throw new Error("eventName must be a string");if(t!==null&&typeof t!="object"&&t!==void 0)throw new Error("extra must be an object or null or undefined");if(t){for(let a in t)if(typeof t[a]=="object")throw new Error("extra must not have nested objects")}window.joliboxsdk._commandPipe.push({cmd:"analytics.trackEvent",params:[o,t]})}}};window.JoliboxAnalytics=h;var N=require("@jolibox/web-sync-sdk");window.__JOLIBOX_LOCAL_SDK_VERSION__="1.0.17-beta.0";var p=class{constructor({useRuntimeSDK:o=!0,loaderConfig:t,testMode:a,apiBaseURL:e}={}){this.hostToApiMap={default:{test:"https://stg-api.jolibox.com",prod:"https://api.jolibox.com"},"oss.jolibox.com":{test:"https://stg-api.jolibox.com",prod:"https://api.jolibox.com"},"oss.pico-game.com":{test:"https://stg-api.pico-game.com",prod:"https://api.pico-game.com"}};this.setJoliboxEnv=(o,t)=>{var d;let e=typeof window<"u"?new URLSearchParams(window.location.search):null,l=(e==null?void 0:e.get("testMode"))==="true",s=o!=null?o:l,n=e==null?void 0:e.get("apiBaseURL"),r;if(t)r=t;else if(n)r=n;else{let c=(d=this.hostToApiMap[window.location.host])!=null?d:this.hostToApiMap.default;r=s?c.test:c.prod}window.joliboxenv={testMode:s,apiBaseURL:r}};var l,s,n,r,d;this.setJoliboxEnv(a,e),o&&window.joliboxsdk?(this.loader=(l=window.joliboxsdk.loader)!=null?l:new window.JoliboxSDKLoader(t),this.ads=(s=window.joliboxsdk.ads)!=null?s:new window.JoliboxAds,this.anaytics=(n=window.joliboxsdk.anaytics)!=null?n:new window.JoliboxAnalytics,this.runtime=(r=window.joliboxsdk.runtime)!=null?r:new window.JoliboxRuntime,this.storage=(d=window.joliboxsdk.storage)!=null?d:new window.JoliboxCloudStorage):(window.joliboxsdk||(window.joliboxsdk={_commandPipe:[]}),this.loader=new window.JoliboxSDKLoader(t),this.ads=new window.JoliboxAds,this.anaytics=new window.JoliboxAnalytics,this.runtime=new window.JoliboxRuntime,this.storage=new window.JoliboxCloudStorage,window.joliboxsdk=Object.assign(this,window.joliboxsdk)),window.joliboxsdk._commandPipe||(window.joliboxsdk._commandPipe=[])}};window.JoliboxSDK||(window.JoliboxSDK=p);var A=p;0&&(module.exports={JoliboxSDK});
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/loader/utils.ts","../src/loader/index.ts","../src/ads/index.ts","../src/analytics/index.ts"],"sourcesContent":["import \"./loader\";\nimport \"./ads\";\nimport \"./analytics\";\nimport \"@jolibox/web-sync-sdk\";\nimport type { JoliboxSDKLoader, IJoliboxSDKLoaderConfig } from \"./loader\";\nimport type { JoliboxAds } from \"./ads\";\nimport type { JoliboxAnalytics } from \"./analytics\";\nimport type { JoliboxRuntime } from \"./runtime\";\nimport type { JoliboxCloudStorage } from \"./storage\";\n\ndeclare global {\n interface IJoliboxSDK extends JoliboxSDK {\n _commandPipe: ICommandPipe[];\n }\n interface Window {\n __JOLIBOX_LOCAL_SDK_VERSION__: string;\n joliboxenv?: {\n testMode: boolean;\n apiBaseURL: string;\n };\n joliboxsdk: IJoliboxSDK;\n JoliboxSDK: typeof JoliboxSDK;\n }\n interface ImportMeta {\n env: {\n JOLIBOX_SDK_VERSION: string;\n };\n }\n}\n\nwindow.__JOLIBOX_LOCAL_SDK_VERSION__ = import.meta.env.JOLIBOX_SDK_VERSION;\n\nexport interface IJoliboxConfig {\n useRuntimeSDK?: boolean;\n loaderConfig?: IJoliboxSDKLoaderConfig;\n testMode?: boolean;\n apiBaseURL?: string;\n}\n\ninterface ICommandPipe {\n cmd: string;\n params: any;\n}\n\nclass JoliboxSDK {\n private loader: JoliboxSDKLoader;\n ads: JoliboxAds;\n private anaytics: JoliboxAnalytics; // currently not open to the public\n runtime: JoliboxRuntime;\n storage: JoliboxCloudStorage;\n\n private hostToApiMap: Record<\n string | \"default\",\n { test: string; prod: string }\n > = {\n default: {\n test: \"https://stg-api.jolibox.com\",\n prod: \"https://api.jolibox.com\",\n },\n \"oss.jolibox.com\": {\n test: \"https://stg-api.jolibox.com\",\n prod: \"https://api.jolibox.com\",\n },\n \"oss.pico-game.com\": {\n test: \"https://stg-api.pico-game.com\",\n prod: \"https://api.pico-game.com\",\n },\n };\n\n private setJoliboxEnv = (\n inputTestMode?: boolean,\n inputApiBaseURL?: string\n ) => {\n const isBrowser = typeof window !== \"undefined\";\n const urlSearchParams = isBrowser\n ? new URLSearchParams(window.location.search)\n : null;\n const testModeParam = urlSearchParams?.get(\"testMode\") === \"true\";\n const testMode = inputTestMode ?? testModeParam;\n\n const apiBaseURLParam = urlSearchParams?.get(\"apiBaseURL\");\n let apiBaseURL: string;\n if (inputApiBaseURL) {\n apiBaseURL = inputApiBaseURL;\n } else if (apiBaseURLParam) {\n apiBaseURL = apiBaseURLParam;\n } else {\n const api =\n this.hostToApiMap[window.location.host] ?? this.hostToApiMap.default;\n apiBaseURL = testMode ? api.test : api.prod;\n }\n window.joliboxenv = {\n testMode,\n apiBaseURL,\n };\n };\n\n constructor({\n useRuntimeSDK = true,\n loaderConfig,\n testMode,\n apiBaseURL,\n }: IJoliboxConfig = {}) {\n this.setJoliboxEnv(testMode, apiBaseURL);\n if (useRuntimeSDK && window.joliboxsdk) {\n this.loader =\n window.joliboxsdk.loader ?? new window.JoliboxSDKLoader(loaderConfig);\n this.ads = window.joliboxsdk.ads ?? new window.JoliboxAds();\n this.anaytics =\n window.joliboxsdk.anaytics ?? new window.JoliboxAnalytics();\n this.runtime = window.joliboxsdk.runtime ?? new window.JoliboxRuntime();\n this.storage =\n window.joliboxsdk.storage ?? new window.JoliboxCloudStorage();\n } else {\n if (!window.joliboxsdk) {\n window.joliboxsdk = {\n _commandPipe: [], // This is to avoid the error \"Cannot read property 'push' of undefined\" if any command is called before the SDK is initialized\n } as any;\n }\n\n this.loader = new window.JoliboxSDKLoader(loaderConfig);\n this.ads = new window.JoliboxAds();\n this.anaytics = new window.JoliboxAnalytics();\n this.runtime = new window.JoliboxRuntime();\n this.storage = new window.JoliboxCloudStorage();\n window.joliboxsdk = Object.assign(this, window.joliboxsdk);\n }\n if (!window.joliboxsdk._commandPipe) {\n window.joliboxsdk._commandPipe = [];\n }\n }\n}\n\nif (!window.JoliboxSDK) {\n window.JoliboxSDK = JoliboxSDK;\n}\n\nexport default JoliboxSDK;\nexport { JoliboxSDK };\n","const splitSemver = (\n version: string\n): {\n major: string;\n minor: string;\n patch: string;\n prerelease?: string;\n build?: string;\n} => {\n const prerelease = version.split(\"-\")[1] as string | undefined;\n if (prerelease) {\n version = version.replace(`-${prerelease}`, \"\");\n }\n\n const build = version.split(\"+\")[1] as string | undefined;\n if (build) {\n version = version.replace(`+${build}`, \"\");\n }\n\n const splitted = version.split(\".\").slice(0, 3);\n const [major, minor, patch] = [\n splitted[0] ?? \"0\",\n splitted[1] ?? \"0\",\n splitted[2] ?? \"0\",\n ];\n return { major, minor, patch, prerelease, build };\n};\n\nexport const major = (version: string): number =>\n parseInt(splitSemver(version).major, 10);\n\nexport const compare = (v1: string, v2: string): -1 | 0 | 1 => {\n const { major: major1, minor: minor1, patch: patch1 } = splitSemver(v1);\n const { major: major2, minor: minor2, patch: patch2 } = splitSemver(v2);\n\n if (major1 !== major2) {\n return major1 > major2 ? 1 : -1;\n }\n\n if (minor1 !== minor2) {\n return minor1 > minor2 ? 1 : -1;\n }\n\n if (patch1 !== patch2) {\n return patch1 > patch2 ? 1 : -1;\n }\n\n return 0;\n};\n","import { major, compare } from \"./utils\";\n\ndeclare global {\n interface Window {\n JOLIBOX_ENV: \"WEB\" | \"IOS\" | \"ANDROID\" | \"WINDOWS\" | \"MACOS\" | \"LINUX\";\n JoliboxSDKLoader: typeof JoliboxSDKLoader;\n }\n}\n\nconst joliboxLoaderKey = \"jolibox-sdk-loader-metadata\";\n\nexport interface IVersionMetadata {\n version: string;\n syncScriptUrl?: string; // By default, the sync script is bundled with the sdk\n asyncScriptUrl?: string;\n}\n\nexport interface IRemoteVersionMetadata {\n code: \"SUCCESS\" | string;\n message?: string;\n data?: IVersionMetadata;\n}\n\nexport interface IJoliboxSDKLoaderConfig {\n loaderMetadata?: IVersionMetadata;\n}\n\nexport class JoliboxSDKLoader {\n loaderMetadata: IVersionMetadata;\n\n constructor({ loaderMetadata }: IJoliboxSDKLoaderConfig = {}) {\n console.log(\"Loading Jolibox SDK...\");\n\n this.loaderMetadata = loaderMetadata ?? this.computeLoaderMetaData();\n this.loadScript();\n this.fetchUpdateLoaderMetadata();\n console.log(\"Jolibox SDK loaded.\");\n }\n\n private get currentVersion() {\n return window.__JOLIBOX_LOCAL_SDK_VERSION__;\n }\n\n private get defaultMetadata(): IVersionMetadata {\n const version = this.currentVersion;\n const majorVersion = major(version);\n return {\n version,\n syncScriptUrl: `https://cdn.jsdelivr.net/npm/@jolibox/web-sync-sdk@${majorVersion}/dist/index.iife.js`,\n asyncScriptUrl: `https://cdn.jsdelivr.net/npm/@jolibox/web-async-sdk@${majorVersion}/dist/index.iife.js`,\n };\n }\n\n computeLoaderMetaData = () => {\n const version = this.currentVersion;\n let loaderMetadata: IVersionMetadata | null = null;\n try {\n loaderMetadata = JSON.parse(\n localStorage.getItem(joliboxLoaderKey) ?? \"null\"\n ) as IVersionMetadata | null;\n if (!loaderMetadata || !loaderMetadata.version) {\n throw new Error(\"Invalid loader metadata\");\n }\n } catch (error) {\n loaderMetadata = this.defaultMetadata;\n }\n\n const versionFromLocalStorage = loaderMetadata?.version ?? version;\n\n if (major(versionFromLocalStorage) !== major(version)) {\n // if major version is different, must follow the version from package.json\n loaderMetadata = this.defaultMetadata;\n } else {\n // if major version is the same, follow the larger version\n if (compare(versionFromLocalStorage, version) < 0) {\n loaderMetadata = this.defaultMetadata;\n }\n }\n\n return loaderMetadata;\n };\n\n loadScript = () => {\n if (this.loaderMetadata.syncScriptUrl) {\n // The only way to load a script synchronously is to use XMLHttpRequest\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", this.loaderMetadata.syncScriptUrl, false);\n xhr.send();\n // eval(xhr.responseText);\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.innerHTML = xhr.responseText;\n document.head.appendChild(script);\n }\n\n if (this.loaderMetadata.asyncScriptUrl) {\n const asyncScript = document.createElement(\"script\");\n asyncScript.type = \"text/javascript\";\n asyncScript.src = this.loaderMetadata.asyncScriptUrl;\n asyncScript.async = true;\n document.head.appendChild(asyncScript);\n }\n };\n\n fetchUpdateLoaderMetadata = async (\n installedSDKVersion = this.currentVersion,\n localSDKVersion = this.loaderMetadata.version,\n env = window.JOLIBOX_ENV ?? \"WEB\"\n ) => {\n const path = `${\n window.joliboxenv?.apiBaseURL ?? \"https://api.jolibox.com\"\n }/frontend/js-sdk/loader-metadata`;\n try {\n const response = await fetch(path, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n installedSDKVersion,\n localSDKVersion,\n env,\n }),\n });\n const data: IRemoteVersionMetadata = await response.json();\n if (data.code !== \"SUCCESS\") {\n throw new Error(data.message);\n } else {\n this.loaderMetadata = data.data ?? this.defaultMetadata;\n localStorage.setItem(\n joliboxLoaderKey,\n JSON.stringify(this.loaderMetadata)\n );\n // reload happens next time the page is loaded\n }\n } catch (error) {\n console.warn(\"Failed to fetch loader metadata: \", error);\n }\n };\n}\n\nwindow.JoliboxSDKLoader = JoliboxSDKLoader;\n","declare global {\n interface Window {\n JoliboxAds: typeof JoliboxAds;\n }\n}\n\nexport interface IAdsInitParams {\n /**\n * (OPTIONAL) Game ID provided by Jolibox\n */\n gameId?: string;\n}\n\nexport interface IAdConfigParams {\n /**\n * (OPTIONAL) Whether ads should always be preloaded before the first call to adBreak()\n *\n * The default value of auto leaves the decision up to the Ad Placement API. preloadAdBreaks can be set only once with adConfig(), and further values passed to preloadAdBreaks have no effect.\n *\n * Setting preloadAdBreaks after the first call to adBreak() has no effect.\n */\n preloadAdBreaks?: \"on\" | \"auto\"; // default: 'auto'\n\n /**\n * (OPTIONAL) Whether the game is currently playing sound.\n *\n * This call specifies whether your game is capable of sound, and whether the sound was enabled (ie unmuted) before the call to adBreak(). This helps the Ad Placement API to select the right kind of ad for your game.\n *\n * Call this function as soon as the sound state of your game changes, as the Ad Placement API may have to request new creatives, and this gives it the maximum amount of time to do so.\n *\n * The default value is sound on. So most games will need to make a call to adConfig() when they start to declare that they have sound enabled.\n */\n sound?: \"on\" | \"off\"; // default: 'on'\n\n /**\n * (OPTIONAL) Called when the API has initialized and has finished preloading ads (if you requested preloading using the preloadAdBreaks above).\n * @returns\n */\n onReady?: () => void;\n}\n\n/**\n * PlacementInfo object passed by **adBreakDone** function\n */\nexport interface IPlacementInfo {\n /**\n * the type argument passed to adBreak()\n */\n breakType: string;\n /**\n * the name argument passed to adBreak()\n */\n breakName: string;\n breakFormat: \"interstitial\" | \"reward\";\n /**\n * the status of this placement and can be one of the following values:\n *\n * | breakStatus | Reason |\n * | -------- | ------- |\n * | 'notReady'\t| The Ad Placement API had not initialised |\n * | 'timeout' | A placement timed out because the Ad Placement API took too long to respond |\n * | 'invalid' | The placement was invalid and was ignored–for instance there should only be one preroll placement per page load, subsequent prerolls are failed with this status |\n * | 'error' | There was a JavaScript error in a callback |\n * | 'noAdPreloaded' |\tAn ad had not been preloaded yet so this placement was skipped |\n * | 'frequencyCapped' |\tAn ad wasn't shown because the frequency cap was applied to this placement |\n * | 'ignored' |\tThe user didn't click on a reward prompt before they reached the next placement, that is showAdFn() wasn't called before the next adBreak(). |\n * | 'other' |\tThe ad was not shown for another reason. (e.g., The ad was still being fetched, or a previously cached ad was disposed because the screen was resized/rotated.) |\n * | 'dismissed' |\tThe user dismissed a rewarded ad before viewing it to completion |\n * | 'viewed' |\tThe ad was viewed by the user |\n */\n breakStatus:\n | \"notReady\"\n | \"timeout\"\n | \"error\"\n | \"noAdPreloaded\"\n | \"frequencyCapped\"\n | \"ignored\"\n | \"other\"\n | \"dismissed\"\n | \"viewed\";\n}\n\n/**\n * Parameter when calling adBreak\n */\nexport type IAdBreakParams =\n | IPrerollParams\n | IInterstitialsParams\n | IRewardParams;\n\n/**\n * Parameter when calling preroll type adBreak\n */\nexport interface IPrerollParams {\n /**\n * 'preroll' before the game loads (before UI has rendered)\n */\n type: \"preroll\";\n\n /**\n * (OPTIONAL) Always called as the last step in an adBreak(), even if there was no ad shown. Function takes as argument a placementInfo object\n * @param placementInfo\n * @returns\n */\n adBreakDone?: (placementInfo: IPlacementInfo) => void;\n}\n\nexport interface IInterstitialsParams {\n /**\n * 'start' before the gameplay starts (after UI has rendered)\n * 'pause' the player pauses the game\n * 'next' player navigates to the next level\n * 'browse' the player explores options outside of the gameplay\n */\n type: \"start\" | \"pause\" | \"next\" | \"browse\";\n\n /**\n * (OPTIONAL) a name for this particular ad placement within your game. It is an internal identifier, and is not shown to the player. In future releases this identifier may be used to enable additional reporting and optimization features.\n *\n * We recommend you name all of your placements.\n */\n name?: string;\n\n /**\n * (OPTIONAL) Called before the ad is displayed. The game should pause and mute the sound. These actions must be done synchronously. The ad will be displayed immediately after this callback finishes.\n *\n * @returns\n */\n beforeAd?: () => void;\n\n /**\n * (OPTIONAL) Called after the ad is finished (for any reason). For rewarded ads, it is called after either adDismissed or adViewed, depending on player actions. This function should be used to resume game flow. For example, use to unmute the sound and start the next level.\n * @returns\n */\n afterAd?: () => void;\n\n /**\n * (OPTIONAL) Always called as the last step in an adBreak(), even if there was no ad shown. Function takes as argument a placementInfo object\n *\n * @param placementInfo\n * @returns\n */\n adBreakDone?: (placementInfo: IPlacementInfo) => void;\n}\n\nexport interface IRewardParams {\n /**\n * 'reward' a rewarded ad\n */\n type: \"reward\";\n\n /**\n * (OPTIONAL) a name for this particular ad placement within your game. It is an internal identifier, and is not shown to the player. In future releases this identifier may be used to enable additional reporting and optimization features.\n *\n * We recommend you name all of your placements.\n */\n name?: string;\n\n /**\n * (OPTIONAL) Called before the ad is displayed. The game should pause and mute the sound. These actions must be done synchronously. The ad will be displayed immediately after this callback finishes.\n * @returns\n */\n beforeAd?: () => void;\n\n /**\n * (OPTIONAL) Called after the ad is finished (for any reason). For rewarded ads, it is called after either adDismissed or adViewed, depending on player actions. This function should be used to resume game flow. For example, use to unmute the sound and start the next level.\n * @returns\n */\n afterAd?: () => void;\n\n /**\n * (OPTIONAL) Always called as the last step in an adBreak(), even if there was no ad shown. Function takes as argument a placementInfo object defined\n * @param placementInfo\n * @returns\n */\n adBreakDone?: (placementInfo: IPlacementInfo) => void;\n\n /**\n * Called if a rewarded ad is available. The function should take a single argument–showAdFn() which must be called to display the rewarded ad.\n * @param showAdFn\n * @returns\n */\n beforeReward: (showAdFn: () => void) => void;\n\n /**\n * Called only for rewarded ads when the player dismisses the ad. It is only called if the player dismisses the ad before it completes. In this case the reward should not be granted.\n * @returns\n */\n adDismissed: () => void;\n\n /**\n * Called only for rewarded ads when the player completes the ad and should be granted the reward.\n * @returns\n */\n adViewed: () => void;\n}\n\n/**\n * Ad unit format, can be 'rectangle', 'vertical', 'horizontal'\n */\nexport type AdUnitFormat = \"rectangle\" | \"vertical\" | \"horizontal\";\n\nexport interface IAdUnitParams {\n /**\n * The element to attach the ad unit to, either an HTMLElement or a string selector. Should be the parent element of the ad unit (<ins> tag).\n */\n el: HTMLElement | string;\n\n /**\n * (OPTIONAL) Reserved for future usage. The slot ID of the ad unit. Currently the slot ID is automatically set by the SDK.\n */\n slot?: string;\n\n // /**\n // * (OPTIONAL) The position of the ad unit. Can be 'TOP', 'BOTTOM', 'LEFT', 'RIGHT', 'CENTER'. Default is 'TOP'. Either position or slot should be set.\n // */\n // position?: AdUnitPosition;\n\n // /**\n // * (OPTIONAL) Channel ID for the ad unit. We will set the Channel ID automatically if not provided. Default is empty.\n // */\n // channelId?: string;\n\n /**\n * (OPTIONAL) Ad format for the ad unit. Can be 'auto' or a single format or an array of formats. Default is 'auto'. If passed as an array, the array will be joined by ', ' and pass to the data-ad-format attribute.\n */\n adFormat?: \"auto\" | AdUnitFormat | AdUnitFormat[];\n\n /**\n * (OPTIONAL) Whether the ad unit should be full width and responsive. Default is false.\n */\n fullWidthResponsive?: \"true\" | \"false\";\n\n /**\n * (OPTIONAL) Custom style for the ad unit. Default is empty.\n */\n style?: string;\n}\n\n/**\n * Jolibox Ads SDK\n */\nexport class JoliboxAds {\n /**\n * Internal constructor, should not be called directly\n */\n constructor() {}\n\n /**\n * Init JoliboxAds. Must be called before any other ads functions.\n * @param config\n * @returns\n */\n public init = (config?: IAdsInitParams) => {\n window.joliboxsdk._commandPipe.push({\n cmd: \"ads.init\",\n params: config,\n });\n };\n\n /**\n * The adConfig() call communicates the game's current configuration to the Ad Placement API. The Ad Placement API can use this to tune the way it preloads ads and to filter the kinds of ads it requests so they're suitable (eg. video ads that require sound).\n * @param params\n */\n public adConfig = (params: IAdConfigParams) => {\n window.joliboxsdk._commandPipe.push({\n cmd: \"ads.adConfig\",\n params,\n });\n };\n\n /**\n * adBreak() is the key function for placing ads within your game. It defines an ad placement and takes an object called a placement config that specifies everything required to show an ad.\n *\n * The adBreak() function defines a placement where an ad could be shown. Whether an ad actually shows depends on factors such as the following:\n *\n * - The type of ad placement that you declared\n * - Is this ad at the start of the game? Between levels? At a moment when the player has paused the game?\n * - Whether a suitable ad exists for the current player\n * - Is this ad relevant to them?\n * - Is it consistent with their data privacy and consent settings?\n * - The number of ads the player has seen recently\n * - The control settings—for example, ad frequency, you've configured for this game\n * - Either as hints in the tag, or,\n * - Within AdSense—note that the controls available in AdSense will evolve over time.\n *\n * The kind of ad that shows also depends on similar factors.\n *\n * Note that a call to adBreak() might not show an ad at all. It simply declares a place where an ad could be shown.\n *\n * This is unlike traditional APIs in which your code always knows if an ad is available, and you decide within the game whether to show it. This approach of letting the Ad Placement API decide if an ad shows in a particular placement is a pattern that is sometimes referred to as \"inversion of control\".\n *\n * The reason we're transitioning our games API to this model is firstly, it shortens the code you have to write within your game. Secondly, it makes it easier to deliver policy compliant placements with a great user experience, which in turn has allowed us to deliver some of our highest performing formats to games publishers. Lastly, it more cleanly separates the process of placing ads in your game from the monetization decisions about the type and number of ads to show.\n *\n * We want you to be able to change your monetization settings and control the user experience without having to edit and release a new version of your game, initially by specifying hints in the tag. But in future releases, we will be able to provide controls directly in the AdSense and AdMob frontends.\n * @param params\n */\n public adBreak = (params: IAdBreakParams) => {\n window.joliboxsdk._commandPipe.push({\n cmd: \"ads.adBreak\",\n params,\n });\n };\n\n /**\n * adUnit() is a function that creates an ad unit and attaches it to a parent element. The ad unit is a single ad placement that can be used to show ads.\n *\n * Currently we only provide support for creating ad units as `<ins>` tags with the class 'adsbygoogle'. This is the standard way to create ad units with Google AdSense.\n *\n * After calling this method, the ad unit is attached to the parent element you specify as el in the params object.\n *\n * By default, the client ID and channel ID are automatically set by the SDK. And the slot name is set to the position of the ad unit. You can override these values by passing the slot and channelId in the params object.\n *\n * @param params\n * @returns\n */\n public adUnit = async (params: IAdUnitParams) => {\n window.joliboxsdk._commandPipe.push({\n cmd: \"ads.adUnit\",\n params,\n });\n };\n}\n\nwindow.JoliboxAds = JoliboxAds;\n\nexport default JoliboxAds;\n","declare global {\n interface Window {\n JoliboxAnalytics: typeof JoliboxAnalytics;\n }\n}\n\n/**\n * Jolibox Analytics SDK\n */\nexport class JoliboxAnalytics {\n constructor() {}\n\n /**\n * Track an event, will be sent to the analytics server\n * Currently not open to the public\n *\n * @param eventName event name, must be a string\n * @param extra (OPTIONAL) extra data, must be an object or null or undefined, must not have nested objects\n */\n private trackEvent = (\n eventName: string,\n extra?: Record<string, string | boolean | number | null> | null\n ) => {\n // assert eventName is a string\n if (typeof eventName !== \"string\") {\n throw new Error(\"eventName must be a string\");\n }\n\n // assert extra is an object or null or undefined\n if (extra !== null && typeof extra !== \"object\" && extra !== undefined) {\n throw new Error(\"extra must be an object or null or undefined\");\n }\n\n // assert extra has no nested objects\n if (extra) {\n for (const key in extra) {\n if (typeof extra[key] === \"object\") {\n throw new Error(\"extra must not have nested objects\");\n }\n }\n }\n\n window.joliboxsdk._commandPipe.push({\n cmd: \"analytics.trackEvent\",\n params: [eventName, extra],\n });\n };\n}\n\nwindow.JoliboxAnalytics = JoliboxAnalytics;\n\nexport default JoliboxAnalytics;\n"],"mappings":"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","names":["src_exports","__export","JoliboxSDK","src_default","__toCommonJS","splitSemver","version","_a","_b","_c","prerelease","build","splitted","major","minor","patch","compare","v1","v2","major1","minor1","patch1","major2","minor2","patch2","joliboxLoaderKey","JoliboxSDKLoader","loaderMetadata","_a","_b","version","error","versionFromLocalStorage","major","compare","xhr","script","asyncScript","_0","__async","installedSDKVersion","localSDKVersion","env","_c","path","data","majorVersion","JoliboxAds","config","params","__async","JoliboxAnalytics","eventName","extra","key","import_web_sync_sdk","JoliboxSDK","useRuntimeSDK","loaderConfig","testMode","apiBaseURL","inputTestMode","inputApiBaseURL","_a","urlSearchParams","testModeParam","apiBaseURLParam","api","_b","_c","_d","_e","src_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/loader/utils.ts","../src/loader/index.ts","../src/ads/index.ts","../src/analytics/index.ts"],"sourcesContent":["import \"./loader\";\nimport \"./ads\";\nimport \"./analytics\";\nimport \"@jolibox/web-sync-sdk\";\nimport type { JoliboxSDKLoader, IJoliboxSDKLoaderConfig } from \"./loader\";\nimport type { JoliboxAds } from \"./ads\";\nimport type { JoliboxAnalytics } from \"./analytics\";\nimport type { JoliboxRuntime } from \"./runtime\";\nimport type { JoliboxCloudStorage } from \"./storage\";\n\ndeclare global {\n interface IJoliboxSDK extends JoliboxSDK {\n _commandPipe: ICommandPipe[];\n }\n interface Window {\n __JOLIBOX_LOCAL_SDK_VERSION__: string;\n joliboxenv?: {\n testMode: boolean;\n apiBaseURL: string;\n };\n joliboxsdk: IJoliboxSDK;\n JoliboxSDK: typeof JoliboxSDK;\n }\n interface ImportMeta {\n env: {\n JOLIBOX_SDK_VERSION: string;\n };\n }\n}\n\nwindow.__JOLIBOX_LOCAL_SDK_VERSION__ = import.meta.env.JOLIBOX_SDK_VERSION;\n\nexport interface IJoliboxConfig {\n useRuntimeSDK?: boolean;\n loaderConfig?: IJoliboxSDKLoaderConfig;\n testMode?: boolean;\n apiBaseURL?: string;\n}\n\ninterface ICommandPipe {\n cmd: string;\n params: any;\n}\n\nclass JoliboxSDK {\n private loader: JoliboxSDKLoader;\n ads: JoliboxAds;\n private anaytics: JoliboxAnalytics; // currently not open to the public\n runtime: JoliboxRuntime;\n storage: JoliboxCloudStorage;\n\n private hostToApiMap: Record<\n string | \"default\",\n { test: string; prod: string }\n > = {\n default: {\n test: \"https://stg-api.jolibox.com\",\n prod: \"https://api.jolibox.com\",\n },\n \"oss.jolibox.com\": {\n test: \"https://stg-api.jolibox.com\",\n prod: \"https://api.jolibox.com\",\n },\n \"oss.pico-game.com\": {\n test: \"https://stg-api.pico-game.com\",\n prod: \"https://api.pico-game.com\",\n },\n };\n\n private setJoliboxEnv = (\n inputTestMode?: boolean,\n inputApiBaseURL?: string\n ) => {\n const isBrowser = typeof window !== \"undefined\";\n const urlSearchParams = isBrowser\n ? new URLSearchParams(window.location.search)\n : null;\n const testModeParam = urlSearchParams?.get(\"testMode\") === \"true\";\n const testMode = inputTestMode ?? testModeParam;\n\n const apiBaseURLParam = urlSearchParams?.get(\"apiBaseURL\");\n let apiBaseURL: string;\n if (inputApiBaseURL) {\n apiBaseURL = inputApiBaseURL;\n } else if (apiBaseURLParam) {\n apiBaseURL = apiBaseURLParam;\n } else {\n const api =\n this.hostToApiMap[window.location.host] ?? this.hostToApiMap.default;\n apiBaseURL = testMode ? api.test : api.prod;\n }\n window.joliboxenv = {\n testMode,\n apiBaseURL,\n };\n };\n\n constructor({\n useRuntimeSDK = true,\n loaderConfig,\n testMode,\n apiBaseURL,\n }: IJoliboxConfig = {}) {\n this.setJoliboxEnv(testMode, apiBaseURL);\n if (useRuntimeSDK && window.joliboxsdk) {\n this.loader =\n window.joliboxsdk.loader ?? new window.JoliboxSDKLoader(loaderConfig);\n this.ads = window.joliboxsdk.ads ?? new window.JoliboxAds();\n this.anaytics =\n window.joliboxsdk.anaytics ?? new window.JoliboxAnalytics();\n this.runtime = window.joliboxsdk.runtime ?? new window.JoliboxRuntime();\n this.storage =\n window.joliboxsdk.storage ?? new window.JoliboxCloudStorage();\n } else {\n if (!window.joliboxsdk) {\n window.joliboxsdk = {\n _commandPipe: [], // This is to avoid the error \"Cannot read property 'push' of undefined\" if any command is called before the SDK is initialized\n } as any;\n }\n\n this.loader = new window.JoliboxSDKLoader(loaderConfig);\n this.ads = new window.JoliboxAds();\n this.anaytics = new window.JoliboxAnalytics();\n this.runtime = new window.JoliboxRuntime();\n this.storage = new window.JoliboxCloudStorage();\n window.joliboxsdk = Object.assign(this, window.joliboxsdk);\n }\n if (!window.joliboxsdk._commandPipe) {\n window.joliboxsdk._commandPipe = [];\n }\n }\n}\n\nif (!window.JoliboxSDK) {\n window.JoliboxSDK = JoliboxSDK;\n}\n\nexport default JoliboxSDK;\nexport { JoliboxSDK };\n","const splitSemver = (\n version: string\n): {\n major: string;\n minor: string;\n patch: string;\n prerelease?: string;\n build?: string;\n} => {\n const prerelease = version.split(\"-\")[1] as string | undefined;\n if (prerelease) {\n version = version.replace(`-${prerelease}`, \"\");\n }\n\n const build = version.split(\"+\")[1] as string | undefined;\n if (build) {\n version = version.replace(`+${build}`, \"\");\n }\n\n const splitted = version.split(\".\").slice(0, 3);\n const [major, minor, patch] = [\n splitted[0] ?? \"0\",\n splitted[1] ?? \"0\",\n splitted[2] ?? \"0\",\n ];\n return { major, minor, patch, prerelease, build };\n};\n\nexport const major = (version: string): number =>\n parseInt(splitSemver(version).major, 10);\n\nexport const compare = (v1: string, v2: string): -1 | 0 | 1 => {\n const { major: major1, minor: minor1, patch: patch1 } = splitSemver(v1);\n const { major: major2, minor: minor2, patch: patch2 } = splitSemver(v2);\n\n if (major1 !== major2) {\n return major1 > major2 ? 1 : -1;\n }\n\n if (minor1 !== minor2) {\n return minor1 > minor2 ? 1 : -1;\n }\n\n if (patch1 !== patch2) {\n return patch1 > patch2 ? 1 : -1;\n }\n\n return 0;\n};\n","import { major, compare } from \"./utils\";\n\ndeclare global {\n interface Window {\n JOLIBOX_ENV: \"WEB\" | \"IOS\" | \"ANDROID\" | \"WINDOWS\" | \"MACOS\" | \"LINUX\";\n JoliboxSDKLoader: typeof JoliboxSDKLoader;\n }\n}\n\nconst joliboxLoaderKey = \"jolibox-sdk-loader-metadata\";\n\nexport interface IVersionMetadata {\n version: string;\n syncScriptUrl?: string; // By default, the sync script is bundled with the sdk\n asyncScriptUrl?: string;\n}\n\nexport interface IRemoteVersionMetadata {\n code: \"SUCCESS\" | string;\n message?: string;\n data?: IVersionMetadata;\n}\n\nexport interface IJoliboxSDKLoaderConfig {\n loaderMetadata?: IVersionMetadata;\n}\n\nexport class JoliboxSDKLoader {\n loaderMetadata: IVersionMetadata;\n\n constructor({ loaderMetadata }: IJoliboxSDKLoaderConfig = {}) {\n console.log(\"Loading Jolibox SDK...\");\n\n this.loaderMetadata = loaderMetadata ?? this.computeLoaderMetaData();\n this.loadScript();\n this.fetchUpdateLoaderMetadata();\n console.log(\"Jolibox SDK loaded.\");\n }\n\n private get currentVersion() {\n return window.__JOLIBOX_LOCAL_SDK_VERSION__;\n }\n\n private get defaultMetadata(): IVersionMetadata {\n const version = this.currentVersion;\n const majorVersion = major(version);\n return {\n version,\n syncScriptUrl: `https://cdn.jsdelivr.net/npm/@jolibox/web-sync-sdk@${majorVersion}/dist/index.iife.js`,\n asyncScriptUrl: `https://cdn.jsdelivr.net/npm/@jolibox/web-async-sdk@${majorVersion}/dist/index.iife.js`,\n };\n }\n\n computeLoaderMetaData = () => {\n const version = this.currentVersion;\n let loaderMetadata: IVersionMetadata | null = null;\n try {\n loaderMetadata = JSON.parse(\n localStorage.getItem(joliboxLoaderKey) ?? \"null\"\n ) as IVersionMetadata | null;\n if (!loaderMetadata || !loaderMetadata.version) {\n throw new Error(\"Invalid loader metadata\");\n }\n } catch (error) {\n loaderMetadata = this.defaultMetadata;\n }\n\n const versionFromLocalStorage = loaderMetadata?.version ?? version;\n\n if (major(versionFromLocalStorage) !== major(version)) {\n // if major version is different, must follow the version from package.json\n loaderMetadata = this.defaultMetadata;\n } else {\n // if major version is the same, follow the larger version\n if (compare(versionFromLocalStorage, version) < 0) {\n loaderMetadata = this.defaultMetadata;\n }\n }\n\n return loaderMetadata;\n };\n\n loadScript = () => {\n if (this.loaderMetadata.syncScriptUrl) {\n // The only way to load a script synchronously is to use XMLHttpRequest\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", this.loaderMetadata.syncScriptUrl, false);\n xhr.send();\n // eval(xhr.responseText);\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.innerHTML = xhr.responseText;\n document.head.appendChild(script);\n }\n\n if (this.loaderMetadata.asyncScriptUrl) {\n const asyncScript = document.createElement(\"script\");\n asyncScript.type = \"text/javascript\";\n asyncScript.src = this.loaderMetadata.asyncScriptUrl;\n asyncScript.async = true;\n document.head.appendChild(asyncScript);\n }\n };\n\n fetchUpdateLoaderMetadata = async (\n installedSDKVersion = this.currentVersion,\n localSDKVersion = this.loaderMetadata.version,\n env = window.JOLIBOX_ENV ?? \"WEB\"\n ) => {\n const path = `${\n window.joliboxenv?.apiBaseURL ?? \"https://api.jolibox.com\"\n }/frontend/js-sdk/loader-metadata`;\n try {\n const response = await fetch(path, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n installedSDKVersion,\n localSDKVersion,\n env,\n }),\n });\n const data: IRemoteVersionMetadata = await response.json();\n if (data.code !== \"SUCCESS\") {\n throw new Error(data.message);\n } else {\n this.loaderMetadata = data.data ?? this.defaultMetadata;\n localStorage.setItem(\n joliboxLoaderKey,\n JSON.stringify(this.loaderMetadata)\n );\n // reload happens next time the page is loaded\n }\n } catch (error) {\n console.warn(\"Failed to fetch loader metadata: \", error);\n }\n };\n}\n\nwindow.JoliboxSDKLoader = JoliboxSDKLoader;\n","declare global {\n interface Window {\n JoliboxAds: typeof JoliboxAds;\n }\n}\n\nexport interface IAdsInitParams {\n /**\n * (OPTIONAL) Game ID provided by Jolibox\n */\n gameId?: string;\n}\n\nexport interface IAdConfigParams {\n /**\n * (OPTIONAL) Whether ads should always be preloaded before the first call to adBreak()\n *\n * The default value of auto leaves the decision up to the Ad Placement API. preloadAdBreaks can be set only once with adConfig(), and further values passed to preloadAdBreaks have no effect.\n *\n * Setting preloadAdBreaks after the first call to adBreak() has no effect.\n */\n preloadAdBreaks?: \"on\" | \"auto\"; // default: 'auto'\n\n /**\n * (OPTIONAL) Whether the game is currently playing sound.\n *\n * This call specifies whether your game is capable of sound, and whether the sound was enabled (ie unmuted) before the call to adBreak(). This helps the Ad Placement API to select the right kind of ad for your game.\n *\n * Call this function as soon as the sound state of your game changes, as the Ad Placement API may have to request new creatives, and this gives it the maximum amount of time to do so.\n *\n * The default value is sound on. So most games will need to make a call to adConfig() when they start to declare that they have sound enabled.\n */\n sound?: \"on\" | \"off\"; // default: 'on'\n\n /**\n * (OPTIONAL) Called when the API has initialized and has finished preloading ads (if you requested preloading using the preloadAdBreaks above).\n * @returns\n */\n onReady?: () => void;\n}\n\n/**\n * PlacementInfo object passed by **adBreakDone** function\n */\nexport interface IPlacementInfo {\n /**\n * the type argument passed to adBreak()\n */\n breakType: string;\n /**\n * the name argument passed to adBreak()\n */\n breakName: string;\n breakFormat: \"interstitial\" | \"reward\";\n /**\n * the status of this placement and can be one of the following values:\n *\n * | breakStatus | Reason |\n * | -------- | ------- |\n * | 'notReady'\t| The Ad Placement API had not initialised |\n * | 'timeout' | A placement timed out because the Ad Placement API took too long to respond |\n * | 'invalid' | The placement was invalid and was ignored–for instance there should only be one preroll placement per page load, subsequent prerolls are failed with this status |\n * | 'error' | There was a JavaScript error in a callback |\n * | 'noAdPreloaded' |\tAn ad had not been preloaded yet so this placement was skipped |\n * | 'frequencyCapped' |\tAn ad wasn't shown because the frequency cap was applied to this placement |\n * | 'ignored' |\tThe user didn't click on a reward prompt before they reached the next placement, that is showAdFn() wasn't called before the next adBreak(). |\n * | 'other' |\tThe ad was not shown for another reason. (e.g., The ad was still being fetched, or a previously cached ad was disposed because the screen was resized/rotated.) |\n * | 'dismissed' |\tThe user dismissed a rewarded ad before viewing it to completion |\n * | 'viewed' |\tThe ad was viewed by the user |\n */\n breakStatus:\n | \"notReady\"\n | \"timeout\"\n | \"error\"\n | \"noAdPreloaded\"\n | \"frequencyCapped\"\n | \"ignored\"\n | \"other\"\n | \"dismissed\"\n | \"viewed\";\n}\n\n/**\n * Parameter when calling adBreak\n */\nexport type IAdBreakParams =\n | IPrerollParams\n | IInterstitialsParams\n | IRewardParams;\n\n/**\n * Parameter when calling preroll type adBreak\n */\nexport interface IPrerollParams {\n /**\n * 'preroll' before the game loads (before UI has rendered)\n */\n type: \"preroll\";\n\n /**\n * (OPTIONAL) Always called as the last step in an adBreak(), even if there was no ad shown. Function takes as argument a placementInfo object\n * @param placementInfo\n * @returns\n */\n adBreakDone?: (placementInfo: IPlacementInfo) => void;\n}\n\nexport interface IInterstitialsParams {\n /**\n * 'start' before the gameplay starts (after UI has rendered)\n * 'pause' the player pauses the game\n * 'next' player navigates to the next level\n * 'browse' the player explores options outside of the gameplay\n */\n type: \"start\" | \"pause\" | \"next\" | \"browse\";\n\n /**\n * (OPTIONAL) a name for this particular ad placement within your game. It is an internal identifier, and is not shown to the player. In future releases this identifier may be used to enable additional reporting and optimization features.\n *\n * We recommend you name all of your placements.\n */\n name?: string;\n\n /**\n * (OPTIONAL) Called before the ad is displayed. The game should pause and mute the sound. These actions must be done synchronously. The ad will be displayed immediately after this callback finishes.\n *\n * @returns\n */\n beforeAd?: () => void;\n\n /**\n * (OPTIONAL) Called after the ad is finished (for any reason). For rewarded ads, it is called after either adDismissed or adViewed, depending on player actions. This function should be used to resume game flow. For example, use to unmute the sound and start the next level.\n * @returns\n */\n afterAd?: () => void;\n\n /**\n * (OPTIONAL) Always called as the last step in an adBreak(), even if there was no ad shown. Function takes as argument a placementInfo object\n *\n * @param placementInfo\n * @returns\n */\n adBreakDone?: (placementInfo: IPlacementInfo) => void;\n}\n\nexport interface IRewardParams {\n /**\n * 'reward' a rewarded ad\n */\n type: \"reward\";\n\n /**\n * (OPTIONAL) a name for this particular ad placement within your game. It is an internal identifier, and is not shown to the player. In future releases this identifier may be used to enable additional reporting and optimization features.\n *\n * We recommend you name all of your placements.\n */\n name?: string;\n\n /**\n * (OPTIONAL) Called before the ad is displayed. The game should pause and mute the sound. These actions must be done synchronously. The ad will be displayed immediately after this callback finishes.\n * @returns\n */\n beforeAd?: () => void;\n\n /**\n * (OPTIONAL) Called after the ad is finished (for any reason). For rewarded ads, it is called after either adDismissed or adViewed, depending on player actions. This function should be used to resume game flow. For example, use to unmute the sound and start the next level.\n * @returns\n */\n afterAd?: () => void;\n\n /**\n * (OPTIONAL) Always called as the last step in an adBreak(), even if there was no ad shown. Function takes as argument a placementInfo object defined\n * @param placementInfo\n * @returns\n */\n adBreakDone?: (placementInfo: IPlacementInfo) => void;\n\n /**\n * Called if a rewarded ad is available. The function should take a single argument–showAdFn() which must be called to display the rewarded ad.\n * @param showAdFn\n * @returns\n */\n beforeReward: (showAdFn: () => void) => void;\n\n /**\n * Called only for rewarded ads when the player dismisses the ad. It is only called if the player dismisses the ad before it completes. In this case the reward should not be granted.\n * @returns\n */\n adDismissed: () => void;\n\n /**\n * Called only for rewarded ads when the player completes the ad and should be granted the reward.\n * @returns\n */\n adViewed: () => void;\n}\n\n/**\n * Ad unit format, can be 'rectangle', 'vertical', 'horizontal'\n */\nexport type AdUnitFormat = \"rectangle\" | \"vertical\" | \"horizontal\";\n\nexport interface IAdUnitParams {\n /**\n * The element to attach the ad unit to, either an HTMLElement or a string selector. Should be the parent element of the ad unit (<ins> tag).\n */\n el: HTMLElement | string;\n\n /**\n * (OPTIONAL) Reserved for future usage. The slot ID of the ad unit. Currently the slot ID is automatically set by the SDK.\n */\n slot?: string;\n\n // /**\n // * (OPTIONAL) The position of the ad unit. Can be 'TOP', 'BOTTOM', 'LEFT', 'RIGHT', 'CENTER'. Default is 'TOP'. Either position or slot should be set.\n // */\n // position?: AdUnitPosition;\n\n // /**\n // * (OPTIONAL) Channel ID for the ad unit. We will set the Channel ID automatically if not provided. Default is empty.\n // */\n // channelId?: string;\n\n /**\n * (OPTIONAL) Ad format for the ad unit. Can be 'auto' or a single format or an array of formats. Default is 'auto'. If passed as an array, the array will be joined by ', ' and pass to the data-ad-format attribute.\n */\n adFormat?: \"auto\" | AdUnitFormat | AdUnitFormat[];\n\n /**\n * (OPTIONAL) Whether the ad unit should be full width and responsive. Default is false.\n */\n fullWidthResponsive?: \"true\" | \"false\";\n\n /**\n * (OPTIONAL) Custom style for the ad unit. Default is empty.\n */\n style?: string;\n}\n\n/**\n * Jolibox Ads SDK\n */\nexport class JoliboxAds {\n /**\n * Internal constructor, should not be called directly\n */\n constructor() {}\n\n /**\n * Init JoliboxAds. Must be called before any other ads functions.\n * @param config\n * @returns\n */\n public init = (config?: IAdsInitParams) => {\n window.joliboxsdk._commandPipe.push({\n cmd: \"ads.init\",\n params: config,\n });\n };\n\n /**\n * The adConfig() call communicates the game's current configuration to the Ad Placement API. The Ad Placement API can use this to tune the way it preloads ads and to filter the kinds of ads it requests so they're suitable (eg. video ads that require sound).\n * @param params\n */\n public adConfig = (params: IAdConfigParams) => {\n window.joliboxsdk._commandPipe.push({\n cmd: \"ads.adConfig\",\n params,\n });\n };\n\n /**\n * adBreak() is the key function for placing ads within your game. It defines an ad placement and takes an object called a placement config that specifies everything required to show an ad.\n *\n * The adBreak() function defines a placement where an ad could be shown. Whether an ad actually shows depends on factors such as the following:\n *\n * - The type of ad placement that you declared\n * - Is this ad at the start of the game? Between levels? At a moment when the player has paused the game?\n * - Whether a suitable ad exists for the current player\n * - Is this ad relevant to them?\n * - Is it consistent with their data privacy and consent settings?\n * - The number of ads the player has seen recently\n * - The control settings—for example, ad frequency, you've configured for this game\n * - Either as hints in the tag, or,\n * - Within AdSense—note that the controls available in AdSense will evolve over time.\n *\n * The kind of ad that shows also depends on similar factors.\n *\n * Note that a call to adBreak() might not show an ad at all. It simply declares a place where an ad could be shown.\n *\n * This is unlike traditional APIs in which your code always knows if an ad is available, and you decide within the game whether to show it. This approach of letting the Ad Placement API decide if an ad shows in a particular placement is a pattern that is sometimes referred to as \"inversion of control\".\n *\n * The reason we're transitioning our games API to this model is firstly, it shortens the code you have to write within your game. Secondly, it makes it easier to deliver policy compliant placements with a great user experience, which in turn has allowed us to deliver some of our highest performing formats to games publishers. Lastly, it more cleanly separates the process of placing ads in your game from the monetization decisions about the type and number of ads to show.\n *\n * We want you to be able to change your monetization settings and control the user experience without having to edit and release a new version of your game, initially by specifying hints in the tag. But in future releases, we will be able to provide controls directly in the AdSense and AdMob frontends.\n * @param params\n */\n public adBreak = (params: IAdBreakParams) => {\n window.joliboxsdk._commandPipe.push({\n cmd: \"ads.adBreak\",\n params,\n });\n };\n\n /**\n * adUnit() is a function that creates an ad unit and attaches it to a parent element. The ad unit is a single ad placement that can be used to show ads.\n *\n * Currently we only provide support for creating ad units as `<ins>` tags with the class 'adsbygoogle'. This is the standard way to create ad units with Google AdSense.\n *\n * After calling this method, the ad unit is attached to the parent element you specify as el in the params object.\n *\n * By default, the client ID and channel ID are automatically set by the SDK. And the slot name is set to the position of the ad unit. You can override these values by passing the slot and channelId in the params object.\n *\n * @param params\n * @returns\n */\n public adUnit = async (params: IAdUnitParams) => {\n window.joliboxsdk._commandPipe.push({\n cmd: \"ads.adUnit\",\n params,\n });\n };\n}\n\nwindow.JoliboxAds = JoliboxAds;\n\nexport default JoliboxAds;\n","declare global {\n interface Window {\n JoliboxAnalytics: typeof JoliboxAnalytics;\n }\n}\n\n/**\n * Jolibox Analytics SDK\n */\nexport class JoliboxAnalytics {\n constructor() {}\n\n /**\n * Track an event, will be sent to the analytics server\n * Currently not open to the public\n *\n * @param eventName event name, must be a string\n * @param extra (OPTIONAL) extra data, must be an object or null or undefined, must not have nested objects\n */\n private trackEvent = (\n eventName: string,\n extra?: Record<string, string | boolean | number | null> | null\n ) => {\n // assert eventName is a string\n if (typeof eventName !== \"string\") {\n throw new Error(\"eventName must be a string\");\n }\n\n // assert extra is an object or null or undefined\n if (extra !== null && typeof extra !== \"object\" && extra !== undefined) {\n throw new Error(\"extra must be an object or null or undefined\");\n }\n\n // assert extra has no nested objects\n if (extra) {\n for (const key in extra) {\n if (typeof extra[key] === \"object\") {\n throw new Error(\"extra must not have nested objects\");\n }\n }\n }\n\n window.joliboxsdk._commandPipe.push({\n cmd: \"analytics.trackEvent\",\n params: [eventName, extra],\n });\n };\n}\n\nwindow.JoliboxAnalytics = JoliboxAnalytics;\n\nexport default JoliboxAnalytics;\n"],"mappings":"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","names":["src_exports","__export","JoliboxSDK","src_default","__toCommonJS","splitSemver","version","_a","_b","_c","prerelease","build","splitted","major","minor","patch","compare","v1","v2","major1","minor1","patch1","major2","minor2","patch2","joliboxLoaderKey","JoliboxSDKLoader","loaderMetadata","_a","_b","version","error","versionFromLocalStorage","major","compare","xhr","script","asyncScript","_0","__async","installedSDKVersion","localSDKVersion","env","_c","path","data","majorVersion","JoliboxAds","config","params","__async","JoliboxAnalytics","eventName","extra","key","import_web_sync_sdk","JoliboxSDK","useRuntimeSDK","loaderConfig","testMode","apiBaseURL","inputTestMode","inputApiBaseURL","_a","urlSearchParams","testModeParam","apiBaseURLParam","api","_b","_c","_d","_e","src_default"]}
|
package/dist/index.iife.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";(()=>{var pr=Object.create;var Ze=Object.defineProperty;var gr=Object.getOwnPropertyDescriptor;var yr=Object.getOwnPropertyNames;var br=Object.getPrototypeOf,wr=Object.prototype.hasOwnProperty;var ne=(u=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(u,{get:(s,l)=>(typeof require<"u"?require:s)[l]}):u)(function(u){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+u+'" is not supported')});var _r=(u,s)=>()=>(s||u((s={exports:{}}).exports,s),s.exports);var Sr=(u,s,l,w)=>{if(s&&typeof s=="object"||typeof s=="function")for(let m of yr(s))!wr.call(u,m)&&m!==l&&Ze(u,m,{get:()=>s[m],enumerable:!(w=gr(s,m))||w.enumerable});return u};var Ir=(u,s,l)=>(l=u!=null?pr(br(u)):{},Sr(s||!u||!u.__esModule?Ze(l,"default",{value:u,enumerable:!0}):l,u));var ue=(u,s,l)=>new Promise((w,m)=>{var x=g=>{try{_(l.next(g))}catch(S){m(S)}},b=g=>{try{_(l.throw(g))}catch(S){m(S)}},_=g=>g.done?w(g.value):Promise.resolve(g.value).then(x,b);_((l=l.apply(u,s)).next())});var nt=_r((rt,Ae)=>{"use strict";(function(u){if(typeof rt=="object"&&typeof Ae<"u")Ae.exports=u();else if(typeof define=="function"&&define.amd)define([],u);else{var s;typeof window<"u"?s=window:typeof global<"u"?s=global:typeof self<"u"?s=self:s=this,s.localforage=u()}})(function(){var u,s,l;return function w(m,x,b){function _(A,N){if(!x[A]){if(!m[A]){var v=typeof ne=="function"&≠if(!N&&v)return v(A,!0);if(g)return g(A,!0);var I=new Error("Cannot find module '"+A+"'");throw I.code="MODULE_NOT_FOUND",I}var C=x[A]={exports:{}};m[A][0].call(C.exports,function(U){var V=m[A][1][U];return _(V||U)},C,C.exports,w,m,x,b)}return x[A].exports}for(var g=typeof ne=="function"&&ne,S=0;S<b.length;S++)_(b[S]);return _}({1:[function(w,m,x){(function(b){"use strict";var _=b.MutationObserver||b.WebKitMutationObserver,g;if(_){var S=0,A=new _(U),N=b.document.createTextNode("");A.observe(N,{characterData:!0}),g=function(){N.data=S=++S%2}}else if(!b.setImmediate&&typeof b.MessageChannel<"u"){var v=new b.MessageChannel;v.port1.onmessage=U,g=function(){v.port2.postMessage(0)}}else"document"in b&&"onreadystatechange"in b.document.createElement("script")?g=function(){var J=b.document.createElement("script");J.onreadystatechange=function(){U(),J.onreadystatechange=null,J.parentNode.removeChild(J),J=null},b.document.documentElement.appendChild(J)}:g=function(){setTimeout(U,0)};var I,C=[];function U(){I=!0;for(var J,W,M=C.length;M;){for(W=C,C=[],J=-1;++J<M;)W[J]();M=C.length}I=!1}m.exports=V;function V(J){C.push(J)===1&&!I&&g()}}).call(this,typeof global<"u"?global:typeof self<"u"?self:typeof window<"u"?window:{})},{}],2:[function(w,m,x){"use strict";var b=w(1);function _(){}var g={},S=["REJECTED"],A=["FULFILLED"],N=["PENDING"];m.exports=v;function v(p){if(typeof p!="function")throw new TypeError("resolver must be a function");this.state=N,this.queue=[],this.outcome=void 0,p!==_&&V(this,p)}v.prototype.catch=function(p){return this.then(null,p)},v.prototype.then=function(p,D){if(typeof p!="function"&&this.state===A||typeof D!="function"&&this.state===S)return this;var R=new this.constructor(_);if(this.state!==N){var T=this.state===A?p:D;C(R,T,this.outcome)}else this.queue.push(new I(R,p,D));return R};function I(p,D,R){this.promise=p,typeof D=="function"&&(this.onFulfilled=D,this.callFulfilled=this.otherCallFulfilled),typeof R=="function"&&(this.onRejected=R,this.callRejected=this.otherCallRejected)}I.prototype.callFulfilled=function(p){g.resolve(this.promise,p)},I.prototype.otherCallFulfilled=function(p){C(this.promise,this.onFulfilled,p)},I.prototype.callRejected=function(p){g.reject(this.promise,p)},I.prototype.otherCallRejected=function(p){C(this.promise,this.onRejected,p)};function C(p,D,R){b(function(){var T;try{T=D(R)}catch(j){return g.reject(p,j)}T===p?g.reject(p,new TypeError("Cannot resolve promise with itself")):g.resolve(p,T)})}g.resolve=function(p,D){var R=J(U,D);if(R.status==="error")return g.reject(p,R.value);var T=R.value;if(T)V(p,T);else{p.state=A,p.outcome=D;for(var j=-1,F=p.queue.length;++j<F;)p.queue[j].callFulfilled(D)}return p},g.reject=function(p,D){p.state=S,p.outcome=D;for(var R=-1,T=p.queue.length;++R<T;)p.queue[R].callRejected(D);return p};function U(p){var D=p&&p.then;if(p&&(typeof p=="object"||typeof p=="function")&&typeof D=="function")return function(){D.apply(p,arguments)}}function V(p,D){var R=!1;function T(k){R||(R=!0,g.reject(p,k))}function j(k){R||(R=!0,g.resolve(p,k))}function F(){D(j,T)}var $=J(F);$.status==="error"&&T($.value)}function J(p,D){var R={};try{R.value=p(D),R.status="success"}catch(T){R.status="error",R.value=T}return R}v.resolve=W;function W(p){return p instanceof this?p:g.resolve(new this(_),p)}v.reject=M;function M(p){var D=new this(_);return g.reject(D,p)}v.all=de;function de(p){var D=this;if(Object.prototype.toString.call(p)!=="[object Array]")return this.reject(new TypeError("must be an array"));var R=p.length,T=!1;if(!R)return this.resolve([]);for(var j=new Array(R),F=0,$=-1,k=new this(_);++$<R;)Y(p[$],$);return k;function Y(ee,ae){D.resolve(ee).then(he,function(q){T||(T=!0,g.reject(k,q))});function he(q){j[ae]=q,++F===R&&!T&&(T=!0,g.resolve(k,j))}}}v.race=H;function H(p){var D=this;if(Object.prototype.toString.call(p)!=="[object Array]")return this.reject(new TypeError("must be an array"));var R=p.length,T=!1;if(!R)return this.resolve([]);for(var j=-1,F=new this(_);++j<R;)$(p[j]);return F;function $(k){D.resolve(k).then(function(Y){T||(T=!0,g.resolve(F,Y))},function(Y){T||(T=!0,g.reject(F,Y))})}}},{1:1}],3:[function(w,m,x){(function(b){"use strict";typeof b.Promise!="function"&&(b.Promise=w(2))}).call(this,typeof global<"u"?global:typeof self<"u"?self:typeof window<"u"?window:{})},{2:2}],4:[function(w,m,x){"use strict";var b=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function _(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}function g(){try{if(typeof indexedDB<"u")return indexedDB;if(typeof webkitIndexedDB<"u")return webkitIndexedDB;if(typeof mozIndexedDB<"u")return mozIndexedDB;if(typeof OIndexedDB<"u")return OIndexedDB;if(typeof msIndexedDB<"u")return msIndexedDB}catch(e){return}}var S=g();function A(){try{if(!S||!S.open)return!1;var e=typeof openDatabase<"u"&&/(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/BlackBerry/.test(navigator.platform),r=typeof fetch=="function"&&fetch.toString().indexOf("[native code")!==-1;return(!e||r)&&typeof indexedDB<"u"&&typeof IDBKeyRange<"u"}catch(t){return!1}}function N(e,r){e=e||[],r=r||{};try{return new Blob(e,r)}catch(n){if(n.name!=="TypeError")throw n;for(var t=typeof BlobBuilder<"u"?BlobBuilder:typeof MSBlobBuilder<"u"?MSBlobBuilder:typeof MozBlobBuilder<"u"?MozBlobBuilder:WebKitBlobBuilder,o=new t,a=0;a<e.length;a+=1)o.append(e[a]);return o.getBlob(r.type)}}typeof Promise>"u"&&w(3);var v=Promise;function I(e,r){r&&e.then(function(t){r(null,t)},function(t){r(t)})}function C(e,r,t){typeof r=="function"&&e.then(r),typeof t=="function"&&e.catch(t)}function U(e){return typeof e!="string"&&(console.warn(e+" used as a key, but it is not a string."),e=String(e)),e}function V(){if(arguments.length&&typeof arguments[arguments.length-1]=="function")return arguments[arguments.length-1]}var J="local-forage-detect-blob-support",W=void 0,M={},de=Object.prototype.toString,H="readonly",p="readwrite";function D(e){for(var r=e.length,t=new ArrayBuffer(r),o=new Uint8Array(t),a=0;a<r;a++)o[a]=e.charCodeAt(a);return t}function R(e){return new v(function(r){var t=e.transaction(J,p),o=N([""]);t.objectStore(J).put(o,"key"),t.onabort=function(a){a.preventDefault(),a.stopPropagation(),r(!1)},t.oncomplete=function(){var a=navigator.userAgent.match(/Chrome\/(\d+)/),n=navigator.userAgent.match(/Edge\//);r(n||!a||parseInt(a[1],10)>=43)}}).catch(function(){return!1})}function T(e){return typeof W=="boolean"?v.resolve(W):R(e).then(function(r){return W=r,W})}function j(e){var r=M[e.name],t={};t.promise=new v(function(o,a){t.resolve=o,t.reject=a}),r.deferredOperations.push(t),r.dbReady?r.dbReady=r.dbReady.then(function(){return t.promise}):r.dbReady=t.promise}function F(e){var r=M[e.name],t=r.deferredOperations.pop();if(t)return t.resolve(),t.promise}function $(e,r){var t=M[e.name],o=t.deferredOperations.pop();if(o)return o.reject(r),o.promise}function k(e,r){return new v(function(t,o){if(M[e.name]=M[e.name]||Pe(),e.db)if(r)j(e),e.db.close();else return t(e.db);var a=[e.name];r&&a.push(e.version);var n=S.open.apply(S,a);r&&(n.onupgradeneeded=function(i){var c=n.result;try{c.createObjectStore(e.storeName),i.oldVersion<=1&&c.createObjectStore(J)}catch(f){if(f.name==="ConstraintError")console.warn('The database "'+e.name+'" has been upgraded from version '+i.oldVersion+" to version "+i.newVersion+', but the storage "'+e.storeName+'" already exists.');else throw f}}),n.onerror=function(i){i.preventDefault(),o(n.error)},n.onsuccess=function(){var i=n.result;i.onversionchange=function(c){c.target.close()},t(i),F(e)}})}function Y(e){return k(e,!1)}function ee(e){return k(e,!0)}function ae(e,r){if(!e.db)return!0;var t=!e.db.objectStoreNames.contains(e.storeName),o=e.version<e.db.version,a=e.version>e.db.version;if(o&&(e.version!==r&&console.warn('The database "'+e.name+`" can't be downgraded from version `+e.db.version+" to version "+e.version+"."),e.version=e.db.version),a||t){if(t){var n=e.db.version+1;n>e.version&&(e.version=n)}return!0}return!1}function he(e){return new v(function(r,t){var o=new FileReader;o.onerror=t,o.onloadend=function(a){var n=btoa(a.target.result||"");r({__local_forage_encoded_blob:!0,data:n,type:e.type})},o.readAsBinaryString(e)})}function q(e){var r=D(atob(e.data));return N([r],{type:e.type})}function Ne(e){return e&&e.__local_forage_encoded_blob}function gt(e){var r=this,t=r._initReady().then(function(){var o=M[r._dbInfo.name];if(o&&o.dbReady)return o.dbReady});return C(t,e,e),t}function yt(e){j(e);for(var r=M[e.name],t=r.forages,o=0;o<t.length;o++){var a=t[o];a._dbInfo.db&&(a._dbInfo.db.close(),a._dbInfo.db=null)}return e.db=null,Y(e).then(function(n){return e.db=n,ae(e)?ee(e):n}).then(function(n){e.db=r.db=n;for(var i=0;i<t.length;i++)t[i]._dbInfo.db=n}).catch(function(n){throw $(e,n),n})}function X(e,r,t,o){o===void 0&&(o=1);try{var a=e.db.transaction(e.storeName,r);t(null,a)}catch(n){if(o>0&&(!e.db||n.name==="InvalidStateError"||n.name==="NotFoundError"))return v.resolve().then(function(){if(!e.db||n.name==="NotFoundError"&&!e.db.objectStoreNames.contains(e.storeName)&&e.version<=e.db.version)return e.db&&(e.version=e.db.version+1),ee(e)}).then(function(){return yt(e).then(function(){X(e,r,t,o-1)})}).catch(t);t(n)}}function Pe(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function bt(e){var r=this,t={db:null};if(e)for(var o in e)t[o]=e[o];var a=M[t.name];a||(a=Pe(),M[t.name]=a),a.forages.push(r),r._initReady||(r._initReady=r.ready,r.ready=gt);var n=[];function i(){return v.resolve()}for(var c=0;c<a.forages.length;c++){var f=a.forages[c];f!==r&&n.push(f._initReady().catch(i))}var d=a.forages.slice(0);return v.all(n).then(function(){return t.db=a.db,Y(t)}).then(function(h){return t.db=h,ae(t,r._defaultConfig.version)?ee(t):h}).then(function(h){t.db=a.db=h,r._dbInfo=t;for(var y=0;y<d.length;y++){var E=d[y];E!==r&&(E._dbInfo.db=t.db,E._dbInfo.version=t.version)}})}function wt(e,r){var t=this;e=U(e);var o=new v(function(a,n){t.ready().then(function(){X(t._dbInfo,H,function(i,c){if(i)return n(i);try{var f=c.objectStore(t._dbInfo.storeName),d=f.get(e);d.onsuccess=function(){var h=d.result;h===void 0&&(h=null),Ne(h)&&(h=q(h)),a(h)},d.onerror=function(){n(d.error)}}catch(h){n(h)}})}).catch(n)});return I(o,r),o}function _t(e,r){var t=this,o=new v(function(a,n){t.ready().then(function(){X(t._dbInfo,H,function(i,c){if(i)return n(i);try{var f=c.objectStore(t._dbInfo.storeName),d=f.openCursor(),h=1;d.onsuccess=function(){var y=d.result;if(y){var E=y.value;Ne(E)&&(E=q(E));var O=e(E,y.key,h++);O!==void 0?a(O):y.continue()}else a()},d.onerror=function(){n(d.error)}}catch(y){n(y)}})}).catch(n)});return I(o,r),o}function St(e,r,t){var o=this;e=U(e);var a=new v(function(n,i){var c;o.ready().then(function(){return c=o._dbInfo,de.call(r)==="[object Blob]"?T(c.db).then(function(f){return f?r:he(r)}):r}).then(function(f){X(o._dbInfo,p,function(d,h){if(d)return i(d);try{var y=h.objectStore(o._dbInfo.storeName);f===null&&(f=void 0);var E=y.put(f,e);h.oncomplete=function(){f===void 0&&(f=null),n(f)},h.onabort=h.onerror=function(){var O=E.error?E.error:E.transaction.error;i(O)}}catch(O){i(O)}})}).catch(i)});return I(a,t),a}function It(e,r){var t=this;e=U(e);var o=new v(function(a,n){t.ready().then(function(){X(t._dbInfo,p,function(i,c){if(i)return n(i);try{var f=c.objectStore(t._dbInfo.storeName),d=f.delete(e);c.oncomplete=function(){a()},c.onerror=function(){n(d.error)},c.onabort=function(){var h=d.error?d.error:d.transaction.error;n(h)}}catch(h){n(h)}})}).catch(n)});return I(o,r),o}function xt(e){var r=this,t=new v(function(o,a){r.ready().then(function(){X(r._dbInfo,p,function(n,i){if(n)return a(n);try{var c=i.objectStore(r._dbInfo.storeName),f=c.clear();i.oncomplete=function(){o()},i.onabort=i.onerror=function(){var d=f.error?f.error:f.transaction.error;a(d)}}catch(d){a(d)}})}).catch(a)});return I(t,e),t}function Et(e){var r=this,t=new v(function(o,a){r.ready().then(function(){X(r._dbInfo,H,function(n,i){if(n)return a(n);try{var c=i.objectStore(r._dbInfo.storeName),f=c.count();f.onsuccess=function(){o(f.result)},f.onerror=function(){a(f.error)}}catch(d){a(d)}})}).catch(a)});return I(t,e),t}function Rt(e,r){var t=this,o=new v(function(a,n){if(e<0){a(null);return}t.ready().then(function(){X(t._dbInfo,H,function(i,c){if(i)return n(i);try{var f=c.objectStore(t._dbInfo.storeName),d=!1,h=f.openKeyCursor();h.onsuccess=function(){var y=h.result;if(!y){a(null);return}e===0||d?a(y.key):(d=!0,y.advance(e))},h.onerror=function(){n(h.error)}}catch(y){n(y)}})}).catch(n)});return I(o,r),o}function At(e){var r=this,t=new v(function(o,a){r.ready().then(function(){X(r._dbInfo,H,function(n,i){if(n)return a(n);try{var c=i.objectStore(r._dbInfo.storeName),f=c.openKeyCursor(),d=[];f.onsuccess=function(){var h=f.result;if(!h){o(d);return}d.push(h.key),h.continue()},f.onerror=function(){a(f.error)}}catch(h){a(h)}})}).catch(a)});return I(t,e),t}function Dt(e,r){r=V.apply(this,arguments);var t=this.config();e=typeof e!="function"&&e||{},e.name||(e.name=e.name||t.name,e.storeName=e.storeName||t.storeName);var o=this,a;if(!e.name)a=v.reject("Invalid arguments");else{var n=e.name===t.name&&o._dbInfo.db,i=n?v.resolve(o._dbInfo.db):Y(e).then(function(c){var f=M[e.name],d=f.forages;f.db=c;for(var h=0;h<d.length;h++)d[h]._dbInfo.db=c;return c});e.storeName?a=i.then(function(c){if(c.objectStoreNames.contains(e.storeName)){var f=c.version+1;j(e);var d=M[e.name],h=d.forages;c.close();for(var y=0;y<h.length;y++){var E=h[y];E._dbInfo.db=null,E._dbInfo.version=f}var O=new v(function(L,B){var P=S.open(e.name,f);P.onerror=function(K){var re=P.result;re.close(),B(K)},P.onupgradeneeded=function(){var K=P.result;K.deleteObjectStore(e.storeName)},P.onsuccess=function(){var K=P.result;K.close(),L(K)}});return O.then(function(L){d.db=L;for(var B=0;B<h.length;B++){var P=h[B];P._dbInfo.db=L,F(P._dbInfo)}}).catch(function(L){throw($(e,L)||v.resolve()).catch(function(){}),L})}}):a=i.then(function(c){j(e);var f=M[e.name],d=f.forages;c.close();for(var h=0;h<d.length;h++){var y=d[h];y._dbInfo.db=null}var E=new v(function(O,L){var B=S.deleteDatabase(e.name);B.onerror=function(){var P=B.result;P&&P.close(),L(B.error)},B.onblocked=function(){console.warn('dropInstance blocked for database "'+e.name+'" until all open connections are closed')},B.onsuccess=function(){var P=B.result;P&&P.close(),O(P)}});return E.then(function(O){f.db=O;for(var L=0;L<d.length;L++){var B=d[L];F(B._dbInfo)}}).catch(function(O){throw($(e,O)||v.resolve()).catch(function(){}),O})})}return I(a,r),a}var Ot={_driver:"asyncStorage",_initStorage:bt,_support:A(),iterate:_t,getItem:wt,setItem:St,removeItem:It,clear:xt,length:Et,key:Rt,keys:At,dropInstance:Dt};function Lt(){return typeof openDatabase=="function"}var z="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Tt="~~local_forage_type~",Ce=/^~~local_forage_type~([^~]+)~/,ie="__lfsc__:",ve=ie.length,me="arbf",pe="blob",Be="si08",Ue="ui08",Je="uic8",Me="si16",je="si32",Fe="ur16",$e="ui32",ke="fl32",Ke="fl64",Ve=ve+me.length,We=Object.prototype.toString;function Ye(e){var r=e.length*.75,t=e.length,o,a=0,n,i,c,f;e[e.length-1]==="="&&(r--,e[e.length-2]==="="&&r--);var d=new ArrayBuffer(r),h=new Uint8Array(d);for(o=0;o<t;o+=4)n=z.indexOf(e[o]),i=z.indexOf(e[o+1]),c=z.indexOf(e[o+2]),f=z.indexOf(e[o+3]),h[a++]=n<<2|i>>4,h[a++]=(i&15)<<4|c>>2,h[a++]=(c&3)<<6|f&63;return d}function ge(e){var r=new Uint8Array(e),t="",o;for(o=0;o<r.length;o+=3)t+=z[r[o]>>2],t+=z[(r[o]&3)<<4|r[o+1]>>4],t+=z[(r[o+1]&15)<<2|r[o+2]>>6],t+=z[r[o+2]&63];return r.length%3===2?t=t.substring(0,t.length-1)+"=":r.length%3===1&&(t=t.substring(0,t.length-2)+"=="),t}function Nt(e,r){var t="";if(e&&(t=We.call(e)),e&&(t==="[object ArrayBuffer]"||e.buffer&&We.call(e.buffer)==="[object ArrayBuffer]")){var o,a=ie;e instanceof ArrayBuffer?(o=e,a+=me):(o=e.buffer,t==="[object Int8Array]"?a+=Be:t==="[object Uint8Array]"?a+=Ue:t==="[object Uint8ClampedArray]"?a+=Je:t==="[object Int16Array]"?a+=Me:t==="[object Uint16Array]"?a+=Fe:t==="[object Int32Array]"?a+=je:t==="[object Uint32Array]"?a+=$e:t==="[object Float32Array]"?a+=ke:t==="[object Float64Array]"?a+=Ke:r(new Error("Failed to get type for BinaryArray"))),r(a+ge(o))}else if(t==="[object Blob]"){var n=new FileReader;n.onload=function(){var i=Tt+e.type+"~"+ge(this.result);r(ie+pe+i)},n.readAsArrayBuffer(e)}else try{r(JSON.stringify(e))}catch(i){console.error("Couldn't convert value into a JSON string: ",e),r(null,i)}}function Pt(e){if(e.substring(0,ve)!==ie)return JSON.parse(e);var r=e.substring(Ve),t=e.substring(ve,Ve),o;if(t===pe&&Ce.test(r)){var a=r.match(Ce);o=a[1],r=r.substring(a[0].length)}var n=Ye(r);switch(t){case me:return n;case pe:return N([n],{type:o});case Be:return new Int8Array(n);case Ue:return new Uint8Array(n);case Je:return new Uint8ClampedArray(n);case Me:return new Int16Array(n);case Fe:return new Uint16Array(n);case je:return new Int32Array(n);case $e:return new Uint32Array(n);case ke:return new Float32Array(n);case Ke:return new Float64Array(n);default:throw new Error("Unkown type: "+t)}}var ye={serialize:Nt,deserialize:Pt,stringToBuffer:Ye,bufferToString:ge};function Xe(e,r,t,o){e.executeSql("CREATE TABLE IF NOT EXISTS "+r.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],t,o)}function Ct(e){var r=this,t={db:null};if(e)for(var o in e)t[o]=typeof e[o]!="string"?e[o].toString():e[o];var a=new v(function(n,i){try{t.db=openDatabase(t.name,String(t.version),t.description,t.size)}catch(c){return i(c)}t.db.transaction(function(c){Xe(c,t,function(){r._dbInfo=t,n()},function(f,d){i(d)})},i)});return t.serializer=ye,a}function G(e,r,t,o,a,n){e.executeSql(t,o,a,function(i,c){c.code===c.SYNTAX_ERR?i.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[r.storeName],function(f,d){d.rows.length?n(f,c):Xe(f,r,function(){f.executeSql(t,o,a,n)},n)},n):n(i,c)},n)}function Bt(e,r){var t=this;e=U(e);var o=new v(function(a,n){t.ready().then(function(){var i=t._dbInfo;i.db.transaction(function(c){G(c,i,"SELECT * FROM "+i.storeName+" WHERE key = ? LIMIT 1",[e],function(f,d){var h=d.rows.length?d.rows.item(0).value:null;h&&(h=i.serializer.deserialize(h)),a(h)},function(f,d){n(d)})})}).catch(n)});return I(o,r),o}function Ut(e,r){var t=this,o=new v(function(a,n){t.ready().then(function(){var i=t._dbInfo;i.db.transaction(function(c){G(c,i,"SELECT * FROM "+i.storeName,[],function(f,d){for(var h=d.rows,y=h.length,E=0;E<y;E++){var O=h.item(E),L=O.value;if(L&&(L=i.serializer.deserialize(L)),L=e(L,O.key,E+1),L!==void 0){a(L);return}}a()},function(f,d){n(d)})})}).catch(n)});return I(o,r),o}function ze(e,r,t,o){var a=this;e=U(e);var n=new v(function(i,c){a.ready().then(function(){r===void 0&&(r=null);var f=r,d=a._dbInfo;d.serializer.serialize(r,function(h,y){y?c(y):d.db.transaction(function(E){G(E,d,"INSERT OR REPLACE INTO "+d.storeName+" (key, value) VALUES (?, ?)",[e,h],function(){i(f)},function(O,L){c(L)})},function(E){if(E.code===E.QUOTA_ERR){if(o>0){i(ze.apply(a,[e,f,t,o-1]));return}c(E)}})})}).catch(c)});return I(n,t),n}function Jt(e,r,t){return ze.apply(this,[e,r,t,1])}function Mt(e,r){var t=this;e=U(e);var o=new v(function(a,n){t.ready().then(function(){var i=t._dbInfo;i.db.transaction(function(c){G(c,i,"DELETE FROM "+i.storeName+" WHERE key = ?",[e],function(){a()},function(f,d){n(d)})})}).catch(n)});return I(o,r),o}function jt(e){var r=this,t=new v(function(o,a){r.ready().then(function(){var n=r._dbInfo;n.db.transaction(function(i){G(i,n,"DELETE FROM "+n.storeName,[],function(){o()},function(c,f){a(f)})})}).catch(a)});return I(t,e),t}function Ft(e){var r=this,t=new v(function(o,a){r.ready().then(function(){var n=r._dbInfo;n.db.transaction(function(i){G(i,n,"SELECT COUNT(key) as c FROM "+n.storeName,[],function(c,f){var d=f.rows.item(0).c;o(d)},function(c,f){a(f)})})}).catch(a)});return I(t,e),t}function $t(e,r){var t=this,o=new v(function(a,n){t.ready().then(function(){var i=t._dbInfo;i.db.transaction(function(c){G(c,i,"SELECT key FROM "+i.storeName+" WHERE id = ? LIMIT 1",[e+1],function(f,d){var h=d.rows.length?d.rows.item(0).key:null;a(h)},function(f,d){n(d)})})}).catch(n)});return I(o,r),o}function kt(e){var r=this,t=new v(function(o,a){r.ready().then(function(){var n=r._dbInfo;n.db.transaction(function(i){G(i,n,"SELECT key FROM "+n.storeName,[],function(c,f){for(var d=[],h=0;h<f.rows.length;h++)d.push(f.rows.item(h).key);o(d)},function(c,f){a(f)})})}).catch(a)});return I(t,e),t}function Kt(e){return new v(function(r,t){e.transaction(function(o){o.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'",[],function(a,n){for(var i=[],c=0;c<n.rows.length;c++)i.push(n.rows.item(c).name);r({db:e,storeNames:i})},function(a,n){t(n)})},function(o){t(o)})})}function Vt(e,r){r=V.apply(this,arguments);var t=this.config();e=typeof e!="function"&&e||{},e.name||(e.name=e.name||t.name,e.storeName=e.storeName||t.storeName);var o=this,a;return e.name?a=new v(function(n){var i;e.name===t.name?i=o._dbInfo.db:i=openDatabase(e.name,"","",0),e.storeName?n({db:i,storeNames:[e.storeName]}):n(Kt(i))}).then(function(n){return new v(function(i,c){n.db.transaction(function(f){function d(O){return new v(function(L,B){f.executeSql("DROP TABLE IF EXISTS "+O,[],function(){L()},function(P,K){B(K)})})}for(var h=[],y=0,E=n.storeNames.length;y<E;y++)h.push(d(n.storeNames[y]));v.all(h).then(function(){i()}).catch(function(O){c(O)})},function(f){c(f)})})}):a=v.reject("Invalid arguments"),I(a,r),a}var Wt={_driver:"webSQLStorage",_initStorage:Ct,_support:Lt(),iterate:Ut,getItem:Bt,setItem:Jt,removeItem:Mt,clear:jt,length:Ft,key:$t,keys:kt,dropInstance:Vt};function Yt(){try{return typeof localStorage<"u"&&"setItem"in localStorage&&!!localStorage.setItem}catch(e){return!1}}function Ge(e,r){var t=e.name+"/";return e.storeName!==r.storeName&&(t+=e.storeName+"/"),t}function Xt(){var e="_localforage_support_test";try{return localStorage.setItem(e,!0),localStorage.removeItem(e),!1}catch(r){return!0}}function zt(){return!Xt()||localStorage.length>0}function Gt(e){var r=this,t={};if(e)for(var o in e)t[o]=e[o];return t.keyPrefix=Ge(e,r._defaultConfig),zt()?(r._dbInfo=t,t.serializer=ye,v.resolve()):v.reject()}function Ht(e){var r=this,t=r.ready().then(function(){for(var o=r._dbInfo.keyPrefix,a=localStorage.length-1;a>=0;a--){var n=localStorage.key(a);n.indexOf(o)===0&&localStorage.removeItem(n)}});return I(t,e),t}function Qt(e,r){var t=this;e=U(e);var o=t.ready().then(function(){var a=t._dbInfo,n=localStorage.getItem(a.keyPrefix+e);return n&&(n=a.serializer.deserialize(n)),n});return I(o,r),o}function qt(e,r){var t=this,o=t.ready().then(function(){for(var a=t._dbInfo,n=a.keyPrefix,i=n.length,c=localStorage.length,f=1,d=0;d<c;d++){var h=localStorage.key(d);if(h.indexOf(n)===0){var y=localStorage.getItem(h);if(y&&(y=a.serializer.deserialize(y)),y=e(y,h.substring(i),f++),y!==void 0)return y}}});return I(o,r),o}function Zt(e,r){var t=this,o=t.ready().then(function(){var a=t._dbInfo,n;try{n=localStorage.key(e)}catch(i){n=null}return n&&(n=n.substring(a.keyPrefix.length)),n});return I(o,r),o}function er(e){var r=this,t=r.ready().then(function(){for(var o=r._dbInfo,a=localStorage.length,n=[],i=0;i<a;i++){var c=localStorage.key(i);c.indexOf(o.keyPrefix)===0&&n.push(c.substring(o.keyPrefix.length))}return n});return I(t,e),t}function tr(e){var r=this,t=r.keys().then(function(o){return o.length});return I(t,e),t}function rr(e,r){var t=this;e=U(e);var o=t.ready().then(function(){var a=t._dbInfo;localStorage.removeItem(a.keyPrefix+e)});return I(o,r),o}function nr(e,r,t){var o=this;e=U(e);var a=o.ready().then(function(){r===void 0&&(r=null);var n=r;return new v(function(i,c){var f=o._dbInfo;f.serializer.serialize(r,function(d,h){if(h)c(h);else try{localStorage.setItem(f.keyPrefix+e,d),i(n)}catch(y){(y.name==="QuotaExceededError"||y.name==="NS_ERROR_DOM_QUOTA_REACHED")&&c(y),c(y)}})})});return I(a,t),a}function or(e,r){if(r=V.apply(this,arguments),e=typeof e!="function"&&e||{},!e.name){var t=this.config();e.name=e.name||t.name,e.storeName=e.storeName||t.storeName}var o=this,a;return e.name?a=new v(function(n){e.storeName?n(Ge(e,o._defaultConfig)):n(e.name+"/")}).then(function(n){for(var i=localStorage.length-1;i>=0;i--){var c=localStorage.key(i);c.indexOf(n)===0&&localStorage.removeItem(c)}}):a=v.reject("Invalid arguments"),I(a,r),a}var ar={_driver:"localStorageWrapper",_initStorage:Gt,_support:Yt(),iterate:qt,getItem:Qt,setItem:nr,removeItem:rr,clear:Ht,length:tr,key:Zt,keys:er,dropInstance:or},ir=function(r,t){return r===t||typeof r=="number"&&typeof t=="number"&&isNaN(r)&&isNaN(t)},sr=function(r,t){for(var o=r.length,a=0;a<o;){if(ir(r[a],t))return!0;a++}return!1},He=Array.isArray||function(e){return Object.prototype.toString.call(e)==="[object Array]"},te={},Qe={},Z={INDEXEDDB:Ot,WEBSQL:Wt,LOCALSTORAGE:ar},ur=[Z.INDEXEDDB._driver,Z.WEBSQL._driver,Z.LOCALSTORAGE._driver],se=["dropInstance"],be=["clear","getItem","iterate","key","keys","length","removeItem","setItem"].concat(se),cr={description:"",driver:ur.slice(),name:"localforage",size:4980736,storeName:"keyvaluepairs",version:1};function fr(e,r){e[r]=function(){var t=arguments;return e.ready().then(function(){return e[r].apply(e,t)})}}function we(){for(var e=1;e<arguments.length;e++){var r=arguments[e];if(r)for(var t in r)r.hasOwnProperty(t)&&(He(r[t])?arguments[0][t]=r[t].slice():arguments[0][t]=r[t])}return arguments[0]}var lr=function(){function e(r){_(this,e);for(var t in Z)if(Z.hasOwnProperty(t)){var o=Z[t],a=o._driver;this[t]=a,te[a]||this.defineDriver(o)}this._defaultConfig=we({},cr),this._config=we({},this._defaultConfig,r),this._driverSet=null,this._initDriver=null,this._ready=!1,this._dbInfo=null,this._wrapLibraryMethodsWithReady(),this.setDriver(this._config.driver).catch(function(){})}return e.prototype.config=function(t){if((typeof t>"u"?"undefined":b(t))==="object"){if(this._ready)return new Error("Can't call config() after localforage has been used.");for(var o in t){if(o==="storeName"&&(t[o]=t[o].replace(/\W/g,"_")),o==="version"&&typeof t[o]!="number")return new Error("Database version must be a number.");this._config[o]=t[o]}return"driver"in t&&t.driver?this.setDriver(this._config.driver):!0}else return typeof t=="string"?this._config[t]:this._config},e.prototype.defineDriver=function(t,o,a){var n=new v(function(i,c){try{var f=t._driver,d=new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");if(!t._driver){c(d);return}for(var h=be.concat("_initStorage"),y=0,E=h.length;y<E;y++){var O=h[y],L=!sr(se,O);if((L||t[O])&&typeof t[O]!="function"){c(d);return}}var B=function(){for(var re=function(vr){return function(){var mr=new Error("Method "+vr+" is not implemented by the current driver"),qe=v.reject(mr);return I(qe,arguments[arguments.length-1]),qe}},_e=0,hr=se.length;_e<hr;_e++){var Se=se[_e];t[Se]||(t[Se]=re(Se))}};B();var P=function(re){te[f]&&console.info("Redefining LocalForage driver: "+f),te[f]=t,Qe[f]=re,i()};"_support"in t?t._support&&typeof t._support=="function"?t._support().then(P,c):P(!!t._support):P(!0)}catch(K){c(K)}});return C(n,o,a),n},e.prototype.driver=function(){return this._driver||null},e.prototype.getDriver=function(t,o,a){var n=te[t]?v.resolve(te[t]):v.reject(new Error("Driver not found."));return C(n,o,a),n},e.prototype.getSerializer=function(t){var o=v.resolve(ye);return C(o,t),o},e.prototype.ready=function(t){var o=this,a=o._driverSet.then(function(){return o._ready===null&&(o._ready=o._initDriver()),o._ready});return C(a,t,t),a},e.prototype.setDriver=function(t,o,a){var n=this;He(t)||(t=[t]);var i=this._getSupportedDrivers(t);function c(){n._config.driver=n.driver()}function f(y){return n._extend(y),c(),n._ready=n._initStorage(n._config),n._ready}function d(y){return function(){var E=0;function O(){for(;E<y.length;){var L=y[E];return E++,n._dbInfo=null,n._ready=null,n.getDriver(L).then(f).catch(O)}c();var B=new Error("No available storage method found.");return n._driverSet=v.reject(B),n._driverSet}return O()}}var h=this._driverSet!==null?this._driverSet.catch(function(){return v.resolve()}):v.resolve();return this._driverSet=h.then(function(){var y=i[0];return n._dbInfo=null,n._ready=null,n.getDriver(y).then(function(E){n._driver=E._driver,c(),n._wrapLibraryMethodsWithReady(),n._initDriver=d(i)})}).catch(function(){c();var y=new Error("No available storage method found.");return n._driverSet=v.reject(y),n._driverSet}),C(this._driverSet,o,a),this._driverSet},e.prototype.supports=function(t){return!!Qe[t]},e.prototype._extend=function(t){we(this,t)},e.prototype._getSupportedDrivers=function(t){for(var o=[],a=0,n=t.length;a<n;a++){var i=t[a];this.supports(i)&&o.push(i)}return o},e.prototype._wrapLibraryMethodsWithReady=function(){for(var t=0,o=be.length;t<o;t++)fr(this,be[t])},e.prototype.createInstance=function(t){return new e(t)},e}(),dr=new lr;m.exports=dr},{3:3}]},{},[4])(4)})});var Ie=u=>{var _,g,S;let s=u.split("-")[1];s&&(u=u.replace(`-${s}`,""));let l=u.split("+")[1];l&&(u=u.replace(`+${l}`,""));let w=u.split(".").slice(0,3),[m,x,b]=[(_=w[0])!=null?_:"0",(g=w[1])!=null?g:"0",(S=w[2])!=null?S:"0"];return{major:m,minor:x,patch:b,prerelease:s,build:l}},ce=u=>parseInt(Ie(u).major,10),et=(u,s)=>{let{major:l,minor:w,patch:m}=Ie(u),{major:x,minor:b,patch:_}=Ie(s);return l!==x?l>x?1:-1:w!==b?w>b?1:-1:m!==_?m>_?1:-1:0};var tt="jolibox-sdk-loader-metadata",xe=class{constructor({loaderMetadata:s}={}){this.computeLoaderMetaData=()=>{var m,x;let s=this.currentVersion,l=null;try{if(l=JSON.parse((m=localStorage.getItem(tt))!=null?m:"null"),!l||!l.version)throw new Error("Invalid loader metadata")}catch(b){l=this.defaultMetadata}let w=(x=l==null?void 0:l.version)!=null?x:s;return ce(w)!==ce(s)?l=this.defaultMetadata:et(w,s)<0&&(l=this.defaultMetadata),l};this.loadScript=()=>{if(this.loaderMetadata.syncScriptUrl){let s=new XMLHttpRequest;s.open("GET",this.loaderMetadata.syncScriptUrl,!1),s.send();let l=document.createElement("script");l.type="text/javascript",l.innerHTML=s.responseText,document.head.appendChild(l)}if(this.loaderMetadata.asyncScriptUrl){let s=document.createElement("script");s.type="text/javascript",s.src=this.loaderMetadata.asyncScriptUrl,s.async=!0,document.head.appendChild(s)}};this.fetchUpdateLoaderMetadata=(...x)=>ue(this,[...x],function*(s=this.currentVersion,l=this.loaderMetadata.version,w=(m=>(m=window.JOLIBOX_ENV)!=null?m:"WEB")()){var _,g,S;let b=`${(g=(_=window.joliboxenv)==null?void 0:_.apiBaseURL)!=null?g:"https://api.jolibox.com"}/frontend/js-sdk/loader-metadata`;try{let N=yield(yield fetch(b,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({installedSDKVersion:s,localSDKVersion:l,env:w})})).json();if(N.code!=="SUCCESS")throw new Error(N.message);this.loaderMetadata=(S=N.data)!=null?S:this.defaultMetadata,localStorage.setItem(tt,JSON.stringify(this.loaderMetadata))}catch(A){console.warn("Failed to fetch loader metadata: ",A)}});console.log("Loading Jolibox SDK..."),this.loaderMetadata=s!=null?s:this.computeLoaderMetaData(),this.loadScript(),this.fetchUpdateLoaderMetadata(),console.log("Jolibox SDK loaded.")}get currentVersion(){return window.__JOLIBOX_LOCAL_SDK_VERSION__}get defaultMetadata(){let s=this.currentVersion,l=ce(s);return{version:s,syncScriptUrl:`https://cdn.jsdelivr.net/npm/@jolibox/web-sync-sdk@${l}/dist/index.iife.js`,asyncScriptUrl:`https://cdn.jsdelivr.net/npm/@jolibox/web-async-sdk@${l}/dist/index.iife.js`}}};window.JoliboxSDKLoader=xe;var Ee=class{constructor(){this.init=s=>{window.joliboxsdk._commandPipe.push({cmd:"ads.init",params:s})};this.adConfig=s=>{window.joliboxsdk._commandPipe.push({cmd:"ads.adConfig",params:s})};this.adBreak=s=>{window.joliboxsdk._commandPipe.push({cmd:"ads.adBreak",params:s})};this.adUnit=s=>ue(this,null,function*(){window.joliboxsdk._commandPipe.push({cmd:"ads.adUnit",params:s})})}};window.JoliboxAds=Ee;var Re=class{constructor(){this.trackEvent=(s,l)=>{if(typeof s!="string")throw new Error("eventName must be a string");if(l!==null&&typeof l!="object"&&l!==void 0)throw new Error("extra must be an object or null or undefined");if(l){for(let w in l)if(typeof l[w]=="object")throw new Error("extra must not have nested objects")}window.joliboxsdk._commandPipe.push({cmd:"analytics.trackEvent",params:[s,l]})}}};window.JoliboxAnalytics=Re;var pt=Ir(nt(),1),xr=Object.defineProperty,Oe=(u,s)=>{for(var l in s)xr(u,l,{get:s[l],enumerable:!0})},Q=(u,s,l)=>new Promise((w,m)=>{var x=g=>{try{_(l.next(g))}catch(S){m(S)}},b=g=>{try{_(l.throw(g))}catch(S){m(S)}},_=g=>g.done?w(g.value):Promise.resolve(g.value).then(x,b);_((l=l.apply(u,s)).next())}),ot={};Oe(ot,{ADVERTISING_ID:()=>ct,DEVICE_ID:()=>ut,getAdvertisingId:()=>lt,getAppVersion:()=>st,getDeviceId:()=>ft,getPlatform:()=>it,getStorage:()=>Te,getUtmSource:()=>dt,platform:()=>oe,xUserAgent:()=>ht});var at={};Oe(at,{isValidUUIDV4:()=>Er,uuidv4:()=>Le});var Le=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,u=>{let s=Math.random()*16|0;return(u==="x"?s:s&3|8).toString(16)}),Er=u=>/^[\da-f]{8}-[\da-f]{4}-4[\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}$/i.test(u),oe={isiOS:navigator.userAgent.includes("iPhone")||navigator.userAgent.includes("iPod")||navigator.userAgent.includes("iPad")||navigator.userAgent.includes("iPhone OS"),iosVersion:()=>{let u=navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);return[parseInt(u[1],10),parseInt(u[2],10),parseInt(u[3]||"0",10)]},isAndroid:navigator.userAgent.includes("Android"),isMac:navigator.userAgent.includes("Mac"),isFacebook:navigator.userAgent.includes("FB_IAB"),isPC:!navigator.userAgent.includes("iPhone")&&!navigator.userAgent.includes("Android")},it=()=>oe.isiOS?"iOS":oe.isAndroid?"Android":oe.isMac?"Mac":oe.isFacebook?"Facebook":"PC",st=()=>window.__JOLIBOX_LOCAL_SDK_VERSION__,ut="device_id",ct="advertising_id",Te=u=>(localStorage.getItem(u)||localStorage.setItem(u,Le()),localStorage.getItem(u)),ft=()=>Te(ut),lt=()=>Te(ct),Rr=u=>u.charAt(0).toUpperCase()+u.slice(1),dt=()=>{var u;let s=new URLSearchParams(window.location.search);return Rr((u=s.get("utm_source"))!=null?u:"")||"JoliboxSDK"},ht=()=>{let u="JoliboxWebSDK",s=it(),l=navigator.language,w=ft(),m=lt(),x=st();return`${u} (${dt()}${s}; UnknownModel; UnknownSystemVersion; ${l}) uuid/${w} adid/${m} version/${x||""}`},Ar;(Ar=AbortSignal.timeout)!=null||(AbortSignal.timeout=function(u){let s=new AbortController;return setTimeout(()=>s.abort(),u),s.signal});var vt=class{constructor(u){this.xua=ht(),this.getGameId=()=>{var m;return(m=new URLSearchParams(window.location.search).get("gameId"))!=null?m:null},this.getJoliSource=()=>{var m;return(m=new URLSearchParams(window.location.search).get("joliSource"))!=null?m:null};var s,l,w;this.baseUrl=(w=(l=u==null?void 0:u.baseUrl)!=null?l:(s=window.joliboxenv)==null?void 0:s.apiBaseURL)!=null?w:"https://api.jolibox.com"}get(u,s){return Q(this,arguments,function*(l,{query:w,headers:m,timeout:x}){let b=new URLSearchParams(w).toString(),_=`${this.baseUrl}${l}${b?`?${b}`:""}`,g=this.xua,S=this.getJoliSource();return m=Object.assign({},m,g?{"x-user-agent":g}:{},S?{"x-joli-source":S}:{}),yield(yield fetch(_,{method:"GET",headers:m,signal:AbortSignal.timeout(x!=null?x:3e4)})).json()})}post(u,s){return Q(this,arguments,function*(l,{data:w,query:m,headers:x,timeout:b}){let _=new URLSearchParams(m).toString(),g=`${this.baseUrl}${l}${_?`?${_}`:""}`,S=this.xua,A=this.getJoliSource();x=Object.assign({},x,{"Content-Type":"application/json"},S?{"x-user-agent":S}:{},A?{"x-joli-source":A}:{});let N=yield fetch(g,{method:"POST",headers:x,body:JSON.stringify(w),signal:AbortSignal.timeout(b!=null?b:3e4)}),v=N.headers.get("content-type");if(v!=null&&v.includes("application/octet-stream"))try{return N.blob()}catch(I){return yield N.arrayBuffer()}if(v!=null&&v.includes("multipart/form-data")||v!=null&&v.includes("application/x-www-form-urlencoded"))try{return N.formData()}catch(I){return yield N.text()}if(v!=null&&v.includes("application/json"))try{return yield N.json()}catch(I){return yield N.text()}return N})}put(u,s){return Q(this,arguments,function*(l,{data:w,query:m,headers:x}){try{let b=new URLSearchParams(m).toString(),_=`${this.baseUrl}${l}${b?`?${b}`:""}`,g=this.xua,S=this.getJoliSource();x=Object.assign({},x,{"Content-Type":"application/json"},g?{"x-user-agent":g}:{},S?{"x-joli-source":S}:{});let A=yield fetch(_,{method:"PUT",headers:x,body:JSON.stringify(w!=null?w:{})});if(!A.ok)throw new Error(`HTTP error! status: ${A.status}`);return yield A.json()}catch(b){throw console.error("Error:",b),b}})}};window.JoliboxHttpClient=vt;var mt={};Oe(mt,{getGameSessionId:()=>Dr});var Dr=()=>{let u=sessionStorage.getItem("gameSessionId");return u||(u=Le(),sessionStorage.setItem("gameSessionId",u)),u},fe=class{};fe.xua=ot,fe.session=mt,fe.uuid=at;window.JoliboxUtil=fe;var Or=(u=>(u.LOAD_START="JOLIBOX_RUNTIME_LOAD_START",u.LOAD_FINISHED="JOLIBOX_RUNTIME_LOAD_FINISHED",u.LOAD_PROGRESS="JOLIBOX_RUNTIME_LOAD_PROGRESS",u))(Or||{});window.dispatchEvent(new Event("JOLIBOX_RUNTIME_LOAD_START"));var Lr=class{constructor(){this.loadFinished=()=>{let u=new Event("JOLIBOX_RUNTIME_LOAD_FINISHED");window.dispatchEvent(u),window.joliboxsdk._commandPipe.push({cmd:"analytics.trackSystemEvent",params:["CallRuntimeLoadFinished"]})},this.notifyLoadProgress=u=>{let s=Math.ceil(u),l=new CustomEvent("JOLIBOX_RUNTIME_LOAD_PROGRESS",{detail:s});window.dispatchEvent(l)}}};window.JoliboxRuntime=Lr;var De="INTERNAL_ERR",Tr=class{constructor(){this.getGameId=()=>{var u;return(u=new URLSearchParams(window.location.search).get("gameId"))!=null?u:""},this.getItem=u=>Q(this,null,function*(){try{let{code:s,data:l,message:w}=yield this.httpClient.get(`/api/games/user-storage/${this.gameId}`,{query:{key:u}}),m=l==null?void 0:l.value;return s!=="SUCCESS"&&(m=yield this.gameStore.getItem(u),console.info("[SDK] cloud storage getItem failed, read from localstorage",m)),{code:s,message:w,data:m!=null?m:null}}catch(s){let l=`[SDK] cloud storage getItem internal error: ${s}`;return console.error(l),{code:"INTERNAL_ERR",message:l}}}),this.setItem=(u,s)=>Q(this,null,function*(){var l,w;try{if(!this.isPrimitiveType(s))throw{code:"PARAMETER_ERROR",message:"[SDK] cloud storage setItem error: typeof value should be number, string or boolean"};if(u.length>128)throw{code:"PARAMETER_ERROR",message:"[SDK] cloud storage setItem error: length of key should be less than 128"};let m=typeof s=="string"?s:String(s);if(u.length+m.length>1024)throw{code:"PARAMETER_ERROR",message:"[SDK] cloud storage setItem error: length of key and value should be less than 1024"};yield this.gameStore.setItem(u,m);let{code:x,message:b}=yield this.httpClient.post(`/api/games/user-storage/${this.gameId}`,{data:{key:u,value:m}});return{code:x,message:b}}catch(m){let x=(l=m.code)!=null?l:De,b=(w=m.message)!=null?w:`${m}`;return console.error(b),{code:x,message:b}}}),this.removeItem=u=>Q(this,null,function*(){try{yield this.gameStore.removeItem(u);let{code:s,message:l}=yield this.httpClient.post(`/api/games/user-storage/${this.gameId}/remove`,{data:{key:u}});return{code:s,message:l}}catch(s){let l=`[SDK] cloud storage removeItem error: ${s}`;return console.error(l),{code:De,message:l}}}),this.clear=()=>Q(this,null,function*(){try{yield this.gameStore.clear();let{code:u,message:s}=yield this.httpClient.post(`/api/games/user-storage/${this.gameId}/clear`,{});return{code:u,message:s}}catch(u){let s=`[SDK] cloud storage clear error: ${u}`;return console.error(s),{code:De,message:s}}}),this.gameId=this.getGameId(),this.httpClient=new vt,this.gameStore=pt.default.createInstance({name:this.gameId.length?this.gameId:"default"})}isPrimitiveType(u){return typeof u=="string"||typeof u=="number"||typeof u=="boolean"}};window.JoliboxCloudStorage=Tr;window.__JOLIBOX_LOCAL_SDK_VERSION__="1.0.16";var le=class{constructor({useRuntimeSDK:s=!0,loaderConfig:l,testMode:w,apiBaseURL:m}={}){this.hostToApiMap={default:{test:"https://stg-api.jolibox.com",prod:"https://api.jolibox.com"},"oss.jolibox.com":{test:"https://stg-api.jolibox.com",prod:"https://api.jolibox.com"},"oss.pico-game.com":{test:"https://stg-api.pico-game.com",prod:"https://api.pico-game.com"}};this.setJoliboxEnv=(s,l)=>{var S;let m=typeof window<"u"?new URLSearchParams(window.location.search):null,x=(m==null?void 0:m.get("testMode"))==="true",b=s!=null?s:x,_=m==null?void 0:m.get("apiBaseURL"),g;if(l)g=l;else if(_)g=_;else{let A=(S=this.hostToApiMap[window.location.host])!=null?S:this.hostToApiMap.default;g=b?A.test:A.prod}window.joliboxenv={testMode:b,apiBaseURL:g}};var x,b,_,g,S;this.setJoliboxEnv(w,m),s&&window.joliboxsdk?(this.loader=(x=window.joliboxsdk.loader)!=null?x:new window.JoliboxSDKLoader(l),this.ads=(b=window.joliboxsdk.ads)!=null?b:new window.JoliboxAds,this.anaytics=(_=window.joliboxsdk.anaytics)!=null?_:new window.JoliboxAnalytics,this.runtime=(g=window.joliboxsdk.runtime)!=null?g:new window.JoliboxRuntime,this.storage=(S=window.joliboxsdk.storage)!=null?S:new window.JoliboxCloudStorage):(window.joliboxsdk||(window.joliboxsdk={_commandPipe:[]}),this.loader=new window.JoliboxSDKLoader(l),this.ads=new window.JoliboxAds,this.anaytics=new window.JoliboxAnalytics,this.runtime=new window.JoliboxRuntime,this.storage=new window.JoliboxCloudStorage,window.joliboxsdk=Object.assign(this,window.joliboxsdk)),window.joliboxsdk._commandPipe||(window.joliboxsdk._commandPipe=[])}};window.JoliboxSDK||(window.JoliboxSDK=le);var Qr=le;})();
|
|
1
|
+
"use strict";(()=>{var pr=Object.create;var Ze=Object.defineProperty;var gr=Object.getOwnPropertyDescriptor;var yr=Object.getOwnPropertyNames;var br=Object.getPrototypeOf,wr=Object.prototype.hasOwnProperty;var ne=(u=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(u,{get:(s,l)=>(typeof require<"u"?require:s)[l]}):u)(function(u){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+u+'" is not supported')});var _r=(u,s)=>()=>(s||u((s={exports:{}}).exports,s),s.exports);var Sr=(u,s,l,w)=>{if(s&&typeof s=="object"||typeof s=="function")for(let m of yr(s))!wr.call(u,m)&&m!==l&&Ze(u,m,{get:()=>s[m],enumerable:!(w=gr(s,m))||w.enumerable});return u};var Ir=(u,s,l)=>(l=u!=null?pr(br(u)):{},Sr(s||!u||!u.__esModule?Ze(l,"default",{value:u,enumerable:!0}):l,u));var ue=(u,s,l)=>new Promise((w,m)=>{var x=g=>{try{_(l.next(g))}catch(S){m(S)}},b=g=>{try{_(l.throw(g))}catch(S){m(S)}},_=g=>g.done?w(g.value):Promise.resolve(g.value).then(x,b);_((l=l.apply(u,s)).next())});var nt=_r((rt,Ae)=>{"use strict";(function(u){if(typeof rt=="object"&&typeof Ae<"u")Ae.exports=u();else if(typeof define=="function"&&define.amd)define([],u);else{var s;typeof window<"u"?s=window:typeof global<"u"?s=global:typeof self<"u"?s=self:s=this,s.localforage=u()}})(function(){var u,s,l;return function w(m,x,b){function _(A,N){if(!x[A]){if(!m[A]){var v=typeof ne=="function"&≠if(!N&&v)return v(A,!0);if(g)return g(A,!0);var I=new Error("Cannot find module '"+A+"'");throw I.code="MODULE_NOT_FOUND",I}var C=x[A]={exports:{}};m[A][0].call(C.exports,function(U){var V=m[A][1][U];return _(V||U)},C,C.exports,w,m,x,b)}return x[A].exports}for(var g=typeof ne=="function"&&ne,S=0;S<b.length;S++)_(b[S]);return _}({1:[function(w,m,x){(function(b){"use strict";var _=b.MutationObserver||b.WebKitMutationObserver,g;if(_){var S=0,A=new _(U),N=b.document.createTextNode("");A.observe(N,{characterData:!0}),g=function(){N.data=S=++S%2}}else if(!b.setImmediate&&typeof b.MessageChannel<"u"){var v=new b.MessageChannel;v.port1.onmessage=U,g=function(){v.port2.postMessage(0)}}else"document"in b&&"onreadystatechange"in b.document.createElement("script")?g=function(){var J=b.document.createElement("script");J.onreadystatechange=function(){U(),J.onreadystatechange=null,J.parentNode.removeChild(J),J=null},b.document.documentElement.appendChild(J)}:g=function(){setTimeout(U,0)};var I,C=[];function U(){I=!0;for(var J,W,M=C.length;M;){for(W=C,C=[],J=-1;++J<M;)W[J]();M=C.length}I=!1}m.exports=V;function V(J){C.push(J)===1&&!I&&g()}}).call(this,typeof global<"u"?global:typeof self<"u"?self:typeof window<"u"?window:{})},{}],2:[function(w,m,x){"use strict";var b=w(1);function _(){}var g={},S=["REJECTED"],A=["FULFILLED"],N=["PENDING"];m.exports=v;function v(p){if(typeof p!="function")throw new TypeError("resolver must be a function");this.state=N,this.queue=[],this.outcome=void 0,p!==_&&V(this,p)}v.prototype.catch=function(p){return this.then(null,p)},v.prototype.then=function(p,D){if(typeof p!="function"&&this.state===A||typeof D!="function"&&this.state===S)return this;var R=new this.constructor(_);if(this.state!==N){var T=this.state===A?p:D;C(R,T,this.outcome)}else this.queue.push(new I(R,p,D));return R};function I(p,D,R){this.promise=p,typeof D=="function"&&(this.onFulfilled=D,this.callFulfilled=this.otherCallFulfilled),typeof R=="function"&&(this.onRejected=R,this.callRejected=this.otherCallRejected)}I.prototype.callFulfilled=function(p){g.resolve(this.promise,p)},I.prototype.otherCallFulfilled=function(p){C(this.promise,this.onFulfilled,p)},I.prototype.callRejected=function(p){g.reject(this.promise,p)},I.prototype.otherCallRejected=function(p){C(this.promise,this.onRejected,p)};function C(p,D,R){b(function(){var T;try{T=D(R)}catch(j){return g.reject(p,j)}T===p?g.reject(p,new TypeError("Cannot resolve promise with itself")):g.resolve(p,T)})}g.resolve=function(p,D){var R=J(U,D);if(R.status==="error")return g.reject(p,R.value);var T=R.value;if(T)V(p,T);else{p.state=A,p.outcome=D;for(var j=-1,F=p.queue.length;++j<F;)p.queue[j].callFulfilled(D)}return p},g.reject=function(p,D){p.state=S,p.outcome=D;for(var R=-1,T=p.queue.length;++R<T;)p.queue[R].callRejected(D);return p};function U(p){var D=p&&p.then;if(p&&(typeof p=="object"||typeof p=="function")&&typeof D=="function")return function(){D.apply(p,arguments)}}function V(p,D){var R=!1;function T(k){R||(R=!0,g.reject(p,k))}function j(k){R||(R=!0,g.resolve(p,k))}function F(){D(j,T)}var $=J(F);$.status==="error"&&T($.value)}function J(p,D){var R={};try{R.value=p(D),R.status="success"}catch(T){R.status="error",R.value=T}return R}v.resolve=W;function W(p){return p instanceof this?p:g.resolve(new this(_),p)}v.reject=M;function M(p){var D=new this(_);return g.reject(D,p)}v.all=de;function de(p){var D=this;if(Object.prototype.toString.call(p)!=="[object Array]")return this.reject(new TypeError("must be an array"));var R=p.length,T=!1;if(!R)return this.resolve([]);for(var j=new Array(R),F=0,$=-1,k=new this(_);++$<R;)Y(p[$],$);return k;function Y(ee,ae){D.resolve(ee).then(he,function(q){T||(T=!0,g.reject(k,q))});function he(q){j[ae]=q,++F===R&&!T&&(T=!0,g.resolve(k,j))}}}v.race=H;function H(p){var D=this;if(Object.prototype.toString.call(p)!=="[object Array]")return this.reject(new TypeError("must be an array"));var R=p.length,T=!1;if(!R)return this.resolve([]);for(var j=-1,F=new this(_);++j<R;)$(p[j]);return F;function $(k){D.resolve(k).then(function(Y){T||(T=!0,g.resolve(F,Y))},function(Y){T||(T=!0,g.reject(F,Y))})}}},{1:1}],3:[function(w,m,x){(function(b){"use strict";typeof b.Promise!="function"&&(b.Promise=w(2))}).call(this,typeof global<"u"?global:typeof self<"u"?self:typeof window<"u"?window:{})},{2:2}],4:[function(w,m,x){"use strict";var b=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function _(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}function g(){try{if(typeof indexedDB<"u")return indexedDB;if(typeof webkitIndexedDB<"u")return webkitIndexedDB;if(typeof mozIndexedDB<"u")return mozIndexedDB;if(typeof OIndexedDB<"u")return OIndexedDB;if(typeof msIndexedDB<"u")return msIndexedDB}catch(e){return}}var S=g();function A(){try{if(!S||!S.open)return!1;var e=typeof openDatabase<"u"&&/(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/BlackBerry/.test(navigator.platform),r=typeof fetch=="function"&&fetch.toString().indexOf("[native code")!==-1;return(!e||r)&&typeof indexedDB<"u"&&typeof IDBKeyRange<"u"}catch(t){return!1}}function N(e,r){e=e||[],r=r||{};try{return new Blob(e,r)}catch(n){if(n.name!=="TypeError")throw n;for(var t=typeof BlobBuilder<"u"?BlobBuilder:typeof MSBlobBuilder<"u"?MSBlobBuilder:typeof MozBlobBuilder<"u"?MozBlobBuilder:WebKitBlobBuilder,o=new t,a=0;a<e.length;a+=1)o.append(e[a]);return o.getBlob(r.type)}}typeof Promise>"u"&&w(3);var v=Promise;function I(e,r){r&&e.then(function(t){r(null,t)},function(t){r(t)})}function C(e,r,t){typeof r=="function"&&e.then(r),typeof t=="function"&&e.catch(t)}function U(e){return typeof e!="string"&&(console.warn(e+" used as a key, but it is not a string."),e=String(e)),e}function V(){if(arguments.length&&typeof arguments[arguments.length-1]=="function")return arguments[arguments.length-1]}var J="local-forage-detect-blob-support",W=void 0,M={},de=Object.prototype.toString,H="readonly",p="readwrite";function D(e){for(var r=e.length,t=new ArrayBuffer(r),o=new Uint8Array(t),a=0;a<r;a++)o[a]=e.charCodeAt(a);return t}function R(e){return new v(function(r){var t=e.transaction(J,p),o=N([""]);t.objectStore(J).put(o,"key"),t.onabort=function(a){a.preventDefault(),a.stopPropagation(),r(!1)},t.oncomplete=function(){var a=navigator.userAgent.match(/Chrome\/(\d+)/),n=navigator.userAgent.match(/Edge\//);r(n||!a||parseInt(a[1],10)>=43)}}).catch(function(){return!1})}function T(e){return typeof W=="boolean"?v.resolve(W):R(e).then(function(r){return W=r,W})}function j(e){var r=M[e.name],t={};t.promise=new v(function(o,a){t.resolve=o,t.reject=a}),r.deferredOperations.push(t),r.dbReady?r.dbReady=r.dbReady.then(function(){return t.promise}):r.dbReady=t.promise}function F(e){var r=M[e.name],t=r.deferredOperations.pop();if(t)return t.resolve(),t.promise}function $(e,r){var t=M[e.name],o=t.deferredOperations.pop();if(o)return o.reject(r),o.promise}function k(e,r){return new v(function(t,o){if(M[e.name]=M[e.name]||Pe(),e.db)if(r)j(e),e.db.close();else return t(e.db);var a=[e.name];r&&a.push(e.version);var n=S.open.apply(S,a);r&&(n.onupgradeneeded=function(i){var c=n.result;try{c.createObjectStore(e.storeName),i.oldVersion<=1&&c.createObjectStore(J)}catch(f){if(f.name==="ConstraintError")console.warn('The database "'+e.name+'" has been upgraded from version '+i.oldVersion+" to version "+i.newVersion+', but the storage "'+e.storeName+'" already exists.');else throw f}}),n.onerror=function(i){i.preventDefault(),o(n.error)},n.onsuccess=function(){var i=n.result;i.onversionchange=function(c){c.target.close()},t(i),F(e)}})}function Y(e){return k(e,!1)}function ee(e){return k(e,!0)}function ae(e,r){if(!e.db)return!0;var t=!e.db.objectStoreNames.contains(e.storeName),o=e.version<e.db.version,a=e.version>e.db.version;if(o&&(e.version!==r&&console.warn('The database "'+e.name+`" can't be downgraded from version `+e.db.version+" to version "+e.version+"."),e.version=e.db.version),a||t){if(t){var n=e.db.version+1;n>e.version&&(e.version=n)}return!0}return!1}function he(e){return new v(function(r,t){var o=new FileReader;o.onerror=t,o.onloadend=function(a){var n=btoa(a.target.result||"");r({__local_forage_encoded_blob:!0,data:n,type:e.type})},o.readAsBinaryString(e)})}function q(e){var r=D(atob(e.data));return N([r],{type:e.type})}function Ne(e){return e&&e.__local_forage_encoded_blob}function gt(e){var r=this,t=r._initReady().then(function(){var o=M[r._dbInfo.name];if(o&&o.dbReady)return o.dbReady});return C(t,e,e),t}function yt(e){j(e);for(var r=M[e.name],t=r.forages,o=0;o<t.length;o++){var a=t[o];a._dbInfo.db&&(a._dbInfo.db.close(),a._dbInfo.db=null)}return e.db=null,Y(e).then(function(n){return e.db=n,ae(e)?ee(e):n}).then(function(n){e.db=r.db=n;for(var i=0;i<t.length;i++)t[i]._dbInfo.db=n}).catch(function(n){throw $(e,n),n})}function X(e,r,t,o){o===void 0&&(o=1);try{var a=e.db.transaction(e.storeName,r);t(null,a)}catch(n){if(o>0&&(!e.db||n.name==="InvalidStateError"||n.name==="NotFoundError"))return v.resolve().then(function(){if(!e.db||n.name==="NotFoundError"&&!e.db.objectStoreNames.contains(e.storeName)&&e.version<=e.db.version)return e.db&&(e.version=e.db.version+1),ee(e)}).then(function(){return yt(e).then(function(){X(e,r,t,o-1)})}).catch(t);t(n)}}function Pe(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function bt(e){var r=this,t={db:null};if(e)for(var o in e)t[o]=e[o];var a=M[t.name];a||(a=Pe(),M[t.name]=a),a.forages.push(r),r._initReady||(r._initReady=r.ready,r.ready=gt);var n=[];function i(){return v.resolve()}for(var c=0;c<a.forages.length;c++){var f=a.forages[c];f!==r&&n.push(f._initReady().catch(i))}var d=a.forages.slice(0);return v.all(n).then(function(){return t.db=a.db,Y(t)}).then(function(h){return t.db=h,ae(t,r._defaultConfig.version)?ee(t):h}).then(function(h){t.db=a.db=h,r._dbInfo=t;for(var y=0;y<d.length;y++){var E=d[y];E!==r&&(E._dbInfo.db=t.db,E._dbInfo.version=t.version)}})}function wt(e,r){var t=this;e=U(e);var o=new v(function(a,n){t.ready().then(function(){X(t._dbInfo,H,function(i,c){if(i)return n(i);try{var f=c.objectStore(t._dbInfo.storeName),d=f.get(e);d.onsuccess=function(){var h=d.result;h===void 0&&(h=null),Ne(h)&&(h=q(h)),a(h)},d.onerror=function(){n(d.error)}}catch(h){n(h)}})}).catch(n)});return I(o,r),o}function _t(e,r){var t=this,o=new v(function(a,n){t.ready().then(function(){X(t._dbInfo,H,function(i,c){if(i)return n(i);try{var f=c.objectStore(t._dbInfo.storeName),d=f.openCursor(),h=1;d.onsuccess=function(){var y=d.result;if(y){var E=y.value;Ne(E)&&(E=q(E));var O=e(E,y.key,h++);O!==void 0?a(O):y.continue()}else a()},d.onerror=function(){n(d.error)}}catch(y){n(y)}})}).catch(n)});return I(o,r),o}function St(e,r,t){var o=this;e=U(e);var a=new v(function(n,i){var c;o.ready().then(function(){return c=o._dbInfo,de.call(r)==="[object Blob]"?T(c.db).then(function(f){return f?r:he(r)}):r}).then(function(f){X(o._dbInfo,p,function(d,h){if(d)return i(d);try{var y=h.objectStore(o._dbInfo.storeName);f===null&&(f=void 0);var E=y.put(f,e);h.oncomplete=function(){f===void 0&&(f=null),n(f)},h.onabort=h.onerror=function(){var O=E.error?E.error:E.transaction.error;i(O)}}catch(O){i(O)}})}).catch(i)});return I(a,t),a}function It(e,r){var t=this;e=U(e);var o=new v(function(a,n){t.ready().then(function(){X(t._dbInfo,p,function(i,c){if(i)return n(i);try{var f=c.objectStore(t._dbInfo.storeName),d=f.delete(e);c.oncomplete=function(){a()},c.onerror=function(){n(d.error)},c.onabort=function(){var h=d.error?d.error:d.transaction.error;n(h)}}catch(h){n(h)}})}).catch(n)});return I(o,r),o}function xt(e){var r=this,t=new v(function(o,a){r.ready().then(function(){X(r._dbInfo,p,function(n,i){if(n)return a(n);try{var c=i.objectStore(r._dbInfo.storeName),f=c.clear();i.oncomplete=function(){o()},i.onabort=i.onerror=function(){var d=f.error?f.error:f.transaction.error;a(d)}}catch(d){a(d)}})}).catch(a)});return I(t,e),t}function Et(e){var r=this,t=new v(function(o,a){r.ready().then(function(){X(r._dbInfo,H,function(n,i){if(n)return a(n);try{var c=i.objectStore(r._dbInfo.storeName),f=c.count();f.onsuccess=function(){o(f.result)},f.onerror=function(){a(f.error)}}catch(d){a(d)}})}).catch(a)});return I(t,e),t}function Rt(e,r){var t=this,o=new v(function(a,n){if(e<0){a(null);return}t.ready().then(function(){X(t._dbInfo,H,function(i,c){if(i)return n(i);try{var f=c.objectStore(t._dbInfo.storeName),d=!1,h=f.openKeyCursor();h.onsuccess=function(){var y=h.result;if(!y){a(null);return}e===0||d?a(y.key):(d=!0,y.advance(e))},h.onerror=function(){n(h.error)}}catch(y){n(y)}})}).catch(n)});return I(o,r),o}function At(e){var r=this,t=new v(function(o,a){r.ready().then(function(){X(r._dbInfo,H,function(n,i){if(n)return a(n);try{var c=i.objectStore(r._dbInfo.storeName),f=c.openKeyCursor(),d=[];f.onsuccess=function(){var h=f.result;if(!h){o(d);return}d.push(h.key),h.continue()},f.onerror=function(){a(f.error)}}catch(h){a(h)}})}).catch(a)});return I(t,e),t}function Dt(e,r){r=V.apply(this,arguments);var t=this.config();e=typeof e!="function"&&e||{},e.name||(e.name=e.name||t.name,e.storeName=e.storeName||t.storeName);var o=this,a;if(!e.name)a=v.reject("Invalid arguments");else{var n=e.name===t.name&&o._dbInfo.db,i=n?v.resolve(o._dbInfo.db):Y(e).then(function(c){var f=M[e.name],d=f.forages;f.db=c;for(var h=0;h<d.length;h++)d[h]._dbInfo.db=c;return c});e.storeName?a=i.then(function(c){if(c.objectStoreNames.contains(e.storeName)){var f=c.version+1;j(e);var d=M[e.name],h=d.forages;c.close();for(var y=0;y<h.length;y++){var E=h[y];E._dbInfo.db=null,E._dbInfo.version=f}var O=new v(function(L,B){var P=S.open(e.name,f);P.onerror=function(K){var re=P.result;re.close(),B(K)},P.onupgradeneeded=function(){var K=P.result;K.deleteObjectStore(e.storeName)},P.onsuccess=function(){var K=P.result;K.close(),L(K)}});return O.then(function(L){d.db=L;for(var B=0;B<h.length;B++){var P=h[B];P._dbInfo.db=L,F(P._dbInfo)}}).catch(function(L){throw($(e,L)||v.resolve()).catch(function(){}),L})}}):a=i.then(function(c){j(e);var f=M[e.name],d=f.forages;c.close();for(var h=0;h<d.length;h++){var y=d[h];y._dbInfo.db=null}var E=new v(function(O,L){var B=S.deleteDatabase(e.name);B.onerror=function(){var P=B.result;P&&P.close(),L(B.error)},B.onblocked=function(){console.warn('dropInstance blocked for database "'+e.name+'" until all open connections are closed')},B.onsuccess=function(){var P=B.result;P&&P.close(),O(P)}});return E.then(function(O){f.db=O;for(var L=0;L<d.length;L++){var B=d[L];F(B._dbInfo)}}).catch(function(O){throw($(e,O)||v.resolve()).catch(function(){}),O})})}return I(a,r),a}var Ot={_driver:"asyncStorage",_initStorage:bt,_support:A(),iterate:_t,getItem:wt,setItem:St,removeItem:It,clear:xt,length:Et,key:Rt,keys:At,dropInstance:Dt};function Lt(){return typeof openDatabase=="function"}var z="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Tt="~~local_forage_type~",Ce=/^~~local_forage_type~([^~]+)~/,ie="__lfsc__:",ve=ie.length,me="arbf",pe="blob",Be="si08",Ue="ui08",Je="uic8",Me="si16",je="si32",Fe="ur16",$e="ui32",ke="fl32",Ke="fl64",Ve=ve+me.length,We=Object.prototype.toString;function Ye(e){var r=e.length*.75,t=e.length,o,a=0,n,i,c,f;e[e.length-1]==="="&&(r--,e[e.length-2]==="="&&r--);var d=new ArrayBuffer(r),h=new Uint8Array(d);for(o=0;o<t;o+=4)n=z.indexOf(e[o]),i=z.indexOf(e[o+1]),c=z.indexOf(e[o+2]),f=z.indexOf(e[o+3]),h[a++]=n<<2|i>>4,h[a++]=(i&15)<<4|c>>2,h[a++]=(c&3)<<6|f&63;return d}function ge(e){var r=new Uint8Array(e),t="",o;for(o=0;o<r.length;o+=3)t+=z[r[o]>>2],t+=z[(r[o]&3)<<4|r[o+1]>>4],t+=z[(r[o+1]&15)<<2|r[o+2]>>6],t+=z[r[o+2]&63];return r.length%3===2?t=t.substring(0,t.length-1)+"=":r.length%3===1&&(t=t.substring(0,t.length-2)+"=="),t}function Nt(e,r){var t="";if(e&&(t=We.call(e)),e&&(t==="[object ArrayBuffer]"||e.buffer&&We.call(e.buffer)==="[object ArrayBuffer]")){var o,a=ie;e instanceof ArrayBuffer?(o=e,a+=me):(o=e.buffer,t==="[object Int8Array]"?a+=Be:t==="[object Uint8Array]"?a+=Ue:t==="[object Uint8ClampedArray]"?a+=Je:t==="[object Int16Array]"?a+=Me:t==="[object Uint16Array]"?a+=Fe:t==="[object Int32Array]"?a+=je:t==="[object Uint32Array]"?a+=$e:t==="[object Float32Array]"?a+=ke:t==="[object Float64Array]"?a+=Ke:r(new Error("Failed to get type for BinaryArray"))),r(a+ge(o))}else if(t==="[object Blob]"){var n=new FileReader;n.onload=function(){var i=Tt+e.type+"~"+ge(this.result);r(ie+pe+i)},n.readAsArrayBuffer(e)}else try{r(JSON.stringify(e))}catch(i){console.error("Couldn't convert value into a JSON string: ",e),r(null,i)}}function Pt(e){if(e.substring(0,ve)!==ie)return JSON.parse(e);var r=e.substring(Ve),t=e.substring(ve,Ve),o;if(t===pe&&Ce.test(r)){var a=r.match(Ce);o=a[1],r=r.substring(a[0].length)}var n=Ye(r);switch(t){case me:return n;case pe:return N([n],{type:o});case Be:return new Int8Array(n);case Ue:return new Uint8Array(n);case Je:return new Uint8ClampedArray(n);case Me:return new Int16Array(n);case Fe:return new Uint16Array(n);case je:return new Int32Array(n);case $e:return new Uint32Array(n);case ke:return new Float32Array(n);case Ke:return new Float64Array(n);default:throw new Error("Unkown type: "+t)}}var ye={serialize:Nt,deserialize:Pt,stringToBuffer:Ye,bufferToString:ge};function Xe(e,r,t,o){e.executeSql("CREATE TABLE IF NOT EXISTS "+r.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],t,o)}function Ct(e){var r=this,t={db:null};if(e)for(var o in e)t[o]=typeof e[o]!="string"?e[o].toString():e[o];var a=new v(function(n,i){try{t.db=openDatabase(t.name,String(t.version),t.description,t.size)}catch(c){return i(c)}t.db.transaction(function(c){Xe(c,t,function(){r._dbInfo=t,n()},function(f,d){i(d)})},i)});return t.serializer=ye,a}function G(e,r,t,o,a,n){e.executeSql(t,o,a,function(i,c){c.code===c.SYNTAX_ERR?i.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[r.storeName],function(f,d){d.rows.length?n(f,c):Xe(f,r,function(){f.executeSql(t,o,a,n)},n)},n):n(i,c)},n)}function Bt(e,r){var t=this;e=U(e);var o=new v(function(a,n){t.ready().then(function(){var i=t._dbInfo;i.db.transaction(function(c){G(c,i,"SELECT * FROM "+i.storeName+" WHERE key = ? LIMIT 1",[e],function(f,d){var h=d.rows.length?d.rows.item(0).value:null;h&&(h=i.serializer.deserialize(h)),a(h)},function(f,d){n(d)})})}).catch(n)});return I(o,r),o}function Ut(e,r){var t=this,o=new v(function(a,n){t.ready().then(function(){var i=t._dbInfo;i.db.transaction(function(c){G(c,i,"SELECT * FROM "+i.storeName,[],function(f,d){for(var h=d.rows,y=h.length,E=0;E<y;E++){var O=h.item(E),L=O.value;if(L&&(L=i.serializer.deserialize(L)),L=e(L,O.key,E+1),L!==void 0){a(L);return}}a()},function(f,d){n(d)})})}).catch(n)});return I(o,r),o}function ze(e,r,t,o){var a=this;e=U(e);var n=new v(function(i,c){a.ready().then(function(){r===void 0&&(r=null);var f=r,d=a._dbInfo;d.serializer.serialize(r,function(h,y){y?c(y):d.db.transaction(function(E){G(E,d,"INSERT OR REPLACE INTO "+d.storeName+" (key, value) VALUES (?, ?)",[e,h],function(){i(f)},function(O,L){c(L)})},function(E){if(E.code===E.QUOTA_ERR){if(o>0){i(ze.apply(a,[e,f,t,o-1]));return}c(E)}})})}).catch(c)});return I(n,t),n}function Jt(e,r,t){return ze.apply(this,[e,r,t,1])}function Mt(e,r){var t=this;e=U(e);var o=new v(function(a,n){t.ready().then(function(){var i=t._dbInfo;i.db.transaction(function(c){G(c,i,"DELETE FROM "+i.storeName+" WHERE key = ?",[e],function(){a()},function(f,d){n(d)})})}).catch(n)});return I(o,r),o}function jt(e){var r=this,t=new v(function(o,a){r.ready().then(function(){var n=r._dbInfo;n.db.transaction(function(i){G(i,n,"DELETE FROM "+n.storeName,[],function(){o()},function(c,f){a(f)})})}).catch(a)});return I(t,e),t}function Ft(e){var r=this,t=new v(function(o,a){r.ready().then(function(){var n=r._dbInfo;n.db.transaction(function(i){G(i,n,"SELECT COUNT(key) as c FROM "+n.storeName,[],function(c,f){var d=f.rows.item(0).c;o(d)},function(c,f){a(f)})})}).catch(a)});return I(t,e),t}function $t(e,r){var t=this,o=new v(function(a,n){t.ready().then(function(){var i=t._dbInfo;i.db.transaction(function(c){G(c,i,"SELECT key FROM "+i.storeName+" WHERE id = ? LIMIT 1",[e+1],function(f,d){var h=d.rows.length?d.rows.item(0).key:null;a(h)},function(f,d){n(d)})})}).catch(n)});return I(o,r),o}function kt(e){var r=this,t=new v(function(o,a){r.ready().then(function(){var n=r._dbInfo;n.db.transaction(function(i){G(i,n,"SELECT key FROM "+n.storeName,[],function(c,f){for(var d=[],h=0;h<f.rows.length;h++)d.push(f.rows.item(h).key);o(d)},function(c,f){a(f)})})}).catch(a)});return I(t,e),t}function Kt(e){return new v(function(r,t){e.transaction(function(o){o.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'",[],function(a,n){for(var i=[],c=0;c<n.rows.length;c++)i.push(n.rows.item(c).name);r({db:e,storeNames:i})},function(a,n){t(n)})},function(o){t(o)})})}function Vt(e,r){r=V.apply(this,arguments);var t=this.config();e=typeof e!="function"&&e||{},e.name||(e.name=e.name||t.name,e.storeName=e.storeName||t.storeName);var o=this,a;return e.name?a=new v(function(n){var i;e.name===t.name?i=o._dbInfo.db:i=openDatabase(e.name,"","",0),e.storeName?n({db:i,storeNames:[e.storeName]}):n(Kt(i))}).then(function(n){return new v(function(i,c){n.db.transaction(function(f){function d(O){return new v(function(L,B){f.executeSql("DROP TABLE IF EXISTS "+O,[],function(){L()},function(P,K){B(K)})})}for(var h=[],y=0,E=n.storeNames.length;y<E;y++)h.push(d(n.storeNames[y]));v.all(h).then(function(){i()}).catch(function(O){c(O)})},function(f){c(f)})})}):a=v.reject("Invalid arguments"),I(a,r),a}var Wt={_driver:"webSQLStorage",_initStorage:Ct,_support:Lt(),iterate:Ut,getItem:Bt,setItem:Jt,removeItem:Mt,clear:jt,length:Ft,key:$t,keys:kt,dropInstance:Vt};function Yt(){try{return typeof localStorage<"u"&&"setItem"in localStorage&&!!localStorage.setItem}catch(e){return!1}}function Ge(e,r){var t=e.name+"/";return e.storeName!==r.storeName&&(t+=e.storeName+"/"),t}function Xt(){var e="_localforage_support_test";try{return localStorage.setItem(e,!0),localStorage.removeItem(e),!1}catch(r){return!0}}function zt(){return!Xt()||localStorage.length>0}function Gt(e){var r=this,t={};if(e)for(var o in e)t[o]=e[o];return t.keyPrefix=Ge(e,r._defaultConfig),zt()?(r._dbInfo=t,t.serializer=ye,v.resolve()):v.reject()}function Ht(e){var r=this,t=r.ready().then(function(){for(var o=r._dbInfo.keyPrefix,a=localStorage.length-1;a>=0;a--){var n=localStorage.key(a);n.indexOf(o)===0&&localStorage.removeItem(n)}});return I(t,e),t}function Qt(e,r){var t=this;e=U(e);var o=t.ready().then(function(){var a=t._dbInfo,n=localStorage.getItem(a.keyPrefix+e);return n&&(n=a.serializer.deserialize(n)),n});return I(o,r),o}function qt(e,r){var t=this,o=t.ready().then(function(){for(var a=t._dbInfo,n=a.keyPrefix,i=n.length,c=localStorage.length,f=1,d=0;d<c;d++){var h=localStorage.key(d);if(h.indexOf(n)===0){var y=localStorage.getItem(h);if(y&&(y=a.serializer.deserialize(y)),y=e(y,h.substring(i),f++),y!==void 0)return y}}});return I(o,r),o}function Zt(e,r){var t=this,o=t.ready().then(function(){var a=t._dbInfo,n;try{n=localStorage.key(e)}catch(i){n=null}return n&&(n=n.substring(a.keyPrefix.length)),n});return I(o,r),o}function er(e){var r=this,t=r.ready().then(function(){for(var o=r._dbInfo,a=localStorage.length,n=[],i=0;i<a;i++){var c=localStorage.key(i);c.indexOf(o.keyPrefix)===0&&n.push(c.substring(o.keyPrefix.length))}return n});return I(t,e),t}function tr(e){var r=this,t=r.keys().then(function(o){return o.length});return I(t,e),t}function rr(e,r){var t=this;e=U(e);var o=t.ready().then(function(){var a=t._dbInfo;localStorage.removeItem(a.keyPrefix+e)});return I(o,r),o}function nr(e,r,t){var o=this;e=U(e);var a=o.ready().then(function(){r===void 0&&(r=null);var n=r;return new v(function(i,c){var f=o._dbInfo;f.serializer.serialize(r,function(d,h){if(h)c(h);else try{localStorage.setItem(f.keyPrefix+e,d),i(n)}catch(y){(y.name==="QuotaExceededError"||y.name==="NS_ERROR_DOM_QUOTA_REACHED")&&c(y),c(y)}})})});return I(a,t),a}function or(e,r){if(r=V.apply(this,arguments),e=typeof e!="function"&&e||{},!e.name){var t=this.config();e.name=e.name||t.name,e.storeName=e.storeName||t.storeName}var o=this,a;return e.name?a=new v(function(n){e.storeName?n(Ge(e,o._defaultConfig)):n(e.name+"/")}).then(function(n){for(var i=localStorage.length-1;i>=0;i--){var c=localStorage.key(i);c.indexOf(n)===0&&localStorage.removeItem(c)}}):a=v.reject("Invalid arguments"),I(a,r),a}var ar={_driver:"localStorageWrapper",_initStorage:Gt,_support:Yt(),iterate:qt,getItem:Qt,setItem:nr,removeItem:rr,clear:Ht,length:tr,key:Zt,keys:er,dropInstance:or},ir=function(r,t){return r===t||typeof r=="number"&&typeof t=="number"&&isNaN(r)&&isNaN(t)},sr=function(r,t){for(var o=r.length,a=0;a<o;){if(ir(r[a],t))return!0;a++}return!1},He=Array.isArray||function(e){return Object.prototype.toString.call(e)==="[object Array]"},te={},Qe={},Z={INDEXEDDB:Ot,WEBSQL:Wt,LOCALSTORAGE:ar},ur=[Z.INDEXEDDB._driver,Z.WEBSQL._driver,Z.LOCALSTORAGE._driver],se=["dropInstance"],be=["clear","getItem","iterate","key","keys","length","removeItem","setItem"].concat(se),cr={description:"",driver:ur.slice(),name:"localforage",size:4980736,storeName:"keyvaluepairs",version:1};function fr(e,r){e[r]=function(){var t=arguments;return e.ready().then(function(){return e[r].apply(e,t)})}}function we(){for(var e=1;e<arguments.length;e++){var r=arguments[e];if(r)for(var t in r)r.hasOwnProperty(t)&&(He(r[t])?arguments[0][t]=r[t].slice():arguments[0][t]=r[t])}return arguments[0]}var lr=function(){function e(r){_(this,e);for(var t in Z)if(Z.hasOwnProperty(t)){var o=Z[t],a=o._driver;this[t]=a,te[a]||this.defineDriver(o)}this._defaultConfig=we({},cr),this._config=we({},this._defaultConfig,r),this._driverSet=null,this._initDriver=null,this._ready=!1,this._dbInfo=null,this._wrapLibraryMethodsWithReady(),this.setDriver(this._config.driver).catch(function(){})}return e.prototype.config=function(t){if((typeof t>"u"?"undefined":b(t))==="object"){if(this._ready)return new Error("Can't call config() after localforage has been used.");for(var o in t){if(o==="storeName"&&(t[o]=t[o].replace(/\W/g,"_")),o==="version"&&typeof t[o]!="number")return new Error("Database version must be a number.");this._config[o]=t[o]}return"driver"in t&&t.driver?this.setDriver(this._config.driver):!0}else return typeof t=="string"?this._config[t]:this._config},e.prototype.defineDriver=function(t,o,a){var n=new v(function(i,c){try{var f=t._driver,d=new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");if(!t._driver){c(d);return}for(var h=be.concat("_initStorage"),y=0,E=h.length;y<E;y++){var O=h[y],L=!sr(se,O);if((L||t[O])&&typeof t[O]!="function"){c(d);return}}var B=function(){for(var re=function(vr){return function(){var mr=new Error("Method "+vr+" is not implemented by the current driver"),qe=v.reject(mr);return I(qe,arguments[arguments.length-1]),qe}},_e=0,hr=se.length;_e<hr;_e++){var Se=se[_e];t[Se]||(t[Se]=re(Se))}};B();var P=function(re){te[f]&&console.info("Redefining LocalForage driver: "+f),te[f]=t,Qe[f]=re,i()};"_support"in t?t._support&&typeof t._support=="function"?t._support().then(P,c):P(!!t._support):P(!0)}catch(K){c(K)}});return C(n,o,a),n},e.prototype.driver=function(){return this._driver||null},e.prototype.getDriver=function(t,o,a){var n=te[t]?v.resolve(te[t]):v.reject(new Error("Driver not found."));return C(n,o,a),n},e.prototype.getSerializer=function(t){var o=v.resolve(ye);return C(o,t),o},e.prototype.ready=function(t){var o=this,a=o._driverSet.then(function(){return o._ready===null&&(o._ready=o._initDriver()),o._ready});return C(a,t,t),a},e.prototype.setDriver=function(t,o,a){var n=this;He(t)||(t=[t]);var i=this._getSupportedDrivers(t);function c(){n._config.driver=n.driver()}function f(y){return n._extend(y),c(),n._ready=n._initStorage(n._config),n._ready}function d(y){return function(){var E=0;function O(){for(;E<y.length;){var L=y[E];return E++,n._dbInfo=null,n._ready=null,n.getDriver(L).then(f).catch(O)}c();var B=new Error("No available storage method found.");return n._driverSet=v.reject(B),n._driverSet}return O()}}var h=this._driverSet!==null?this._driverSet.catch(function(){return v.resolve()}):v.resolve();return this._driverSet=h.then(function(){var y=i[0];return n._dbInfo=null,n._ready=null,n.getDriver(y).then(function(E){n._driver=E._driver,c(),n._wrapLibraryMethodsWithReady(),n._initDriver=d(i)})}).catch(function(){c();var y=new Error("No available storage method found.");return n._driverSet=v.reject(y),n._driverSet}),C(this._driverSet,o,a),this._driverSet},e.prototype.supports=function(t){return!!Qe[t]},e.prototype._extend=function(t){we(this,t)},e.prototype._getSupportedDrivers=function(t){for(var o=[],a=0,n=t.length;a<n;a++){var i=t[a];this.supports(i)&&o.push(i)}return o},e.prototype._wrapLibraryMethodsWithReady=function(){for(var t=0,o=be.length;t<o;t++)fr(this,be[t])},e.prototype.createInstance=function(t){return new e(t)},e}(),dr=new lr;m.exports=dr},{3:3}]},{},[4])(4)})});var Ie=u=>{var _,g,S;let s=u.split("-")[1];s&&(u=u.replace(`-${s}`,""));let l=u.split("+")[1];l&&(u=u.replace(`+${l}`,""));let w=u.split(".").slice(0,3),[m,x,b]=[(_=w[0])!=null?_:"0",(g=w[1])!=null?g:"0",(S=w[2])!=null?S:"0"];return{major:m,minor:x,patch:b,prerelease:s,build:l}},ce=u=>parseInt(Ie(u).major,10),et=(u,s)=>{let{major:l,minor:w,patch:m}=Ie(u),{major:x,minor:b,patch:_}=Ie(s);return l!==x?l>x?1:-1:w!==b?w>b?1:-1:m!==_?m>_?1:-1:0};var tt="jolibox-sdk-loader-metadata",xe=class{constructor({loaderMetadata:s}={}){this.computeLoaderMetaData=()=>{var m,x;let s=this.currentVersion,l=null;try{if(l=JSON.parse((m=localStorage.getItem(tt))!=null?m:"null"),!l||!l.version)throw new Error("Invalid loader metadata")}catch(b){l=this.defaultMetadata}let w=(x=l==null?void 0:l.version)!=null?x:s;return ce(w)!==ce(s)?l=this.defaultMetadata:et(w,s)<0&&(l=this.defaultMetadata),l};this.loadScript=()=>{if(this.loaderMetadata.syncScriptUrl){let s=new XMLHttpRequest;s.open("GET",this.loaderMetadata.syncScriptUrl,!1),s.send();let l=document.createElement("script");l.type="text/javascript",l.innerHTML=s.responseText,document.head.appendChild(l)}if(this.loaderMetadata.asyncScriptUrl){let s=document.createElement("script");s.type="text/javascript",s.src=this.loaderMetadata.asyncScriptUrl,s.async=!0,document.head.appendChild(s)}};this.fetchUpdateLoaderMetadata=(...x)=>ue(this,[...x],function*(s=this.currentVersion,l=this.loaderMetadata.version,w=(m=>(m=window.JOLIBOX_ENV)!=null?m:"WEB")()){var _,g,S;let b=`${(g=(_=window.joliboxenv)==null?void 0:_.apiBaseURL)!=null?g:"https://api.jolibox.com"}/frontend/js-sdk/loader-metadata`;try{let N=yield(yield fetch(b,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({installedSDKVersion:s,localSDKVersion:l,env:w})})).json();if(N.code!=="SUCCESS")throw new Error(N.message);this.loaderMetadata=(S=N.data)!=null?S:this.defaultMetadata,localStorage.setItem(tt,JSON.stringify(this.loaderMetadata))}catch(A){console.warn("Failed to fetch loader metadata: ",A)}});console.log("Loading Jolibox SDK..."),this.loaderMetadata=s!=null?s:this.computeLoaderMetaData(),this.loadScript(),this.fetchUpdateLoaderMetadata(),console.log("Jolibox SDK loaded.")}get currentVersion(){return window.__JOLIBOX_LOCAL_SDK_VERSION__}get defaultMetadata(){let s=this.currentVersion,l=ce(s);return{version:s,syncScriptUrl:`https://cdn.jsdelivr.net/npm/@jolibox/web-sync-sdk@${l}/dist/index.iife.js`,asyncScriptUrl:`https://cdn.jsdelivr.net/npm/@jolibox/web-async-sdk@${l}/dist/index.iife.js`}}};window.JoliboxSDKLoader=xe;var Ee=class{constructor(){this.init=s=>{window.joliboxsdk._commandPipe.push({cmd:"ads.init",params:s})};this.adConfig=s=>{window.joliboxsdk._commandPipe.push({cmd:"ads.adConfig",params:s})};this.adBreak=s=>{window.joliboxsdk._commandPipe.push({cmd:"ads.adBreak",params:s})};this.adUnit=s=>ue(this,null,function*(){window.joliboxsdk._commandPipe.push({cmd:"ads.adUnit",params:s})})}};window.JoliboxAds=Ee;var Re=class{constructor(){this.trackEvent=(s,l)=>{if(typeof s!="string")throw new Error("eventName must be a string");if(l!==null&&typeof l!="object"&&l!==void 0)throw new Error("extra must be an object or null or undefined");if(l){for(let w in l)if(typeof l[w]=="object")throw new Error("extra must not have nested objects")}window.joliboxsdk._commandPipe.push({cmd:"analytics.trackEvent",params:[s,l]})}}};window.JoliboxAnalytics=Re;var pt=Ir(nt(),1),xr=Object.defineProperty,Oe=(u,s)=>{for(var l in s)xr(u,l,{get:s[l],enumerable:!0})},Q=(u,s,l)=>new Promise((w,m)=>{var x=g=>{try{_(l.next(g))}catch(S){m(S)}},b=g=>{try{_(l.throw(g))}catch(S){m(S)}},_=g=>g.done?w(g.value):Promise.resolve(g.value).then(x,b);_((l=l.apply(u,s)).next())}),ot={};Oe(ot,{ADVERTISING_ID:()=>ct,DEVICE_ID:()=>ut,getAdvertisingId:()=>lt,getAppVersion:()=>st,getDeviceId:()=>ft,getPlatform:()=>it,getStorage:()=>Te,getUtmSource:()=>dt,platform:()=>oe,xUserAgent:()=>ht});var at={};Oe(at,{isValidUUIDV4:()=>Er,uuidv4:()=>Le});var Le=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,u=>{let s=Math.random()*16|0;return(u==="x"?s:s&3|8).toString(16)}),Er=u=>/^[\da-f]{8}-[\da-f]{4}-4[\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}$/i.test(u),oe={isiOS:navigator.userAgent.includes("iPhone")||navigator.userAgent.includes("iPod")||navigator.userAgent.includes("iPad")||navigator.userAgent.includes("iPhone OS"),iosVersion:()=>{let u=navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);return[parseInt(u[1],10),parseInt(u[2],10),parseInt(u[3]||"0",10)]},isAndroid:navigator.userAgent.includes("Android"),isMac:navigator.userAgent.includes("Mac"),isFacebook:navigator.userAgent.includes("FB_IAB"),isPC:!navigator.userAgent.includes("iPhone")&&!navigator.userAgent.includes("Android")},it=()=>oe.isiOS?"iOS":oe.isAndroid?"Android":oe.isMac?"Mac":oe.isFacebook?"Facebook":"PC",st=()=>window.__JOLIBOX_LOCAL_SDK_VERSION__,ut="device_id",ct="advertising_id",Te=u=>(localStorage.getItem(u)||localStorage.setItem(u,Le()),localStorage.getItem(u)),ft=()=>Te(ut),lt=()=>Te(ct),Rr=u=>u.charAt(0).toUpperCase()+u.slice(1),dt=()=>{var u;let s=new URLSearchParams(window.location.search);return Rr((u=s.get("utm_source"))!=null?u:"")||"JoliboxSDK"},ht=()=>{let u="JoliboxWebSDK",s=it(),l=navigator.language,w=ft(),m=lt(),x=st();return`${u} (${dt()}${s}; UnknownModel; UnknownSystemVersion; ${l}) uuid/${w} adid/${m} version/${x||""}`},Ar;(Ar=AbortSignal.timeout)!=null||(AbortSignal.timeout=function(u){let s=new AbortController;return setTimeout(()=>s.abort(),u),s.signal});var vt=class{constructor(u){this.xua=ht(),this.getGameId=()=>{var m;return(m=new URLSearchParams(window.location.search).get("gameId"))!=null?m:null},this.getJoliSource=()=>{var m;return(m=new URLSearchParams(window.location.search).get("joliSource"))!=null?m:null};var s,l,w;this.baseUrl=(w=(l=u==null?void 0:u.baseUrl)!=null?l:(s=window.joliboxenv)==null?void 0:s.apiBaseURL)!=null?w:"https://api.jolibox.com"}get(u,s){return Q(this,arguments,function*(l,{query:w,headers:m,timeout:x}){let b=new URLSearchParams(w).toString(),_=`${this.baseUrl}${l}${b?`?${b}`:""}`,g=this.xua,S=this.getJoliSource();return m=Object.assign({},m,g?{"x-user-agent":g}:{},S?{"x-joli-source":S}:{}),yield(yield fetch(_,{method:"GET",headers:m,signal:AbortSignal.timeout(x!=null?x:3e4)})).json()})}post(u,s){return Q(this,arguments,function*(l,{data:w,query:m,headers:x,timeout:b}){let _=new URLSearchParams(m).toString(),g=`${this.baseUrl}${l}${_?`?${_}`:""}`,S=this.xua,A=this.getJoliSource();x=Object.assign({},x,{"Content-Type":"application/json"},S?{"x-user-agent":S}:{},A?{"x-joli-source":A}:{});let N=yield fetch(g,{method:"POST",headers:x,body:JSON.stringify(w),signal:AbortSignal.timeout(b!=null?b:3e4)}),v=N.headers.get("content-type");if(v!=null&&v.includes("application/octet-stream"))try{return N.blob()}catch(I){return yield N.arrayBuffer()}if(v!=null&&v.includes("multipart/form-data")||v!=null&&v.includes("application/x-www-form-urlencoded"))try{return N.formData()}catch(I){return yield N.text()}if(v!=null&&v.includes("application/json"))try{return yield N.json()}catch(I){return yield N.text()}return N})}put(u,s){return Q(this,arguments,function*(l,{data:w,query:m,headers:x}){try{let b=new URLSearchParams(m).toString(),_=`${this.baseUrl}${l}${b?`?${b}`:""}`,g=this.xua,S=this.getJoliSource();x=Object.assign({},x,{"Content-Type":"application/json"},g?{"x-user-agent":g}:{},S?{"x-joli-source":S}:{});let A=yield fetch(_,{method:"PUT",headers:x,body:JSON.stringify(w!=null?w:{})});if(!A.ok)throw new Error(`HTTP error! status: ${A.status}`);return yield A.json()}catch(b){throw console.error("Error:",b),b}})}};window.JoliboxHttpClient=vt;var mt={};Oe(mt,{getGameSessionId:()=>Dr});var Dr=()=>{let u=sessionStorage.getItem("gameSessionId");return u||(u=Le(),sessionStorage.setItem("gameSessionId",u)),u},fe=class{};fe.xua=ot,fe.session=mt,fe.uuid=at;window.JoliboxUtil=fe;var Or=(u=>(u.LOAD_START="JOLIBOX_RUNTIME_LOAD_START",u.LOAD_FINISHED="JOLIBOX_RUNTIME_LOAD_FINISHED",u.LOAD_PROGRESS="JOLIBOX_RUNTIME_LOAD_PROGRESS",u))(Or||{});window.dispatchEvent(new Event("JOLIBOX_RUNTIME_LOAD_START"));var Lr=class{constructor(){this.loadFinished=()=>{let u=new Event("JOLIBOX_RUNTIME_LOAD_FINISHED");window.dispatchEvent(u),window.joliboxsdk._commandPipe.push({cmd:"analytics.trackSystemEvent",params:["CallRuntimeLoadFinished"]})},this.notifyLoadProgress=u=>{let s=Math.ceil(u),l=new CustomEvent("JOLIBOX_RUNTIME_LOAD_PROGRESS",{detail:s});window.dispatchEvent(l)}}};window.JoliboxRuntime=Lr;var De="INTERNAL_ERR",Tr=class{constructor(){this.getGameId=()=>{var u;return(u=new URLSearchParams(window.location.search).get("gameId"))!=null?u:""},this.getItem=u=>Q(this,null,function*(){try{let{code:s,data:l,message:w}=yield this.httpClient.get(`/api/games/user-storage/${this.gameId}`,{query:{key:u}}),m=l==null?void 0:l.value;return s!=="SUCCESS"&&(m=yield this.gameStore.getItem(u),console.info("[SDK] cloud storage getItem failed, read from localstorage",m)),{code:s,message:w,data:m!=null?m:null}}catch(s){let l=`[SDK] cloud storage getItem internal error: ${s}`;return console.error(l),{code:"INTERNAL_ERR",message:l}}}),this.setItem=(u,s)=>Q(this,null,function*(){var l,w;try{if(!this.isPrimitiveType(s))throw{code:"PARAMETER_ERROR",message:"[SDK] cloud storage setItem error: typeof value should be number, string or boolean"};if(u.length>128)throw{code:"PARAMETER_ERROR",message:"[SDK] cloud storage setItem error: length of key should be less than 128"};let m=typeof s=="string"?s:String(s);if(u.length+m.length>1024)throw{code:"PARAMETER_ERROR",message:"[SDK] cloud storage setItem error: length of key and value should be less than 1024"};yield this.gameStore.setItem(u,m);let{code:x,message:b}=yield this.httpClient.post(`/api/games/user-storage/${this.gameId}`,{data:{key:u,value:m}});return{code:x,message:b}}catch(m){let x=(l=m.code)!=null?l:De,b=(w=m.message)!=null?w:`${m}`;return console.error(b),{code:x,message:b}}}),this.removeItem=u=>Q(this,null,function*(){try{yield this.gameStore.removeItem(u);let{code:s,message:l}=yield this.httpClient.post(`/api/games/user-storage/${this.gameId}/remove`,{data:{key:u}});return{code:s,message:l}}catch(s){let l=`[SDK] cloud storage removeItem error: ${s}`;return console.error(l),{code:De,message:l}}}),this.clear=()=>Q(this,null,function*(){try{yield this.gameStore.clear();let{code:u,message:s}=yield this.httpClient.post(`/api/games/user-storage/${this.gameId}/clear`,{});return{code:u,message:s}}catch(u){let s=`[SDK] cloud storage clear error: ${u}`;return console.error(s),{code:De,message:s}}}),this.gameId=this.getGameId(),this.httpClient=new vt,this.gameStore=pt.default.createInstance({name:this.gameId.length?this.gameId:"default"})}isPrimitiveType(u){return typeof u=="string"||typeof u=="number"||typeof u=="boolean"}};window.JoliboxCloudStorage=Tr;window.__JOLIBOX_LOCAL_SDK_VERSION__="1.0.17-beta.0";var le=class{constructor({useRuntimeSDK:s=!0,loaderConfig:l,testMode:w,apiBaseURL:m}={}){this.hostToApiMap={default:{test:"https://stg-api.jolibox.com",prod:"https://api.jolibox.com"},"oss.jolibox.com":{test:"https://stg-api.jolibox.com",prod:"https://api.jolibox.com"},"oss.pico-game.com":{test:"https://stg-api.pico-game.com",prod:"https://api.pico-game.com"}};this.setJoliboxEnv=(s,l)=>{var S;let m=typeof window<"u"?new URLSearchParams(window.location.search):null,x=(m==null?void 0:m.get("testMode"))==="true",b=s!=null?s:x,_=m==null?void 0:m.get("apiBaseURL"),g;if(l)g=l;else if(_)g=_;else{let A=(S=this.hostToApiMap[window.location.host])!=null?S:this.hostToApiMap.default;g=b?A.test:A.prod}window.joliboxenv={testMode:b,apiBaseURL:g}};var x,b,_,g,S;this.setJoliboxEnv(w,m),s&&window.joliboxsdk?(this.loader=(x=window.joliboxsdk.loader)!=null?x:new window.JoliboxSDKLoader(l),this.ads=(b=window.joliboxsdk.ads)!=null?b:new window.JoliboxAds,this.anaytics=(_=window.joliboxsdk.anaytics)!=null?_:new window.JoliboxAnalytics,this.runtime=(g=window.joliboxsdk.runtime)!=null?g:new window.JoliboxRuntime,this.storage=(S=window.joliboxsdk.storage)!=null?S:new window.JoliboxCloudStorage):(window.joliboxsdk||(window.joliboxsdk={_commandPipe:[]}),this.loader=new window.JoliboxSDKLoader(l),this.ads=new window.JoliboxAds,this.anaytics=new window.JoliboxAnalytics,this.runtime=new window.JoliboxRuntime,this.storage=new window.JoliboxCloudStorage,window.joliboxsdk=Object.assign(this,window.joliboxsdk)),window.joliboxsdk._commandPipe||(window.joliboxsdk._commandPipe=[])}};window.JoliboxSDK||(window.JoliboxSDK=le);var Qr=le;})();
|
|
2
2
|
/*! Bundled license information:
|
|
3
3
|
|
|
4
4
|
localforage/dist/localforage.js:
|