@givefreely/adunit 1.9.0-dev.0 → 1.9.2-dev.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.
@@ -1 +1 @@
1
- "use strict";class e{constructor(){this.isLocal=!0}log({level:t,message:r,timestamp:i,data:s,title:a}){const n="debug"===t?"log":t,o=a?`[${a}]`:"";void 0!==s?console[n](`[${i}] - ${e.LOGGER_PREFIX} ${o} ${r}`,s):console[n](`[${i}] - ${e.LOGGER_PREFIX} ${o} ${r}`)}}var t,r;e.LOGGER_PREFIX="[GFAdUnit] -",function(e){e.checkoutPopupShown="CHECKOUT-POPUP-SHOWN",e.checkoutPopupNotShown="CHECKOUT-POPUP-NOT-SHOWN",e.checkoutPopupSupressed="CHECKOUT-POPUP-SUPRESSED",e.checkoutPopupDonation="CHECKOUT-POPUP-DONATION",e.checkoutPopupFailedActivation="CHECKOUT-POPUP-FAILED-ACTIVATION",e.checkoutPopupPurchaseConfirmed="CHECKOUT-POPUP-PURCHASE-CONFIRMED",e.checkoutPopupHealthCheck="CHECKOUT-POPUP-HEALTH-CHECK",e.checkouPopupActivationFailed="CHECKOUT-POPUP-ACTIVATION-FAILED",e.checkoutPopupOfferDetailsClicked="CHECKOUT-POPUP-OFFER-DETAILS-CLICKED",e.checkoutPopupWhyAmISeeingThisClicked="CHECKOUT-POPUP-WHY-AM-I-SEEING-THIS-CLICKED",e.checkoutPopupLooserExtension="CHECKOUT-POPUP-LOOSER-EXTENSION",e.checkoutPopupActiveDomain="CHECKOUT-POPUP-ACTIVE-DOMAIN",e.checkoutPopupSiteMatches="CHECKOUT-POPUP-SITE-MATCHES"}(t||(t={})),function(e){e.adUnitLog="ADUNIT-LOG"}(r||(r={}));class i{constructor(e){this.isLocal=!1,this.gfService=e}log({level:e,message:t,data:i,title:s}){this.gfService.trackEvent(r.adUnitLog,{log:{level:e,message:t,data:i,title:s}})}}const s=["debug","info","warn","error"];class a{constructor(t){this.config={minLevel:t?.minLevel??"debug",enabled:t?.enabled??!1,transports:t?.transports??[new e],title:t?.title??""}}static getInstance(e){return a.instance||(a.instance=new a(e)),a.instance}configure(e){this.config={...this.config,...e}}shouldLog(e){return!!this.config.enabled&&s.indexOf(e)>=s.indexOf(this.config.minLevel)}createLogMessage(e,t,r){return{level:e,version:"1.8.3",message:t,timestamp:(new Date).toISOString(),data:r,title:this.config.title}}log(e,t,r,i){if(!this.shouldLog(e))return;const s=this.createLogMessage(e,t,i);this.config.transports.filter((e=>!r||e.isLocal)).forEach((e=>e.log(s)))}debug(e,t,r=!1){this.log("debug",e,r,t)}info(e,t,r=!1){this.log("info",e,r,t)}warn(e,t,r=!1){this.log("warn",e,r,t)}error(e,t,r=!1){this.log("error",e,r,t)}addTransport(e){this.config.transports.push(e)}clearTransports(){this.config.transports=[]}disable(){this.config.enabled=!1}enable(){this.config.enabled=!0}}const n=3,o=e=>1e3*e;async function c(e,t={},r){const{maxAttempts:i=n,delayFn:s=o}=t;let a=null;for(let t=1;t<=i;t+=1)try{return await e()}catch(e){a=e,t<i&&await new Promise((e=>{setTimeout(e,s(t))}))}if(a&&t.logger&&t.operationName&&t.logger.error(`Operation ${t.operationName} failed after ${i} attempts.`,a),void 0!==r)return r;throw a||new Error("Operation failed after multiple attempts")}const g=chrome;function l(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var h={exports:{}};"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self&&self,function(e){if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)e.exports=globalThis.browser;else{const t="The message port closed before a response was received.",r=e=>{const r={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(0===Object.keys(r).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class i extends WeakMap{constructor(e,t=void 0){super(t),this.createItem=e}get(e){return this.has(e)||this.set(e,this.createItem(e)),super.get(e)}}const s=(t,r)=>(...i)=>{e.runtime.lastError?t.reject(new Error(e.runtime.lastError.message)):r.singleCallbackArg||i.length<=1&&!1!==r.singleCallbackArg?t.resolve(i[0]):t.resolve(i)},a=e=>1==e?"argument":"arguments",n=(e,t,r)=>new Proxy(t,{apply:(t,i,s)=>r.call(i,e,...s)});let o=Function.call.bind(Object.prototype.hasOwnProperty);const c=(e,t={},r={})=>{let i=Object.create(null),g={has:(t,r)=>r in e||r in i,get(g,l,h){if(l in i)return i[l];if(!(l in e))return;let d=e[l];if("function"==typeof d)if("function"==typeof t[l])d=n(e,e[l],t[l]);else if(o(r,l)){let t=((e,t)=>function(r,...i){if(i.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${a(t.minArgs)} for ${e}(), got ${i.length}`);if(i.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${a(t.maxArgs)} for ${e}(), got ${i.length}`);return new Promise(((a,n)=>{if(t.fallbackToNoCallback)try{r[e](...i,s({resolve:a,reject:n},t))}catch(s){console.warn(`${e} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,s),r[e](...i),t.fallbackToNoCallback=!1,t.noCallback=!0,a()}else t.noCallback?(r[e](...i),a()):r[e](...i,s({resolve:a,reject:n},t))}))})(l,r[l]);d=n(e,e[l],t)}else d=d.bind(e);else if("object"==typeof d&&null!==d&&(o(t,l)||o(r,l)))d=c(d,t[l],r[l]);else{if(!o(r,"*"))return Object.defineProperty(i,l,{configurable:!0,enumerable:!0,get:()=>e[l],set(t){e[l]=t}}),d;d=c(d,t[l],r["*"])}return i[l]=d,d},set:(t,r,s,a)=>(r in i?i[r]=s:e[r]=s,!0),defineProperty:(e,t,r)=>Reflect.defineProperty(i,t,r),deleteProperty:(e,t)=>Reflect.deleteProperty(i,t)},l=Object.create(e);return new Proxy(l,g)},g=e=>({addListener(t,r,...i){t.addListener(e.get(r),...i)},hasListener:(t,r)=>t.hasListener(e.get(r)),removeListener(t,r){t.removeListener(e.get(r))}}),l=new i((e=>"function"!=typeof e?e:function(t){const r=c(t,{},{getContent:{minArgs:0,maxArgs:0}});e(r)})),h=new i((e=>"function"!=typeof e?e:function(t,r,i){let s,a,n=!1,o=new Promise((e=>{s=function(t){n=!0,e(t)}}));try{a=e(t,r,s)}catch(e){a=Promise.reject(e)}const c=!0!==a&&((g=a)&&"object"==typeof g&&"function"==typeof g.then);var g;if(!0!==a&&!c&&!n)return!1;return(c?a:o).then((e=>{i(e)}),(e=>{let t;t=e&&(e instanceof Error||"string"==typeof e.message)?e.message:"An unexpected error occurred",i({__mozWebExtensionPolyfillReject__:!0,message:t})})).catch((e=>{console.error("Failed to send onMessage rejected reply",e)})),!0})),d=({reject:r,resolve:i},s)=>{e.runtime.lastError?e.runtime.lastError.message===t?i():r(new Error(e.runtime.lastError.message)):s&&s.__mozWebExtensionPolyfillReject__?r(new Error(s.message)):i(s)},m=(e,t,r,...i)=>{if(i.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${a(t.minArgs)} for ${e}(), got ${i.length}`);if(i.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${a(t.maxArgs)} for ${e}(), got ${i.length}`);return new Promise(((e,t)=>{const s=d.bind(null,{resolve:e,reject:t});i.push(s),r.sendMessage(...i)}))},u={devtools:{network:{onRequestFinished:g(l)}},runtime:{onMessage:g(h),onMessageExternal:g(h),sendMessage:m.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:m.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},f={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return r.privacy={network:{"*":f},services:{"*":f},websites:{"*":f}},c(e,u,r)};e.exports=r(chrome)}}(h);var d=l(h.exports);class m{constructor(e,t,r,i,s){this.wfSecret=e,this.wfAppId=t,this.deviceUrl=r,this.dataUrl=i,this._logger=s}async getWildfireDevice(){try{const e=await fetch(this.deviceUrl,{method:"POST",body:JSON.stringify({}),headers:{"Content-Type":"application/json","WF-Secret":this.wfSecret,"WF-App-ID":this.wfAppId}});if(e.ok)return e.json();throw new Error(`Failed to fetch Wildfire device from ${this.deviceUrl}. Status ${e.status}. ${e.statusText}`)}catch(e){throw this._logger.error("Failed to fetch the Wildfire device",{err:e}),e}}async getActiveDomains(){try{const e=`${this.dataUrl}/${this.wfAppId}/active-domain/1`,t=await fetch(e);if(t.ok)return t.json();throw new Error(`Failed to fetch active domains from ${e}. Status ${t.status}. ${t.statusText}`)}catch(e){throw this._logger.error("Failed to fetch the active domains",{err:e}),e}}async getStanddownPolicy(){const e=`${this.dataUrl}/${this.wfAppId}/stand-down-policy/1`;try{const t=await fetch(e);if(t.ok)return t.json();throw new Error(`Failed to fetch standdown policy from ${e}. Status ${t.status} ${t.statusText}`)}catch(t){throw this._logger.error("Failed to fetch the standdown policy",{err:t,url:e}),t}}async getMerchantRates(){const e=`${this.dataUrl}/${this.wfAppId}/merchant-rate/1`;try{const t=await fetch(e);if(this._logger.debug("Merchant rates response",{response:t}),!t.ok)throw new Error(`Failed to fetch merchant rates from ${e}. Status ${t.status}. ${t.statusText}`);const r=t.json();return this._logger.debug("Merchant rates",{rates:r}),r}catch(t){throw this._logger.error("Failed to fetch the merchant rates",{err:t,url:e}),t}}}const u="GIVE_FREELY_",f={async get(e){const t=`${u}${e}`;return(await d.storage.local.get(t))[t]||null},async set(e,t){const r=`${u}${e}`;await d.storage.local.set({[r]:t})},async remove(e){const t=Array.isArray(e)?e.map((e=>`${u}${e}`)):`${u}${e}`;await d.storage.local.remove(t)}},A="wfDevice",p="wfDomains",y="wfStanddownPolicy",w="wfStanddownHistory",v="wfMerchantRates";async function x(e,t,r){try{const i=(await b())?.[t];if(i&&i>Date.now())return e.info("Standing down because current affiliate stand down session has not expired"),S(t),!0;await this.refreshCache();const s=await this.getStanddownPolicy();if(I(s,new URL(r).search))return e.info("Standing down because url has affiliate params"),S(t),!0;e.info("No need to stand down.")}catch(t){e.error("Exception produced when trying to determine if it should stand down",t)}return!1}function E(e,t){if(!this.standDownPolicy)return this.logger.warn("Couldnt check affilliation. No stand down policy found"),this.getStanddownPolicy().then((e=>{this.standDownPolicy=e})),!1;const r=e.some((e=>C(this.standDownPolicy,e)))||I(this.standDownPolicy,t);return this.logger.info("Affilliation result:",r),r}const b=async()=>f.get(w),S=async(e,t=1)=>{const r=await b()??{};r[e]=Date.now()+60*t*60*1e3,await f.set(w,r)},C=(e,t)=>{if(!t)return!1;const{Domains:r}=e;return r.some((e=>t.includes(e)))},I=(e,t)=>{if(!t)return!1;const{Params:r}=e;return r.some((e=>t.toLowerCase().includes(`?${e.toLowerCase()}`)))||r.some((e=>t.toLowerCase().includes(`&${e.toLowerCase()}`)))};class T{constructor(e,t,r,i){this.userId=e,this.charityEin=t,this.charityThirdPartyIdentifier=r,this.partnerId=i}toString(){return`userId=${this.encodeUserId(this.userId)},charityEin=${this.charityEin},charityThirdPartyIdentifier=${this.charityThirdPartyIdentifier},partnerId=${this.partnerId}`}encodeUserId(e){return btoa(e).replace(/_/g,"/").replace(/-/g,"+")}}const P="TRACK_EVENT",U="GF_HIDE_POPUP",O="GF_GET_POPUP_CONFIG",F="GF_IS_ACTIVE_DOMAIN",D="GF_SHOULD_STAND_DOWN",_="GF_ACTIVATE_OFFER",k="GF_STORE_SHOPIFY_SHOP_ID",R="GF_GET_DOMAIN_BY_SHOP_ID",$="GF_GET_LANGUAGE_CONTENT",L="shopify_shop_ids",N="gf_last_health_check",G="en",M={async get(e,t,r,i=!1){let s=await f.get(e);const a=s;let n=!1;if(s&&Date.now()<=s.expiration&&!i)return{content:s.content,isStale:n};try{const i=await t();s=await this.set(e,i,r)}catch(e){n=!0}return{content:s?.content??a?.content,isStale:n}},async set(e,t,r){const i={content:t,expiration:Date.now()+1e3*(r??300)};return await f.set(e,i),i},async refresh(e,t,r,i=!1){const s=await this.get(e,t,r,i);if(s.isStale||i)try{const i=await t();if(!i)return{content:s.content,isStale:!0};s.content=i,await this.set(e,s.content,r)}catch(e){return{content:s.content,isStale:!0}}return{content:s.content,isStale:!1}},async clear(e){await f.remove(e)}};class K{constructor(e,t,r,i=21600){if(this.standDownPolicy=null,this.shouldStandDown=x.bind(this),this.hasAffilliation=E.bind(this),!e||!r)throw new Error("WildfireService requires wildfireClient and vanityBaseUrl");this.wildfireClient=e,this.vanityBaseUrl=r.replace(/\/$/,""),this.refreshInterval=i,this.logger=t}async getActiveDomains(e=!1){try{const t=(await M.get(p,(async()=>this.fetchActiveDomains()),this.refreshInterval,e)).content;if(!t)throw Error("Failed to retrieve active domains");return t}catch(e){throw this.logger.error("Failed to get active domains:",e),new Error("Failed to retrieve active domains")}}async getMerchantRates(e,t=!1){try{const r=await M.get(v,(async()=>this.fetchMerchantRates()),this.refreshInterval,t);if(!r.content)throw new Error("Failed to retrieve merchant rates from cache");return r.content[e]}catch(e){throw this.logger.error("Failed to retrieve merchant rates:",e),new Error("Failed to retrieve merchant rates")}}async generateAffiliateUrl(e,t,r,i){if(!e||!t||!i)throw new Error("Missing required parameters for affiliate URL generation");try{const s=await this.getDevice(),a=await this.generateTrackingCode(r,i,s),n=encodeURIComponent(t),o=encodeURIComponent(a);return`${this.vanityBaseUrl}/e?d=${s.DeviceID}&c=${e.ID}&tc=${o}&url=${n}`}catch(e){throw this.logger.error("Failed to generate affiliate URL:",e),new Error("Failed to generate affiliate URL")}}async clearCache(){try{await Promise.all([M.clear(p),M.clear(y),M.clear(v)])}catch(e){throw this.logger.error("Failed to clear cache:",e),new Error("Failed to clear cache")}}async refreshCache(e=!1){try{const[,t]=await Promise.all([M.refresh(p,(()=>this.fetchActiveDomains()),this.refreshInterval,e),M.refresh(y,(()=>this.fetchStanddownPolicy()),this.refreshInterval,e),M.refresh(v,(()=>this.fetchMerchantRates()),this.refreshInterval,e)]);t?.content&&(this.standDownPolicy=t.content)}catch(e){throw this.logger.error("Failed to refresh cache:",e),new Error("Failed to refresh cache")}}async getStanddownPolicy(){try{const e=await M.get(y,(async()=>this.fetchStanddownPolicy()),this.refreshInterval);if(!e.content)throw new Error("Failed to retrieve standdown policy from cache");return this.logger.info("Retrieved standdown policy from cache",e.content),this.standDownPolicy=e.content,this.standDownPolicy}catch(e){throw this.logger.error("Failed to get standdown policy from cache:",e),new Error("Failed to retrieve standdown policy")}}getRetryOptions(e){return{delayFn:e=>1e3*e,maxAttempts:3,logger:this.logger,operationName:e}}async getDevice(){try{const e=await f.get(A);return e?.DeviceID?e:c((()=>this.fetchAndStoreDevice()),this.getRetryOptions("Get Device"))}catch(e){throw this.logger.error("Failed to get device:",e),new Error("Failed to retrieve device information")}}async fetchAndStoreDevice(){const e=await this.wildfireClient.getWildfireDevice();if(!e?.DeviceID)throw new Error("Failed to retrieve device information");return await f.set(A,e),e}async generateTrackingCode(e,t,r){if(!(e?.id&&e?.charity&&e?.charity.ein&&e?.charity.thirdPartyId)){const e=`notregistered-${r.DeviceID}`;return this.logger.info("User not provided. Using GF's default bucket instead.",e),e}return new T(e.id,e.charity.ein,e.charity.thirdPartyId,t).toString()}async fetchActiveDomains(){const e=await c((()=>this.wildfireClient.getActiveDomains()),this.getRetryOptions("Fetch Active Domains"));return this.logger.info("Updated active domains"),e}async fetchStanddownPolicy(){const e=await c((()=>this.wildfireClient.getStanddownPolicy()),this.getRetryOptions("Get Standdown policy"),{Domains:[],LostAttribution:[],Params:[],Serp:[]});return this.logger.info("Updated standdown policy"),e}async fetchMerchantRates(){const e=await c((()=>this.wildfireClient.getMerchantRates()),this.getRetryOptions("Fetch Merchant Rates"),{});return this.logger.debug("Updated Merchant rates"),e}}const H="version",z=()=>String("1.8.3"),j=async(e=!0)=>{const t=await f.get(H),r=await z(),i=t!==r;var s;return e&&i&&await(s=r,f.set(H,s)),i},W="https://cdn.givefreely.com/adunit/behavioral/";class Y{constructor(e){this.partnerApiKey=e,this.partnerConfig=null,this.globalConfig=null,this.PARTNER_CONFIG_STORAGE_KEY="gf_partner_config",this.GLOBAL_CONFIG_STORAGE_KEY="gf_global_config",this.globalConfigRefreshInterval=60,this.partnerConfigRefreshInterval=60}getRetryOptions(){return{delayFn:e=>1e3*e,maxAttempts:3}}async fetchPartnerConfig(){const e=await c((async()=>{const e=await fetch(`${W}${this.partnerApiKey}.json`,{cache:"no-store"});if(!e.ok)throw new Error(`Failed to fetch partner config: ${e.statusText}`);return e.json()}),this.getRetryOptions());if(!e)throw new Error("Failed to fetch or get from cache partner config");return this.partnerConfigRefreshInterval=e.configRefreshInterval||this.partnerConfigRefreshInterval,e}async fetchGlobalConfig(){const e=await c((async()=>{const e=await fetch(`${W}global.json`,{cache:"no-store"});if(!e.ok)throw new Error(`Failed to fetch global config => Status code: ${e.status} .${e.statusText}`);return e.json()}),this.getRetryOptions());if(!e)throw new Error("Failed to fetch or get from cache global config",e);return this.globalConfigRefreshInterval=e.configRefreshInterval||this.globalConfigRefreshInterval,e}async getConfig(e=!1){let t=!1;e&&(t=await j());const[r,i]=await Promise.all([await M.get(this.PARTNER_CONFIG_STORAGE_KEY,this.fetchPartnerConfig.bind(this),this.partnerConfigRefreshInterval,t),await M.get(this.GLOBAL_CONFIG_STORAGE_KEY,this.fetchGlobalConfig.bind(this),this.globalConfigRefreshInterval,t)]);if(!i.content)throw new Error("Global config is required");if(!r.content)throw new Error("Partner config is required");this.partnerConfig=r.content,this.globalConfig=i.content;const s=this.mergeConfigs(JSON.parse(JSON.stringify(this.globalConfig)),JSON.parse(JSON.stringify(this.partnerConfig)));if(!s)throw new Error("Was not able to merge configs");return((e,t,r)=>{const i=[...t.merchantExclusions??[],...r.merchantExclusions??[]];e.merchantExclusions=i})(s,this.globalConfig,this.partnerConfig),s}async clearCache(){await Promise.all([M.clear(this.PARTNER_CONFIG_STORAGE_KEY),M.clear(this.GLOBAL_CONFIG_STORAGE_KEY)]),this.partnerConfig=null,this.globalConfig=null}mergeConfigs(e,t){if(!t)return e;if(!e)return t;const r={...e};return Object.keys(t).forEach((i=>{if(!Object.prototype.hasOwnProperty.call(t,i))return;const s=e[i],a=t[i];void 0!==a&&(Array.isArray(a)?r[i]=[...a]:r[i]=null===a||"object"!=typeof a||null===s||"object"!=typeof s?a:this.mergeConfigs(s,a))})),r}}class B{static register(e,t){this.strategies.set(e,t)}static get(e){return this.strategies.get(e)}static exists(e){return!!function(e){return"object"==typeof e&&null!==e&&"type"in e&&"payload"in e&&"string"==typeof e.type}(e)&&this.strategies.has(e.type)}}B.strategies=new Map;class q{async handle(e,t){const{hostname:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger(),a=await i.getConfig().merchantExclusions,n=await i.getActiveDomains();s.debug("Checking hostname",{hostname:r});try{if(i.healthCheck(),a.some((e=>e.disableDomain&&(r===e.domain||r.endsWith(`.${e.domain}`)))))return s.debug("Hostname is in merchant exclusions",{hostname:r}),{type:F,payload:{isActive:!1,domain:void 0,rates:[]}};if(!n||0===n.length)throw new Error("No active domains");s.debug("Retrieved active domains",{count:n.length});const e=n.find((e=>r===e.Domain||r.endsWith(`.${e.Domain}`)));s.debug("Domain check result",{hostname:r,isActive:!!e});let t=[];if(e?.ID){const r=await i.getMerchantRates(e.Merchant.ID);r&&(s.debug("Retrieved merchant rates",{merchantRates:r}),t=r)}return{type:F,payload:{isActive:!!e,domain:e,rates:t}}}catch(e){return s.error("Error checking domain",{hostname:r,error:e}),{type:F,payload:{isActive:!1,domain:void 0,rates:[]}}}}}class V{async handle(e,t){const{giveFreelyService:r}=t,i=r.getLogger(),s=await r.getCachedConfig();try{return i.debug("Fetching popup config"),{type:O,payload:{config:s}}}catch(e){return i.error("Error fetching popup config",{error:e}),{type:O,payload:{config:null}}}}}class X{async handle(e,t){const{days:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger();try{const e=new Date;return e.setDate(e.getDate()+r),await f.set("popup_hide",{popupHide:e.getTime()}),s.debug("Popup hidden",{days:r,expiry:e}),{type:U,payload:{ack:!0}}}catch(e){return s.error("Error hiding popup",{days:r,error:e}),{type:U,payload:{ack:!1}}}}}class J{async handle(e,t){const{activeDomain:r,url:i}=e.payload,{giveFreelyService:s}=t,a=s.getLogger();a.debug("Checking if we should stand down",{activeDomain:r});try{const e=await s.shouldStandDown(r,i);return{type:D,payload:{result:e}}}catch(e){return a.error("Error checking if we should stand down. Returning false",{activeDomain:r,error:e}),{type:D,payload:{result:!1}}}}}class Z{constructor(e,t,r,i=60){this.track=async(e,t,r,i=!1)=>{const s={partner:`adUnit_${this._partnerApiKey}`,eventType:e,eventData:{userId:i?void 0:this._userService?.user?.id,libVersion:z(),wfDeviceId:t,...r}};try{const e=JSON.stringify(s,((e,t)=>t instanceof Error?{name:t.name,message:t.message,stack:t.stack}:t)),t=await this.getEventsUrl();if(await this.shouldBroadcastEvent(e)){const r=await fetch(t,{headers:{"Content-Type":"application/json"},method:"POST",body:e,cache:"no-store"});return r.ok?(await this.pushEventToHistory(e),!0):(this._logger.error("Something unexpected happened when dispatching an event",{status:r.status,statusText:r.statusText,event:s},!0),!1)}return this._logger.info("This event has already been broadcasted during the past hour",s,!0),!1}catch(e){return this._logger.error("Something unexpected happened when dispatching a gf event",{error:e,event:s}),!1}},this.getEventsHistory=async()=>{const{GF_AD_EVENT_HISTORY:e}=await g.storage.local.get({GF_AD_EVENT_HISTORY:""}),t=(e=>{const t=new Date;return t.setTime(t.getTime()+60*e*1e3),t.getTime()})(-this._debounceWindowInMinutes),r=(e||[]).filter((e=>e.createdAt>t));return await g.storage.local.set({GF_AD_EVENT_HISTORY:r}),r},this.shouldBroadcastEvent=async e=>!(await this.getEventsHistory()).some((t=>t.payload===e)),this.pushEventToHistory=async e=>{const t=await this.getEventsHistory();t.push({createdAt:Date.now(),payload:e}),await g.storage.local.set({GF_AD_EVENT_HISTORY:t})},this._partnerApiKey=e,this._userService=t,this._debounceWindowInMinutes=i,this._logger=a.getInstance({title:"Analytics"}),this._configService=r}async getEventsUrl(){const{eventsUrl:e}=await this._configService.getConfig();return e}}Z.trackEvent=async(e,t,r=!1)=>{await async function(e){return new Promise(((t,r)=>{try{const i=i=>chrome.runtime.lastError?r({error:chrome.runtime.lastError,message:e}):t(i);g.runtime.sendMessage(e,i)}catch(e){r(e)}}))}({type:P,payload:{eventType:e,eventData:t,anonymous:r}})};class Q{async handle(e,t){const{eventType:r,eventData:i,anonymous:s}=e.payload,{giveFreelyService:a}=t,n=a.getLogger();n.debug("Broadcasting event",{eventType:r,eventData:i,anonymous:s});try{const e=await a.trackEvent(r,i,s);return{type:P,payload:{result:e}}}catch(e){return n.error("Error broadcasting event. Returning false",{eventType:r,eventData:i,error:e}),{type:P,payload:{result:!1}}}}}class ee{async handle(e,r){const{activeDomain:i,originalUrl:s,selectedCharity:a}=e.payload,{giveFreelyService:n}=r,o=n.getLogger();o.debug("Activating offer",{activeDomain:i,selectedCharity:a});try{if(!a?.ein||!a?.thirdPartyId)throw new Error("Missing charity information");const e=await n.initializeWfDeviceId();if(!e)throw new Error("Failed to initialize Wildfire device ID");const t=await n.upsertUser(a,e);o.debug("Upserted user",{currentUser:t}),t||o.info("Failed to create user. Using default bucket's user");const r=await n.generateAffiliateUrl(i,s,t);return o.debug("Generated affiliate URL",{affiliateUrl:r}),(async e=>{const t=g.tabs.getCurrent(),r=await t,i=await g.tabs.create({url:e,openerTabId:r?.id,active:!1,pinned:!0});await(async e=>new Promise((t=>{g.tabs.onUpdated.addListener((async function r(i,s){if(i===e&&"complete"===s.status){if(g.tabs.onUpdated.removeListener(r),!(await g.tabs.get(e)).url)return void t(!1);t(!0)}}))})))(i.id)&&setTimeout((()=>{i?.id&&g.tabs.remove(i.id)}),3e4)})(r),await n.updateStanddownHistory(i.Domain),o.debug("Activated offer",{activeDomain:i,selectedCharity:a}),{type:_,payload:{response:!0}}}catch(e){return o.error("Error activating offer",{activeDomain:i,error:e}),n.trackEvent(t.checkoutPopupFailedActivation,{activeDomain:i,error:e}),{type:_,payload:{response:!1}}}}}var te;!function(e){e[e.Pending=0]="Pending",e[e.Ready=1]="Ready",e[e.Received=2]="Received",e[e.Donated=3]="Donated",e[e.Disqualified=4]="Disqualified"}(te||(te={}));class re{constructor(e,t,r){this.adUnitId=e,this.config=t,this.logger=r}async getAnonymousUserCommissions(e,t){try{const r=new URLSearchParams(t).toString(),i=await fetch(`${this.config.apiConfig.baseUri}/${this.config.apiConfig.getAnonymousUserComissionsPath}?${r}`,{method:"GET",headers:{"Content-Type":"application/json","X-AnonymousUserToken":e}});if(!i.ok)throw new Error(`Failed to fetch commissions. Status code: ${i.status} .${i.statusText}`);return await i.json()}catch(e){throw this.logger.error("[GiveFreelyApiClient] Error fetching anonymous user's commissions:",{error:e}),e}}async createOrUpdateAnonymousUser(e,t){try{const r=await fetch(`${this.config.apiConfig.baseUri}/${this.config.apiConfig.createAnonymousUserPath}?adUnitId=${this.adUnitId}`,{method:"PUT",headers:{"Content-Type":"application/json","X-GF-Platform":"adUnitLibrary","X-AnonymousUserToken":t??""},body:JSON.stringify(e)});if(!r.ok)throw new Error(`Failed to create/update anonymous user. Status code: ${r.status} .${r.statusText}`);this.logger.info("[GiveFreelyApiClient] anonymous user created/updated successfully.");const i=await r.json(),s=r.headers.get("X-AnonymousUserToken");return{resultUser:{...i,charity:{ein:i.selectedCharity,thirdPartyId:i.selectedCharityThirdPartyIdentifier,name:void 0}},resultToken:s}}catch(e){throw this.logger.error("[GiveFreelyApiClient] Error creating anonymous user:",{error:e}),e}}}class ie{constructor(e,t){this.ANONYMOUS_USER_STORAGE_KEY="gf_anonymous_user_info",this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY="gf_anonymous_encrypted_token",this._giveFreelyApiClient=e,this._logger=t,this.user=null}async resetUser(){await f.remove(this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY),await f.remove(this.ANONYMOUS_USER_STORAGE_KEY)}async upsertUser(e,t){let r=await this.fetchUser();try{const i={selectedCharity:e?.ein,selectedCharityThirdPartyIdentifier:e?.thirdPartyId,deviceId:t};if(!await this.shouldCreateOrUpdateUser(r,i))return r;const s=await f.get(this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY),{resultUser:a,resultToken:n}=await this._giveFreelyApiClient.createOrUpdateAnonymousUser(i,s);n&&await f.set(this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY,n),a&&(await f.set(this.ANONYMOUS_USER_STORAGE_KEY,a),r=a)}catch(e){this._logger.error("Error creating/updating anonymous user:",e)}return this.user=r,r}async fetchUser(){const e=await f.get(this.ANONYMOUS_USER_STORAGE_KEY);return this.user=e,e}async shouldCreateOrUpdateUser(e,t){return!e||e.charity?.ein!==t.selectedCharity||e.charity?.thirdPartyId!==t.selectedCharityThirdPartyIdentifier||e.deviceId!==t.deviceId}}const se=e=>{try{return new URL(e),!0}catch{return!1}},ae=new Set,ne=new Set,oe={urls:["<all_urls>"],types:["main_frame"]};class ce{async handle(e,t){const r=e.payload,{giveFreelyService:i}=t,s=i.getLogger();try{const e=L,t=await f.get(e)||[],i=t.findIndex((e=>e.shopId===r.shopId));return i>=0?t[i]=r:t.push(r),await f.set(e,t),s.debug("Stored Shopify shop ID",{shopInfo:r}),{type:k,payload:{success:!0}}}catch(e){return s.error("Error storing Shopify shop ID",{shopInfo:r,error:e}),{type:k,payload:{success:!1}}}}}class ge{async handle(e,t){const{shopId:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger();try{const e=L,t=(await f.get(e)||[]).find((e=>e.shopId===r));return t?(s.debug("Found domain for shop ID",{shopId:r,domain:t.domain}),{type:R,payload:{found:!0,domain:t.domain,shopInfo:t}}):(s.debug("No domain found for shop ID",{shopId:r}),{type:R,payload:{found:!1}})}catch(e){return s.error("Error getting domain for shop ID",{shopId:r,error:e}),{type:R,payload:{found:!1}}}}}class le{constructor(e,t){this.lastCheck=null,this.trackEvent=e,this.logger=t}async initialize(){const e=await f.get(N);e&&(this.lastCheck=e)}getToday(){return(new Date).toISOString().split("T")[0]}async check(){try{const e=this.lastCheck??0,r=this.getToday();(e?new Date(e).toISOString().split("T")[0]:null)!==r&&(this.lastCheck=Date.now(),await f.set(N,this.lastCheck),await this.trackEvent(t.checkoutPopupHealthCheck,{language:chrome.i18n.getUILanguage()}))}catch(e){this.logger.error("Health check failed",{error:e instanceof Error?e.message:"Unknown error"})}}}const he=a.getInstance(),de="countryCode";class me{async handle(e,t){const{lang:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger();s.debug("Getting language strings",{lang:r});try{const e=await i.getLanguage(r);return s.debug("Language strings fetched",{language:e}),{type:$,payload:{translations:e.translations,charities:e.charities}}}catch(e){return s.error("Error getting language strings",{error:e}),{type:$,payload:{translations:null,charities:null}}}}}const ue="https://cdn.givefreely.com/adunit/language",fe=async(e,t,r,i,s=!1)=>{const a=`lang-${G}`,n=await M.get(a,(async()=>(e.debug(`Fetching default language ${G} for partner ${t}`),Ae(e,t,G))),i||60,s);if(!n.content)throw new Error(`Failed to fetch default language ${G} and no cache version available`);if(G===r)return n.content;const o=`lang-${r}`,c=await M.get(o,(async()=>(e.debug(`Fetching language ${r} for partner ${t}`),Ae(e,t,r))),i||60,s);if(!c.content)return n.content;const g=we(n.content,c.content);return await M.set(o,g,i||60),g},Ae=async(e,t,r)=>{const i=`/global-${r}.json`,s=`/${t}/${r}.json`,[a,n]=await Promise.allSettled([pe(`${ue}${i}`),pe(`${ue}${s}`)]);let o,c;if("fulfilled"!==a.status)throw e.error(`Failed to fetch global language file: ${a.reason}`),new Error(`Failed to fetch global language file: ${a.reason}`);o=a.value,"fulfilled"===n.status?c=n.value:e.error(`Failed to fetch partner language file ${n.reason}. Using global language file only`);let g=o;return c&&(g=ye(o,c)),{translations:g.translations,charities:g.charities}},pe=async e=>{const t=await fetch(e,{cache:"no-store"});if(!t.ok)throw new Error(`Failed to fetch partner language file ${e}. Status: ${t.status}. Reason: ${t.statusText}`);return t.json()},ye=(e,t)=>({translations:{...e.translations,...t},charities:{...e.charities}}),we=(e,t)=>({translations:{...e.translations,...t.translations},charities:{...e.charities,...t.charities}});class ve extends Error{constructor(e="Service not initialized"){super(e),this.name="UninitializedServiceError"}}exports.GiveFreelyService=class{constructor(e){this.partnerApiKey=e,this.dependencies={configService:new Y(e)},this.logger=a.getInstance(),this.logger.configure({enabled:!0,title:"Background - GiveFreelyService"}),this.state={initialized:!1,wildfireService:null,partnerFilter:null,config:null,wfDeviceId:null,analytics:null,giveFreelyUserService:null,partnerApiKey:e,healthCheck:null}}assertInitialized(){if(!this.state.initialized)throw new ve}async initialize(e=async()=>(this.logger.debug("Using default partnerFilter."),!0)){if(!this.state.initialized)try{const t=await this.dependencies.configService.getConfig(!0);this.logger.configure({minLevel:t.backgroundMinLogLevel??"error"}),this.logger.info("Initializing GiveFreelyService",{partnerApiKey:this.partnerApiKey});const r=this.createWildfireService(t);this.state.healthCheck=new le(this.trackEvent.bind(this),this.logger),await this.state.healthCheck.initialize();const s=await j();await r.refreshCache(s);const n=new re(this.partnerApiKey,t,this.logger);this.state.giveFreelyUserService=new ie(n,this.logger),await this.state.giveFreelyUserService.fetchUser(),this.state.giveFreelyUserService.user?.id||await this.state.giveFreelyUserService.upsertUser();try{await(async()=>await f.get(de)||(async()=>{he.debug("detecting country");const e={method:"GET",headers:{"Content-Type":"application/json",Authorization:"Basic OTEzOTkxOnFlYmpaWF9DOGNRY0lxSHA4WTVjNGxzU1pRSlM2VW9MMExzTF9tbWs="}};try{const t=await fetch("https://geoip.maxmind.com/geoip/v2.1/country/me",e);if(he.debug("Received geolocation response",{status:t.status}),!t.ok)return void he.error("Failed to get geolocation data",{status:t.status,statusText:t.statusText});const r=await t.json();if(!r)throw new Error("There was an error fetching geoip look up");return await f.set(de,r.country.iso_code),r.country.iso_code}catch(e){return void he.error("Failed to get geolocation data",{error:e})}})())()}catch(e){this.logger.debug("Failed to get geolocation data",{error:e})}this.state.analytics=new Z(this.partnerApiKey,this.state.giveFreelyUserService,this.dependencies.configService),this.logger.addTransport(new i(this)),B.register(F,new q),B.register(O,new V),B.register(U,new X),B.register(D,new J),B.register(P,new Q),B.register(_,new ee),B.register(k,new ce),B.register(R,new ge),B.register($,new me),this.state.wildfireService=r,this.state.partnerFilter=e,this.state.config=t,this.state.initialized=!0,d.webRequest&&(d.webRequest.onBeforeRequest.addListener((e=>{const t=e.getLogger();return({requestId:r,url:i,initiator:s})=>{try{if(ae.has(r)||ne.has(r)||!se(i))return;const{hostname:a,search:n}=new URL(i);if(a.includes("wild.link"))return t.info("Cashback activation request identified, ignoring affiliate check for request"),void ne.add(r);let o;s&&se(s)&&(o=new URL(s).hostname),e.hasAffiliation([a,o],n)&&(t.info("Affiliation found on url, adding request id to track"),ae.add(r))}catch(e){t.error("Error on handleAffiliateOnBeforeRequest",e)}}})(this),oe),d.webRequest.onBeforeRedirect.addListener((e=>{const t=e.getLogger();return async({requestId:r,redirectUrl:i})=>{try{if(!ae.has(r))return;t.info("Attempting to find active domain");const{hostname:s}=new URL(i),a=(await e.getActiveDomains()).find((e=>s===e.Domain||s.endsWith(`.${e.Domain}`)));if(!a)return;t.info("Found active domain. Updating standdown state"),await S(a.Domain)}catch(e){t.error("Error on handleAffiliateOnBeforeRedirect",e)}}})(this),oe),d.webRequest.onCompleted.addListener((()=>{const e=this.getLogger();return({requestId:t})=>{try{ae.has(t)&&(e.info("Tracking request completed. Request Id:",t),ae.delete(t))}catch(t){e.error("Error on handleAffiliateOnCompleted",t)}}})(),oe)),function(e){const t=a.getInstance();g.runtime.onMessage.addListener(((r,i,s)=>{function a(e){s(e)}const n=e(r,0);return n instanceof Promise?(n.then((e=>{e&&a(e)})).catch((e=>{t.warn("Async message callback error:",e)})),!0):n}))}((async(e,t)=>(this.logger.debug("Received message",{type:e.type,payload:e.payload}),this.handleMessage(e)))),t.purgeLanguages&&t.purgeLanguages.length>0&&await Promise.all(t.purgeLanguages.map((e=>M.clear(`lang-${e}`)))),c((async()=>{this.logger.debug("Initializing default language with partner API key",{partnerApiKey:this.partnerApiKey}),await fe(this.logger,this.partnerApiKey,G,t.configRefreshInterval)})),this.logger.info("GiveFreelyService initialized successfully")}catch(e){const t=e instanceof Error?e.message:"Unknown error";throw this.logger.error("Failed to initialize GiveFreelyService",{error:t}),new Error(`Failed to initialize GiveFreelyService: ${t}`)}}getConfig(){return this.assertInitialized(),this.state.config}async getCachedConfig(){return this.state.config=await this.dependencies.configService.getConfig(),this.logger.configure({minLevel:this.state.config.backgroundMinLogLevel??"error"}),this.state.config}async getActiveDomains(){return this.assertInitialized(),this.state.wildfireService.getActiveDomains()}async shouldStandDown(e,t){this.assertInitialized();const r=new URL(t);if(!await this.state.partnerFilter(r.hostname))return this.logger.info("Should standdown due to partner filter."),!0;if(this.getConfig().merchantExclusions.some((t=>t.mutePopups&&e===t.domain)))return this.logger.info("Should standdown due to merchant exclusions"),!0;const i=await this.state.wildfireService.shouldStandDown(this.logger,e,t);return i&&this.logger.info("Should standdown due to vendor policy"),i}hasAffiliation(e,t){if(!this.state.wildfireService)return this.logger.warn("Wildfire service not initialized yet"),!1;const r=this.state.wildfireService.hasAffilliation(e,t);return r&&this.logger.info("Affiliation identified"),r}trackEvent(e,t,r=!1){return this.assertInitialized(),this.state.analytics.track(e,this.state.wfDeviceId?.DeviceID,t,r)}getLogger(){return this.assertInitialized(),this.logger}async initializeWfDeviceId(){if(this.assertInitialized(),this.state.wfDeviceId=await this.state.wildfireService.getDevice(),!this.state.wfDeviceId)throw new Error("Failed to initialize Wildfire device ID");return this.state.wfDeviceId.DeviceID}getWfDeviceId(){return this.assertInitialized(),this.state.wfDeviceId.DeviceID}upsertUser(e,t){return this.assertInitialized(),this.state.giveFreelyUserService.upsertUser(e,t)}getCurrentUser(){return this.assertInitialized(),this.state.giveFreelyUserService.user}generateAffiliateUrl(e,t,r){return this.assertInitialized(),this.state.wildfireService.generateAffiliateUrl(e,t,r,this.state.partnerApiKey)}updateStanddownHistory(e){return this.assertInitialized(),S(e)}getMerchantRates(e){if(this.assertInitialized(),!this.state.wildfireService)throw new Error("Wildfire service not initialized");return this.state.wildfireService.getMerchantRates(e)}async healthCheck(){this.assertInitialized(),await this.state.healthCheck.check()}async getLanguage(e){return this.assertInitialized(),fe(this.logger,this.state.partnerApiKey,e,this.state.config?.configRefreshInterval)}async handleMessage(e){this.assertInitialized();const t=B.get(e.type);if(!t)return;const r={giveFreelyService:this};return t.handle(e,r)}createWildfireService(e){this.logger.debug("Initializing wildfire service with config",this.state.config);const t=new m(e.wfSecret,e.wfAppId,e.deviceUrl,e.dataUrl,this.logger);return new K(t,this.logger,e.vanityBaseUrl,e.refreshInterval)}async destroy(){this.logger.info("Destroying GiveFreelyService"),await Promise.all([this.dependencies.configService.clearCache(),this.state.wildfireService?.clearCache(),this.state.giveFreelyUserService?.resetUser()]),this.state.initialized=!1,this.state.wildfireService=null,this.state.partnerFilter=null,this.state.analytics=null,this.state.config=null}},exports.browser=g,exports.isAdUnitMessage=e=>B.exists(e);
1
+ "use strict";class e{constructor(){this.isLocal=!0}log({level:t,message:r,timestamp:i,data:s,title:a}){const n="debug"===t?"log":t,o=a?`[${a}]`:"";void 0!==s?console[n](`[${i}] - ${e.LOGGER_PREFIX} ${o} ${r}`,s):console[n](`[${i}] - ${e.LOGGER_PREFIX} ${o} ${r}`)}}var t,r;e.LOGGER_PREFIX="[GFAdUnit] -",function(e){e.checkoutPopupShown="CHECKOUT-POPUP-SHOWN",e.checkoutPopupNotShown="CHECKOUT-POPUP-NOT-SHOWN",e.checkoutPopupSupressed="CHECKOUT-POPUP-SUPRESSED",e.checkoutPopupDonation="CHECKOUT-POPUP-DONATION",e.checkoutPopupFailedActivation="CHECKOUT-POPUP-FAILED-ACTIVATION",e.checkoutPopupPurchaseConfirmed="CHECKOUT-POPUP-PURCHASE-CONFIRMED",e.checkoutPopupHealthCheck="CHECKOUT-POPUP-HEALTH-CHECK",e.checkouPopupActivationFailed="CHECKOUT-POPUP-ACTIVATION-FAILED",e.checkoutPopupOfferDetailsClicked="CHECKOUT-POPUP-OFFER-DETAILS-CLICKED",e.checkoutPopupWhyAmISeeingThisClicked="CHECKOUT-POPUP-WHY-AM-I-SEEING-THIS-CLICKED",e.checkoutPopupLooserExtension="CHECKOUT-POPUP-LOOSER-EXTENSION",e.checkoutPopupActiveDomain="CHECKOUT-POPUP-ACTIVE-DOMAIN",e.checkoutPopupSiteMatches="CHECKOUT-POPUP-SITE-MATCHES"}(t||(t={})),function(e){e.adUnitLog="ADUNIT-LOG"}(r||(r={}));class i{constructor(e){this.isLocal=!1,this.gfService=e}log({level:e,message:t,data:i,title:s}){this.gfService.trackEvent(r.adUnitLog,{log:{level:e,message:t,data:i,title:s}})}}const s=["debug","info","warn","error"];class a{constructor(t){this.config={minLevel:t?.minLevel??"debug",enabled:t?.enabled??!1,transports:t?.transports??[new e],title:t?.title??""}}static getInstance(e){return a.instance||(a.instance=new a(e)),a.instance}configure(e){this.config={...this.config,...e}}shouldLog(e){return!!this.config.enabled&&s.indexOf(e)>=s.indexOf(this.config.minLevel)}createLogMessage(e,t,r){return{level:e,version:"1.9.1",message:t,timestamp:(new Date).toISOString(),data:r,title:this.config.title}}log(e,t,r,i){if(!this.shouldLog(e))return;const s=this.createLogMessage(e,t,i);this.config.transports.filter((e=>!r||e.isLocal)).forEach((e=>e.log(s)))}debug(e,t,r=!1){this.log("debug",e,r,t)}info(e,t,r=!1){this.log("info",e,r,t)}warn(e,t,r=!1){this.log("warn",e,r,t)}error(e,t,r=!1){this.log("error",e,r,t)}addTransport(e){this.config.transports.push(e)}clearTransports(){this.config.transports=[]}disable(){this.config.enabled=!1}enable(){this.config.enabled=!0}}const n=3,o=e=>1e3*e;async function c(e,t={},r){const{maxAttempts:i=n,delayFn:s=o}=t;let a=null;for(let t=1;t<=i;t+=1)try{return await e()}catch(e){a=e,t<i&&await new Promise((e=>{setTimeout(e,s(t))}))}if(a&&t.logger&&t.operationName&&t.logger.error(`Operation ${t.operationName} failed after ${i} attempts.`,a),void 0!==r)return r;throw a||new Error("Operation failed after multiple attempts")}const g=chrome;function l(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var h={exports:{}};"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self&&self,function(e){if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)e.exports=globalThis.browser;else{const t="The message port closed before a response was received.",r=e=>{const r={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(0===Object.keys(r).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class i extends WeakMap{constructor(e,t=void 0){super(t),this.createItem=e}get(e){return this.has(e)||this.set(e,this.createItem(e)),super.get(e)}}const s=(t,r)=>(...i)=>{e.runtime.lastError?t.reject(new Error(e.runtime.lastError.message)):r.singleCallbackArg||i.length<=1&&!1!==r.singleCallbackArg?t.resolve(i[0]):t.resolve(i)},a=e=>1==e?"argument":"arguments",n=(e,t,r)=>new Proxy(t,{apply:(t,i,s)=>r.call(i,e,...s)});let o=Function.call.bind(Object.prototype.hasOwnProperty);const c=(e,t={},r={})=>{let i=Object.create(null),g={has:(t,r)=>r in e||r in i,get(g,l,h){if(l in i)return i[l];if(!(l in e))return;let d=e[l];if("function"==typeof d)if("function"==typeof t[l])d=n(e,e[l],t[l]);else if(o(r,l)){let t=((e,t)=>function(r,...i){if(i.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${a(t.minArgs)} for ${e}(), got ${i.length}`);if(i.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${a(t.maxArgs)} for ${e}(), got ${i.length}`);return new Promise(((a,n)=>{if(t.fallbackToNoCallback)try{r[e](...i,s({resolve:a,reject:n},t))}catch(s){console.warn(`${e} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,s),r[e](...i),t.fallbackToNoCallback=!1,t.noCallback=!0,a()}else t.noCallback?(r[e](...i),a()):r[e](...i,s({resolve:a,reject:n},t))}))})(l,r[l]);d=n(e,e[l],t)}else d=d.bind(e);else if("object"==typeof d&&null!==d&&(o(t,l)||o(r,l)))d=c(d,t[l],r[l]);else{if(!o(r,"*"))return Object.defineProperty(i,l,{configurable:!0,enumerable:!0,get:()=>e[l],set(t){e[l]=t}}),d;d=c(d,t[l],r["*"])}return i[l]=d,d},set:(t,r,s,a)=>(r in i?i[r]=s:e[r]=s,!0),defineProperty:(e,t,r)=>Reflect.defineProperty(i,t,r),deleteProperty:(e,t)=>Reflect.deleteProperty(i,t)},l=Object.create(e);return new Proxy(l,g)},g=e=>({addListener(t,r,...i){t.addListener(e.get(r),...i)},hasListener:(t,r)=>t.hasListener(e.get(r)),removeListener(t,r){t.removeListener(e.get(r))}}),l=new i((e=>"function"!=typeof e?e:function(t){const r=c(t,{},{getContent:{minArgs:0,maxArgs:0}});e(r)})),h=new i((e=>"function"!=typeof e?e:function(t,r,i){let s,a,n=!1,o=new Promise((e=>{s=function(t){n=!0,e(t)}}));try{a=e(t,r,s)}catch(e){a=Promise.reject(e)}const c=!0!==a&&((g=a)&&"object"==typeof g&&"function"==typeof g.then);var g;if(!0!==a&&!c&&!n)return!1;return(c?a:o).then((e=>{i(e)}),(e=>{let t;t=e&&(e instanceof Error||"string"==typeof e.message)?e.message:"An unexpected error occurred",i({__mozWebExtensionPolyfillReject__:!0,message:t})})).catch((e=>{console.error("Failed to send onMessage rejected reply",e)})),!0})),d=({reject:r,resolve:i},s)=>{e.runtime.lastError?e.runtime.lastError.message===t?i():r(new Error(e.runtime.lastError.message)):s&&s.__mozWebExtensionPolyfillReject__?r(new Error(s.message)):i(s)},m=(e,t,r,...i)=>{if(i.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${a(t.minArgs)} for ${e}(), got ${i.length}`);if(i.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${a(t.maxArgs)} for ${e}(), got ${i.length}`);return new Promise(((e,t)=>{const s=d.bind(null,{resolve:e,reject:t});i.push(s),r.sendMessage(...i)}))},u={devtools:{network:{onRequestFinished:g(l)}},runtime:{onMessage:g(h),onMessageExternal:g(h),sendMessage:m.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:m.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},f={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return r.privacy={network:{"*":f},services:{"*":f},websites:{"*":f}},c(e,u,r)};e.exports=r(chrome)}}(h);var d=l(h.exports);class m{constructor(e,t,r,i,s){this.wfSecret=e,this.wfAppId=t,this.deviceUrl=r,this.dataUrl=i,this._logger=s}async getWildfireDevice(){try{const e=await fetch(this.deviceUrl,{method:"POST",body:JSON.stringify({}),headers:{"Content-Type":"application/json","WF-Secret":this.wfSecret,"WF-App-ID":this.wfAppId}});if(e.ok)return e.json();throw new Error(`Failed to fetch Wildfire device from ${this.deviceUrl}. Status ${e.status}. ${e.statusText}`)}catch(e){throw this._logger.error("Failed to fetch the Wildfire device",{err:e}),e}}async getActiveDomains(){try{const e=`${this.dataUrl}/${this.wfAppId}/active-domain/1`,t=await fetch(e);if(t.ok)return t.json();throw new Error(`Failed to fetch active domains from ${e}. Status ${t.status}. ${t.statusText}`)}catch(e){throw this._logger.error("Failed to fetch the active domains",{err:e}),e}}async getStanddownPolicy(){const e=`${this.dataUrl}/${this.wfAppId}/stand-down-policy/1`;try{const t=await fetch(e);if(t.ok)return t.json();throw new Error(`Failed to fetch standdown policy from ${e}. Status ${t.status} ${t.statusText}`)}catch(t){throw this._logger.error("Failed to fetch the standdown policy",{err:t,url:e}),t}}async getMerchantRates(){const e=`${this.dataUrl}/${this.wfAppId}/merchant-rate/1`;try{const t=await fetch(e);if(this._logger.debug("Merchant rates response",{response:t}),!t.ok)throw new Error(`Failed to fetch merchant rates from ${e}. Status ${t.status}. ${t.statusText}`);const r=t.json();return this._logger.debug("Merchant rates",{rates:r}),r}catch(t){throw this._logger.error("Failed to fetch the merchant rates",{err:t,url:e}),t}}}const u="GIVE_FREELY_",f={async get(e){const t=`${u}${e}`;return(await d.storage.local.get(t))[t]||null},async set(e,t){const r=`${u}${e}`;await d.storage.local.set({[r]:t})},async remove(e){const t=Array.isArray(e)?e.map((e=>`${u}${e}`)):`${u}${e}`;await d.storage.local.remove(t)}},A="wfDevice",p="wfDomains",y="wfStanddownPolicy",w="wfStanddownHistory",v="wfMerchantRates";async function x(e,t,r){try{const i=(await b())?.[t];if(i&&i>Date.now())return e.info("Standing down because current affiliate stand down session has not expired"),S(t),!0;await this.refreshCache();const s=await this.getStanddownPolicy();if(I(s,new URL(r).search))return e.info("Standing down because url has affiliate params"),S(t),!0;e.info("No need to stand down.")}catch(t){e.error("Exception produced when trying to determine if it should stand down",t)}return!1}function E(e,t){if(!this.standDownPolicy)return this.logger.warn("Couldnt check affilliation. No stand down policy found"),this.getStanddownPolicy().then((e=>{this.standDownPolicy=e})),!1;const r=e.some((e=>C(this.standDownPolicy,e)))||I(this.standDownPolicy,t);return this.logger.info("Affilliation result:",r),r}const b=async()=>f.get(w),S=async(e,t=1)=>{const r=await b()??{};r[e]=Date.now()+60*t*60*1e3,await f.set(w,r)},C=(e,t)=>{if(!t)return!1;const{Domains:r}=e;return r.some((e=>t.includes(e)))},I=(e,t)=>{if(!t)return!1;const{Params:r}=e;return r.some((e=>t.toLowerCase().includes(`?${e.toLowerCase()}`)))||r.some((e=>t.toLowerCase().includes(`&${e.toLowerCase()}`)))};class T{constructor(e,t,r,i){this.userId=e,this.charityEin=t,this.charityThirdPartyIdentifier=r,this.partnerId=i}toString(){return`userId=${this.encodeUserId(this.userId)},charityEin=${this.charityEin},charityThirdPartyIdentifier=${this.charityThirdPartyIdentifier},partnerId=${this.partnerId}`}encodeUserId(e){return btoa(e).replace(/_/g,"/").replace(/-/g,"+")}}const P="TRACK_EVENT",U="GF_HIDE_POPUP",O="GF_GET_POPUP_CONFIG",k="GF_IS_ACTIVE_DOMAIN",D="GF_SHOULD_STAND_DOWN",_="GF_ACTIVATE_OFFER",F="GF_STORE_SHOPIFY_SHOP_ID",R="GF_GET_DOMAIN_BY_SHOP_ID",$="GF_GET_LANGUAGE_CONTENT",L="shopify_shop_ids",N="gf_last_health_check",G="en",M={async get(e,t,r,i=!1){let s=await f.get(e);const a=s;let n=!1;if(s&&Date.now()<=s.expiration&&!i)return{content:s.content,isStale:n};try{const i=await t();s=await this.set(e,i,r)}catch(e){n=!0}return{content:s?.content??a?.content,isStale:n}},async set(e,t,r){const i={content:t,expiration:Date.now()+1e3*(r??300)};return await f.set(e,i),i},async refresh(e,t,r,i=!1){const s=await this.get(e,t,r,i);if(s.isStale||i)try{const i=await t();if(!i)return{content:s.content,isStale:!0};s.content=i,await this.set(e,s.content,r)}catch(e){return{content:s.content,isStale:!0}}return{content:s.content,isStale:!1}},async clear(e){await f.remove(e)}};class K{constructor(e,t,r,i=21600){if(this.standDownPolicy=null,this.shouldStandDown=x.bind(this),this.hasAffilliation=E.bind(this),!e||!r)throw new Error("WildfireService requires wildfireClient and vanityBaseUrl");this.wildfireClient=e,this.vanityBaseUrl=r.replace(/\/$/,""),this.refreshInterval=i,this.logger=t}async getActiveDomains(e=!1){try{const t=(await M.get(p,(async()=>this.fetchActiveDomains()),this.refreshInterval,e)).content;if(!t)throw Error("Failed to retrieve active domains");return t}catch(e){throw this.logger.error("Failed to get active domains:",e),new Error("Failed to retrieve active domains")}}async getMerchantRates(e,t=!1){try{const r=await M.get(v,(async()=>this.fetchMerchantRates()),this.refreshInterval,t);if(!r.content)throw new Error("Failed to retrieve merchant rates from cache");return r.content[e]}catch(e){throw this.logger.error("Failed to retrieve merchant rates:",e),new Error("Failed to retrieve merchant rates")}}async generateAffiliateUrl(e,t,r,i){if(!e||!t||!i)throw new Error("Missing required parameters for affiliate URL generation");try{const s=await this.getDevice(),a=await this.generateTrackingCode(r,i,s),n=encodeURIComponent(t),o=encodeURIComponent(a);return`${this.vanityBaseUrl}/e?d=${s.DeviceID}&c=${e.ID}&tc=${o}&url=${n}`}catch(e){throw this.logger.error("Failed to generate affiliate URL:",e),new Error("Failed to generate affiliate URL")}}async clearCache(){try{await Promise.all([M.clear(p),M.clear(y),M.clear(v)])}catch(e){throw this.logger.error("Failed to clear cache:",e),new Error("Failed to clear cache")}}async refreshCache(e=!1){try{const[,t]=await Promise.all([M.refresh(p,(()=>this.fetchActiveDomains()),this.refreshInterval,e),M.refresh(y,(()=>this.fetchStanddownPolicy()),this.refreshInterval,e),M.refresh(v,(()=>this.fetchMerchantRates()),this.refreshInterval,e)]);t?.content&&(this.standDownPolicy=t.content)}catch(e){throw this.logger.error("Failed to refresh cache:",e),new Error("Failed to refresh cache")}}async getStanddownPolicy(){try{const e=await M.get(y,(async()=>this.fetchStanddownPolicy()),this.refreshInterval);if(!e.content)throw new Error("Failed to retrieve standdown policy from cache");return this.logger.info("Retrieved standdown policy from cache",e.content),this.standDownPolicy=e.content,this.standDownPolicy}catch(e){throw this.logger.error("Failed to get standdown policy from cache:",e),new Error("Failed to retrieve standdown policy")}}getRetryOptions(e){return{delayFn:e=>1e3*e,maxAttempts:3,logger:this.logger,operationName:e}}async getDevice(){try{const e=await f.get(A);return e?.DeviceID?e:c((()=>this.fetchAndStoreDevice()),this.getRetryOptions("Get Device"))}catch(e){throw this.logger.error("Failed to get device:",e),new Error("Failed to retrieve device information")}}async fetchAndStoreDevice(){const e=await this.wildfireClient.getWildfireDevice();if(!e?.DeviceID)throw new Error("Failed to retrieve device information");return await f.set(A,e),e}async generateTrackingCode(e,t,r){if(!(e?.id&&e?.charity&&e?.charity.ein&&e?.charity.thirdPartyId)){const e=`notregistered-${r.DeviceID}`;return this.logger.info("User not provided. Using GF's default bucket instead.",e),e}return new T(e.id,e.charity.ein,e.charity.thirdPartyId,t).toString()}async fetchActiveDomains(){const e=await c((()=>this.wildfireClient.getActiveDomains()),this.getRetryOptions("Fetch Active Domains"));return this.logger.info("Updated active domains"),e}async fetchStanddownPolicy(){const e=await c((()=>this.wildfireClient.getStanddownPolicy()),this.getRetryOptions("Get Standdown policy"),{Domains:[],LostAttribution:[],Params:[],Serp:[]});return this.logger.info("Updated standdown policy"),e}async fetchMerchantRates(){const e=await c((()=>this.wildfireClient.getMerchantRates()),this.getRetryOptions("Fetch Merchant Rates"),{});return this.logger.debug("Updated Merchant rates"),e}}const H="version",z=()=>String("1.9.1"),j=async(e=!0)=>{const t=await f.get(H),r=await z(),i=t!==r;var s;return e&&i&&await(s=r,f.set(H,s)),i},W="https://cdn.givefreely.com/adunit/behavioral/";class Y{constructor(e){this.partnerApiKey=e,this.partnerConfig=null,this.globalConfig=null,this.PARTNER_CONFIG_STORAGE_KEY="gf_partner_config",this.GLOBAL_CONFIG_STORAGE_KEY="gf_global_config",this.globalConfigRefreshInterval=60,this.partnerConfigRefreshInterval=60}getRetryOptions(){return{delayFn:e=>1e3*e,maxAttempts:3}}async fetchPartnerConfig(){const e=await c((async()=>{const e=await fetch(`${W}${this.partnerApiKey}.json`,{cache:"no-store"});if(!e.ok)throw new Error(`Failed to fetch partner config: ${e.statusText}`);return e.json()}),this.getRetryOptions());if(!e)throw new Error("Failed to fetch or get from cache partner config");return this.partnerConfigRefreshInterval=e.configRefreshInterval||this.partnerConfigRefreshInterval,e}async fetchGlobalConfig(){const e=await c((async()=>{const e=await fetch(`${W}global.json`,{cache:"no-store"});if(!e.ok)throw new Error(`Failed to fetch global config => Status code: ${e.status} .${e.statusText}`);return e.json()}),this.getRetryOptions());if(!e)throw new Error("Failed to fetch or get from cache global config",e);return this.globalConfigRefreshInterval=e.configRefreshInterval||this.globalConfigRefreshInterval,e}async getConfig(e=!1){let t=!1;e&&(t=await j());const[r,i]=await Promise.all([await M.get(this.PARTNER_CONFIG_STORAGE_KEY,this.fetchPartnerConfig.bind(this),this.partnerConfigRefreshInterval,t),await M.get(this.GLOBAL_CONFIG_STORAGE_KEY,this.fetchGlobalConfig.bind(this),this.globalConfigRefreshInterval,t)]);if(!i.content)throw new Error("Global config is required");if(!r.content)throw new Error("Partner config is required");this.partnerConfig=r.content,this.globalConfig=i.content;const s=this.mergeConfigs(JSON.parse(JSON.stringify(this.globalConfig)),JSON.parse(JSON.stringify(this.partnerConfig)));if(!s)throw new Error("Was not able to merge configs");return((e,t,r)=>{const i=[...t.merchantExclusions??[],...r.merchantExclusions??[]];e.merchantExclusions=i})(s,this.globalConfig,this.partnerConfig),s}async clearCache(){await Promise.all([M.clear(this.PARTNER_CONFIG_STORAGE_KEY),M.clear(this.GLOBAL_CONFIG_STORAGE_KEY)]),this.partnerConfig=null,this.globalConfig=null}mergeConfigs(e,t){if(!t)return e;if(!e)return t;const r={...e};return Object.keys(t).forEach((i=>{if(!Object.prototype.hasOwnProperty.call(t,i))return;const s=e[i],a=t[i];void 0!==a&&(Array.isArray(a)?r[i]=[...a]:r[i]=null===a||"object"!=typeof a||null===s||"object"!=typeof s?a:this.mergeConfigs(s,a))})),r}}class B{static register(e,t){this.strategies.set(e,t)}static get(e){return this.strategies.get(e)}static exists(e){return!!function(e){return"object"==typeof e&&null!==e&&"type"in e&&"payload"in e&&"string"==typeof e.type}(e)&&this.strategies.has(e.type)}}B.strategies=new Map;class q{async handle(e,t){const{hostname:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger(),a=await i.getConfig().merchantExclusions,n=await i.getActiveDomains();s.debug("Checking hostname",{hostname:r});try{if(i.healthCheck(),a.some((e=>e.disableDomain&&(r===e.domain||r.endsWith(`.${e.domain}`)))))return s.debug("Hostname is in merchant exclusions",{hostname:r}),{type:k,payload:{isActive:!1,domain:void 0,rates:[]}};if(!n||0===n.length)throw new Error("No active domains");s.debug("Retrieved active domains",{count:n.length});const e=n.find((e=>r===e.Domain||r.endsWith(`.${e.Domain}`)));s.debug("Domain check result",{hostname:r,isActive:!!e});let t=[];if(e?.ID){const r=await i.getMerchantRates(e.Merchant.ID);r&&(s.debug("Retrieved merchant rates",{merchantRates:r}),t=r)}return{type:k,payload:{isActive:!!e,domain:e,rates:t}}}catch(e){return s.error("Error checking domain",{hostname:r,error:e}),{type:k,payload:{isActive:!1,domain:void 0,rates:[]}}}}}class V{async handle(e,t){const{giveFreelyService:r}=t,i=r.getLogger(),s=await r.getCachedConfig();try{return i.debug("Fetching popup config"),{type:O,payload:{config:s}}}catch(e){return i.error("Error fetching popup config",{error:e}),{type:O,payload:{config:null}}}}}class X{async handle(e,t){const{days:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger();try{const e=new Date;return e.setDate(e.getDate()+r),await f.set("popup_hide",{popupHide:e.getTime()}),s.debug("Popup hidden",{days:r,expiry:e}),{type:U,payload:{ack:!0}}}catch(e){return s.error("Error hiding popup",{days:r,error:e}),{type:U,payload:{ack:!1}}}}}class J{async handle(e,t){const{activeDomain:r,url:i}=e.payload,{giveFreelyService:s}=t,a=s.getLogger();a.debug("Checking if we should stand down",{activeDomain:r});try{const e=await s.shouldStandDown(r,i);return{type:D,payload:{result:e}}}catch(e){return a.error("Error checking if we should stand down. Returning false",{activeDomain:r,error:e}),{type:D,payload:{result:!1}}}}}class Z{constructor(e,t,r,i=60){this.track=async(e,t,r,i=!1,s=!1)=>{const a={partner:`adUnit_${this._partnerApiKey}`,eventType:e,eventData:{userId:i?void 0:this._userService?.user?.id,libVersion:z(),wfDeviceId:t,...r}};try{const e=JSON.stringify(a,((e,t)=>t instanceof Error?{name:t.name,message:t.message,stack:t.stack}:t)),t=await this.getEventsUrl();if(await this.shouldBroadcastEvent(e,s)){const r=await fetch(t,{headers:{"Content-Type":"application/json"},method:"POST",body:e,cache:"no-store"});return r.ok?(await this.pushEventToHistory(e),!0):(this._logger.error("Something unexpected happened when dispatching an event",{status:r.status,statusText:r.statusText,event:a},!0),!1)}return this._logger.info("This event has already been broadcasted during the past hour",a,!0),!1}catch(e){return this._logger.error("Something unexpected happened when dispatching a gf event",{error:e,event:a}),!1}},this.getEventsHistory=async()=>{const{GF_AD_EVENT_HISTORY:e}=await g.storage.local.get({GF_AD_EVENT_HISTORY:""}),t=(e=>{const t=new Date;return t.setTime(t.getTime()+60*e*1e3),t.getTime()})(-this._debounceWindowInMinutes),r=(e||[]).filter((e=>e.createdAt>t));return await g.storage.local.set({GF_AD_EVENT_HISTORY:r}),r},this.shouldBroadcastEvent=async(e,t)=>!!t||!(await this.getEventsHistory()).some((t=>t.payload===e)),this.pushEventToHistory=async e=>{const t=await this.getEventsHistory();t.push({createdAt:Date.now(),payload:e}),await g.storage.local.set({GF_AD_EVENT_HISTORY:t})},this._partnerApiKey=e,this._userService=t,this._debounceWindowInMinutes=i,this._logger=a.getInstance({title:"Analytics"}),this._configService=r}async getEventsUrl(){const{eventsUrl:e}=await this._configService.getConfig();return e}}Z.trackEvent=async(e,t,r=!1,i=!1)=>{await async function(e){return new Promise(((t,r)=>{try{const i=i=>chrome.runtime.lastError?r({error:chrome.runtime.lastError,message:e}):t(i);g.runtime.sendMessage(e,i)}catch(e){r(e)}}))}({type:P,payload:{eventType:e,eventData:t,anonymous:r,skipThrottling:i}})};class Q{async handle(e,t){const{eventType:r,eventData:i,anonymous:s,skipThrottling:a}=e.payload,{giveFreelyService:n}=t,o=n.getLogger();o.debug("Broadcasting event",{eventType:r,eventData:i,anonymous:s,skipThrottling:a});try{const e=await n.trackEvent(r,i,s,a);return{type:P,payload:{result:e}}}catch(e){return o.error("Error broadcasting event. Returning false",{eventType:r,eventData:i,error:e}),{type:P,payload:{result:!1}}}}}class ee{async handle(e,r){const{activeDomain:i,originalUrl:s,selectedCharity:a}=e.payload,{giveFreelyService:n}=r,o=n.getLogger();o.debug("Activating offer",{activeDomain:i,selectedCharity:a});try{if(!a?.ein||!a?.thirdPartyId)throw new Error("Missing charity information");const e=await n.initializeWfDeviceId();if(!e)throw new Error("Failed to initialize Wildfire device ID");const t=await n.upsertUser(a,e);o.debug("Upserted user",{currentUser:t}),t||o.info("Failed to create user. Using default bucket's user");const r=await n.generateAffiliateUrl(i,s,t);return o.debug("Generated affiliate URL",{affiliateUrl:r}),(async e=>{const t=g.tabs.getCurrent(),r=await t,i=await g.tabs.create({url:e,openerTabId:r?.id,active:!1,pinned:!0});await(async e=>new Promise((t=>{g.tabs.onUpdated.addListener((async function r(i,s){if(i===e&&"complete"===s.status){if(g.tabs.onUpdated.removeListener(r),!(await g.tabs.get(e)).url)return void t(!1);t(!0)}}))})))(i.id)&&setTimeout((()=>{i?.id&&g.tabs.remove(i.id)}),3e4)})(r),await n.updateStanddownHistory(i.Domain),o.debug("Activated offer",{activeDomain:i,selectedCharity:a}),{type:_,payload:{response:!0}}}catch(e){return o.error("Error activating offer",{activeDomain:i,error:e}),n.trackEvent(t.checkoutPopupFailedActivation,{activeDomain:i,error:e}),{type:_,payload:{response:!1}}}}}var te;!function(e){e[e.Pending=0]="Pending",e[e.Ready=1]="Ready",e[e.Received=2]="Received",e[e.Donated=3]="Donated",e[e.Disqualified=4]="Disqualified"}(te||(te={}));class re{constructor(e,t,r){this.adUnitId=e,this.config=t,this.logger=r}async getAnonymousUserCommissions(e,t){try{const r=new URLSearchParams(t).toString(),i=await fetch(`${this.config.apiConfig.baseUri}/${this.config.apiConfig.getAnonymousUserComissionsPath}?${r}`,{method:"GET",headers:{"Content-Type":"application/json","X-AnonymousUserToken":e}});if(!i.ok)throw new Error(`Failed to fetch commissions. Status code: ${i.status} .${i.statusText}`);return await i.json()}catch(e){throw this.logger.error("[GiveFreelyApiClient] Error fetching anonymous user's commissions:",{error:e}),e}}async createOrUpdateAnonymousUser(e,t){try{const r=await fetch(`${this.config.apiConfig.baseUri}/${this.config.apiConfig.createAnonymousUserPath}?adUnitId=${this.adUnitId}`,{method:"PUT",headers:{"Content-Type":"application/json","X-GF-Platform":"adUnitLibrary","X-AnonymousUserToken":t??""},body:JSON.stringify(e)});if(!r.ok)throw new Error(`Failed to create/update anonymous user. Status code: ${r.status} .${r.statusText}`);this.logger.info("[GiveFreelyApiClient] anonymous user created/updated successfully.");const i=await r.json(),s=r.headers.get("X-AnonymousUserToken");return{resultUser:{...i,charity:{ein:i.selectedCharity,thirdPartyId:i.selectedCharityThirdPartyIdentifier,name:void 0}},resultToken:s}}catch(e){throw this.logger.error("[GiveFreelyApiClient] Error creating anonymous user:",{error:e}),e}}}class ie{constructor(e,t){this.ANONYMOUS_USER_STORAGE_KEY="gf_anonymous_user_info",this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY="gf_anonymous_encrypted_token",this._giveFreelyApiClient=e,this._logger=t,this.user=null}async resetUser(){await f.remove(this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY),await f.remove(this.ANONYMOUS_USER_STORAGE_KEY)}async upsertUser(e,t){let r=await this.fetchUser();try{const i={selectedCharity:e?.ein,selectedCharityThirdPartyIdentifier:e?.thirdPartyId,deviceId:t};if(!await this.shouldCreateOrUpdateUser(r,i))return r;const s=await f.get(this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY),{resultUser:a,resultToken:n}=await this._giveFreelyApiClient.createOrUpdateAnonymousUser(i,s);n&&await f.set(this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY,n),a&&(await f.set(this.ANONYMOUS_USER_STORAGE_KEY,a),r=a)}catch(e){this._logger.error("Error creating/updating anonymous user:",e)}return this.user=r,r}async fetchUser(){const e=await f.get(this.ANONYMOUS_USER_STORAGE_KEY);return this.user=e,e}async shouldCreateOrUpdateUser(e,t){return!e||e.charity?.ein!==t.selectedCharity||e.charity?.thirdPartyId!==t.selectedCharityThirdPartyIdentifier||e.deviceId!==t.deviceId}}const se=e=>{try{return new URL(e),!0}catch{return!1}},ae=new Set,ne=new Set,oe={urls:["<all_urls>"],types:["main_frame"]};class ce{async handle(e,t){const r=e.payload,{giveFreelyService:i}=t,s=i.getLogger();try{const e=L,t=await f.get(e)||[],i=t.findIndex((e=>e.shopId===r.shopId));return i>=0?t[i]=r:t.push(r),await f.set(e,t),s.debug("Stored Shopify shop ID",{shopInfo:r}),{type:F,payload:{success:!0}}}catch(e){return s.error("Error storing Shopify shop ID",{shopInfo:r,error:e}),{type:F,payload:{success:!1}}}}}class ge{async handle(e,t){const{shopId:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger();try{const e=L,t=(await f.get(e)||[]).find((e=>e.shopId===r));return t?(s.debug("Found domain for shop ID",{shopId:r,domain:t.domain}),{type:R,payload:{found:!0,domain:t.domain,shopInfo:t}}):(s.debug("No domain found for shop ID",{shopId:r}),{type:R,payload:{found:!1}})}catch(e){return s.error("Error getting domain for shop ID",{shopId:r,error:e}),{type:R,payload:{found:!1}}}}}class le{constructor(e,t){this.lastCheck=null,this.trackEvent=e,this.logger=t}async initialize(){const e=await f.get(N);e&&(this.lastCheck=e)}getToday(){return(new Date).toISOString().split("T")[0]}async check(){try{const e=this.lastCheck??0,r=this.getToday();(e?new Date(e).toISOString().split("T")[0]:null)!==r&&(this.lastCheck=Date.now(),await f.set(N,this.lastCheck),await this.trackEvent(t.checkoutPopupHealthCheck,{language:chrome.i18n.getUILanguage()}))}catch(e){this.logger.error("Health check failed",{error:e instanceof Error?e.message:"Unknown error"})}}}const he=a.getInstance(),de="countryCode";class me{async handle(e,t){const{lang:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger();s.debug("Getting language strings",{lang:r});try{const e=await i.getLanguage(r);return s.debug("Language strings fetched",{language:e}),{type:$,payload:{translations:e.translations,charities:e.charities}}}catch(e){return s.error("Error getting language strings",{error:e}),{type:$,payload:{translations:null,charities:null}}}}}const ue="https://cdn.givefreely.com/adunit/language",fe=async(e,t,r,i,s=[],a=!1)=>{const n=(s??[]).includes(r)?G:r;e.debug(`Requested lang ${r} and current lang ${n}`);const o=`lang-${G}`,c=await M.get(o,(async()=>(e.debug(`Fetching default language ${G} for partner ${t}`),Ae(t,G))),i||60,a);if(!c.content)throw new Error(`Failed to fetch default language ${G} and no cache version available`);if(G===n)return c.content;const g=`lang-${n}`,l=await M.get(g,(async()=>(e.debug(`Fetching language ${n} for partner ${t}`),Ae(t,n))),i||60,a);if(!l.content)return c.content;const h=we(c.content,l.content);return await M.set(g,h,i||60),h},Ae=async(e,t)=>{const r=`/global-${t}.json`,i=`/${e}/${t}.json`,[s,a]=await Promise.allSettled([pe(`${ue}${r}`),pe(`${ue}${i}`)]);let n,o;"fulfilled"===s.status&&(n=s.value),"fulfilled"===a.status&&(o=a.value);const c=ye(n,o);return{translations:c.translations,charities:c.charities}},pe=async e=>{const t=await fetch(e,{cache:"no-store"});if(!t.ok)throw new Error(`Failed to fetch partner language file ${e}. Status: ${t.status}. Reason: ${t.statusText}`);return t.json()},ye=(e,t)=>({translations:{...e?.translations??{},...t??{}},charities:{...e?.charities??{}}}),we=(e,t)=>({translations:{...e.translations,...t.translations},charities:{...e.charities,...t.charities}});class ve extends Error{constructor(e="Service not initialized"){super(e),this.name="UninitializedServiceError"}}exports.GiveFreelyService=class{constructor(e){this.partnerApiKey=e,this.dependencies={configService:new Y(e)},this.logger=a.getInstance(),this.logger.configure({enabled:!0,title:"Background - GiveFreelyService"}),this.state={initialized:!1,wildfireService:null,partnerFilter:null,config:null,wfDeviceId:null,analytics:null,giveFreelyUserService:null,partnerApiKey:e,healthCheck:null}}assertInitialized(){if(!this.state.initialized)throw new ve}async initialize(e=async()=>(this.logger.debug("Using default partnerFilter."),!0)){if(!this.state.initialized)try{const t=await this.dependencies.configService.getConfig(!0);this.logger.configure({minLevel:t.backgroundMinLogLevel??"error"}),this.logger.info("Initializing GiveFreelyService",{partnerApiKey:this.partnerApiKey});const r=this.createWildfireService(t);this.state.healthCheck=new le(this.trackEvent.bind(this),this.logger),await this.state.healthCheck.initialize();const s=await j();await r.refreshCache(s);const n=new re(this.partnerApiKey,t,this.logger);this.state.giveFreelyUserService=new ie(n,this.logger),await this.state.giveFreelyUserService.fetchUser(),this.state.giveFreelyUserService.user?.id||await this.state.giveFreelyUserService.upsertUser();try{await(async()=>await f.get(de)||(async()=>{he.debug("detecting country");const e={method:"GET",headers:{"Content-Type":"application/json",Authorization:"Basic OTEzOTkxOnFlYmpaWF9DOGNRY0lxSHA4WTVjNGxzU1pRSlM2VW9MMExzTF9tbWs="}};try{const t=await fetch("https://geoip.maxmind.com/geoip/v2.1/country/me",e);if(he.debug("Received geolocation response",{status:t.status}),!t.ok)return void he.error("Failed to get geolocation data",{status:t.status,statusText:t.statusText});const r=await t.json();if(!r)throw new Error("There was an error fetching geoip look up");return await f.set(de,r.country.iso_code),r.country.iso_code}catch(e){return void he.error("Failed to get geolocation data",{error:e})}})())()}catch(e){this.logger.debug("Failed to get geolocation data",{error:e})}this.state.analytics=new Z(this.partnerApiKey,this.state.giveFreelyUserService,this.dependencies.configService),this.logger.addTransport(new i(this)),B.register(k,new q),B.register(O,new V),B.register(U,new X),B.register(D,new J),B.register(P,new Q),B.register(_,new ee),B.register(F,new ce),B.register(R,new ge),B.register($,new me),this.state.wildfireService=r,this.state.partnerFilter=e,this.state.config=t,this.state.initialized=!0,d.webRequest&&(d.webRequest.onBeforeRequest.addListener((e=>{const t=e.getLogger();return({requestId:r,url:i,initiator:s})=>{try{if(ae.has(r)||ne.has(r)||!se(i))return;const{hostname:a,search:n}=new URL(i);if(a.includes("wild.link"))return t.info("Cashback activation request identified, ignoring affiliate check for request"),void ne.add(r);let o;s&&se(s)&&(o=new URL(s).hostname),e.hasAffiliation([a,o],n)&&(t.info("Affiliation found on url, adding request id to track"),ae.add(r))}catch(e){t.error("Error on handleAffiliateOnBeforeRequest",e)}}})(this),oe),d.webRequest.onBeforeRedirect.addListener((e=>{const t=e.getLogger();return async({requestId:r,redirectUrl:i})=>{try{if(!ae.has(r))return;t.info("Attempting to find active domain");const{hostname:s}=new URL(i),a=(await e.getActiveDomains()).find((e=>s===e.Domain||s.endsWith(`.${e.Domain}`)));if(!a)return;t.info("Found active domain. Updating standdown state"),await S(a.Domain)}catch(e){t.error("Error on handleAffiliateOnBeforeRedirect",e)}}})(this),oe),d.webRequest.onCompleted.addListener((()=>{const e=this.getLogger();return({requestId:t})=>{try{ae.has(t)&&(e.info("Tracking request completed. Request Id:",t),ae.delete(t))}catch(t){e.error("Error on handleAffiliateOnCompleted",t)}}})(),oe)),function(e){const t=a.getInstance();g.runtime.onMessage.addListener(((r,i,s)=>{function a(e){s(e)}const n=e(r,0);return n instanceof Promise?(n.then((e=>{e&&a(e)})).catch((e=>{t.warn("Async message callback error:",e)})),!0):n}))}((async(e,t)=>(this.logger.debug("Received message",{type:e.type,payload:e.payload}),this.handleMessage(e)))),t.purgeLanguages&&t.purgeLanguages.length>0&&await Promise.all(t.purgeLanguages.flatMap((e=>[M.clear(`lang-${e}`),M.clear(`global-${e}`)]))),c((async()=>{this.logger.debug("Initializing default language with partner API key",{partnerApiKey:this.partnerApiKey}),await fe(this.logger,this.partnerApiKey,G,t.configRefreshInterval)})),this.logger.info("GiveFreelyService initialized successfully")}catch(e){const t=e instanceof Error?e.message:"Unknown error";throw this.logger.error("Failed to initialize GiveFreelyService",{error:t}),new Error(`Failed to initialize GiveFreelyService: ${t}`)}}getConfig(){return this.assertInitialized(),this.state.config}async getCachedConfig(){return this.state.config=await this.dependencies.configService.getConfig(),this.logger.configure({minLevel:this.state.config.backgroundMinLogLevel??"error"}),this.state.config}async getActiveDomains(){return this.assertInitialized(),this.state.wildfireService.getActiveDomains()}async shouldStandDown(e,t){this.assertInitialized();const r=new URL(t);if(!await this.state.partnerFilter(r.hostname))return this.logger.info("Should standdown due to partner filter."),!0;if(this.getConfig().merchantExclusions.some((t=>t.mutePopups&&e===t.domain)))return this.logger.info("Should standdown due to merchant exclusions"),!0;const i=await this.state.wildfireService.shouldStandDown(this.logger,e,t);return i&&this.logger.info("Should standdown due to vendor policy"),i}hasAffiliation(e,t){if(!this.state.wildfireService)return this.logger.warn("Wildfire service not initialized yet"),!1;const r=this.state.wildfireService.hasAffilliation(e,t);return r&&this.logger.info("Affiliation identified"),r}trackEvent(e,t,r=!1,i=!1){return this.assertInitialized(),this.state.analytics.track(e,this.state.wfDeviceId?.DeviceID,t,r,i)}getLogger(){return this.assertInitialized(),this.logger}async initializeWfDeviceId(){if(this.assertInitialized(),this.state.wfDeviceId=await this.state.wildfireService.getDevice(),!this.state.wfDeviceId)throw new Error("Failed to initialize Wildfire device ID");return this.state.wfDeviceId.DeviceID}getWfDeviceId(){return this.assertInitialized(),this.state.wfDeviceId.DeviceID}upsertUser(e,t){return this.assertInitialized(),this.state.giveFreelyUserService.upsertUser(e,t)}getCurrentUser(){return this.assertInitialized(),this.state.giveFreelyUserService.user}generateAffiliateUrl(e,t,r){return this.assertInitialized(),this.state.wildfireService.generateAffiliateUrl(e,t,r,this.state.partnerApiKey)}updateStanddownHistory(e){return this.assertInitialized(),S(e)}getMerchantRates(e){if(this.assertInitialized(),!this.state.wildfireService)throw new Error("Wildfire service not initialized");return this.state.wildfireService.getMerchantRates(e)}async healthCheck(){this.assertInitialized(),await this.state.healthCheck.check()}async getLanguage(e){return this.assertInitialized(),fe(this.logger,this.state.partnerApiKey,e,this.state.config?.configRefreshInterval,this.state.config?.ignoredLanguages)}async handleMessage(e){this.assertInitialized();const t=B.get(e.type);if(!t)return;const r={giveFreelyService:this};return t.handle(e,r)}createWildfireService(e){this.logger.debug("Initializing wildfire service with config",this.state.config);const t=new m(e.wfSecret,e.wfAppId,e.deviceUrl,e.dataUrl,this.logger);return new K(t,this.logger,e.vanityBaseUrl,e.refreshInterval)}async destroy(){this.logger.info("Destroying GiveFreelyService"),await Promise.all([this.dependencies.configService.clearCache(),this.state.wildfireService?.clearCache(),this.state.giveFreelyUserService?.resetUser()]),this.state.initialized=!1,this.state.wildfireService=null,this.state.partnerFilter=null,this.state.analytics=null,this.state.config=null}},exports.browser=g,exports.isAdUnitMessage=e=>B.exists(e);
@@ -1 +1 @@
1
- class e{constructor(){this.isLocal=!0}log({level:t,message:r,timestamp:i,data:s,title:a}){const n="debug"===t?"log":t,o=a?`[${a}]`:"";void 0!==s?console[n](`[${i}] - ${e.LOGGER_PREFIX} ${o} ${r}`,s):console[n](`[${i}] - ${e.LOGGER_PREFIX} ${o} ${r}`)}}var t,r;e.LOGGER_PREFIX="[GFAdUnit] -",function(e){e.checkoutPopupShown="CHECKOUT-POPUP-SHOWN",e.checkoutPopupNotShown="CHECKOUT-POPUP-NOT-SHOWN",e.checkoutPopupSupressed="CHECKOUT-POPUP-SUPRESSED",e.checkoutPopupDonation="CHECKOUT-POPUP-DONATION",e.checkoutPopupFailedActivation="CHECKOUT-POPUP-FAILED-ACTIVATION",e.checkoutPopupPurchaseConfirmed="CHECKOUT-POPUP-PURCHASE-CONFIRMED",e.checkoutPopupHealthCheck="CHECKOUT-POPUP-HEALTH-CHECK",e.checkouPopupActivationFailed="CHECKOUT-POPUP-ACTIVATION-FAILED",e.checkoutPopupOfferDetailsClicked="CHECKOUT-POPUP-OFFER-DETAILS-CLICKED",e.checkoutPopupWhyAmISeeingThisClicked="CHECKOUT-POPUP-WHY-AM-I-SEEING-THIS-CLICKED",e.checkoutPopupLooserExtension="CHECKOUT-POPUP-LOOSER-EXTENSION",e.checkoutPopupActiveDomain="CHECKOUT-POPUP-ACTIVE-DOMAIN",e.checkoutPopupSiteMatches="CHECKOUT-POPUP-SITE-MATCHES"}(t||(t={})),function(e){e.adUnitLog="ADUNIT-LOG"}(r||(r={}));class i{constructor(e){this.isLocal=!1,this.gfService=e}log({level:e,message:t,data:i,title:s}){this.gfService.trackEvent(r.adUnitLog,{log:{level:e,message:t,data:i,title:s}})}}const s=["debug","info","warn","error"];class a{constructor(t){this.config={minLevel:t?.minLevel??"debug",enabled:t?.enabled??!1,transports:t?.transports??[new e],title:t?.title??""}}static getInstance(e){return a.instance||(a.instance=new a(e)),a.instance}configure(e){this.config={...this.config,...e}}shouldLog(e){return!!this.config.enabled&&s.indexOf(e)>=s.indexOf(this.config.minLevel)}createLogMessage(e,t,r){return{level:e,version:"1.8.3",message:t,timestamp:(new Date).toISOString(),data:r,title:this.config.title}}log(e,t,r,i){if(!this.shouldLog(e))return;const s=this.createLogMessage(e,t,i);this.config.transports.filter((e=>!r||e.isLocal)).forEach((e=>e.log(s)))}debug(e,t,r=!1){this.log("debug",e,r,t)}info(e,t,r=!1){this.log("info",e,r,t)}warn(e,t,r=!1){this.log("warn",e,r,t)}error(e,t,r=!1){this.log("error",e,r,t)}addTransport(e){this.config.transports.push(e)}clearTransports(){this.config.transports=[]}disable(){this.config.enabled=!1}enable(){this.config.enabled=!0}}const n=3,o=e=>1e3*e;async function c(e,t={},r){const{maxAttempts:i=n,delayFn:s=o}=t;let a=null;for(let t=1;t<=i;t+=1)try{return await e()}catch(e){a=e,t<i&&await new Promise((e=>{setTimeout(e,s(t))}))}if(a&&t.logger&&t.operationName&&t.logger.error(`Operation ${t.operationName} failed after ${i} attempts.`,a),void 0!==r)return r;throw a||new Error("Operation failed after multiple attempts")}const g=chrome;function l(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var h={exports:{}};"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self&&self,function(e){if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)e.exports=globalThis.browser;else{const t="The message port closed before a response was received.",r=e=>{const r={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(0===Object.keys(r).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class i extends WeakMap{constructor(e,t=void 0){super(t),this.createItem=e}get(e){return this.has(e)||this.set(e,this.createItem(e)),super.get(e)}}const s=(t,r)=>(...i)=>{e.runtime.lastError?t.reject(new Error(e.runtime.lastError.message)):r.singleCallbackArg||i.length<=1&&!1!==r.singleCallbackArg?t.resolve(i[0]):t.resolve(i)},a=e=>1==e?"argument":"arguments",n=(e,t,r)=>new Proxy(t,{apply:(t,i,s)=>r.call(i,e,...s)});let o=Function.call.bind(Object.prototype.hasOwnProperty);const c=(e,t={},r={})=>{let i=Object.create(null),g={has:(t,r)=>r in e||r in i,get(g,l,h){if(l in i)return i[l];if(!(l in e))return;let d=e[l];if("function"==typeof d)if("function"==typeof t[l])d=n(e,e[l],t[l]);else if(o(r,l)){let t=((e,t)=>function(r,...i){if(i.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${a(t.minArgs)} for ${e}(), got ${i.length}`);if(i.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${a(t.maxArgs)} for ${e}(), got ${i.length}`);return new Promise(((a,n)=>{if(t.fallbackToNoCallback)try{r[e](...i,s({resolve:a,reject:n},t))}catch(s){console.warn(`${e} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,s),r[e](...i),t.fallbackToNoCallback=!1,t.noCallback=!0,a()}else t.noCallback?(r[e](...i),a()):r[e](...i,s({resolve:a,reject:n},t))}))})(l,r[l]);d=n(e,e[l],t)}else d=d.bind(e);else if("object"==typeof d&&null!==d&&(o(t,l)||o(r,l)))d=c(d,t[l],r[l]);else{if(!o(r,"*"))return Object.defineProperty(i,l,{configurable:!0,enumerable:!0,get:()=>e[l],set(t){e[l]=t}}),d;d=c(d,t[l],r["*"])}return i[l]=d,d},set:(t,r,s,a)=>(r in i?i[r]=s:e[r]=s,!0),defineProperty:(e,t,r)=>Reflect.defineProperty(i,t,r),deleteProperty:(e,t)=>Reflect.deleteProperty(i,t)},l=Object.create(e);return new Proxy(l,g)},g=e=>({addListener(t,r,...i){t.addListener(e.get(r),...i)},hasListener:(t,r)=>t.hasListener(e.get(r)),removeListener(t,r){t.removeListener(e.get(r))}}),l=new i((e=>"function"!=typeof e?e:function(t){const r=c(t,{},{getContent:{minArgs:0,maxArgs:0}});e(r)})),h=new i((e=>"function"!=typeof e?e:function(t,r,i){let s,a,n=!1,o=new Promise((e=>{s=function(t){n=!0,e(t)}}));try{a=e(t,r,s)}catch(e){a=Promise.reject(e)}const c=!0!==a&&((g=a)&&"object"==typeof g&&"function"==typeof g.then);var g;if(!0!==a&&!c&&!n)return!1;return(c?a:o).then((e=>{i(e)}),(e=>{let t;t=e&&(e instanceof Error||"string"==typeof e.message)?e.message:"An unexpected error occurred",i({__mozWebExtensionPolyfillReject__:!0,message:t})})).catch((e=>{console.error("Failed to send onMessage rejected reply",e)})),!0})),d=({reject:r,resolve:i},s)=>{e.runtime.lastError?e.runtime.lastError.message===t?i():r(new Error(e.runtime.lastError.message)):s&&s.__mozWebExtensionPolyfillReject__?r(new Error(s.message)):i(s)},m=(e,t,r,...i)=>{if(i.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${a(t.minArgs)} for ${e}(), got ${i.length}`);if(i.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${a(t.maxArgs)} for ${e}(), got ${i.length}`);return new Promise(((e,t)=>{const s=d.bind(null,{resolve:e,reject:t});i.push(s),r.sendMessage(...i)}))},u={devtools:{network:{onRequestFinished:g(l)}},runtime:{onMessage:g(h),onMessageExternal:g(h),sendMessage:m.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:m.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},f={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return r.privacy={network:{"*":f},services:{"*":f},websites:{"*":f}},c(e,u,r)};e.exports=r(chrome)}}(h);var d=l(h.exports);class m{constructor(e,t,r,i,s){this.wfSecret=e,this.wfAppId=t,this.deviceUrl=r,this.dataUrl=i,this._logger=s}async getWildfireDevice(){try{const e=await fetch(this.deviceUrl,{method:"POST",body:JSON.stringify({}),headers:{"Content-Type":"application/json","WF-Secret":this.wfSecret,"WF-App-ID":this.wfAppId}});if(e.ok)return e.json();throw new Error(`Failed to fetch Wildfire device from ${this.deviceUrl}. Status ${e.status}. ${e.statusText}`)}catch(e){throw this._logger.error("Failed to fetch the Wildfire device",{err:e}),e}}async getActiveDomains(){try{const e=`${this.dataUrl}/${this.wfAppId}/active-domain/1`,t=await fetch(e);if(t.ok)return t.json();throw new Error(`Failed to fetch active domains from ${e}. Status ${t.status}. ${t.statusText}`)}catch(e){throw this._logger.error("Failed to fetch the active domains",{err:e}),e}}async getStanddownPolicy(){const e=`${this.dataUrl}/${this.wfAppId}/stand-down-policy/1`;try{const t=await fetch(e);if(t.ok)return t.json();throw new Error(`Failed to fetch standdown policy from ${e}. Status ${t.status} ${t.statusText}`)}catch(t){throw this._logger.error("Failed to fetch the standdown policy",{err:t,url:e}),t}}async getMerchantRates(){const e=`${this.dataUrl}/${this.wfAppId}/merchant-rate/1`;try{const t=await fetch(e);if(this._logger.debug("Merchant rates response",{response:t}),!t.ok)throw new Error(`Failed to fetch merchant rates from ${e}. Status ${t.status}. ${t.statusText}`);const r=t.json();return this._logger.debug("Merchant rates",{rates:r}),r}catch(t){throw this._logger.error("Failed to fetch the merchant rates",{err:t,url:e}),t}}}const u="GIVE_FREELY_",f={async get(e){const t=`${u}${e}`;return(await d.storage.local.get(t))[t]||null},async set(e,t){const r=`${u}${e}`;await d.storage.local.set({[r]:t})},async remove(e){const t=Array.isArray(e)?e.map((e=>`${u}${e}`)):`${u}${e}`;await d.storage.local.remove(t)}},A="wfDevice",p="wfDomains",y="wfStanddownPolicy",w="wfStanddownHistory",v="wfMerchantRates";async function x(e,t,r){try{const i=(await b())?.[t];if(i&&i>Date.now())return e.info("Standing down because current affiliate stand down session has not expired"),S(t),!0;await this.refreshCache();const s=await this.getStanddownPolicy();if(I(s,new URL(r).search))return e.info("Standing down because url has affiliate params"),S(t),!0;e.info("No need to stand down.")}catch(t){e.error("Exception produced when trying to determine if it should stand down",t)}return!1}function E(e,t){if(!this.standDownPolicy)return this.logger.warn("Couldnt check affilliation. No stand down policy found"),this.getStanddownPolicy().then((e=>{this.standDownPolicy=e})),!1;const r=e.some((e=>C(this.standDownPolicy,e)))||I(this.standDownPolicy,t);return this.logger.info("Affilliation result:",r),r}const b=async()=>f.get(w),S=async(e,t=1)=>{const r=await b()??{};r[e]=Date.now()+60*t*60*1e3,await f.set(w,r)},C=(e,t)=>{if(!t)return!1;const{Domains:r}=e;return r.some((e=>t.includes(e)))},I=(e,t)=>{if(!t)return!1;const{Params:r}=e;return r.some((e=>t.toLowerCase().includes(`?${e.toLowerCase()}`)))||r.some((e=>t.toLowerCase().includes(`&${e.toLowerCase()}`)))};class T{constructor(e,t,r,i){this.userId=e,this.charityEin=t,this.charityThirdPartyIdentifier=r,this.partnerId=i}toString(){return`userId=${this.encodeUserId(this.userId)},charityEin=${this.charityEin},charityThirdPartyIdentifier=${this.charityThirdPartyIdentifier},partnerId=${this.partnerId}`}encodeUserId(e){return btoa(e).replace(/_/g,"/").replace(/-/g,"+")}}const P="TRACK_EVENT",U="GF_HIDE_POPUP",O="GF_GET_POPUP_CONFIG",D="GF_IS_ACTIVE_DOMAIN",F="GF_SHOULD_STAND_DOWN",_="GF_ACTIVATE_OFFER",k="GF_STORE_SHOPIFY_SHOP_ID",R="GF_GET_DOMAIN_BY_SHOP_ID",$="GF_GET_LANGUAGE_CONTENT",L="shopify_shop_ids",N="gf_last_health_check",G="en",M={async get(e,t,r,i=!1){let s=await f.get(e);const a=s;let n=!1;if(s&&Date.now()<=s.expiration&&!i)return{content:s.content,isStale:n};try{const i=await t();s=await this.set(e,i,r)}catch(e){n=!0}return{content:s?.content??a?.content,isStale:n}},async set(e,t,r){const i={content:t,expiration:Date.now()+1e3*(r??300)};return await f.set(e,i),i},async refresh(e,t,r,i=!1){const s=await this.get(e,t,r,i);if(s.isStale||i)try{const i=await t();if(!i)return{content:s.content,isStale:!0};s.content=i,await this.set(e,s.content,r)}catch(e){return{content:s.content,isStale:!0}}return{content:s.content,isStale:!1}},async clear(e){await f.remove(e)}};class K{constructor(e,t,r,i=21600){if(this.standDownPolicy=null,this.shouldStandDown=x.bind(this),this.hasAffilliation=E.bind(this),!e||!r)throw new Error("WildfireService requires wildfireClient and vanityBaseUrl");this.wildfireClient=e,this.vanityBaseUrl=r.replace(/\/$/,""),this.refreshInterval=i,this.logger=t}async getActiveDomains(e=!1){try{const t=(await M.get(p,(async()=>this.fetchActiveDomains()),this.refreshInterval,e)).content;if(!t)throw Error("Failed to retrieve active domains");return t}catch(e){throw this.logger.error("Failed to get active domains:",e),new Error("Failed to retrieve active domains")}}async getMerchantRates(e,t=!1){try{const r=await M.get(v,(async()=>this.fetchMerchantRates()),this.refreshInterval,t);if(!r.content)throw new Error("Failed to retrieve merchant rates from cache");return r.content[e]}catch(e){throw this.logger.error("Failed to retrieve merchant rates:",e),new Error("Failed to retrieve merchant rates")}}async generateAffiliateUrl(e,t,r,i){if(!e||!t||!i)throw new Error("Missing required parameters for affiliate URL generation");try{const s=await this.getDevice(),a=await this.generateTrackingCode(r,i,s),n=encodeURIComponent(t),o=encodeURIComponent(a);return`${this.vanityBaseUrl}/e?d=${s.DeviceID}&c=${e.ID}&tc=${o}&url=${n}`}catch(e){throw this.logger.error("Failed to generate affiliate URL:",e),new Error("Failed to generate affiliate URL")}}async clearCache(){try{await Promise.all([M.clear(p),M.clear(y),M.clear(v)])}catch(e){throw this.logger.error("Failed to clear cache:",e),new Error("Failed to clear cache")}}async refreshCache(e=!1){try{const[,t]=await Promise.all([M.refresh(p,(()=>this.fetchActiveDomains()),this.refreshInterval,e),M.refresh(y,(()=>this.fetchStanddownPolicy()),this.refreshInterval,e),M.refresh(v,(()=>this.fetchMerchantRates()),this.refreshInterval,e)]);t?.content&&(this.standDownPolicy=t.content)}catch(e){throw this.logger.error("Failed to refresh cache:",e),new Error("Failed to refresh cache")}}async getStanddownPolicy(){try{const e=await M.get(y,(async()=>this.fetchStanddownPolicy()),this.refreshInterval);if(!e.content)throw new Error("Failed to retrieve standdown policy from cache");return this.logger.info("Retrieved standdown policy from cache",e.content),this.standDownPolicy=e.content,this.standDownPolicy}catch(e){throw this.logger.error("Failed to get standdown policy from cache:",e),new Error("Failed to retrieve standdown policy")}}getRetryOptions(e){return{delayFn:e=>1e3*e,maxAttempts:3,logger:this.logger,operationName:e}}async getDevice(){try{const e=await f.get(A);return e?.DeviceID?e:c((()=>this.fetchAndStoreDevice()),this.getRetryOptions("Get Device"))}catch(e){throw this.logger.error("Failed to get device:",e),new Error("Failed to retrieve device information")}}async fetchAndStoreDevice(){const e=await this.wildfireClient.getWildfireDevice();if(!e?.DeviceID)throw new Error("Failed to retrieve device information");return await f.set(A,e),e}async generateTrackingCode(e,t,r){if(!(e?.id&&e?.charity&&e?.charity.ein&&e?.charity.thirdPartyId)){const e=`notregistered-${r.DeviceID}`;return this.logger.info("User not provided. Using GF's default bucket instead.",e),e}return new T(e.id,e.charity.ein,e.charity.thirdPartyId,t).toString()}async fetchActiveDomains(){const e=await c((()=>this.wildfireClient.getActiveDomains()),this.getRetryOptions("Fetch Active Domains"));return this.logger.info("Updated active domains"),e}async fetchStanddownPolicy(){const e=await c((()=>this.wildfireClient.getStanddownPolicy()),this.getRetryOptions("Get Standdown policy"),{Domains:[],LostAttribution:[],Params:[],Serp:[]});return this.logger.info("Updated standdown policy"),e}async fetchMerchantRates(){const e=await c((()=>this.wildfireClient.getMerchantRates()),this.getRetryOptions("Fetch Merchant Rates"),{});return this.logger.debug("Updated Merchant rates"),e}}const H="version",z=()=>String("1.8.3"),j=async(e=!0)=>{const t=await f.get(H),r=await z(),i=t!==r;var s;return e&&i&&await(s=r,f.set(H,s)),i},W="https://cdn.givefreely.com/adunit/behavioral/";class Y{constructor(e){this.partnerApiKey=e,this.partnerConfig=null,this.globalConfig=null,this.PARTNER_CONFIG_STORAGE_KEY="gf_partner_config",this.GLOBAL_CONFIG_STORAGE_KEY="gf_global_config",this.globalConfigRefreshInterval=60,this.partnerConfigRefreshInterval=60}getRetryOptions(){return{delayFn:e=>1e3*e,maxAttempts:3}}async fetchPartnerConfig(){const e=await c((async()=>{const e=await fetch(`${W}${this.partnerApiKey}.json`,{cache:"no-store"});if(!e.ok)throw new Error(`Failed to fetch partner config: ${e.statusText}`);return e.json()}),this.getRetryOptions());if(!e)throw new Error("Failed to fetch or get from cache partner config");return this.partnerConfigRefreshInterval=e.configRefreshInterval||this.partnerConfigRefreshInterval,e}async fetchGlobalConfig(){const e=await c((async()=>{const e=await fetch(`${W}global.json`,{cache:"no-store"});if(!e.ok)throw new Error(`Failed to fetch global config => Status code: ${e.status} .${e.statusText}`);return e.json()}),this.getRetryOptions());if(!e)throw new Error("Failed to fetch or get from cache global config",e);return this.globalConfigRefreshInterval=e.configRefreshInterval||this.globalConfigRefreshInterval,e}async getConfig(e=!1){let t=!1;e&&(t=await j());const[r,i]=await Promise.all([await M.get(this.PARTNER_CONFIG_STORAGE_KEY,this.fetchPartnerConfig.bind(this),this.partnerConfigRefreshInterval,t),await M.get(this.GLOBAL_CONFIG_STORAGE_KEY,this.fetchGlobalConfig.bind(this),this.globalConfigRefreshInterval,t)]);if(!i.content)throw new Error("Global config is required");if(!r.content)throw new Error("Partner config is required");this.partnerConfig=r.content,this.globalConfig=i.content;const s=this.mergeConfigs(JSON.parse(JSON.stringify(this.globalConfig)),JSON.parse(JSON.stringify(this.partnerConfig)));if(!s)throw new Error("Was not able to merge configs");return((e,t,r)=>{const i=[...t.merchantExclusions??[],...r.merchantExclusions??[]];e.merchantExclusions=i})(s,this.globalConfig,this.partnerConfig),s}async clearCache(){await Promise.all([M.clear(this.PARTNER_CONFIG_STORAGE_KEY),M.clear(this.GLOBAL_CONFIG_STORAGE_KEY)]),this.partnerConfig=null,this.globalConfig=null}mergeConfigs(e,t){if(!t)return e;if(!e)return t;const r={...e};return Object.keys(t).forEach((i=>{if(!Object.prototype.hasOwnProperty.call(t,i))return;const s=e[i],a=t[i];void 0!==a&&(Array.isArray(a)?r[i]=[...a]:r[i]=null===a||"object"!=typeof a||null===s||"object"!=typeof s?a:this.mergeConfigs(s,a))})),r}}class B{static register(e,t){this.strategies.set(e,t)}static get(e){return this.strategies.get(e)}static exists(e){return!!function(e){return"object"==typeof e&&null!==e&&"type"in e&&"payload"in e&&"string"==typeof e.type}(e)&&this.strategies.has(e.type)}}B.strategies=new Map;class q{async handle(e,t){const{hostname:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger(),a=await i.getConfig().merchantExclusions,n=await i.getActiveDomains();s.debug("Checking hostname",{hostname:r});try{if(i.healthCheck(),a.some((e=>e.disableDomain&&(r===e.domain||r.endsWith(`.${e.domain}`)))))return s.debug("Hostname is in merchant exclusions",{hostname:r}),{type:D,payload:{isActive:!1,domain:void 0,rates:[]}};if(!n||0===n.length)throw new Error("No active domains");s.debug("Retrieved active domains",{count:n.length});const e=n.find((e=>r===e.Domain||r.endsWith(`.${e.Domain}`)));s.debug("Domain check result",{hostname:r,isActive:!!e});let t=[];if(e?.ID){const r=await i.getMerchantRates(e.Merchant.ID);r&&(s.debug("Retrieved merchant rates",{merchantRates:r}),t=r)}return{type:D,payload:{isActive:!!e,domain:e,rates:t}}}catch(e){return s.error("Error checking domain",{hostname:r,error:e}),{type:D,payload:{isActive:!1,domain:void 0,rates:[]}}}}}class V{async handle(e,t){const{giveFreelyService:r}=t,i=r.getLogger(),s=await r.getCachedConfig();try{return i.debug("Fetching popup config"),{type:O,payload:{config:s}}}catch(e){return i.error("Error fetching popup config",{error:e}),{type:O,payload:{config:null}}}}}class X{async handle(e,t){const{days:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger();try{const e=new Date;return e.setDate(e.getDate()+r),await f.set("popup_hide",{popupHide:e.getTime()}),s.debug("Popup hidden",{days:r,expiry:e}),{type:U,payload:{ack:!0}}}catch(e){return s.error("Error hiding popup",{days:r,error:e}),{type:U,payload:{ack:!1}}}}}class J{async handle(e,t){const{activeDomain:r,url:i}=e.payload,{giveFreelyService:s}=t,a=s.getLogger();a.debug("Checking if we should stand down",{activeDomain:r});try{const e=await s.shouldStandDown(r,i);return{type:F,payload:{result:e}}}catch(e){return a.error("Error checking if we should stand down. Returning false",{activeDomain:r,error:e}),{type:F,payload:{result:!1}}}}}class Z{constructor(e,t,r,i=60){this.track=async(e,t,r,i=!1)=>{const s={partner:`adUnit_${this._partnerApiKey}`,eventType:e,eventData:{userId:i?void 0:this._userService?.user?.id,libVersion:z(),wfDeviceId:t,...r}};try{const e=JSON.stringify(s,((e,t)=>t instanceof Error?{name:t.name,message:t.message,stack:t.stack}:t)),t=await this.getEventsUrl();if(await this.shouldBroadcastEvent(e)){const r=await fetch(t,{headers:{"Content-Type":"application/json"},method:"POST",body:e,cache:"no-store"});return r.ok?(await this.pushEventToHistory(e),!0):(this._logger.error("Something unexpected happened when dispatching an event",{status:r.status,statusText:r.statusText,event:s},!0),!1)}return this._logger.info("This event has already been broadcasted during the past hour",s,!0),!1}catch(e){return this._logger.error("Something unexpected happened when dispatching a gf event",{error:e,event:s}),!1}},this.getEventsHistory=async()=>{const{GF_AD_EVENT_HISTORY:e}=await g.storage.local.get({GF_AD_EVENT_HISTORY:""}),t=(e=>{const t=new Date;return t.setTime(t.getTime()+60*e*1e3),t.getTime()})(-this._debounceWindowInMinutes),r=(e||[]).filter((e=>e.createdAt>t));return await g.storage.local.set({GF_AD_EVENT_HISTORY:r}),r},this.shouldBroadcastEvent=async e=>!(await this.getEventsHistory()).some((t=>t.payload===e)),this.pushEventToHistory=async e=>{const t=await this.getEventsHistory();t.push({createdAt:Date.now(),payload:e}),await g.storage.local.set({GF_AD_EVENT_HISTORY:t})},this._partnerApiKey=e,this._userService=t,this._debounceWindowInMinutes=i,this._logger=a.getInstance({title:"Analytics"}),this._configService=r}async getEventsUrl(){const{eventsUrl:e}=await this._configService.getConfig();return e}}Z.trackEvent=async(e,t,r=!1)=>{await async function(e){return new Promise(((t,r)=>{try{const i=i=>chrome.runtime.lastError?r({error:chrome.runtime.lastError,message:e}):t(i);g.runtime.sendMessage(e,i)}catch(e){r(e)}}))}({type:P,payload:{eventType:e,eventData:t,anonymous:r}})};class Q{async handle(e,t){const{eventType:r,eventData:i,anonymous:s}=e.payload,{giveFreelyService:a}=t,n=a.getLogger();n.debug("Broadcasting event",{eventType:r,eventData:i,anonymous:s});try{const e=await a.trackEvent(r,i,s);return{type:P,payload:{result:e}}}catch(e){return n.error("Error broadcasting event. Returning false",{eventType:r,eventData:i,error:e}),{type:P,payload:{result:!1}}}}}class ee{async handle(e,r){const{activeDomain:i,originalUrl:s,selectedCharity:a}=e.payload,{giveFreelyService:n}=r,o=n.getLogger();o.debug("Activating offer",{activeDomain:i,selectedCharity:a});try{if(!a?.ein||!a?.thirdPartyId)throw new Error("Missing charity information");const e=await n.initializeWfDeviceId();if(!e)throw new Error("Failed to initialize Wildfire device ID");const t=await n.upsertUser(a,e);o.debug("Upserted user",{currentUser:t}),t||o.info("Failed to create user. Using default bucket's user");const r=await n.generateAffiliateUrl(i,s,t);return o.debug("Generated affiliate URL",{affiliateUrl:r}),(async e=>{const t=g.tabs.getCurrent(),r=await t,i=await g.tabs.create({url:e,openerTabId:r?.id,active:!1,pinned:!0});await(async e=>new Promise((t=>{g.tabs.onUpdated.addListener((async function r(i,s){if(i===e&&"complete"===s.status){if(g.tabs.onUpdated.removeListener(r),!(await g.tabs.get(e)).url)return void t(!1);t(!0)}}))})))(i.id)&&setTimeout((()=>{i?.id&&g.tabs.remove(i.id)}),3e4)})(r),await n.updateStanddownHistory(i.Domain),o.debug("Activated offer",{activeDomain:i,selectedCharity:a}),{type:_,payload:{response:!0}}}catch(e){return o.error("Error activating offer",{activeDomain:i,error:e}),n.trackEvent(t.checkoutPopupFailedActivation,{activeDomain:i,error:e}),{type:_,payload:{response:!1}}}}}var te;!function(e){e[e.Pending=0]="Pending",e[e.Ready=1]="Ready",e[e.Received=2]="Received",e[e.Donated=3]="Donated",e[e.Disqualified=4]="Disqualified"}(te||(te={}));class re{constructor(e,t,r){this.adUnitId=e,this.config=t,this.logger=r}async getAnonymousUserCommissions(e,t){try{const r=new URLSearchParams(t).toString(),i=await fetch(`${this.config.apiConfig.baseUri}/${this.config.apiConfig.getAnonymousUserComissionsPath}?${r}`,{method:"GET",headers:{"Content-Type":"application/json","X-AnonymousUserToken":e}});if(!i.ok)throw new Error(`Failed to fetch commissions. Status code: ${i.status} .${i.statusText}`);return await i.json()}catch(e){throw this.logger.error("[GiveFreelyApiClient] Error fetching anonymous user's commissions:",{error:e}),e}}async createOrUpdateAnonymousUser(e,t){try{const r=await fetch(`${this.config.apiConfig.baseUri}/${this.config.apiConfig.createAnonymousUserPath}?adUnitId=${this.adUnitId}`,{method:"PUT",headers:{"Content-Type":"application/json","X-GF-Platform":"adUnitLibrary","X-AnonymousUserToken":t??""},body:JSON.stringify(e)});if(!r.ok)throw new Error(`Failed to create/update anonymous user. Status code: ${r.status} .${r.statusText}`);this.logger.info("[GiveFreelyApiClient] anonymous user created/updated successfully.");const i=await r.json(),s=r.headers.get("X-AnonymousUserToken");return{resultUser:{...i,charity:{ein:i.selectedCharity,thirdPartyId:i.selectedCharityThirdPartyIdentifier,name:void 0}},resultToken:s}}catch(e){throw this.logger.error("[GiveFreelyApiClient] Error creating anonymous user:",{error:e}),e}}}class ie{constructor(e,t){this.ANONYMOUS_USER_STORAGE_KEY="gf_anonymous_user_info",this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY="gf_anonymous_encrypted_token",this._giveFreelyApiClient=e,this._logger=t,this.user=null}async resetUser(){await f.remove(this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY),await f.remove(this.ANONYMOUS_USER_STORAGE_KEY)}async upsertUser(e,t){let r=await this.fetchUser();try{const i={selectedCharity:e?.ein,selectedCharityThirdPartyIdentifier:e?.thirdPartyId,deviceId:t};if(!await this.shouldCreateOrUpdateUser(r,i))return r;const s=await f.get(this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY),{resultUser:a,resultToken:n}=await this._giveFreelyApiClient.createOrUpdateAnonymousUser(i,s);n&&await f.set(this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY,n),a&&(await f.set(this.ANONYMOUS_USER_STORAGE_KEY,a),r=a)}catch(e){this._logger.error("Error creating/updating anonymous user:",e)}return this.user=r,r}async fetchUser(){const e=await f.get(this.ANONYMOUS_USER_STORAGE_KEY);return this.user=e,e}async shouldCreateOrUpdateUser(e,t){return!e||e.charity?.ein!==t.selectedCharity||e.charity?.thirdPartyId!==t.selectedCharityThirdPartyIdentifier||e.deviceId!==t.deviceId}}const se=e=>{try{return new URL(e),!0}catch{return!1}},ae=new Set,ne=new Set,oe={urls:["<all_urls>"],types:["main_frame"]};class ce{async handle(e,t){const r=e.payload,{giveFreelyService:i}=t,s=i.getLogger();try{const e=L,t=await f.get(e)||[],i=t.findIndex((e=>e.shopId===r.shopId));return i>=0?t[i]=r:t.push(r),await f.set(e,t),s.debug("Stored Shopify shop ID",{shopInfo:r}),{type:k,payload:{success:!0}}}catch(e){return s.error("Error storing Shopify shop ID",{shopInfo:r,error:e}),{type:k,payload:{success:!1}}}}}class ge{async handle(e,t){const{shopId:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger();try{const e=L,t=(await f.get(e)||[]).find((e=>e.shopId===r));return t?(s.debug("Found domain for shop ID",{shopId:r,domain:t.domain}),{type:R,payload:{found:!0,domain:t.domain,shopInfo:t}}):(s.debug("No domain found for shop ID",{shopId:r}),{type:R,payload:{found:!1}})}catch(e){return s.error("Error getting domain for shop ID",{shopId:r,error:e}),{type:R,payload:{found:!1}}}}}class le{constructor(e,t){this.lastCheck=null,this.trackEvent=e,this.logger=t}async initialize(){const e=await f.get(N);e&&(this.lastCheck=e)}getToday(){return(new Date).toISOString().split("T")[0]}async check(){try{const e=this.lastCheck??0,r=this.getToday();(e?new Date(e).toISOString().split("T")[0]:null)!==r&&(this.lastCheck=Date.now(),await f.set(N,this.lastCheck),await this.trackEvent(t.checkoutPopupHealthCheck,{language:chrome.i18n.getUILanguage()}))}catch(e){this.logger.error("Health check failed",{error:e instanceof Error?e.message:"Unknown error"})}}}const he=a.getInstance(),de="countryCode";class me{async handle(e,t){const{lang:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger();s.debug("Getting language strings",{lang:r});try{const e=await i.getLanguage(r);return s.debug("Language strings fetched",{language:e}),{type:$,payload:{translations:e.translations,charities:e.charities}}}catch(e){return s.error("Error getting language strings",{error:e}),{type:$,payload:{translations:null,charities:null}}}}}const ue="https://cdn.givefreely.com/adunit/language",fe=async(e,t,r,i,s=!1)=>{const a=`lang-${G}`,n=await M.get(a,(async()=>(e.debug(`Fetching default language ${G} for partner ${t}`),Ae(e,t,G))),i||60,s);if(!n.content)throw new Error(`Failed to fetch default language ${G} and no cache version available`);if(G===r)return n.content;const o=`lang-${r}`,c=await M.get(o,(async()=>(e.debug(`Fetching language ${r} for partner ${t}`),Ae(e,t,r))),i||60,s);if(!c.content)return n.content;const g=we(n.content,c.content);return await M.set(o,g,i||60),g},Ae=async(e,t,r)=>{const i=`/global-${r}.json`,s=`/${t}/${r}.json`,[a,n]=await Promise.allSettled([pe(`${ue}${i}`),pe(`${ue}${s}`)]);let o,c;if("fulfilled"!==a.status)throw e.error(`Failed to fetch global language file: ${a.reason}`),new Error(`Failed to fetch global language file: ${a.reason}`);o=a.value,"fulfilled"===n.status?c=n.value:e.error(`Failed to fetch partner language file ${n.reason}. Using global language file only`);let g=o;return c&&(g=ye(o,c)),{translations:g.translations,charities:g.charities}},pe=async e=>{const t=await fetch(e,{cache:"no-store"});if(!t.ok)throw new Error(`Failed to fetch partner language file ${e}. Status: ${t.status}. Reason: ${t.statusText}`);return t.json()},ye=(e,t)=>({translations:{...e.translations,...t},charities:{...e.charities}}),we=(e,t)=>({translations:{...e.translations,...t.translations},charities:{...e.charities,...t.charities}});class ve extends Error{constructor(e="Service not initialized"){super(e),this.name="UninitializedServiceError"}}class GiveFreelyService{constructor(e){this.partnerApiKey=e,this.dependencies={configService:new Y(e)},this.logger=a.getInstance(),this.logger.configure({enabled:!0,title:"Background - GiveFreelyService"}),this.state={initialized:!1,wildfireService:null,partnerFilter:null,config:null,wfDeviceId:null,analytics:null,giveFreelyUserService:null,partnerApiKey:e,healthCheck:null}}assertInitialized(){if(!this.state.initialized)throw new ve}async initialize(e=async()=>(this.logger.debug("Using default partnerFilter."),!0)){if(!this.state.initialized)try{const t=await this.dependencies.configService.getConfig(!0);this.logger.configure({minLevel:t.backgroundMinLogLevel??"error"}),this.logger.info("Initializing GiveFreelyService",{partnerApiKey:this.partnerApiKey});const r=this.createWildfireService(t);this.state.healthCheck=new le(this.trackEvent.bind(this),this.logger),await this.state.healthCheck.initialize();const s=await j();await r.refreshCache(s);const n=new re(this.partnerApiKey,t,this.logger);this.state.giveFreelyUserService=new ie(n,this.logger),await this.state.giveFreelyUserService.fetchUser(),this.state.giveFreelyUserService.user?.id||await this.state.giveFreelyUserService.upsertUser();try{await(async()=>await f.get(de)||(async()=>{he.debug("detecting country");const e={method:"GET",headers:{"Content-Type":"application/json",Authorization:"Basic OTEzOTkxOnFlYmpaWF9DOGNRY0lxSHA4WTVjNGxzU1pRSlM2VW9MMExzTF9tbWs="}};try{const t=await fetch("https://geoip.maxmind.com/geoip/v2.1/country/me",e);if(he.debug("Received geolocation response",{status:t.status}),!t.ok)return void he.error("Failed to get geolocation data",{status:t.status,statusText:t.statusText});const r=await t.json();if(!r)throw new Error("There was an error fetching geoip look up");return await f.set(de,r.country.iso_code),r.country.iso_code}catch(e){return void he.error("Failed to get geolocation data",{error:e})}})())()}catch(e){this.logger.debug("Failed to get geolocation data",{error:e})}this.state.analytics=new Z(this.partnerApiKey,this.state.giveFreelyUserService,this.dependencies.configService),this.logger.addTransport(new i(this)),B.register(D,new q),B.register(O,new V),B.register(U,new X),B.register(F,new J),B.register(P,new Q),B.register(_,new ee),B.register(k,new ce),B.register(R,new ge),B.register($,new me),this.state.wildfireService=r,this.state.partnerFilter=e,this.state.config=t,this.state.initialized=!0,d.webRequest&&(d.webRequest.onBeforeRequest.addListener((e=>{const t=e.getLogger();return({requestId:r,url:i,initiator:s})=>{try{if(ae.has(r)||ne.has(r)||!se(i))return;const{hostname:a,search:n}=new URL(i);if(a.includes("wild.link"))return t.info("Cashback activation request identified, ignoring affiliate check for request"),void ne.add(r);let o;s&&se(s)&&(o=new URL(s).hostname),e.hasAffiliation([a,o],n)&&(t.info("Affiliation found on url, adding request id to track"),ae.add(r))}catch(e){t.error("Error on handleAffiliateOnBeforeRequest",e)}}})(this),oe),d.webRequest.onBeforeRedirect.addListener((e=>{const t=e.getLogger();return async({requestId:r,redirectUrl:i})=>{try{if(!ae.has(r))return;t.info("Attempting to find active domain");const{hostname:s}=new URL(i),a=(await e.getActiveDomains()).find((e=>s===e.Domain||s.endsWith(`.${e.Domain}`)));if(!a)return;t.info("Found active domain. Updating standdown state"),await S(a.Domain)}catch(e){t.error("Error on handleAffiliateOnBeforeRedirect",e)}}})(this),oe),d.webRequest.onCompleted.addListener((()=>{const e=this.getLogger();return({requestId:t})=>{try{ae.has(t)&&(e.info("Tracking request completed. Request Id:",t),ae.delete(t))}catch(t){e.error("Error on handleAffiliateOnCompleted",t)}}})(),oe)),function(e){const t=a.getInstance();g.runtime.onMessage.addListener(((r,i,s)=>{function a(e){s(e)}const n=e(r,0);return n instanceof Promise?(n.then((e=>{e&&a(e)})).catch((e=>{t.warn("Async message callback error:",e)})),!0):n}))}((async(e,t)=>(this.logger.debug("Received message",{type:e.type,payload:e.payload}),this.handleMessage(e)))),t.purgeLanguages&&t.purgeLanguages.length>0&&await Promise.all(t.purgeLanguages.map((e=>M.clear(`lang-${e}`)))),c((async()=>{this.logger.debug("Initializing default language with partner API key",{partnerApiKey:this.partnerApiKey}),await fe(this.logger,this.partnerApiKey,G,t.configRefreshInterval)})),this.logger.info("GiveFreelyService initialized successfully")}catch(e){const t=e instanceof Error?e.message:"Unknown error";throw this.logger.error("Failed to initialize GiveFreelyService",{error:t}),new Error(`Failed to initialize GiveFreelyService: ${t}`)}}getConfig(){return this.assertInitialized(),this.state.config}async getCachedConfig(){return this.state.config=await this.dependencies.configService.getConfig(),this.logger.configure({minLevel:this.state.config.backgroundMinLogLevel??"error"}),this.state.config}async getActiveDomains(){return this.assertInitialized(),this.state.wildfireService.getActiveDomains()}async shouldStandDown(e,t){this.assertInitialized();const r=new URL(t);if(!await this.state.partnerFilter(r.hostname))return this.logger.info("Should standdown due to partner filter."),!0;if(this.getConfig().merchantExclusions.some((t=>t.mutePopups&&e===t.domain)))return this.logger.info("Should standdown due to merchant exclusions"),!0;const i=await this.state.wildfireService.shouldStandDown(this.logger,e,t);return i&&this.logger.info("Should standdown due to vendor policy"),i}hasAffiliation(e,t){if(!this.state.wildfireService)return this.logger.warn("Wildfire service not initialized yet"),!1;const r=this.state.wildfireService.hasAffilliation(e,t);return r&&this.logger.info("Affiliation identified"),r}trackEvent(e,t,r=!1){return this.assertInitialized(),this.state.analytics.track(e,this.state.wfDeviceId?.DeviceID,t,r)}getLogger(){return this.assertInitialized(),this.logger}async initializeWfDeviceId(){if(this.assertInitialized(),this.state.wfDeviceId=await this.state.wildfireService.getDevice(),!this.state.wfDeviceId)throw new Error("Failed to initialize Wildfire device ID");return this.state.wfDeviceId.DeviceID}getWfDeviceId(){return this.assertInitialized(),this.state.wfDeviceId.DeviceID}upsertUser(e,t){return this.assertInitialized(),this.state.giveFreelyUserService.upsertUser(e,t)}getCurrentUser(){return this.assertInitialized(),this.state.giveFreelyUserService.user}generateAffiliateUrl(e,t,r){return this.assertInitialized(),this.state.wildfireService.generateAffiliateUrl(e,t,r,this.state.partnerApiKey)}updateStanddownHistory(e){return this.assertInitialized(),S(e)}getMerchantRates(e){if(this.assertInitialized(),!this.state.wildfireService)throw new Error("Wildfire service not initialized");return this.state.wildfireService.getMerchantRates(e)}async healthCheck(){this.assertInitialized(),await this.state.healthCheck.check()}async getLanguage(e){return this.assertInitialized(),fe(this.logger,this.state.partnerApiKey,e,this.state.config?.configRefreshInterval)}async handleMessage(e){this.assertInitialized();const t=B.get(e.type);if(!t)return;const r={giveFreelyService:this};return t.handle(e,r)}createWildfireService(e){this.logger.debug("Initializing wildfire service with config",this.state.config);const t=new m(e.wfSecret,e.wfAppId,e.deviceUrl,e.dataUrl,this.logger);return new K(t,this.logger,e.vanityBaseUrl,e.refreshInterval)}async destroy(){this.logger.info("Destroying GiveFreelyService"),await Promise.all([this.dependencies.configService.clearCache(),this.state.wildfireService?.clearCache(),this.state.giveFreelyUserService?.resetUser()]),this.state.initialized=!1,this.state.wildfireService=null,this.state.partnerFilter=null,this.state.analytics=null,this.state.config=null}}const xe=e=>B.exists(e);export{GiveFreelyService,g as browser,xe as isAdUnitMessage};
1
+ class e{constructor(){this.isLocal=!0}log({level:t,message:r,timestamp:i,data:s,title:a}){const n="debug"===t?"log":t,o=a?`[${a}]`:"";void 0!==s?console[n](`[${i}] - ${e.LOGGER_PREFIX} ${o} ${r}`,s):console[n](`[${i}] - ${e.LOGGER_PREFIX} ${o} ${r}`)}}var t,r;e.LOGGER_PREFIX="[GFAdUnit] -",function(e){e.checkoutPopupShown="CHECKOUT-POPUP-SHOWN",e.checkoutPopupNotShown="CHECKOUT-POPUP-NOT-SHOWN",e.checkoutPopupSupressed="CHECKOUT-POPUP-SUPRESSED",e.checkoutPopupDonation="CHECKOUT-POPUP-DONATION",e.checkoutPopupFailedActivation="CHECKOUT-POPUP-FAILED-ACTIVATION",e.checkoutPopupPurchaseConfirmed="CHECKOUT-POPUP-PURCHASE-CONFIRMED",e.checkoutPopupHealthCheck="CHECKOUT-POPUP-HEALTH-CHECK",e.checkouPopupActivationFailed="CHECKOUT-POPUP-ACTIVATION-FAILED",e.checkoutPopupOfferDetailsClicked="CHECKOUT-POPUP-OFFER-DETAILS-CLICKED",e.checkoutPopupWhyAmISeeingThisClicked="CHECKOUT-POPUP-WHY-AM-I-SEEING-THIS-CLICKED",e.checkoutPopupLooserExtension="CHECKOUT-POPUP-LOOSER-EXTENSION",e.checkoutPopupActiveDomain="CHECKOUT-POPUP-ACTIVE-DOMAIN",e.checkoutPopupSiteMatches="CHECKOUT-POPUP-SITE-MATCHES"}(t||(t={})),function(e){e.adUnitLog="ADUNIT-LOG"}(r||(r={}));class i{constructor(e){this.isLocal=!1,this.gfService=e}log({level:e,message:t,data:i,title:s}){this.gfService.trackEvent(r.adUnitLog,{log:{level:e,message:t,data:i,title:s}})}}const s=["debug","info","warn","error"];class a{constructor(t){this.config={minLevel:t?.minLevel??"debug",enabled:t?.enabled??!1,transports:t?.transports??[new e],title:t?.title??""}}static getInstance(e){return a.instance||(a.instance=new a(e)),a.instance}configure(e){this.config={...this.config,...e}}shouldLog(e){return!!this.config.enabled&&s.indexOf(e)>=s.indexOf(this.config.minLevel)}createLogMessage(e,t,r){return{level:e,version:"1.9.1",message:t,timestamp:(new Date).toISOString(),data:r,title:this.config.title}}log(e,t,r,i){if(!this.shouldLog(e))return;const s=this.createLogMessage(e,t,i);this.config.transports.filter((e=>!r||e.isLocal)).forEach((e=>e.log(s)))}debug(e,t,r=!1){this.log("debug",e,r,t)}info(e,t,r=!1){this.log("info",e,r,t)}warn(e,t,r=!1){this.log("warn",e,r,t)}error(e,t,r=!1){this.log("error",e,r,t)}addTransport(e){this.config.transports.push(e)}clearTransports(){this.config.transports=[]}disable(){this.config.enabled=!1}enable(){this.config.enabled=!0}}const n=3,o=e=>1e3*e;async function c(e,t={},r){const{maxAttempts:i=n,delayFn:s=o}=t;let a=null;for(let t=1;t<=i;t+=1)try{return await e()}catch(e){a=e,t<i&&await new Promise((e=>{setTimeout(e,s(t))}))}if(a&&t.logger&&t.operationName&&t.logger.error(`Operation ${t.operationName} failed after ${i} attempts.`,a),void 0!==r)return r;throw a||new Error("Operation failed after multiple attempts")}const g=chrome;function l(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var h={exports:{}};"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self&&self,function(e){if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)e.exports=globalThis.browser;else{const t="The message port closed before a response was received.",r=e=>{const r={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(0===Object.keys(r).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class i extends WeakMap{constructor(e,t=void 0){super(t),this.createItem=e}get(e){return this.has(e)||this.set(e,this.createItem(e)),super.get(e)}}const s=(t,r)=>(...i)=>{e.runtime.lastError?t.reject(new Error(e.runtime.lastError.message)):r.singleCallbackArg||i.length<=1&&!1!==r.singleCallbackArg?t.resolve(i[0]):t.resolve(i)},a=e=>1==e?"argument":"arguments",n=(e,t,r)=>new Proxy(t,{apply:(t,i,s)=>r.call(i,e,...s)});let o=Function.call.bind(Object.prototype.hasOwnProperty);const c=(e,t={},r={})=>{let i=Object.create(null),g={has:(t,r)=>r in e||r in i,get(g,l,h){if(l in i)return i[l];if(!(l in e))return;let d=e[l];if("function"==typeof d)if("function"==typeof t[l])d=n(e,e[l],t[l]);else if(o(r,l)){let t=((e,t)=>function(r,...i){if(i.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${a(t.minArgs)} for ${e}(), got ${i.length}`);if(i.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${a(t.maxArgs)} for ${e}(), got ${i.length}`);return new Promise(((a,n)=>{if(t.fallbackToNoCallback)try{r[e](...i,s({resolve:a,reject:n},t))}catch(s){console.warn(`${e} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,s),r[e](...i),t.fallbackToNoCallback=!1,t.noCallback=!0,a()}else t.noCallback?(r[e](...i),a()):r[e](...i,s({resolve:a,reject:n},t))}))})(l,r[l]);d=n(e,e[l],t)}else d=d.bind(e);else if("object"==typeof d&&null!==d&&(o(t,l)||o(r,l)))d=c(d,t[l],r[l]);else{if(!o(r,"*"))return Object.defineProperty(i,l,{configurable:!0,enumerable:!0,get:()=>e[l],set(t){e[l]=t}}),d;d=c(d,t[l],r["*"])}return i[l]=d,d},set:(t,r,s,a)=>(r in i?i[r]=s:e[r]=s,!0),defineProperty:(e,t,r)=>Reflect.defineProperty(i,t,r),deleteProperty:(e,t)=>Reflect.deleteProperty(i,t)},l=Object.create(e);return new Proxy(l,g)},g=e=>({addListener(t,r,...i){t.addListener(e.get(r),...i)},hasListener:(t,r)=>t.hasListener(e.get(r)),removeListener(t,r){t.removeListener(e.get(r))}}),l=new i((e=>"function"!=typeof e?e:function(t){const r=c(t,{},{getContent:{minArgs:0,maxArgs:0}});e(r)})),h=new i((e=>"function"!=typeof e?e:function(t,r,i){let s,a,n=!1,o=new Promise((e=>{s=function(t){n=!0,e(t)}}));try{a=e(t,r,s)}catch(e){a=Promise.reject(e)}const c=!0!==a&&((g=a)&&"object"==typeof g&&"function"==typeof g.then);var g;if(!0!==a&&!c&&!n)return!1;return(c?a:o).then((e=>{i(e)}),(e=>{let t;t=e&&(e instanceof Error||"string"==typeof e.message)?e.message:"An unexpected error occurred",i({__mozWebExtensionPolyfillReject__:!0,message:t})})).catch((e=>{console.error("Failed to send onMessage rejected reply",e)})),!0})),d=({reject:r,resolve:i},s)=>{e.runtime.lastError?e.runtime.lastError.message===t?i():r(new Error(e.runtime.lastError.message)):s&&s.__mozWebExtensionPolyfillReject__?r(new Error(s.message)):i(s)},m=(e,t,r,...i)=>{if(i.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${a(t.minArgs)} for ${e}(), got ${i.length}`);if(i.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${a(t.maxArgs)} for ${e}(), got ${i.length}`);return new Promise(((e,t)=>{const s=d.bind(null,{resolve:e,reject:t});i.push(s),r.sendMessage(...i)}))},u={devtools:{network:{onRequestFinished:g(l)}},runtime:{onMessage:g(h),onMessageExternal:g(h),sendMessage:m.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:m.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},f={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return r.privacy={network:{"*":f},services:{"*":f},websites:{"*":f}},c(e,u,r)};e.exports=r(chrome)}}(h);var d=l(h.exports);class m{constructor(e,t,r,i,s){this.wfSecret=e,this.wfAppId=t,this.deviceUrl=r,this.dataUrl=i,this._logger=s}async getWildfireDevice(){try{const e=await fetch(this.deviceUrl,{method:"POST",body:JSON.stringify({}),headers:{"Content-Type":"application/json","WF-Secret":this.wfSecret,"WF-App-ID":this.wfAppId}});if(e.ok)return e.json();throw new Error(`Failed to fetch Wildfire device from ${this.deviceUrl}. Status ${e.status}. ${e.statusText}`)}catch(e){throw this._logger.error("Failed to fetch the Wildfire device",{err:e}),e}}async getActiveDomains(){try{const e=`${this.dataUrl}/${this.wfAppId}/active-domain/1`,t=await fetch(e);if(t.ok)return t.json();throw new Error(`Failed to fetch active domains from ${e}. Status ${t.status}. ${t.statusText}`)}catch(e){throw this._logger.error("Failed to fetch the active domains",{err:e}),e}}async getStanddownPolicy(){const e=`${this.dataUrl}/${this.wfAppId}/stand-down-policy/1`;try{const t=await fetch(e);if(t.ok)return t.json();throw new Error(`Failed to fetch standdown policy from ${e}. Status ${t.status} ${t.statusText}`)}catch(t){throw this._logger.error("Failed to fetch the standdown policy",{err:t,url:e}),t}}async getMerchantRates(){const e=`${this.dataUrl}/${this.wfAppId}/merchant-rate/1`;try{const t=await fetch(e);if(this._logger.debug("Merchant rates response",{response:t}),!t.ok)throw new Error(`Failed to fetch merchant rates from ${e}. Status ${t.status}. ${t.statusText}`);const r=t.json();return this._logger.debug("Merchant rates",{rates:r}),r}catch(t){throw this._logger.error("Failed to fetch the merchant rates",{err:t,url:e}),t}}}const u="GIVE_FREELY_",f={async get(e){const t=`${u}${e}`;return(await d.storage.local.get(t))[t]||null},async set(e,t){const r=`${u}${e}`;await d.storage.local.set({[r]:t})},async remove(e){const t=Array.isArray(e)?e.map((e=>`${u}${e}`)):`${u}${e}`;await d.storage.local.remove(t)}},A="wfDevice",p="wfDomains",y="wfStanddownPolicy",w="wfStanddownHistory",v="wfMerchantRates";async function x(e,t,r){try{const i=(await b())?.[t];if(i&&i>Date.now())return e.info("Standing down because current affiliate stand down session has not expired"),S(t),!0;await this.refreshCache();const s=await this.getStanddownPolicy();if(I(s,new URL(r).search))return e.info("Standing down because url has affiliate params"),S(t),!0;e.info("No need to stand down.")}catch(t){e.error("Exception produced when trying to determine if it should stand down",t)}return!1}function E(e,t){if(!this.standDownPolicy)return this.logger.warn("Couldnt check affilliation. No stand down policy found"),this.getStanddownPolicy().then((e=>{this.standDownPolicy=e})),!1;const r=e.some((e=>C(this.standDownPolicy,e)))||I(this.standDownPolicy,t);return this.logger.info("Affilliation result:",r),r}const b=async()=>f.get(w),S=async(e,t=1)=>{const r=await b()??{};r[e]=Date.now()+60*t*60*1e3,await f.set(w,r)},C=(e,t)=>{if(!t)return!1;const{Domains:r}=e;return r.some((e=>t.includes(e)))},I=(e,t)=>{if(!t)return!1;const{Params:r}=e;return r.some((e=>t.toLowerCase().includes(`?${e.toLowerCase()}`)))||r.some((e=>t.toLowerCase().includes(`&${e.toLowerCase()}`)))};class T{constructor(e,t,r,i){this.userId=e,this.charityEin=t,this.charityThirdPartyIdentifier=r,this.partnerId=i}toString(){return`userId=${this.encodeUserId(this.userId)},charityEin=${this.charityEin},charityThirdPartyIdentifier=${this.charityThirdPartyIdentifier},partnerId=${this.partnerId}`}encodeUserId(e){return btoa(e).replace(/_/g,"/").replace(/-/g,"+")}}const P="TRACK_EVENT",U="GF_HIDE_POPUP",O="GF_GET_POPUP_CONFIG",k="GF_IS_ACTIVE_DOMAIN",D="GF_SHOULD_STAND_DOWN",_="GF_ACTIVATE_OFFER",F="GF_STORE_SHOPIFY_SHOP_ID",R="GF_GET_DOMAIN_BY_SHOP_ID",$="GF_GET_LANGUAGE_CONTENT",L="shopify_shop_ids",N="gf_last_health_check",G="en",M={async get(e,t,r,i=!1){let s=await f.get(e);const a=s;let n=!1;if(s&&Date.now()<=s.expiration&&!i)return{content:s.content,isStale:n};try{const i=await t();s=await this.set(e,i,r)}catch(e){n=!0}return{content:s?.content??a?.content,isStale:n}},async set(e,t,r){const i={content:t,expiration:Date.now()+1e3*(r??300)};return await f.set(e,i),i},async refresh(e,t,r,i=!1){const s=await this.get(e,t,r,i);if(s.isStale||i)try{const i=await t();if(!i)return{content:s.content,isStale:!0};s.content=i,await this.set(e,s.content,r)}catch(e){return{content:s.content,isStale:!0}}return{content:s.content,isStale:!1}},async clear(e){await f.remove(e)}};class K{constructor(e,t,r,i=21600){if(this.standDownPolicy=null,this.shouldStandDown=x.bind(this),this.hasAffilliation=E.bind(this),!e||!r)throw new Error("WildfireService requires wildfireClient and vanityBaseUrl");this.wildfireClient=e,this.vanityBaseUrl=r.replace(/\/$/,""),this.refreshInterval=i,this.logger=t}async getActiveDomains(e=!1){try{const t=(await M.get(p,(async()=>this.fetchActiveDomains()),this.refreshInterval,e)).content;if(!t)throw Error("Failed to retrieve active domains");return t}catch(e){throw this.logger.error("Failed to get active domains:",e),new Error("Failed to retrieve active domains")}}async getMerchantRates(e,t=!1){try{const r=await M.get(v,(async()=>this.fetchMerchantRates()),this.refreshInterval,t);if(!r.content)throw new Error("Failed to retrieve merchant rates from cache");return r.content[e]}catch(e){throw this.logger.error("Failed to retrieve merchant rates:",e),new Error("Failed to retrieve merchant rates")}}async generateAffiliateUrl(e,t,r,i){if(!e||!t||!i)throw new Error("Missing required parameters for affiliate URL generation");try{const s=await this.getDevice(),a=await this.generateTrackingCode(r,i,s),n=encodeURIComponent(t),o=encodeURIComponent(a);return`${this.vanityBaseUrl}/e?d=${s.DeviceID}&c=${e.ID}&tc=${o}&url=${n}`}catch(e){throw this.logger.error("Failed to generate affiliate URL:",e),new Error("Failed to generate affiliate URL")}}async clearCache(){try{await Promise.all([M.clear(p),M.clear(y),M.clear(v)])}catch(e){throw this.logger.error("Failed to clear cache:",e),new Error("Failed to clear cache")}}async refreshCache(e=!1){try{const[,t]=await Promise.all([M.refresh(p,(()=>this.fetchActiveDomains()),this.refreshInterval,e),M.refresh(y,(()=>this.fetchStanddownPolicy()),this.refreshInterval,e),M.refresh(v,(()=>this.fetchMerchantRates()),this.refreshInterval,e)]);t?.content&&(this.standDownPolicy=t.content)}catch(e){throw this.logger.error("Failed to refresh cache:",e),new Error("Failed to refresh cache")}}async getStanddownPolicy(){try{const e=await M.get(y,(async()=>this.fetchStanddownPolicy()),this.refreshInterval);if(!e.content)throw new Error("Failed to retrieve standdown policy from cache");return this.logger.info("Retrieved standdown policy from cache",e.content),this.standDownPolicy=e.content,this.standDownPolicy}catch(e){throw this.logger.error("Failed to get standdown policy from cache:",e),new Error("Failed to retrieve standdown policy")}}getRetryOptions(e){return{delayFn:e=>1e3*e,maxAttempts:3,logger:this.logger,operationName:e}}async getDevice(){try{const e=await f.get(A);return e?.DeviceID?e:c((()=>this.fetchAndStoreDevice()),this.getRetryOptions("Get Device"))}catch(e){throw this.logger.error("Failed to get device:",e),new Error("Failed to retrieve device information")}}async fetchAndStoreDevice(){const e=await this.wildfireClient.getWildfireDevice();if(!e?.DeviceID)throw new Error("Failed to retrieve device information");return await f.set(A,e),e}async generateTrackingCode(e,t,r){if(!(e?.id&&e?.charity&&e?.charity.ein&&e?.charity.thirdPartyId)){const e=`notregistered-${r.DeviceID}`;return this.logger.info("User not provided. Using GF's default bucket instead.",e),e}return new T(e.id,e.charity.ein,e.charity.thirdPartyId,t).toString()}async fetchActiveDomains(){const e=await c((()=>this.wildfireClient.getActiveDomains()),this.getRetryOptions("Fetch Active Domains"));return this.logger.info("Updated active domains"),e}async fetchStanddownPolicy(){const e=await c((()=>this.wildfireClient.getStanddownPolicy()),this.getRetryOptions("Get Standdown policy"),{Domains:[],LostAttribution:[],Params:[],Serp:[]});return this.logger.info("Updated standdown policy"),e}async fetchMerchantRates(){const e=await c((()=>this.wildfireClient.getMerchantRates()),this.getRetryOptions("Fetch Merchant Rates"),{});return this.logger.debug("Updated Merchant rates"),e}}const H="version",z=()=>String("1.9.1"),j=async(e=!0)=>{const t=await f.get(H),r=await z(),i=t!==r;var s;return e&&i&&await(s=r,f.set(H,s)),i},W="https://cdn.givefreely.com/adunit/behavioral/";class Y{constructor(e){this.partnerApiKey=e,this.partnerConfig=null,this.globalConfig=null,this.PARTNER_CONFIG_STORAGE_KEY="gf_partner_config",this.GLOBAL_CONFIG_STORAGE_KEY="gf_global_config",this.globalConfigRefreshInterval=60,this.partnerConfigRefreshInterval=60}getRetryOptions(){return{delayFn:e=>1e3*e,maxAttempts:3}}async fetchPartnerConfig(){const e=await c((async()=>{const e=await fetch(`${W}${this.partnerApiKey}.json`,{cache:"no-store"});if(!e.ok)throw new Error(`Failed to fetch partner config: ${e.statusText}`);return e.json()}),this.getRetryOptions());if(!e)throw new Error("Failed to fetch or get from cache partner config");return this.partnerConfigRefreshInterval=e.configRefreshInterval||this.partnerConfigRefreshInterval,e}async fetchGlobalConfig(){const e=await c((async()=>{const e=await fetch(`${W}global.json`,{cache:"no-store"});if(!e.ok)throw new Error(`Failed to fetch global config => Status code: ${e.status} .${e.statusText}`);return e.json()}),this.getRetryOptions());if(!e)throw new Error("Failed to fetch or get from cache global config",e);return this.globalConfigRefreshInterval=e.configRefreshInterval||this.globalConfigRefreshInterval,e}async getConfig(e=!1){let t=!1;e&&(t=await j());const[r,i]=await Promise.all([await M.get(this.PARTNER_CONFIG_STORAGE_KEY,this.fetchPartnerConfig.bind(this),this.partnerConfigRefreshInterval,t),await M.get(this.GLOBAL_CONFIG_STORAGE_KEY,this.fetchGlobalConfig.bind(this),this.globalConfigRefreshInterval,t)]);if(!i.content)throw new Error("Global config is required");if(!r.content)throw new Error("Partner config is required");this.partnerConfig=r.content,this.globalConfig=i.content;const s=this.mergeConfigs(JSON.parse(JSON.stringify(this.globalConfig)),JSON.parse(JSON.stringify(this.partnerConfig)));if(!s)throw new Error("Was not able to merge configs");return((e,t,r)=>{const i=[...t.merchantExclusions??[],...r.merchantExclusions??[]];e.merchantExclusions=i})(s,this.globalConfig,this.partnerConfig),s}async clearCache(){await Promise.all([M.clear(this.PARTNER_CONFIG_STORAGE_KEY),M.clear(this.GLOBAL_CONFIG_STORAGE_KEY)]),this.partnerConfig=null,this.globalConfig=null}mergeConfigs(e,t){if(!t)return e;if(!e)return t;const r={...e};return Object.keys(t).forEach((i=>{if(!Object.prototype.hasOwnProperty.call(t,i))return;const s=e[i],a=t[i];void 0!==a&&(Array.isArray(a)?r[i]=[...a]:r[i]=null===a||"object"!=typeof a||null===s||"object"!=typeof s?a:this.mergeConfigs(s,a))})),r}}class B{static register(e,t){this.strategies.set(e,t)}static get(e){return this.strategies.get(e)}static exists(e){return!!function(e){return"object"==typeof e&&null!==e&&"type"in e&&"payload"in e&&"string"==typeof e.type}(e)&&this.strategies.has(e.type)}}B.strategies=new Map;class q{async handle(e,t){const{hostname:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger(),a=await i.getConfig().merchantExclusions,n=await i.getActiveDomains();s.debug("Checking hostname",{hostname:r});try{if(i.healthCheck(),a.some((e=>e.disableDomain&&(r===e.domain||r.endsWith(`.${e.domain}`)))))return s.debug("Hostname is in merchant exclusions",{hostname:r}),{type:k,payload:{isActive:!1,domain:void 0,rates:[]}};if(!n||0===n.length)throw new Error("No active domains");s.debug("Retrieved active domains",{count:n.length});const e=n.find((e=>r===e.Domain||r.endsWith(`.${e.Domain}`)));s.debug("Domain check result",{hostname:r,isActive:!!e});let t=[];if(e?.ID){const r=await i.getMerchantRates(e.Merchant.ID);r&&(s.debug("Retrieved merchant rates",{merchantRates:r}),t=r)}return{type:k,payload:{isActive:!!e,domain:e,rates:t}}}catch(e){return s.error("Error checking domain",{hostname:r,error:e}),{type:k,payload:{isActive:!1,domain:void 0,rates:[]}}}}}class V{async handle(e,t){const{giveFreelyService:r}=t,i=r.getLogger(),s=await r.getCachedConfig();try{return i.debug("Fetching popup config"),{type:O,payload:{config:s}}}catch(e){return i.error("Error fetching popup config",{error:e}),{type:O,payload:{config:null}}}}}class X{async handle(e,t){const{days:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger();try{const e=new Date;return e.setDate(e.getDate()+r),await f.set("popup_hide",{popupHide:e.getTime()}),s.debug("Popup hidden",{days:r,expiry:e}),{type:U,payload:{ack:!0}}}catch(e){return s.error("Error hiding popup",{days:r,error:e}),{type:U,payload:{ack:!1}}}}}class J{async handle(e,t){const{activeDomain:r,url:i}=e.payload,{giveFreelyService:s}=t,a=s.getLogger();a.debug("Checking if we should stand down",{activeDomain:r});try{const e=await s.shouldStandDown(r,i);return{type:D,payload:{result:e}}}catch(e){return a.error("Error checking if we should stand down. Returning false",{activeDomain:r,error:e}),{type:D,payload:{result:!1}}}}}class Z{constructor(e,t,r,i=60){this.track=async(e,t,r,i=!1,s=!1)=>{const a={partner:`adUnit_${this._partnerApiKey}`,eventType:e,eventData:{userId:i?void 0:this._userService?.user?.id,libVersion:z(),wfDeviceId:t,...r}};try{const e=JSON.stringify(a,((e,t)=>t instanceof Error?{name:t.name,message:t.message,stack:t.stack}:t)),t=await this.getEventsUrl();if(await this.shouldBroadcastEvent(e,s)){const r=await fetch(t,{headers:{"Content-Type":"application/json"},method:"POST",body:e,cache:"no-store"});return r.ok?(await this.pushEventToHistory(e),!0):(this._logger.error("Something unexpected happened when dispatching an event",{status:r.status,statusText:r.statusText,event:a},!0),!1)}return this._logger.info("This event has already been broadcasted during the past hour",a,!0),!1}catch(e){return this._logger.error("Something unexpected happened when dispatching a gf event",{error:e,event:a}),!1}},this.getEventsHistory=async()=>{const{GF_AD_EVENT_HISTORY:e}=await g.storage.local.get({GF_AD_EVENT_HISTORY:""}),t=(e=>{const t=new Date;return t.setTime(t.getTime()+60*e*1e3),t.getTime()})(-this._debounceWindowInMinutes),r=(e||[]).filter((e=>e.createdAt>t));return await g.storage.local.set({GF_AD_EVENT_HISTORY:r}),r},this.shouldBroadcastEvent=async(e,t)=>!!t||!(await this.getEventsHistory()).some((t=>t.payload===e)),this.pushEventToHistory=async e=>{const t=await this.getEventsHistory();t.push({createdAt:Date.now(),payload:e}),await g.storage.local.set({GF_AD_EVENT_HISTORY:t})},this._partnerApiKey=e,this._userService=t,this._debounceWindowInMinutes=i,this._logger=a.getInstance({title:"Analytics"}),this._configService=r}async getEventsUrl(){const{eventsUrl:e}=await this._configService.getConfig();return e}}Z.trackEvent=async(e,t,r=!1,i=!1)=>{await async function(e){return new Promise(((t,r)=>{try{const i=i=>chrome.runtime.lastError?r({error:chrome.runtime.lastError,message:e}):t(i);g.runtime.sendMessage(e,i)}catch(e){r(e)}}))}({type:P,payload:{eventType:e,eventData:t,anonymous:r,skipThrottling:i}})};class Q{async handle(e,t){const{eventType:r,eventData:i,anonymous:s,skipThrottling:a}=e.payload,{giveFreelyService:n}=t,o=n.getLogger();o.debug("Broadcasting event",{eventType:r,eventData:i,anonymous:s,skipThrottling:a});try{const e=await n.trackEvent(r,i,s,a);return{type:P,payload:{result:e}}}catch(e){return o.error("Error broadcasting event. Returning false",{eventType:r,eventData:i,error:e}),{type:P,payload:{result:!1}}}}}class ee{async handle(e,r){const{activeDomain:i,originalUrl:s,selectedCharity:a}=e.payload,{giveFreelyService:n}=r,o=n.getLogger();o.debug("Activating offer",{activeDomain:i,selectedCharity:a});try{if(!a?.ein||!a?.thirdPartyId)throw new Error("Missing charity information");const e=await n.initializeWfDeviceId();if(!e)throw new Error("Failed to initialize Wildfire device ID");const t=await n.upsertUser(a,e);o.debug("Upserted user",{currentUser:t}),t||o.info("Failed to create user. Using default bucket's user");const r=await n.generateAffiliateUrl(i,s,t);return o.debug("Generated affiliate URL",{affiliateUrl:r}),(async e=>{const t=g.tabs.getCurrent(),r=await t,i=await g.tabs.create({url:e,openerTabId:r?.id,active:!1,pinned:!0});await(async e=>new Promise((t=>{g.tabs.onUpdated.addListener((async function r(i,s){if(i===e&&"complete"===s.status){if(g.tabs.onUpdated.removeListener(r),!(await g.tabs.get(e)).url)return void t(!1);t(!0)}}))})))(i.id)&&setTimeout((()=>{i?.id&&g.tabs.remove(i.id)}),3e4)})(r),await n.updateStanddownHistory(i.Domain),o.debug("Activated offer",{activeDomain:i,selectedCharity:a}),{type:_,payload:{response:!0}}}catch(e){return o.error("Error activating offer",{activeDomain:i,error:e}),n.trackEvent(t.checkoutPopupFailedActivation,{activeDomain:i,error:e}),{type:_,payload:{response:!1}}}}}var te;!function(e){e[e.Pending=0]="Pending",e[e.Ready=1]="Ready",e[e.Received=2]="Received",e[e.Donated=3]="Donated",e[e.Disqualified=4]="Disqualified"}(te||(te={}));class re{constructor(e,t,r){this.adUnitId=e,this.config=t,this.logger=r}async getAnonymousUserCommissions(e,t){try{const r=new URLSearchParams(t).toString(),i=await fetch(`${this.config.apiConfig.baseUri}/${this.config.apiConfig.getAnonymousUserComissionsPath}?${r}`,{method:"GET",headers:{"Content-Type":"application/json","X-AnonymousUserToken":e}});if(!i.ok)throw new Error(`Failed to fetch commissions. Status code: ${i.status} .${i.statusText}`);return await i.json()}catch(e){throw this.logger.error("[GiveFreelyApiClient] Error fetching anonymous user's commissions:",{error:e}),e}}async createOrUpdateAnonymousUser(e,t){try{const r=await fetch(`${this.config.apiConfig.baseUri}/${this.config.apiConfig.createAnonymousUserPath}?adUnitId=${this.adUnitId}`,{method:"PUT",headers:{"Content-Type":"application/json","X-GF-Platform":"adUnitLibrary","X-AnonymousUserToken":t??""},body:JSON.stringify(e)});if(!r.ok)throw new Error(`Failed to create/update anonymous user. Status code: ${r.status} .${r.statusText}`);this.logger.info("[GiveFreelyApiClient] anonymous user created/updated successfully.");const i=await r.json(),s=r.headers.get("X-AnonymousUserToken");return{resultUser:{...i,charity:{ein:i.selectedCharity,thirdPartyId:i.selectedCharityThirdPartyIdentifier,name:void 0}},resultToken:s}}catch(e){throw this.logger.error("[GiveFreelyApiClient] Error creating anonymous user:",{error:e}),e}}}class ie{constructor(e,t){this.ANONYMOUS_USER_STORAGE_KEY="gf_anonymous_user_info",this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY="gf_anonymous_encrypted_token",this._giveFreelyApiClient=e,this._logger=t,this.user=null}async resetUser(){await f.remove(this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY),await f.remove(this.ANONYMOUS_USER_STORAGE_KEY)}async upsertUser(e,t){let r=await this.fetchUser();try{const i={selectedCharity:e?.ein,selectedCharityThirdPartyIdentifier:e?.thirdPartyId,deviceId:t};if(!await this.shouldCreateOrUpdateUser(r,i))return r;const s=await f.get(this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY),{resultUser:a,resultToken:n}=await this._giveFreelyApiClient.createOrUpdateAnonymousUser(i,s);n&&await f.set(this.ANONYMOUS_ENCRIPTED_TOKEN_STORAGE_KEY,n),a&&(await f.set(this.ANONYMOUS_USER_STORAGE_KEY,a),r=a)}catch(e){this._logger.error("Error creating/updating anonymous user:",e)}return this.user=r,r}async fetchUser(){const e=await f.get(this.ANONYMOUS_USER_STORAGE_KEY);return this.user=e,e}async shouldCreateOrUpdateUser(e,t){return!e||e.charity?.ein!==t.selectedCharity||e.charity?.thirdPartyId!==t.selectedCharityThirdPartyIdentifier||e.deviceId!==t.deviceId}}const se=e=>{try{return new URL(e),!0}catch{return!1}},ae=new Set,ne=new Set,oe={urls:["<all_urls>"],types:["main_frame"]};class ce{async handle(e,t){const r=e.payload,{giveFreelyService:i}=t,s=i.getLogger();try{const e=L,t=await f.get(e)||[],i=t.findIndex((e=>e.shopId===r.shopId));return i>=0?t[i]=r:t.push(r),await f.set(e,t),s.debug("Stored Shopify shop ID",{shopInfo:r}),{type:F,payload:{success:!0}}}catch(e){return s.error("Error storing Shopify shop ID",{shopInfo:r,error:e}),{type:F,payload:{success:!1}}}}}class ge{async handle(e,t){const{shopId:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger();try{const e=L,t=(await f.get(e)||[]).find((e=>e.shopId===r));return t?(s.debug("Found domain for shop ID",{shopId:r,domain:t.domain}),{type:R,payload:{found:!0,domain:t.domain,shopInfo:t}}):(s.debug("No domain found for shop ID",{shopId:r}),{type:R,payload:{found:!1}})}catch(e){return s.error("Error getting domain for shop ID",{shopId:r,error:e}),{type:R,payload:{found:!1}}}}}class le{constructor(e,t){this.lastCheck=null,this.trackEvent=e,this.logger=t}async initialize(){const e=await f.get(N);e&&(this.lastCheck=e)}getToday(){return(new Date).toISOString().split("T")[0]}async check(){try{const e=this.lastCheck??0,r=this.getToday();(e?new Date(e).toISOString().split("T")[0]:null)!==r&&(this.lastCheck=Date.now(),await f.set(N,this.lastCheck),await this.trackEvent(t.checkoutPopupHealthCheck,{language:chrome.i18n.getUILanguage()}))}catch(e){this.logger.error("Health check failed",{error:e instanceof Error?e.message:"Unknown error"})}}}const he=a.getInstance(),de="countryCode";class me{async handle(e,t){const{lang:r}=e.payload,{giveFreelyService:i}=t,s=i.getLogger();s.debug("Getting language strings",{lang:r});try{const e=await i.getLanguage(r);return s.debug("Language strings fetched",{language:e}),{type:$,payload:{translations:e.translations,charities:e.charities}}}catch(e){return s.error("Error getting language strings",{error:e}),{type:$,payload:{translations:null,charities:null}}}}}const ue="https://cdn.givefreely.com/adunit/language",fe=async(e,t,r,i,s=[],a=!1)=>{const n=(s??[]).includes(r)?G:r;e.debug(`Requested lang ${r} and current lang ${n}`);const o=`lang-${G}`,c=await M.get(o,(async()=>(e.debug(`Fetching default language ${G} for partner ${t}`),Ae(t,G))),i||60,a);if(!c.content)throw new Error(`Failed to fetch default language ${G} and no cache version available`);if(G===n)return c.content;const g=`lang-${n}`,l=await M.get(g,(async()=>(e.debug(`Fetching language ${n} for partner ${t}`),Ae(t,n))),i||60,a);if(!l.content)return c.content;const h=we(c.content,l.content);return await M.set(g,h,i||60),h},Ae=async(e,t)=>{const r=`/global-${t}.json`,i=`/${e}/${t}.json`,[s,a]=await Promise.allSettled([pe(`${ue}${r}`),pe(`${ue}${i}`)]);let n,o;"fulfilled"===s.status&&(n=s.value),"fulfilled"===a.status&&(o=a.value);const c=ye(n,o);return{translations:c.translations,charities:c.charities}},pe=async e=>{const t=await fetch(e,{cache:"no-store"});if(!t.ok)throw new Error(`Failed to fetch partner language file ${e}. Status: ${t.status}. Reason: ${t.statusText}`);return t.json()},ye=(e,t)=>({translations:{...e?.translations??{},...t??{}},charities:{...e?.charities??{}}}),we=(e,t)=>({translations:{...e.translations,...t.translations},charities:{...e.charities,...t.charities}});class ve extends Error{constructor(e="Service not initialized"){super(e),this.name="UninitializedServiceError"}}class GiveFreelyService{constructor(e){this.partnerApiKey=e,this.dependencies={configService:new Y(e)},this.logger=a.getInstance(),this.logger.configure({enabled:!0,title:"Background - GiveFreelyService"}),this.state={initialized:!1,wildfireService:null,partnerFilter:null,config:null,wfDeviceId:null,analytics:null,giveFreelyUserService:null,partnerApiKey:e,healthCheck:null}}assertInitialized(){if(!this.state.initialized)throw new ve}async initialize(e=async()=>(this.logger.debug("Using default partnerFilter."),!0)){if(!this.state.initialized)try{const t=await this.dependencies.configService.getConfig(!0);this.logger.configure({minLevel:t.backgroundMinLogLevel??"error"}),this.logger.info("Initializing GiveFreelyService",{partnerApiKey:this.partnerApiKey});const r=this.createWildfireService(t);this.state.healthCheck=new le(this.trackEvent.bind(this),this.logger),await this.state.healthCheck.initialize();const s=await j();await r.refreshCache(s);const n=new re(this.partnerApiKey,t,this.logger);this.state.giveFreelyUserService=new ie(n,this.logger),await this.state.giveFreelyUserService.fetchUser(),this.state.giveFreelyUserService.user?.id||await this.state.giveFreelyUserService.upsertUser();try{await(async()=>await f.get(de)||(async()=>{he.debug("detecting country");const e={method:"GET",headers:{"Content-Type":"application/json",Authorization:"Basic OTEzOTkxOnFlYmpaWF9DOGNRY0lxSHA4WTVjNGxzU1pRSlM2VW9MMExzTF9tbWs="}};try{const t=await fetch("https://geoip.maxmind.com/geoip/v2.1/country/me",e);if(he.debug("Received geolocation response",{status:t.status}),!t.ok)return void he.error("Failed to get geolocation data",{status:t.status,statusText:t.statusText});const r=await t.json();if(!r)throw new Error("There was an error fetching geoip look up");return await f.set(de,r.country.iso_code),r.country.iso_code}catch(e){return void he.error("Failed to get geolocation data",{error:e})}})())()}catch(e){this.logger.debug("Failed to get geolocation data",{error:e})}this.state.analytics=new Z(this.partnerApiKey,this.state.giveFreelyUserService,this.dependencies.configService),this.logger.addTransport(new i(this)),B.register(k,new q),B.register(O,new V),B.register(U,new X),B.register(D,new J),B.register(P,new Q),B.register(_,new ee),B.register(F,new ce),B.register(R,new ge),B.register($,new me),this.state.wildfireService=r,this.state.partnerFilter=e,this.state.config=t,this.state.initialized=!0,d.webRequest&&(d.webRequest.onBeforeRequest.addListener((e=>{const t=e.getLogger();return({requestId:r,url:i,initiator:s})=>{try{if(ae.has(r)||ne.has(r)||!se(i))return;const{hostname:a,search:n}=new URL(i);if(a.includes("wild.link"))return t.info("Cashback activation request identified, ignoring affiliate check for request"),void ne.add(r);let o;s&&se(s)&&(o=new URL(s).hostname),e.hasAffiliation([a,o],n)&&(t.info("Affiliation found on url, adding request id to track"),ae.add(r))}catch(e){t.error("Error on handleAffiliateOnBeforeRequest",e)}}})(this),oe),d.webRequest.onBeforeRedirect.addListener((e=>{const t=e.getLogger();return async({requestId:r,redirectUrl:i})=>{try{if(!ae.has(r))return;t.info("Attempting to find active domain");const{hostname:s}=new URL(i),a=(await e.getActiveDomains()).find((e=>s===e.Domain||s.endsWith(`.${e.Domain}`)));if(!a)return;t.info("Found active domain. Updating standdown state"),await S(a.Domain)}catch(e){t.error("Error on handleAffiliateOnBeforeRedirect",e)}}})(this),oe),d.webRequest.onCompleted.addListener((()=>{const e=this.getLogger();return({requestId:t})=>{try{ae.has(t)&&(e.info("Tracking request completed. Request Id:",t),ae.delete(t))}catch(t){e.error("Error on handleAffiliateOnCompleted",t)}}})(),oe)),function(e){const t=a.getInstance();g.runtime.onMessage.addListener(((r,i,s)=>{function a(e){s(e)}const n=e(r,0);return n instanceof Promise?(n.then((e=>{e&&a(e)})).catch((e=>{t.warn("Async message callback error:",e)})),!0):n}))}((async(e,t)=>(this.logger.debug("Received message",{type:e.type,payload:e.payload}),this.handleMessage(e)))),t.purgeLanguages&&t.purgeLanguages.length>0&&await Promise.all(t.purgeLanguages.flatMap((e=>[M.clear(`lang-${e}`),M.clear(`global-${e}`)]))),c((async()=>{this.logger.debug("Initializing default language with partner API key",{partnerApiKey:this.partnerApiKey}),await fe(this.logger,this.partnerApiKey,G,t.configRefreshInterval)})),this.logger.info("GiveFreelyService initialized successfully")}catch(e){const t=e instanceof Error?e.message:"Unknown error";throw this.logger.error("Failed to initialize GiveFreelyService",{error:t}),new Error(`Failed to initialize GiveFreelyService: ${t}`)}}getConfig(){return this.assertInitialized(),this.state.config}async getCachedConfig(){return this.state.config=await this.dependencies.configService.getConfig(),this.logger.configure({minLevel:this.state.config.backgroundMinLogLevel??"error"}),this.state.config}async getActiveDomains(){return this.assertInitialized(),this.state.wildfireService.getActiveDomains()}async shouldStandDown(e,t){this.assertInitialized();const r=new URL(t);if(!await this.state.partnerFilter(r.hostname))return this.logger.info("Should standdown due to partner filter."),!0;if(this.getConfig().merchantExclusions.some((t=>t.mutePopups&&e===t.domain)))return this.logger.info("Should standdown due to merchant exclusions"),!0;const i=await this.state.wildfireService.shouldStandDown(this.logger,e,t);return i&&this.logger.info("Should standdown due to vendor policy"),i}hasAffiliation(e,t){if(!this.state.wildfireService)return this.logger.warn("Wildfire service not initialized yet"),!1;const r=this.state.wildfireService.hasAffilliation(e,t);return r&&this.logger.info("Affiliation identified"),r}trackEvent(e,t,r=!1,i=!1){return this.assertInitialized(),this.state.analytics.track(e,this.state.wfDeviceId?.DeviceID,t,r,i)}getLogger(){return this.assertInitialized(),this.logger}async initializeWfDeviceId(){if(this.assertInitialized(),this.state.wfDeviceId=await this.state.wildfireService.getDevice(),!this.state.wfDeviceId)throw new Error("Failed to initialize Wildfire device ID");return this.state.wfDeviceId.DeviceID}getWfDeviceId(){return this.assertInitialized(),this.state.wfDeviceId.DeviceID}upsertUser(e,t){return this.assertInitialized(),this.state.giveFreelyUserService.upsertUser(e,t)}getCurrentUser(){return this.assertInitialized(),this.state.giveFreelyUserService.user}generateAffiliateUrl(e,t,r){return this.assertInitialized(),this.state.wildfireService.generateAffiliateUrl(e,t,r,this.state.partnerApiKey)}updateStanddownHistory(e){return this.assertInitialized(),S(e)}getMerchantRates(e){if(this.assertInitialized(),!this.state.wildfireService)throw new Error("Wildfire service not initialized");return this.state.wildfireService.getMerchantRates(e)}async healthCheck(){this.assertInitialized(),await this.state.healthCheck.check()}async getLanguage(e){return this.assertInitialized(),fe(this.logger,this.state.partnerApiKey,e,this.state.config?.configRefreshInterval,this.state.config?.ignoredLanguages)}async handleMessage(e){this.assertInitialized();const t=B.get(e.type);if(!t)return;const r={giveFreelyService:this};return t.handle(e,r)}createWildfireService(e){this.logger.debug("Initializing wildfire service with config",this.state.config);const t=new m(e.wfSecret,e.wfAppId,e.deviceUrl,e.dataUrl,this.logger);return new K(t,this.logger,e.vanityBaseUrl,e.refreshInterval)}async destroy(){this.logger.info("Destroying GiveFreelyService"),await Promise.all([this.dependencies.configService.clearCache(),this.state.wildfireService?.clearCache(),this.state.giveFreelyUserService?.resetUser()]),this.state.initialized=!1,this.state.wildfireService=null,this.state.partnerFilter=null,this.state.analytics=null,this.state.config=null}}const xe=e=>B.exists(e);export{GiveFreelyService,g as browser,xe as isAdUnitMessage};
@@ -1 +1 @@
1
- "use strict";const e={equals:(e,t)=>e===t};let t=P;const n=1,r=2,o={owned:null,cleanups:null,context:null,owner:null};var i=null;let s=null,a=null,l=null,c=null,u=0;function g(t,n){const r={value:t,observers:null,observerSlots:null,comparator:(n=n?Object.assign({},e,n):e).equals||void 0};return[x.bind(r),e=>("function"==typeof e&&(e=e(r.value)),b(r,e))]}function d(e,t,r){y(w(e,t,!1,n))}function p(e,r,o){t=S;const i=w(e,r,!1,n);i.user=!0,c?c.push(i):y(i)}function m(t,n,r){r=r?Object.assign({},e,r):e;const o=w(t,n,!0,0);return o.observers=null,o.observerSlots=null,o.comparator=r.equals||void 0,y(o),x.bind(o)}function h(e){if(null===a)return e();const t=a;a=null;try{return e()}finally{a=t}}function f(e){p((()=>h(e)))}function A(e){let t;return i&&i.context&&void 0!==(t=i.context[e.id])?t:e.defaultValue}function v(e){const t=m(e),n=m((()=>O(t())));return n.toArray=()=>{const e=n();return Array.isArray(e)?e:null!=e?[e]:[]},n}function x(){if(this.sources&&this.state)if(this.state===n)y(this);else{const e=l;l=null,k((()=>T(this)),!1),l=e}if(a){const e=this.observers?this.observers.length:0;a.sources?(a.sources.push(this),a.sourceSlots.push(e)):(a.sources=[this],a.sourceSlots=[e]),this.observers?(this.observers.push(a),this.observerSlots.push(a.sources.length-1)):(this.observers=[a],this.observerSlots=[a.sources.length-1])}return this.value}function b(e,t,r){let o=e.value;return e.comparator&&e.comparator(o,t)||(e.value=t,e.observers&&e.observers.length&&k((()=>{for(let t=0;t<e.observers.length;t+=1){const r=e.observers[t],o=s&&s.running;o&&s.disposed.has(r),(o?r.tState:r.state)||(r.pure?l.push(r):c.push(r),r.observers&&E(r)),o||(r.state=n)}if(l.length>1e6)throw l=[],new Error}),!1)),t}function y(e){if(!e.fn)return;D(e);const t=u;!function(e,t,r){let o;const s=i,l=a;a=i=e;try{o=e.fn(t)}catch(t){return e.pure&&(e.state=n,e.owned&&e.owned.forEach(D),e.owned=null),e.updatedAt=r+1,I(t)}finally{a=l,i=s}(!e.updatedAt||e.updatedAt<=r)&&(null!=e.updatedAt&&"observers"in e?b(e,o):e.value=o,e.updatedAt=r)}(e,e.value,t)}function w(e,t,r,s=n,a){const l={fn:e,state:s,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:t,owner:i,context:i?i.context:null,pure:r};return null===i||i!==o&&(i.owned?i.owned.push(l):i.owned=[l]),l}function C(e){if(0===e.state)return;if(e.state===r)return T(e);if(e.suspense&&h(e.suspense.inFallback))return e.suspense.effects.push(e);const t=[e];for(;(e=e.owner)&&(!e.updatedAt||e.updatedAt<u);)e.state&&t.push(e);for(let o=t.length-1;o>=0;o--)if((e=t[o]).state===n)y(e);else if(e.state===r){const n=l;l=null,k((()=>T(e,t[0])),!1),l=n}}function k(e,n){if(l)return e();let r=!1;n||(l=[]),c?r=!0:c=[],u++;try{const n=e();return function(e){if(l&&(P(l),l=null),e)return;const n=c;c=null,n.length&&k((()=>t(n)),!1)}(r),n}catch(e){r||(c=null),l=null,I(e)}}function P(e){for(let t=0;t<e.length;t++)C(e[t])}function S(e){let t,n=0;for(t=0;t<e.length;t++){const r=e[t];r.user?e[n++]=r:C(r)}for(t=0;t<n;t++)C(e[t])}function T(e,t){e.state=0;for(let o=0;o<e.sources.length;o+=1){const i=e.sources[o];if(i.sources){const e=i.state;e===n?i!==t&&(!i.updatedAt||i.updatedAt<u)&&C(i):e===r&&T(i,t)}}}function E(e){for(let t=0;t<e.observers.length;t+=1){const n=e.observers[t];n.state||(n.state=r,n.pure?l.push(n):c.push(n),n.observers&&E(n))}}function D(e){let t;if(e.sources)for(;e.sources.length;){const t=e.sources.pop(),n=e.sourceSlots.pop(),r=t.observers;if(r&&r.length){const e=r.pop(),o=t.observerSlots.pop();n<r.length&&(e.sourceSlots[o]=n,r[n]=e,t.observerSlots[n]=o)}}if(e.tOwned){for(t=e.tOwned.length-1;t>=0;t--)D(e.tOwned[t]);delete e.tOwned}if(e.owned){for(t=e.owned.length-1;t>=0;t--)D(e.owned[t]);e.owned=null}if(e.cleanups){for(t=e.cleanups.length-1;t>=0;t--)e.cleanups[t]();e.cleanups=null}e.state=0}function I(e,t=i){const n=function(e){return e instanceof Error?e:new Error("string"==typeof e?e:"Unknown error",{cause:e})}(e);throw n}function O(e){if("function"==typeof e&&!e.length)return O(e());if(Array.isArray(e)){const t=[];for(let n=0;n<e.length;n++){const r=O(e[n]);Array.isArray(r)?t.push.apply(t,r):t.push(r)}return t}return e}function M(e,t){return function(t){let n;return d((()=>n=h((()=>(i.context={...i.context,[e]:t.value},v((()=>t.children)))))),void 0),n}}function L(e,t){return h((()=>e(t||{})))}function N(e){const t=e.keyed,n=m((()=>e.when),void 0,{equals:(e,n)=>t?e===n:!e==!n});return m((()=>{const r=n();if(r){const o=e.children;return"function"==typeof o&&o.length>0?h((()=>o(t?r:()=>{if(!h(n))throw"Stale read from <Show>.";return e.when}))):o}return e.fallback}),void 0,void 0)}const R="_$DX_DELEGATE";function $(e,t,n){let r;const o=()=>(r||(r=(()=>{const t=document.createElement("template");return t.innerHTML=e,t.content.firstChild})())).cloneNode(!0);return o.cloneNode=o,o}function _(e,t=window.document){const n=t[R]||(t[R]=new Set);for(let r=0,o=e.length;r<o;r++){const o=e[r];n.has(o)||(n.add(o),t.addEventListener(o,G))}}function H(e,t,n){null==n?e.removeAttribute(t):e.setAttribute(t,n)}function F(e,t,n){if(!t)return n?H(e,"style"):t;const r=e.style;if("string"==typeof t)return r.cssText=t;let o,i;for(i in"string"==typeof n&&(r.cssText=n=void 0),n||(n={}),t||(t={}),n)null==t[i]&&r.removeProperty(i),delete n[i];for(i in t)o=t[i],o!==n[i]&&(r.setProperty(i,o),n[i]=o);return n}function U(e,t,n,r){if(void 0===n||r||(r=[]),"function"!=typeof t)return B(e,t,r,n);d((r=>B(e,t(),r,n)),r)}function G(e){let t=e.target;const n=`$$${e.type}`,r=e.target,o=e.currentTarget,i=t=>Object.defineProperty(e,"target",{configurable:!0,value:t}),s=()=>{const r=t[n];if(r&&!t.disabled){const o=t[`${n}Data`];if(void 0!==o?r.call(t,o,e):r.call(t,e),e.cancelBubble)return}return t.host&&"string"!=typeof t.host&&!t.host._$host&&t.contains(e.target)&&i(t.host),!0},a=()=>{for(;s()&&(t=t._$host||t.parentNode||t.host););};if(Object.defineProperty(e,"currentTarget",{configurable:!0,get:()=>t||document}),e.composedPath){const n=e.composedPath();i(n[0]);for(let e=0;e<n.length-2&&(t=n[e],s());e++){if(t._$host){t=t._$host,a();break}if(t.parentNode===o)break}}else a();i(r)}function B(e,t,n,r,o){for(;"function"==typeof n;)n=n();if(t===n)return n;const i=typeof t,s=void 0!==r;if(e=s&&n[0]&&n[0].parentNode||e,"string"===i||"number"===i){if("number"===i&&(t=t.toString())===n)return n;if(s){let o=n[0];o&&3===o.nodeType?o.data!==t&&(o.data=t):o=document.createTextNode(t),n=V(e,n,r,o)}else n=""!==n&&"string"==typeof n?e.firstChild.data=t:e.textContent=t}else if(null==t||"boolean"===i)n=V(e,n,r);else{if("function"===i)return d((()=>{let o=t();for(;"function"==typeof o;)o=o();n=B(e,o,n,r)})),()=>n;if(Array.isArray(t)){const i=[],a=n&&Array.isArray(n);if(j(i,t,n,o))return d((()=>n=B(e,i,n,r,!0))),()=>n;if(0===i.length){if(n=V(e,n,r),s)return n}else a?0===n.length?W(e,i,r):function(e,t,n){let r=n.length,o=t.length,i=r,s=0,a=0,l=t[o-1].nextSibling,c=null;for(;s<o||a<i;)if(t[s]!==n[a]){for(;t[o-1]===n[i-1];)o--,i--;if(o===s){const t=i<r?a?n[a-1].nextSibling:n[i-a]:l;for(;a<i;)e.insertBefore(n[a++],t)}else if(i===a)for(;s<o;)c&&c.has(t[s])||t[s].remove(),s++;else if(t[s]===n[i-1]&&n[a]===t[o-1]){const r=t[--o].nextSibling;e.insertBefore(n[a++],t[s++].nextSibling),e.insertBefore(n[--i],r),t[o]=n[i]}else{if(!c){c=new Map;let e=a;for(;e<i;)c.set(n[e],e++)}const r=c.get(t[s]);if(null!=r)if(a<r&&r<i){let l,u=s,g=1;for(;++u<o&&u<i&&null!=(l=c.get(t[u]))&&l===r+g;)g++;if(g>r-a){const o=t[s];for(;a<r;)e.insertBefore(n[a++],o)}else e.replaceChild(n[a++],t[s++])}else s++;else t[s++].remove()}}else s++,a++}(e,n,i):(n&&V(e),W(e,i));n=i}else if(t.nodeType){if(Array.isArray(n)){if(s)return n=V(e,n,r,t);V(e,n,null,t)}else null!=n&&""!==n&&e.firstChild?e.replaceChild(t,e.firstChild):e.appendChild(t);n=t}}return n}function j(e,t,n,r){let o=!1;for(let i=0,s=t.length;i<s;i++){let s,a=t[i],l=n&&n[e.length];if(null==a||!0===a||!1===a);else if("object"==(s=typeof a)&&a.nodeType)e.push(a);else if(Array.isArray(a))o=j(e,a,l)||o;else if("function"===s)if(r){for(;"function"==typeof a;)a=a();o=j(e,Array.isArray(a)?a:[a],Array.isArray(l)?l:[l])||o}else e.push(a),o=!0;else{const t=String(a);l&&3===l.nodeType&&l.data===t?e.push(l):e.push(document.createTextNode(t))}}return o}function W(e,t,n=null){for(let r=0,o=t.length;r<o;r++)e.insertBefore(t[r],n)}function V(e,t,n,r){if(void 0===n)return e.textContent="";const o=r||document.createTextNode("");if(t.length){let r=!1;for(let i=t.length-1;i>=0;i--){const s=t[i];if(o!==s){const t=s.parentNode===e;r||i?t&&s.remove():t?e.replaceChild(o,s):e.insertBefore(o,n)}else r=!0}}else e.insertBefore(o,n);return[o]}class K{constructor(){this.isLocal=!0}log({level:e,message:t,timestamp:n,data:r,title:o}){const i="debug"===e?"log":e,s=o?`[${o}]`:"";void 0!==r?console[i](`[${n}] - ${K.LOGGER_PREFIX} ${s} ${t}`,r):console[i](`[${n}] - ${K.LOGGER_PREFIX} ${s} ${t}`)}}var z,q;K.LOGGER_PREFIX="[GFAdUnit] -",function(e){e.checkoutPopupShown="CHECKOUT-POPUP-SHOWN",e.checkoutPopupNotShown="CHECKOUT-POPUP-NOT-SHOWN",e.checkoutPopupSupressed="CHECKOUT-POPUP-SUPRESSED",e.checkoutPopupDonation="CHECKOUT-POPUP-DONATION",e.checkoutPopupFailedActivation="CHECKOUT-POPUP-FAILED-ACTIVATION",e.checkoutPopupPurchaseConfirmed="CHECKOUT-POPUP-PURCHASE-CONFIRMED",e.checkoutPopupHealthCheck="CHECKOUT-POPUP-HEALTH-CHECK",e.checkouPopupActivationFailed="CHECKOUT-POPUP-ACTIVATION-FAILED",e.checkoutPopupOfferDetailsClicked="CHECKOUT-POPUP-OFFER-DETAILS-CLICKED",e.checkoutPopupWhyAmISeeingThisClicked="CHECKOUT-POPUP-WHY-AM-I-SEEING-THIS-CLICKED",e.checkoutPopupLooserExtension="CHECKOUT-POPUP-LOOSER-EXTENSION",e.checkoutPopupActiveDomain="CHECKOUT-POPUP-ACTIVE-DOMAIN",e.checkoutPopupSiteMatches="CHECKOUT-POPUP-SITE-MATCHES"}(z||(z={})),function(e){e.adUnitLog="ADUNIT-LOG"}(q||(q={}));const Y=["debug","info","warn","error"];class X{constructor(e){this.config={minLevel:e?.minLevel??"debug",enabled:e?.enabled??!1,transports:e?.transports??[new K],title:e?.title??""}}static getInstance(e){return X.instance||(X.instance=new X(e)),X.instance}configure(e){this.config={...this.config,...e}}shouldLog(e){return!!this.config.enabled&&Y.indexOf(e)>=Y.indexOf(this.config.minLevel)}createLogMessage(e,t,n){return{level:e,version:"1.8.3",message:t,timestamp:(new Date).toISOString(),data:n,title:this.config.title}}log(e,t,n,r){if(!this.shouldLog(e))return;const o=this.createLogMessage(e,t,r);this.config.transports.filter((e=>!n||e.isLocal)).forEach((e=>e.log(o)))}debug(e,t,n=!1){this.log("debug",e,n,t)}info(e,t,n=!1){this.log("info",e,n,t)}warn(e,t,n=!1){this.log("warn",e,n,t)}error(e,t,n=!1){this.log("error",e,n,t)}addTransport(e){this.config.transports.push(e)}clearTransports(){this.config.transports=[]}disable(){this.config.enabled=!1}enable(){this.config.enabled=!0}}const Z=3,J=e=>1e3*e,Q=chrome;async function ee(e,t){return new Promise(((n,r)=>{try{const o=t=>chrome.runtime.lastError?r({error:chrome.runtime.lastError,message:e}):n(t);t?.tabId||Q.runtime.sendMessage(e,o)}catch(e){r(e)}}))}async function te(e,t,n){return async function(e,t={}){const{maxAttempts:n=Z,delayFn:r=J}=t;let o=null;for(let t=1;t<=n;t+=1)try{return await e()}catch(e){o=e,t<n&&await new Promise((e=>{setTimeout(e,r(t))}))}throw o&&t.logger&&t.operationName&&t.logger.error(`Operation ${t.operationName} failed after ${n} attempts.`,o),o||new Error("Operation failed after multiple attempts")}((()=>ee(e,t)),{maxAttempts:Z,delayFn:J})}const ne={display:"block",position:"fixed",top:"0%",left:"100%",width:"500px",height:"520px","margin-left":"-560px","margin-top":"50px",padding:"2px 5px","background-color":"white",border:"1px solid black","border-radius":"10px","box-shadow":"0 2px 10px rgba(0, 0, 0, 0.1)","z-index":"2147483647","font-family":"Arial","line-height":"1","vertical-align":"baseline","box-sizing":"border-box",color:"rgb(34, 34, 34)","@media (max-width: 600px), (max-height: 480px)":{display:"none !important"}},re={height:"100%","overflow-x":"hidden","overlfow-y":"auto",position:"relative",padding:"0px 15px"},oe={},ie={display:"flex","align-items":"center","margin-bottom":"10px"},se={flex:"1","font-size":"24px","font-weight":"700","margin-top":"20px","margin-bottom":"0px"},ae={background:"none",border:"none",padding:"4px 8px",color:"#666464","font-size":"38px",cursor:"pointer","line-height":"1"},le={color:"black","margin-top":"20px","max-width":"40%"},ce={color:"gray",cursor:"default","pointer-events":"none","text-decoration":"none"},ue={"font-size":"18px","font-weight":"400","margin-top":"20px","margin-bottom":"0px"},ge={display:"flex",gap:"10px",width:"100%","margin-top":"20px","margin-bottom":"20px","flex-wrap":"wrap","justify-content":"space-between"},de={width:"28%",position:"relative",display:"flex","flex-direction":"column","align-items":"center",background:"none",border:"1px solid #ccc","border-radius":"5px",padding:"5px",gap:"5px","text-align":"center","font-size":"14px",cursor:"pointer",transition:"background-color 0.2s ease"},pe={color:"white","background-color":"lightgray",cursor:"default","pointer-events":"none"},me={"max-width":"120px","max-height":"70px","margin-bottom":"5px","object-fit":"contain"},he={"background-color":"#FFD812",cursor:"pointer","border-radius":"8px",padding:"8px",color:"white","min-width":"100px",border:"0","font-weight":"600",width:"100%"},fe={display:"flex","flex-direction":"column",gap:"10px",width:"100%","color-scheme":"light"},Ae={display:"flex","align-items":"center",gap:"5px",border:"1px solid #ddd",padding:"15px","border-radius":"5px","font-weight":"600",cursor:"pointer","margin-bottom":"8px"},ve={"text-align":"right"},xe={background:"none",border:"none",color:"blue","text-decoration":"underline",padding:"0",cursor:"pointer","margin-bottom":"15px"},be={display:"flex","justify-content":"space-between",margin:"20px 0px 10px 0px","font-size":"14px"},ye={margin:"5px 0px 5px 0px","font-size":"14px","text-align":"center"},we={color:"#666464","text-decoration":"underline"},Ce={color:"rgb(102, 100, 100)","text-decoration":"underline",margin:"0",cursor:"pointer"},ke={width:"100%","background-color":"#f2f2f2",border:"1px solid black","border-radius":"10px","border-top":"1px solid #bbb7b7","margin-top":"10px","margin-bottom":"20px","box-sizing":"border-box"},Pe={padding:"0 5px 0 10px",width:"100%","font-size":"12px","box-sizing":"border-box"},Se={display:"grid","grid-template-columns":"4fr 1fr","padding-right":"15px","padding-bottom":"5px"},Te={color:"#000","margin-bottom":"4px"},Ee={"font-size":"14px",color:"#555","text-align":"right"},De=(e,t)=>{let n=parseFloat(t);return"FLAT"===e&&(n*=.75),((e,t)=>{let n=parseFloat(t);return n<1&&(n=1),n=Math.floor(n),"PERCENTAGE"===e?`${n}%`:`$${n}`})(e,n.toString())};var Ie=$("<span>");function Oe(e){return t=Ie(),d((()=>{return t.innerHTML=(n=e.title,r=e.activeDomain,n.replace("{0}",De(r.Merchant.MaxRate?.Kind,r.Merchant.MaxRate?.Amount??"0")));var n,r})),t;var t}const Me=function(){const e=Symbol("context");return{id:e,Provider:M(e),defaultValue:()=>({translate:e=>"",getAllCharities:()=>[]})}}(),Le=Me,Ne=()=>{const e=A(Le)();if(!e)throw new Error("Content provider context is undefined");return t=>e.translate(t)};class Re{static formatMessage(e,...t){return e.replace(/{(\d+)}/g,((e,n)=>{const r=Number(n);return void 0!==t[r]?String(t[r]):`{${r}}`}))}}var $e=$("<div>"),_e=$("<div><div class=gf-offer-details><p><span></span></p><p><span></span></p><p><span></span></p><p><span></span></p><p><span></span></p><p><a target=_blank rel=noreferrer><span>"),He=$("<div class=gf-offer-details-rate-item><div></div><div>");const Fe=e=>{const t=Ne();return n=_e(),o=(r=n.firstChild).firstChild,i=o.firstChild,s=o.nextSibling,a=s.firstChild,l=s.nextSibling,c=l.firstChild,u=l.nextSibling,g=u.firstChild,p=u.nextSibling,m=p.firstChild,h=p.nextSibling.firstChild,f=h.firstChild,U(r,L(N,{get when(){return!!e.merchantRateDetail?.length},get children(){var t=$e();return U(t,(()=>e.merchantRateDetail?.map((e=>{return t=He(),n=t.firstChild,r=n.nextSibling,U(n,(()=>e.Name||"")),U(r,(()=>((e,t=1,n=1)=>{const r=e.BoostedOffer??null;let o=parseFloat(e?.Amount??"");if(r?.EndDate&&new Date(r.EndDate)<new Date&&(o=parseFloat(r.OriginalMaxRate)),Number.isNaN(o))return"";const i=o*t;return"PERCENTAGE"===e?.Kind?`${i.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:n})}%`:"FLAT"===e?.Kind?i.toLocaleString("en-US",{style:"currency",currency:e.Currency}):""})(e))),d((e=>{var o=Se,i=Te,s=Ee;return e.e=F(t,o,e.e),e.t=F(n,i,e.t),e.a=F(r,s,e.a),e}),{e:void 0,t:void 0,a:void 0}),t;var t,n,r})))),t}}),u),d((o=>{var s=ke,l=Pe,u=t("offerDetails.intro"),d=t("offerDetails.eligible"),p=e.parsedMaxRate?Re.formatMessage(t("offerDetails.donationRatesWithValue"),e.parsedMaxRate):Re.formatMessage(t("offerDetails.donationRates")),A=t("offerDetails.donationAmounts"),v=t("offerDetails.donationTiming"),x=we,b=e.termsUrl,y=t("offerDetails.termsAndConditions");return o.e=F(n,s,o.e),o.t=F(r,l,o.t),u!==o.a&&(i.innerHTML=o.a=u),d!==o.o&&(a.innerHTML=o.o=d),p!==o.i&&(c.innerHTML=o.i=p),A!==o.n&&(g.innerHTML=o.n=A),v!==o.s&&(m.innerHTML=o.s=v),o.h=F(h,x,o.h),b!==o.r&&H(h,"href",o.r=b),y!==o.d&&(f.innerHTML=o.d=y),o}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0}),n;var n,r,o,i,s,a,l,c,u,g,p,m,h,f},Ue="TRACK_EVENT",Ge="GF_HIDE_POPUP",Be="GF_GET_POPUP_CONFIG",je="GF_IS_ACTIVE_DOMAIN",We="GF_SHOULD_STAND_DOWN",Ve="GF_ACTIVATE_OFFER",Ke="GF_STORE_SHOPIFY_SHOP_ID",ze="GF_GET_DOMAIN_BY_SHOP_ID",qe="GF_GET_LANGUAGE_CONTENT",Ye={ein:"0",tpi:"0"};function Xe(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Ze={exports:{}};"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self&&self,function(e){if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)e.exports=globalThis.browser;else{const t="The message port closed before a response was received.",n=e=>{const n={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(0===Object.keys(n).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class r extends WeakMap{constructor(e,t=void 0){super(t),this.createItem=e}get(e){return this.has(e)||this.set(e,this.createItem(e)),super.get(e)}}const o=(t,n)=>(...r)=>{e.runtime.lastError?t.reject(new Error(e.runtime.lastError.message)):n.singleCallbackArg||r.length<=1&&!1!==n.singleCallbackArg?t.resolve(r[0]):t.resolve(r)},i=e=>1==e?"argument":"arguments",s=(e,t,n)=>new Proxy(t,{apply:(t,r,o)=>n.call(r,e,...o)});let a=Function.call.bind(Object.prototype.hasOwnProperty);const l=(e,t={},n={})=>{let r=Object.create(null),c={has:(t,n)=>n in e||n in r,get(c,u,g){if(u in r)return r[u];if(!(u in e))return;let d=e[u];if("function"==typeof d)if("function"==typeof t[u])d=s(e,e[u],t[u]);else if(a(n,u)){let t=((e,t)=>function(n,...r){if(r.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${i(t.minArgs)} for ${e}(), got ${r.length}`);if(r.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${i(t.maxArgs)} for ${e}(), got ${r.length}`);return new Promise(((i,s)=>{if(t.fallbackToNoCallback)try{n[e](...r,o({resolve:i,reject:s},t))}catch(o){console.warn(`${e} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,o),n[e](...r),t.fallbackToNoCallback=!1,t.noCallback=!0,i()}else t.noCallback?(n[e](...r),i()):n[e](...r,o({resolve:i,reject:s},t))}))})(u,n[u]);d=s(e,e[u],t)}else d=d.bind(e);else if("object"==typeof d&&null!==d&&(a(t,u)||a(n,u)))d=l(d,t[u],n[u]);else{if(!a(n,"*"))return Object.defineProperty(r,u,{configurable:!0,enumerable:!0,get:()=>e[u],set(t){e[u]=t}}),d;d=l(d,t[u],n["*"])}return r[u]=d,d},set:(t,n,o,i)=>(n in r?r[n]=o:e[n]=o,!0),defineProperty:(e,t,n)=>Reflect.defineProperty(r,t,n),deleteProperty:(e,t)=>Reflect.deleteProperty(r,t)},u=Object.create(e);return new Proxy(u,c)},c=e=>({addListener(t,n,...r){t.addListener(e.get(n),...r)},hasListener:(t,n)=>t.hasListener(e.get(n)),removeListener(t,n){t.removeListener(e.get(n))}}),u=new r((e=>"function"!=typeof e?e:function(t){const n=l(t,{},{getContent:{minArgs:0,maxArgs:0}});e(n)})),g=new r((e=>"function"!=typeof e?e:function(t,n,r){let o,i,s=!1,a=new Promise((e=>{o=function(t){s=!0,e(t)}}));try{i=e(t,n,o)}catch(e){i=Promise.reject(e)}const l=!0!==i&&((c=i)&&"object"==typeof c&&"function"==typeof c.then);var c;if(!0!==i&&!l&&!s)return!1;return(l?i:a).then((e=>{r(e)}),(e=>{let t;t=e&&(e instanceof Error||"string"==typeof e.message)?e.message:"An unexpected error occurred",r({__mozWebExtensionPolyfillReject__:!0,message:t})})).catch((e=>{console.error("Failed to send onMessage rejected reply",e)})),!0})),d=({reject:n,resolve:r},o)=>{e.runtime.lastError?e.runtime.lastError.message===t?r():n(new Error(e.runtime.lastError.message)):o&&o.__mozWebExtensionPolyfillReject__?n(new Error(o.message)):r(o)},p=(e,t,n,...r)=>{if(r.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${i(t.minArgs)} for ${e}(), got ${r.length}`);if(r.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${i(t.maxArgs)} for ${e}(), got ${r.length}`);return new Promise(((e,t)=>{const o=d.bind(null,{resolve:e,reject:t});r.push(o),n.sendMessage(...r)}))},m={devtools:{network:{onRequestFinished:c(u)}},runtime:{onMessage:c(g),onMessageExternal:c(g),sendMessage:p.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:p.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},h={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return n.privacy={network:{"*":h},services:{"*":h},websites:{"*":h}},l(e,m,n)};e.exports=n(chrome)}}(Ze);var Je=Xe(Ze.exports);const Qe="GIVE_FREELY_",et={async get(e){const t=`${Qe}${e}`;return(await Je.storage.local.get(t))[t]||null},async set(e,t){const n=`${Qe}${e}`;await Je.storage.local.set({[n]:t})},async remove(e){const t=Array.isArray(e)?e.map((e=>`${Qe}${e}`)):`${Qe}${e}`;await Je.storage.local.remove(t)}},tt=()=>String("1.8.3");class nt{constructor(e,t,n,r=60){this.track=async(e,t,n,r=!1)=>{const o={partner:`adUnit_${this._partnerApiKey}`,eventType:e,eventData:{userId:r?void 0:this._userService?.user?.id,libVersion:tt(),wfDeviceId:t,...n}};try{const e=JSON.stringify(o,((e,t)=>t instanceof Error?{name:t.name,message:t.message,stack:t.stack}:t)),t=await this.getEventsUrl();if(await this.shouldBroadcastEvent(e)){const n=await fetch(t,{headers:{"Content-Type":"application/json"},method:"POST",body:e,cache:"no-store"});return n.ok?(await this.pushEventToHistory(e),!0):(this._logger.error("Something unexpected happened when dispatching an event",{status:n.status,statusText:n.statusText,event:o},!0),!1)}return this._logger.info("This event has already been broadcasted during the past hour",o,!0),!1}catch(e){return this._logger.error("Something unexpected happened when dispatching a gf event",{error:e,event:o}),!1}},this.getEventsHistory=async()=>{const{GF_AD_EVENT_HISTORY:e}=await Q.storage.local.get({GF_AD_EVENT_HISTORY:""}),t=(e=>{const t=new Date;return t.setTime(t.getTime()+60*e*1e3),t.getTime()})(-this._debounceWindowInMinutes),n=(e||[]).filter((e=>e.createdAt>t));return await Q.storage.local.set({GF_AD_EVENT_HISTORY:n}),n},this.shouldBroadcastEvent=async e=>!(await this.getEventsHistory()).some((t=>t.payload===e)),this.pushEventToHistory=async e=>{const t=await this.getEventsHistory();t.push({createdAt:Date.now(),payload:e}),await Q.storage.local.set({GF_AD_EVENT_HISTORY:t})},this._partnerApiKey=e,this._userService=t,this._debounceWindowInMinutes=r,this._logger=X.getInstance({title:"Analytics"}),this._configService=n}async getEventsUrl(){const{eventsUrl:e}=await this._configService.getConfig();return e}}function rt(e,t,n){return e?{...t,...n}:t}nt.trackEvent=async(e,t,n=!1)=>{await ee({type:Ue,payload:{eventType:e,eventData:t,anonymous:n}})};var ot=$("<a href=#!>"),it=$("<button class=give-freely-close-button aria-label=Close>×"),st=$('<div><div><div></div></div><hr><div></div><div><div><div><br><span></span></div><button aria-label="Don\'t show again"><span></span></button></div></div><div><p><span></span></p><a class=give-freely-footer-link target=_blank rel="noopener noreferrer"><span>'),at=$("<div><div><img><span></span></div><button><span>"),lt=$("<div>"),ct=$("<div><span>");function ut(e){const[t,n]=g(!1),[r,o]=g(null),i=Ne(),s=(()=>{const e=A(Me)();if(!e)throw new Error("Content provider context is undefined");return()=>e.getAllCharities()})();p((()=>{t()&&e.mainContainerRef&&e.mainContainerRef.scroll({top:e.mainContainerRef.scrollHeight,behavior:"smooth"})})),p((()=>{const t=r();t&&e.onCharitySelect(t.charity,t.closeOnDonation?e.checkoutPopupConf.checkoutPopupActivateAndCloseSkipSuccess:void 0)}));const a=(e,t)=>o({charity:e,closeOnDonation:t}),l=()=>!!r()?.charity;return[(u=st(),h=u.firstChild,f=h.firstChild,v=h.nextSibling.nextSibling,x=v.nextSibling,b=x.firstChild,y=b.firstChild,w=y.firstChild.nextSibling,C=y.nextSibling,k=C.firstChild,P=x.nextSibling,S=P.firstChild,T=S.firstChild,E=S.nextSibling,D=E.firstChild,U(h,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupActivateAndClose},get children(){var e=ot();return e.$$click=()=>a(Ye,!0),d((t=>{var n=rt(l(),le,ce),r=i("main.activateAndClose");return t.e=F(e,n,t.e),r!==t.t&&(e.innerHTML=t.t=r),t}),{e:void 0,t:void 0}),e}}),null),U(h,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupMainCloseButtonVisible&&!e.checkoutPopupConf.checkoutPopupActivateAndClose},get children(){var t=it();return t.$$click=()=>e.onClose(),d((e=>F(t,ae,e))),t}}),null),U(v,L(Oe,{get title(){return i("main.subTitle")},get activeDomain(){return e.activeDomain}})),U(x,(()=>s().reduce(((t,n)=>{var r,o,s,c,u,g,p;return n?.title&&""!==n?.title?t.push((s=(o=at()).firstChild,u=(c=s.firstChild).nextSibling,g=s.nextSibling,p=g.firstChild,o.$$click=()=>!l()&&a(n),U(o,(r=m((()=>!!(n.decorator&&n.decoratorLeftStyle&&n.decoratorRightStyle))),()=>{return r()&&[(t=lt(),d((e=>{var r=n.decoratorLeftStyle,o=n.decorator;return e.e=F(t,r,e.e),o!==e.t&&(t.innerHTML=e.t=o),e}),{e:void 0,t:void 0}),t),(e=lt(),d((t=>{var r=n.decoratorRightStyle,o=n.decorator;return t.e=F(e,r,t.e),o!==t.t&&(e.innerHTML=t.t=o),t}),{e:void 0,t:void 0}),e)];var e,t}),s),s.style.setProperty("height","100px"),s.style.setProperty("text-align","center"),U(u,(()=>n.title)),d((t=>{var r=rt(l(),de,{cursor:"default"}),s=n.logo,a=me,u=n.title,d=rt(l(),{...he,"background-color":e.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor||"#FFD812"},pe),m=l(),h=`Select charity: ${n.title}`,f=i("main.charitySelect");return t.e=F(o,r,t.e),s!==t.t&&H(c,"src",t.t=s),t.a=F(c,a,t.a),u!==t.o&&H(c,"alt",t.o=u),t.i=F(g,d,t.i),m!==t.n&&(g.disabled=t.n=m),h!==t.s&&H(g,"aria-label",t.s=h),f!==t.h&&(p.innerHTML=t.h=f),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0}),o)):e.logger.error(`Translation was not found for EIN ${n?.ein}`),t}),[])),b),b.$$click=()=>!l()&&e.onSuppress(),y.style.setProperty("height","100px"),y.style.setProperty("text-align","center"),S.$$click=()=>{e.onOfferDetailsClick(!t()),n(!t())},E.$$click=()=>{nt.trackEvent(z.checkoutPopupWhyAmISeeingThisClicked,{domain:globalThis.window.location.hostname})},U(u,(c=m((()=>!!e.checkoutPopupConf.checkoutPopupDisplayNameInFooter)),()=>{return c()&&(e=ct(),t=e.firstChild,d((n=>{var r=ye,o=i("main.footer");return n.e=F(e,r,n.e),o!==n.t&&(t.innerHTML=n.t=o),n}),{e:void 0,t:void 0}),e);var e,t}),null),d((t=>{var n=oe,r=ie,o=se,s=i("main.title"),a=ue,c=ge,g=rt(l(),de,{cursor:"default"}),d=i("main.sixthBox"),p=rt(l(),{...he,"background-color":e.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor||"#FFD812"},pe),m=l(),A=i("main.settings"),y=be,I=Ce,O=i("main.offerDetails"),M=we,L=e.checkoutPopupConf.externalUrls.giveFreelyWhyAmISeeingThis,N=i("main.whyAmISeeingThis");return t.e=F(u,n,t.e),t.t=F(h,r,t.t),t.a=F(f,o,t.a),s!==t.o&&(f.innerHTML=t.o=s),t.i=F(v,a,t.i),t.n=F(x,c,t.n),t.s=F(b,g,t.s),d!==t.h&&(w.innerHTML=t.h=d),t.r=F(C,p,t.r),m!==t.d&&(C.disabled=t.d=m),A!==t.l&&(k.innerHTML=t.l=A),t.u=F(P,y,t.u),t.c=F(S,I,t.c),O!==t.w&&(T.innerHTML=t.w=O),t.m=F(E,M,t.m),L!==t.f&&H(E,"href",t.f=L),N!==t.y&&(D.innerHTML=t.y=N),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0,l:void 0,u:void 0,c:void 0,w:void 0,m:void 0,f:void 0,y:void 0}),u),L(N,{get when(){return t()},get children(){return L(Fe,{get merchantName(){return e.activeDomain.Merchant.Name},get extensionName(){return e.checkoutPopupConf.displayName},get termsUrl(){return e.checkoutPopupConf.externalUrls.giveFreelyTermsAndConditions},get parsedMaxRate(){return m((()=>!!e.activeDomain.Merchant.MaxRate))()?De(e.activeDomain.Merchant.MaxRate.Kind,e.activeDomain.Merchant.MaxRate?.Amount):null},get merchantRateDetail(){return e.merchantRates},onClose:()=>n(!1)})}})];var c,u,h,f,v,x,b,y,w,C,k,P,S,T,E,D}_(["click"]);var gt=$("<button class=give-freely-close-button aria-label=Close>×"),dt=$("<label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=18250><span>"),pt=$('<div><div><div><span></span></div></div><button class=give-freely-back-button aria-label="Back to charity selection"><span></span></button><hr><div id=give-freely-goodbye-screen-options><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=1><span></span></label><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=7><span></span></label><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=30><span></span></label><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=90><span></span></label></div><button class=give-freely-submit-button><span>');function mt(e){const[t,n]=g(0),r=Ne();return o=pt(),i=o.firstChild,s=i.firstChild,a=s.firstChild,l=i.nextSibling,c=l.firstChild,u=l.nextSibling.nextSibling,m=(p=u.firstChild).firstChild,h=m.nextSibling,A=(f=p.nextSibling).firstChild,v=A.nextSibling,b=(x=f.nextSibling).firstChild,y=b.nextSibling,C=(w=x.nextSibling).firstChild,k=C.nextSibling,P=u.nextSibling,S=P.firstChild,o.style.setProperty("font-size","14px"),U(i,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupSupressCloseButtonVisible},get children(){var t=gt();return t.$$click=()=>e.onGoodbye(0),d((e=>F(t,ae,e))),t}}),null),l.$$click=()=>e.onBack(),m.addEventListener("change",(()=>n(1))),A.addEventListener("change",(()=>n(7))),b.addEventListener("change",(()=>n(30))),C.addEventListener("change",(()=>n(90))),U(u,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupNeverSuppressionAllowed},get children(){var e=dt(),t=e.firstChild,o=t.nextSibling;return t.addEventListener("change",(()=>n(18250))),d((t=>{var n=Ae,i=r("suppress.suppressionPeriodNever");return t.e=F(e,n,t.e),i!==t.t&&(o.innerHTML=t.t=i),t}),{e:void 0,t:void 0}),e}}),null),P.$$click=()=>{const n=t();n&&(e.onGoodbye(n),e.setScreen("main"))},d((t=>{var n=ie,o=se,g=r("suppress.title"),d=xe,m=r("suppress.backButton"),A=fe,b=Ae,C=r("suppress.suppressionPeriod").replace("{0}","1"),T=Ae,E=r("suppress.suppressionPeriodPlural").replace("{0}","7"),D=Ae,I=r("suppress.suppressionPeriodPlural").replace("{0}","30"),O=Ae,M=r("suppress.suppressionPeriodPlural").replace("{0}","90"),L={...he,"font-weight":"700","margin-top":"10px","margin-bottom":"0px","background-color":e.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor||"#FFD812",width:"100px"},N=r("suppress.submitButton");return t.e=F(i,n,t.e),t.t=F(s,o,t.t),g!==t.a&&(a.innerHTML=t.a=g),t.o=F(l,d,t.o),m!==t.i&&(c.innerHTML=t.i=m),t.n=F(u,A,t.n),t.s=F(p,b,t.s),C!==t.h&&(h.innerHTML=t.h=C),t.r=F(f,T,t.r),E!==t.d&&(v.innerHTML=t.d=E),t.l=F(x,D,t.l),I!==t.u&&(y.innerHTML=t.u=I),t.c=F(w,O,t.c),M!==t.w&&(k.innerHTML=t.w=M),t.m=F(P,L,t.m),N!==t.f&&(S.innerHTML=t.f=N),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0,l:void 0,u:void 0,c:void 0,w:void 0,m:void 0,f:void 0}),o;var o,i,s,a,l,c,u,p,m,h,f,A,v,x,b,y,w,C,k,P,S}_(["click"]);var ht=$("<div><p><span>"),ft=$("<div><div><div><span></span></div><button class=give-freely-close-button aria-label=Close>×</button></div><hr><div><span>");function At(e){const[t,n]=g(null),r=Ne();let o;var s,a,l,c,u,p,m,h;return s=()=>clearInterval(o),null===i||(null===i.cleanups?i.cleanups=[s]:i.cleanups.push(s)),f((()=>{e.failedDonation||(()=>{const t=e.checkoutPopupConf.checkoutPopupDonationSuccessAutoCloseInSeconds??3;n(t),o=setInterval((()=>{n((t=>null===t||t<=1?(clearInterval(o),e.onClose(),0):t-1))}),1e3)})()})),a=ft(),l=a.firstChild,c=l.firstChild,u=c.firstChild,p=c.nextSibling,m=l.nextSibling.nextSibling,h=m.firstChild,a.style.setProperty("font-size","14px"),p.$$click=()=>e.onClose(),m.style.setProperty("padding","30px"),m.style.setProperty("height","150px"),m.style.setProperty("font-size","14px"),U(a,L(N,{get when(){return!e.failedDonation},get children(){var e=ht(),n=e.firstChild,o=n.firstChild;return d((e=>{var i=ve,s=Re.formatMessage(r("donate.autoClosing"),t()??0);return e.e=F(n,i,e.e),s!==e.t&&(o.innerHTML=e.t=s),e}),{e:void 0,t:void 0}),e}}),null),d((t=>{var n=ie,o=se,i=e.failedDonation?r("donate.failTitle"):r("donate.title"),s=ae,a=e.failedDonation?r("donate.failContent"):r("donate.content");return t.e=F(l,n,t.e),t.t=F(c,o,t.t),i!==t.a&&(u.innerHTML=t.a=i),t.o=F(p,s,t.o),a!==t.i&&(h.innerHTML=t.i=a),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),a}_(["click"]);var vt=$("<div><div>");const xt=(e,t,n)=>"donate"===e?"340px":t.checkoutPopupDisplayNameInFooter?"520px":n;function bt(e){const[t,n]=g("main"),[r,o]=g(),[i,s]=g(!1),a=()=>{e.logger.debug("Close button clicked"),e.onClose()},l=async(t,r=!1)=>{r&&e.onClose(),e.logger.info("Charity selected",{charity:t,domain:e.activeDomain.Domain}),o(t);const i=await e.onDonate(t,e.activeDomain);r?e.onClose():(s(!i),n("donate"))},c=()=>{e.logger.debug("Suppress button clicked"),n("goodbye")},u=()=>{e.logger.debug("Navigating back to main screen"),n("main")},p=t=>{e.logger.info("User chose to hide popup",{days:t}),e.onClose(t)};let m;return v=vt(),x=v.firstChild,"function"==typeof m?(f=m,A=x,h((()=>f(A,undefined)))):m=x,U(x,L(N,{get when(){return"main"===t()},get children(){return L(ut,{mainContainerRef:m,get checkoutPopupConf(){return e.checkoutPopupConf},get activeDomain(){return e.activeDomain},get merchantRates(){return e.merchantRates},onClose:a,onCharitySelect:l,onSuppress:c,get onOfferDetailsClick(){return e.onOfferDetailsClick},get logger(){return e.logger}})}}),null),U(x,L(N,{get when(){return"goodbye"===t()},get children(){return L(mt,{get checkoutPopupConf(){return e.checkoutPopupConf},onClose:()=>e.onClose(),onBack:u,onGoodbye:p,setScreen:n})}}),null),U(x,L(N,{get when(){return"donate"===t()},get children(){return L(At,{get checkoutPopupConf(){return e.checkoutPopupConf},get selectedCharity(){return r()},onClose:()=>e.onClose(),get failedDonation(){return i()},setScreen:n})}}),null),d((n=>{var r={...ne,height:xt(t(),e.checkoutPopupConf,ne.height)},o=e.elementId,i=re;return n.e=F(v,r,n.e),o!==n.t&&H(v,"id",n.t=o),n.a=F(x,i,n.a),n}),{e:void 0,t:void 0,a:void 0}),v;var f,A,v,x}function yt(e){const t=["",".asp",".aspx",".php",".js",".htm",".html"],n=["cart","checkout","shopping-bag","shopping-basket","shopping-cart","basket"].flatMap((e=>t.map((t=>e+t)))).filter((e=>"basket"!==e)),r=["tote-cart","tote.cart"],o=e,i=n.filter((e=>o.includes(e))),s=o.split("/");return!s.some((e=>r.some((t=>e.includes(t)))))&&(s.some((e=>n.some((t=>e.startsWith(t)||e.endsWith(t)))))||"basket"===s[s.length-1].toLowerCase()||i.length>1||1===i.length&&o.includes("shopping"))}function wt(e,t){const n=["book"];return e.split("/").some((e=>n.some((t=>e.startsWith(t)||e.endsWith(t)))))&&null!=t.evaluate("//*[self::h1 or self::h2 or self::h3 or self::h4 or self::h5 or self::h6][contains(., 'Your Reservation') or contains(., 'Your reservation')]",t,null,XPathResult.ANY_TYPE,null)?.iterateNext()}async function Ct(e){try{const t=await ee({type:ze,payload:{shopId:e}});return t.payload.found&&t.payload.domain?t.payload.domain:null}catch{return null}}function kt(e){try{const e=Array.from(document.querySelectorAll("script"));for(const t of e){if(t.dataset?.shopId&&(t.dataset?.shopId?.startsWith("gid")||t.src.includes("shopify"))){const e=parseInt(t.dataset.shopId.replace("gid://shopify/Shop/",""));if(!Number.isNaN(e)&&e>0)return e}const e=t.textContent||"";if(e.includes("ShopifyAnalytics")&&e.includes("shopId")){const t=e.match(/shopId['"]*:\s*['"]*(\d+)['"]*[,}]/);if(t&&t[1]){const e=parseInt(t[1]);if(!Number.isNaN(e)&&e>0)return e}}}const t=document.querySelector("[data-shop-id]");if(t instanceof HTMLElement){const{shopId:e}=t.dataset;if(e){const t=parseInt(e);if(!Number.isNaN(t)&&t>0)return t}}const n=window?.ShopifyAnalytics?.lib?.trekkie?.defaultAttributes?.shopId;return n&&parseInt(n)||0}catch(t){return e.error("Error accessing ShopifyAnalytics:",t),0}}function Pt(){try{if(!window.location.href.startsWith("https://shop.app"))return 0;const e=document?.head?.querySelector('meta[name="store"][content]');if(!e)return 0;try{const t=JSON.parse(e.content);return t?.id||0}catch{return 0}}catch{return 0}}const St=X.getInstance();function Tt(e,t,n){try{const r=function(e){try{const t=e.split(".");return t.length>=2?t.slice(-2).join("."):e}catch(e){return St.error("Error extracting domain",e),""}}(n);St.debug("Checking merchant regex rules",{currentDomain:r,currentUrl:t});const o=e.merchantPopupRules.filter((e=>r.includes(e.domain)));if(0===o.length)return St.debug("No matching merchant rules found for domain",{currentDomain:r}),!1;for(const e of o)for(const n of e.rules)try{if(new RegExp(n.rule).test(t))return St.debug("Merchant regex rule matched",{merchant:e.name,rule:n.rule,currentUrl:t}),!0}catch(t){St.error("Invalid regex in merchant rule",{merchant:e.name,rule:n.rule,error:t})}return St.debug("No matching regex rules found",{currentUrl:t}),!1}catch(e){return St.error("Error in merchantRegexRule",e),!1}}function Et(){const e=document.documentElement.lang,t=document.querySelector('meta[http-equiv="Content-Language"]')?.content,n=document.querySelector('link[rel="alternate"][hreflang]')?.getAttribute("hreflang"),r=navigator.language,o=e||t||n||r||"en";return"string"==typeof o?o.split("-")[0]:"en"}function Dt(e){return!0!==e.checkoutPopupOnlyShowLanguageMatch||"en"===Et()}const It=(e,t=!1)=>e.length<2&&t?null:Array.from(e).filter((e=>!t||e.dataset.extensionId!==Q.runtime.id)).map((e=>e.dataset.extensionName)).join(",");const Ot=e=>{const t=m((()=>({translate:e.translate()||(e=>""),getAllCharities:e.charities()||(()=>[])})));return L(Me.Provider,{value:t,get children(){return e.children}})},Mt=X.getInstance(),Lt="countryCode",Nt=async()=>await et.get(Lt)||(async()=>{Mt.debug("detecting country");const e={method:"GET",headers:{"Content-Type":"application/json",Authorization:"Basic OTEzOTkxOnFlYmpaWF9DOGNRY0lxSHA4WTVjNGxzU1pRSlM2VW9MMExzTF9tbWs="}};try{const t=await fetch("https://geoip.maxmind.com/geoip/v2.1/country/me",e);if(Mt.debug("Received geolocation response",{status:t.status}),!t.ok)return void Mt.error("Failed to get geolocation data",{status:t.status,statusText:t.statusText});const n=await t.json();if(!n)throw new Error("There was an error fetching geoip look up");return await et.set(Lt,n.country.iso_code),n.country.iso_code}catch(e){return void Mt.error("Failed to get geolocation data",{error:e})}})();var Rt=$("<div class=gf-app>");function $t(){const e=X.getInstance(),[t,n]=g(null),[r,o]=g(void 0),[i,s]=g(!1),[a,l]=g([]),[c,u]=g(),[d,p]=g({});f((async()=>{e.info("Mounting GfApp component");try{const i=await(async()=>{const e=await ee({type:Be,payload:{}});if(!e.payload.config)throw new Error("No checkout popup config found");return e.payload.config})();if(!i)return void e.error("No checkout popup config found");n(i),e.configure({enabled:!0,title:"Content - GfAdUnit",minLevel:i.checkoutPopupMinLogLevel??"error"}),function(e){if(!e?.shouldCheckSiteMatches)return;let t;(e?.siteMatchesRegex??[]).some((e=>{var n;return n=window.location.href,!(!new RegExp(e).test(n)||(t=e,0))}))&&t&&nt.trackEvent(z.checkoutPopupSiteMatches,{url:window.location.href,matchedRule:t,uts:Date.now()},!0)}(i);const a=Et();x(a);const c=tt();if(i.minVersion&&((e,t)=>{if(e===t)return!1;const n=e.split(".").map((e=>parseInt(e,10))),r=t.split(".").map((e=>parseInt(e,10)));for(let e=0;e<n.length;e++){if(n[e]<r[e])return!0;if(n[e]>r[e])return!1}return!1})(c,i.minVersion))return void e.debug(`Current version: ${c}. Minimum version ${i.minVersion} not met`);const u=await Nt()??"us",g=i.charities[u.toLowerCase()]??i.charities.us;if(p(g||{}),e.debug("Charities for current country",{currentCountry:u,charities:g}),!1===i.checkoutPopupMasterSwitch)return void e.debug("Checkout popup master switch is disabled");const d=document.getElementsByClassName("give-freely-root");let m=!1;d.length>1&&(e.debug("There is more than one gf extension installed"),d.item(0).dataset.extensionId!==Q.runtime.id&&(e.debug("Giving preference to the first gf extension injected in the DOM"),m=!0),e.debug("Providing this extension preference over the other installed extensions"));const{domain:h,rates:f}=await(async e=>{const{hostname:t}=window.location;e.debug("Checking if domain is active",{hostname:t});const n=await ee({type:je,payload:{hostname:t}});return n.payload.isActive?(e.debug("Active domain",{domain:n.payload.domain}),e.debug("Merchant rates",{rates:n.payload.rates}),e.info("Domain and rates ({})ed successfully."),{isActive:!0,domain:n.payload.domain,rates:n.payload.rates}):{isActive:!1,domain:void 0,rates:[]}})(e);if(l(f),o(h),h)await function(e,t){const n=kt(t)||Pt();return n>0&&function(e,t,n){if(e&&!(e<=0))try{ee({type:Ke,payload:{shopId:e,domain:t}}).catch((e=>{n.error("Error sending shop ID to background:",e)}))}catch(e){n.error("Error sending Shopify shop ID:",e)}}(n,e,t),n}(h,e);else{if("shop.app"!==window.location.hostname&&!window.location.hostname.endsWith(".shop.app"))return void s(!1);const t=window.location.pathname.split("/")[2];if(!t)return e.error("Shop ID not found"),void s(!1);const n=await Ct(parseInt(t));if(!n)return e.error("Shop domain not found"),void s(!1);e.debug("Shop domain found",{shopDomain:n}),o(n)}const A=await(async e=>{const t=await et.get("popup_hide");if(!t)return e.debug("No expiry found in storage"),!1;const{popupHide:n}=t,r=!!n&&Date.now()<n;return e.debug("Is AdUnit Muted?",{isMuted:r,expiry:n}),r})(e);if(A)return;if(!r())return void s(!1);const v=await(async(e,t)=>{const{Domain:n}=t,r=window.location.href,{payload:o}=await ee({type:We,payload:{activeDomain:n,url:r}});return!!o.result&&(e.info("Stand Down detected"),!0)})(e,r());if(v)return void s(!1);const b=t()?.anonymousActiveDomainLogging??!1,y=r()??void 0;y&&b&&!function(e){const t=`gfhv-${e}`;return!!sessionStorage.getItem(t)||(sessionStorage.setItem(t,"true"),!1)}(y.Domain)&&nt.trackEvent(z.checkoutPopupActiveDomain,{url:y.Domain});const w=setInterval((async()=>{e.debug("Checking checkout rules");const t=await(async e=>{const t=X.getInstance();t.configure({enabled:!0,title:"Content - checkoutRulesTest"});const n=new URL(globalThis.location.href),r=n.href,{hostname:o}=n;t.debug("Checking if popup should be shown",{currentUrl:r});const i=await async function(e){const t=kt(e)||Pt();return!("shop.app"!==window.location.hostname&&!window.location.hostname.endsWith(".shop.app")||!(t>0)||!await Ct(t))}(t),s=Dt(e)&&(yt(n.pathname.toLowerCase())||wt(r,document)||Tt(e,r,o)||i);return t.debug("Popup show decision based on rules",{shouldShow:s,matchesCartRule:yt(n.pathname.toLowerCase()),matchesBookingRule:wt(r,document),matchesShopPayRule:i,matchesMerchantRegexRule:Tt(e,r,o),matchesLanguageRule:Dt(e)}),s})(i);if(t&&m)return nt.trackEvent(z.checkoutPopupLooserExtension,{url:globalThis.window.location.href,winner:d.item(0).dataset.extensionName}),e.debug("Standing down because, another ad-unit extension will pop"),void clearInterval(w);s(t),t&&(e.debug("Should show popup based on checkout rules",{shouldShowResult:t}),nt.trackEvent(z.checkoutPopupShown,{url:globalThis.window.location.href,pageLanguage:a,looserCompetingExtensions:It(d,!0)}),clearInterval(w))}),2e3)}catch(t){s(!1),e.error("An error occurred in GfApp",{error:t})}}));const h=async(t,n)=>{e.info("Processing donation",{charity:t,domain:n.Domain});const r=await(async(e,t,n,r)=>{e.debug("Activating offer",{activeDomain:t,selectedCharity:r});const o=await te({type:Ve,payload:{activeDomain:t,originalUrl:n,selectedCharity:r}});return e.debug("Activate offer response",{response:o}),o})(e,n,window.location.href,{ein:t.ein,thirdPartyId:t.tpi});return e.debug("Activate offer response",{activationResponse:r}),nt.trackEvent(r.payload.response?z.checkoutPopupDonation:z.checkoutPopupFailedActivation,{activeDomain:n.Domain,url:globalThis.window.location.href,charity:{ein:t.ein,tpi:t.tpi},rate:n.Merchant.MaxRate}),r.payload.response},A=async t=>{s(await(async(e,t)=>{try{e.info("Hiding ad",{days:t});const n=await te({type:Ge,payload:{days:t??0}});return void 0!==t&&nt.trackEvent(z.checkoutPopupSupressed,{url:globalThis.window.location.href,days:t}),e.info("Hiding ad response",{hideResponse:n}),n.payload.ack?(e.debug("Ad hidden successfully"),!1):(e.warn("Failed to hide ad"),!0)}catch{return!1}})(e,t))},v=async e=>{nt.trackEvent(z.checkoutPopupOfferDetailsClicked,{action:e?"opened":"closed"})},x=async t=>{e.debug("Getting translation provider",{currentLanguage:t});const{translations:n,charities:r}=await async function(e,t){try{t&&t.debug("Getting language content",{languageCode:e});const n=await ee({type:qe,payload:{lang:e}});return{translations:n.payload.translations,charities:n.payload.charities}}catch(n){return t&&t.error("Error getting language content",{error:n,languageCode:e}),{translations:null,charities:null}}}(t,e),o={translate:e=>n&&n[e]?n[e]:"",getAllCharities:()=>{const e=d();return Object.entries(e).map((([e,t])=>{const{ein:n}=t;try{const o=r?.[n];if(!o)throw new Error(`Failed to find charity metadata for ein ${n}`);return{ein:n,tpi:o.tpi,title:o.title,order:parseInt(e,10),logo:o.logo,decorator:t.decorator,decoratorLeftStyle:t.decoratorLeftStyle,decoratorRightStyle:t.decoratorRightStyle}}catch{return{ein:n,tpi:"",title:"",order:9,logo:""}}}))}};e.debug("Setting content provider with translations and charity functions"),u((()=>o))};return L(Ot,{translate:()=>c()?.translate,charities:()=>c()?.getAllCharities,get children(){var n,o=Rt();return U(o,(n=m((()=>!(!r()||!i()))),()=>n()&&L(bt,{get checkoutPopupConf(){return t()},elementId:"give-freely-checkout-popup",get activeDomain(){return r()},get merchantRates(){return a()},onClose:A,onDonate:h,onOfferDetailsClick:v,logger:e}))),o}})}exports.browser=Q,exports.initializeAdUnit=async function(){const e=`give-freely-root-${Q.runtime.id}`;if(document.getElementById(e))return;const t=document.createElement("div");t.id=e,t.className="give-freely-root",t.style.display="block",t.dataset.extensionId=Q.runtime.id,t.dataset.extensionName=Q.runtime.getManifest().name||Q.runtime.id,document.body.appendChild(t);const n=t.attachShadow({mode:"open"}),r=document.createElement("div"),s=document.createElement("style");s.textContent='\n :host {\n all: initial;\n }\n\n .gf-scroll-remove::-webkit-scrollbar {\n border-radius-bottom-right: 15px;\n }\n\n button {\n cursor: pointer;\n transition: transform 0.1s ease;\n }\n\n button:active {\n transform: scale(0.98);\n }\n\n .give-freely-close-button:hover {\n opacity: 0.7;\n }\n\n input[type="radio"] {\n margin-right: 8px;\n }\n\n hr {\n border: none;\n border-top: 1px solid #e5e5e5;\n margin: 1em 0;\n }\n\n @media (max-width: 600px), (max-height: 480px) {\n #give-freely-checkout-popup {\n display: none !important;\n }\n }\n',n.appendChild(s),n.appendChild(r),function(e,t,n,r={}){let s;(function(e,t){const n=a,r=i,s=0===e.length,l=void 0===t?r:t,c=s?o:{owned:null,cleanups:null,context:l?l.context:null,owner:l},u=s?e:()=>e((()=>h((()=>D(c)))));i=c,a=null;try{return k(u,!0)}finally{a=n,i=r}})((r=>{s=r,t===document?e():U(t,e(),t.firstChild?null:void 0,n)}),r.owner)}((()=>L($t,{})),r)};
1
+ "use strict";const e={equals:(e,t)=>e===t};let t=P;const n=1,r=2,o={owned:null,cleanups:null,context:null,owner:null};var i=null;let s=null,a=null,l=null,c=null,u=0;function g(t,n){const r={value:t,observers:null,observerSlots:null,comparator:(n=n?Object.assign({},e,n):e).equals||void 0};return[x.bind(r),e=>("function"==typeof e&&(e=e(r.value)),b(r,e))]}function d(e,t,r){y(w(e,t,!1,n))}function p(e,r,o){t=S;const i=w(e,r,!1,n);i.user=!0,c?c.push(i):y(i)}function m(t,n,r){r=r?Object.assign({},e,r):e;const o=w(t,n,!0,0);return o.observers=null,o.observerSlots=null,o.comparator=r.equals||void 0,y(o),x.bind(o)}function h(e){if(null===a)return e();const t=a;a=null;try{return e()}finally{a=t}}function f(e){p((()=>h(e)))}function A(e){let t;return i&&i.context&&void 0!==(t=i.context[e.id])?t:e.defaultValue}function v(e){const t=m(e),n=m((()=>O(t())));return n.toArray=()=>{const e=n();return Array.isArray(e)?e:null!=e?[e]:[]},n}function x(){if(this.sources&&this.state)if(this.state===n)y(this);else{const e=l;l=null,k((()=>T(this)),!1),l=e}if(a){const e=this.observers?this.observers.length:0;a.sources?(a.sources.push(this),a.sourceSlots.push(e)):(a.sources=[this],a.sourceSlots=[e]),this.observers?(this.observers.push(a),this.observerSlots.push(a.sources.length-1)):(this.observers=[a],this.observerSlots=[a.sources.length-1])}return this.value}function b(e,t,r){let o=e.value;return e.comparator&&e.comparator(o,t)||(e.value=t,e.observers&&e.observers.length&&k((()=>{for(let t=0;t<e.observers.length;t+=1){const r=e.observers[t],o=s&&s.running;o&&s.disposed.has(r),(o?r.tState:r.state)||(r.pure?l.push(r):c.push(r),r.observers&&E(r)),o||(r.state=n)}if(l.length>1e6)throw l=[],new Error}),!1)),t}function y(e){if(!e.fn)return;D(e);const t=u;!function(e,t,r){let o;const s=i,l=a;a=i=e;try{o=e.fn(t)}catch(t){return e.pure&&(e.state=n,e.owned&&e.owned.forEach(D),e.owned=null),e.updatedAt=r+1,I(t)}finally{a=l,i=s}(!e.updatedAt||e.updatedAt<=r)&&(null!=e.updatedAt&&"observers"in e?b(e,o):e.value=o,e.updatedAt=r)}(e,e.value,t)}function w(e,t,r,s=n,a){const l={fn:e,state:s,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:t,owner:i,context:i?i.context:null,pure:r};return null===i||i!==o&&(i.owned?i.owned.push(l):i.owned=[l]),l}function C(e){if(0===e.state)return;if(e.state===r)return T(e);if(e.suspense&&h(e.suspense.inFallback))return e.suspense.effects.push(e);const t=[e];for(;(e=e.owner)&&(!e.updatedAt||e.updatedAt<u);)e.state&&t.push(e);for(let o=t.length-1;o>=0;o--)if((e=t[o]).state===n)y(e);else if(e.state===r){const n=l;l=null,k((()=>T(e,t[0])),!1),l=n}}function k(e,n){if(l)return e();let r=!1;n||(l=[]),c?r=!0:c=[],u++;try{const n=e();return function(e){if(l&&(P(l),l=null),e)return;const n=c;c=null,n.length&&k((()=>t(n)),!1)}(r),n}catch(e){r||(c=null),l=null,I(e)}}function P(e){for(let t=0;t<e.length;t++)C(e[t])}function S(e){let t,n=0;for(t=0;t<e.length;t++){const r=e[t];r.user?e[n++]=r:C(r)}for(t=0;t<n;t++)C(e[t])}function T(e,t){e.state=0;for(let o=0;o<e.sources.length;o+=1){const i=e.sources[o];if(i.sources){const e=i.state;e===n?i!==t&&(!i.updatedAt||i.updatedAt<u)&&C(i):e===r&&T(i,t)}}}function E(e){for(let t=0;t<e.observers.length;t+=1){const n=e.observers[t];n.state||(n.state=r,n.pure?l.push(n):c.push(n),n.observers&&E(n))}}function D(e){let t;if(e.sources)for(;e.sources.length;){const t=e.sources.pop(),n=e.sourceSlots.pop(),r=t.observers;if(r&&r.length){const e=r.pop(),o=t.observerSlots.pop();n<r.length&&(e.sourceSlots[o]=n,r[n]=e,t.observerSlots[n]=o)}}if(e.tOwned){for(t=e.tOwned.length-1;t>=0;t--)D(e.tOwned[t]);delete e.tOwned}if(e.owned){for(t=e.owned.length-1;t>=0;t--)D(e.owned[t]);e.owned=null}if(e.cleanups){for(t=e.cleanups.length-1;t>=0;t--)e.cleanups[t]();e.cleanups=null}e.state=0}function I(e,t=i){const n=function(e){return e instanceof Error?e:new Error("string"==typeof e?e:"Unknown error",{cause:e})}(e);throw n}function O(e){if("function"==typeof e&&!e.length)return O(e());if(Array.isArray(e)){const t=[];for(let n=0;n<e.length;n++){const r=O(e[n]);Array.isArray(r)?t.push.apply(t,r):t.push(r)}return t}return e}function M(e,t){return function(t){let n;return d((()=>n=h((()=>(i.context={...i.context,[e]:t.value},v((()=>t.children)))))),void 0),n}}function L(e,t){return h((()=>e(t||{})))}function N(e){const t=e.keyed,n=m((()=>e.when),void 0,{equals:(e,n)=>t?e===n:!e==!n});return m((()=>{const r=n();if(r){const o=e.children;return"function"==typeof o&&o.length>0?h((()=>o(t?r:()=>{if(!h(n))throw"Stale read from <Show>.";return e.when}))):o}return e.fallback}),void 0,void 0)}const R="_$DX_DELEGATE";function $(e,t,n){let r;const o=()=>(r||(r=(()=>{const t=document.createElement("template");return t.innerHTML=e,t.content.firstChild})())).cloneNode(!0);return o.cloneNode=o,o}function _(e,t=window.document){const n=t[R]||(t[R]=new Set);for(let r=0,o=e.length;r<o;r++){const o=e[r];n.has(o)||(n.add(o),t.addEventListener(o,G))}}function H(e,t,n){null==n?e.removeAttribute(t):e.setAttribute(t,n)}function F(e,t,n){if(!t)return n?H(e,"style"):t;const r=e.style;if("string"==typeof t)return r.cssText=t;let o,i;for(i in"string"==typeof n&&(r.cssText=n=void 0),n||(n={}),t||(t={}),n)null==t[i]&&r.removeProperty(i),delete n[i];for(i in t)o=t[i],o!==n[i]&&(r.setProperty(i,o),n[i]=o);return n}function U(e,t,n,r){if(void 0===n||r||(r=[]),"function"!=typeof t)return B(e,t,r,n);d((r=>B(e,t(),r,n)),r)}function G(e){let t=e.target;const n=`$$${e.type}`,r=e.target,o=e.currentTarget,i=t=>Object.defineProperty(e,"target",{configurable:!0,value:t}),s=()=>{const r=t[n];if(r&&!t.disabled){const o=t[`${n}Data`];if(void 0!==o?r.call(t,o,e):r.call(t,e),e.cancelBubble)return}return t.host&&"string"!=typeof t.host&&!t.host._$host&&t.contains(e.target)&&i(t.host),!0},a=()=>{for(;s()&&(t=t._$host||t.parentNode||t.host););};if(Object.defineProperty(e,"currentTarget",{configurable:!0,get:()=>t||document}),e.composedPath){const n=e.composedPath();i(n[0]);for(let e=0;e<n.length-2&&(t=n[e],s());e++){if(t._$host){t=t._$host,a();break}if(t.parentNode===o)break}}else a();i(r)}function B(e,t,n,r,o){for(;"function"==typeof n;)n=n();if(t===n)return n;const i=typeof t,s=void 0!==r;if(e=s&&n[0]&&n[0].parentNode||e,"string"===i||"number"===i){if("number"===i&&(t=t.toString())===n)return n;if(s){let o=n[0];o&&3===o.nodeType?o.data!==t&&(o.data=t):o=document.createTextNode(t),n=V(e,n,r,o)}else n=""!==n&&"string"==typeof n?e.firstChild.data=t:e.textContent=t}else if(null==t||"boolean"===i)n=V(e,n,r);else{if("function"===i)return d((()=>{let o=t();for(;"function"==typeof o;)o=o();n=B(e,o,n,r)})),()=>n;if(Array.isArray(t)){const i=[],a=n&&Array.isArray(n);if(j(i,t,n,o))return d((()=>n=B(e,i,n,r,!0))),()=>n;if(0===i.length){if(n=V(e,n,r),s)return n}else a?0===n.length?W(e,i,r):function(e,t,n){let r=n.length,o=t.length,i=r,s=0,a=0,l=t[o-1].nextSibling,c=null;for(;s<o||a<i;)if(t[s]!==n[a]){for(;t[o-1]===n[i-1];)o--,i--;if(o===s){const t=i<r?a?n[a-1].nextSibling:n[i-a]:l;for(;a<i;)e.insertBefore(n[a++],t)}else if(i===a)for(;s<o;)c&&c.has(t[s])||t[s].remove(),s++;else if(t[s]===n[i-1]&&n[a]===t[o-1]){const r=t[--o].nextSibling;e.insertBefore(n[a++],t[s++].nextSibling),e.insertBefore(n[--i],r),t[o]=n[i]}else{if(!c){c=new Map;let e=a;for(;e<i;)c.set(n[e],e++)}const r=c.get(t[s]);if(null!=r)if(a<r&&r<i){let l,u=s,g=1;for(;++u<o&&u<i&&null!=(l=c.get(t[u]))&&l===r+g;)g++;if(g>r-a){const o=t[s];for(;a<r;)e.insertBefore(n[a++],o)}else e.replaceChild(n[a++],t[s++])}else s++;else t[s++].remove()}}else s++,a++}(e,n,i):(n&&V(e),W(e,i));n=i}else if(t.nodeType){if(Array.isArray(n)){if(s)return n=V(e,n,r,t);V(e,n,null,t)}else null!=n&&""!==n&&e.firstChild?e.replaceChild(t,e.firstChild):e.appendChild(t);n=t}}return n}function j(e,t,n,r){let o=!1;for(let i=0,s=t.length;i<s;i++){let s,a=t[i],l=n&&n[e.length];if(null==a||!0===a||!1===a);else if("object"==(s=typeof a)&&a.nodeType)e.push(a);else if(Array.isArray(a))o=j(e,a,l)||o;else if("function"===s)if(r){for(;"function"==typeof a;)a=a();o=j(e,Array.isArray(a)?a:[a],Array.isArray(l)?l:[l])||o}else e.push(a),o=!0;else{const t=String(a);l&&3===l.nodeType&&l.data===t?e.push(l):e.push(document.createTextNode(t))}}return o}function W(e,t,n=null){for(let r=0,o=t.length;r<o;r++)e.insertBefore(t[r],n)}function V(e,t,n,r){if(void 0===n)return e.textContent="";const o=r||document.createTextNode("");if(t.length){let r=!1;for(let i=t.length-1;i>=0;i--){const s=t[i];if(o!==s){const t=s.parentNode===e;r||i?t&&s.remove():t?e.replaceChild(o,s):e.insertBefore(o,n)}else r=!0}}else e.insertBefore(o,n);return[o]}class K{constructor(){this.isLocal=!0}log({level:e,message:t,timestamp:n,data:r,title:o}){const i="debug"===e?"log":e,s=o?`[${o}]`:"";void 0!==r?console[i](`[${n}] - ${K.LOGGER_PREFIX} ${s} ${t}`,r):console[i](`[${n}] - ${K.LOGGER_PREFIX} ${s} ${t}`)}}var z,q;K.LOGGER_PREFIX="[GFAdUnit] -",function(e){e.checkoutPopupShown="CHECKOUT-POPUP-SHOWN",e.checkoutPopupNotShown="CHECKOUT-POPUP-NOT-SHOWN",e.checkoutPopupSupressed="CHECKOUT-POPUP-SUPRESSED",e.checkoutPopupDonation="CHECKOUT-POPUP-DONATION",e.checkoutPopupFailedActivation="CHECKOUT-POPUP-FAILED-ACTIVATION",e.checkoutPopupPurchaseConfirmed="CHECKOUT-POPUP-PURCHASE-CONFIRMED",e.checkoutPopupHealthCheck="CHECKOUT-POPUP-HEALTH-CHECK",e.checkouPopupActivationFailed="CHECKOUT-POPUP-ACTIVATION-FAILED",e.checkoutPopupOfferDetailsClicked="CHECKOUT-POPUP-OFFER-DETAILS-CLICKED",e.checkoutPopupWhyAmISeeingThisClicked="CHECKOUT-POPUP-WHY-AM-I-SEEING-THIS-CLICKED",e.checkoutPopupLooserExtension="CHECKOUT-POPUP-LOOSER-EXTENSION",e.checkoutPopupActiveDomain="CHECKOUT-POPUP-ACTIVE-DOMAIN",e.checkoutPopupSiteMatches="CHECKOUT-POPUP-SITE-MATCHES"}(z||(z={})),function(e){e.adUnitLog="ADUNIT-LOG"}(q||(q={}));const Y=["debug","info","warn","error"];class X{constructor(e){this.config={minLevel:e?.minLevel??"debug",enabled:e?.enabled??!1,transports:e?.transports??[new K],title:e?.title??""}}static getInstance(e){return X.instance||(X.instance=new X(e)),X.instance}configure(e){this.config={...this.config,...e}}shouldLog(e){return!!this.config.enabled&&Y.indexOf(e)>=Y.indexOf(this.config.minLevel)}createLogMessage(e,t,n){return{level:e,version:"1.9.1",message:t,timestamp:(new Date).toISOString(),data:n,title:this.config.title}}log(e,t,n,r){if(!this.shouldLog(e))return;const o=this.createLogMessage(e,t,r);this.config.transports.filter((e=>!n||e.isLocal)).forEach((e=>e.log(o)))}debug(e,t,n=!1){this.log("debug",e,n,t)}info(e,t,n=!1){this.log("info",e,n,t)}warn(e,t,n=!1){this.log("warn",e,n,t)}error(e,t,n=!1){this.log("error",e,n,t)}addTransport(e){this.config.transports.push(e)}clearTransports(){this.config.transports=[]}disable(){this.config.enabled=!1}enable(){this.config.enabled=!0}}const Z=3,J=e=>1e3*e,Q=chrome;async function ee(e,t){return new Promise(((n,r)=>{try{const o=t=>chrome.runtime.lastError?r({error:chrome.runtime.lastError,message:e}):n(t);t?.tabId||Q.runtime.sendMessage(e,o)}catch(e){r(e)}}))}async function te(e,t,n){return async function(e,t={}){const{maxAttempts:n=Z,delayFn:r=J}=t;let o=null;for(let t=1;t<=n;t+=1)try{return await e()}catch(e){o=e,t<n&&await new Promise((e=>{setTimeout(e,r(t))}))}throw o&&t.logger&&t.operationName&&t.logger.error(`Operation ${t.operationName} failed after ${n} attempts.`,o),o||new Error("Operation failed after multiple attempts")}((()=>ee(e,t)),{maxAttempts:Z,delayFn:J})}const ne={display:"block",position:"fixed",top:"0%",left:"100%",width:"500px",height:"520px","margin-left":"-560px","margin-top":"50px",padding:"2px 5px","background-color":"white",border:"1px solid black","border-radius":"10px","box-shadow":"0 2px 10px rgba(0, 0, 0, 0.1)","z-index":"2147483647","font-family":"Arial","line-height":"1","vertical-align":"baseline","box-sizing":"border-box",color:"rgb(34, 34, 34)","@media (max-width: 600px), (max-height: 480px)":{display:"none !important"}},re={height:"100%","overflow-x":"hidden","overlfow-y":"auto",position:"relative",padding:"0px 15px"},oe={},ie={display:"flex","align-items":"center","margin-bottom":"10px"},se={flex:"1","font-size":"24px","font-weight":"700","margin-top":"20px","margin-bottom":"0px"},ae={background:"none",border:"none",padding:"4px 8px",color:"#666464","font-size":"38px",cursor:"pointer","line-height":"1"},le={color:"black","margin-top":"20px","max-width":"40%"},ce={color:"gray",cursor:"default","pointer-events":"none","text-decoration":"none"},ue={"font-size":"18px","font-weight":"400","margin-top":"20px","margin-bottom":"0px"},ge={display:"flex",gap:"10px",width:"100%","margin-top":"20px","margin-bottom":"20px","flex-wrap":"wrap","justify-content":"space-between"},de={width:"28%",position:"relative",display:"flex","flex-direction":"column","align-items":"center",background:"none",border:"1px solid #ccc","border-radius":"5px",padding:"5px",gap:"5px","text-align":"center","font-size":"14px",cursor:"pointer",transition:"background-color 0.2s ease"},pe={color:"white","background-color":"lightgray",cursor:"default","pointer-events":"none"},me={"max-width":"120px","max-height":"70px","margin-bottom":"5px","object-fit":"contain"},he={"background-color":"#FFD812",cursor:"pointer","border-radius":"8px",padding:"8px",color:"white","min-width":"100px",border:"0","font-weight":"600",width:"100%"},fe={display:"flex","flex-direction":"column",gap:"10px",width:"100%","color-scheme":"light"},Ae={display:"flex","align-items":"center",gap:"5px",border:"1px solid #ddd",padding:"15px","border-radius":"5px","font-weight":"600",cursor:"pointer","margin-bottom":"8px"},ve={"text-align":"right"},xe={background:"none",border:"none",color:"blue","text-decoration":"underline",padding:"0",cursor:"pointer","margin-bottom":"15px"},be={display:"flex","justify-content":"space-between",margin:"20px 0px 10px 0px","font-size":"14px"},ye={margin:"5px 0px 5px 0px","font-size":"14px","text-align":"center"},we={color:"#666464","text-decoration":"underline"},Ce={color:"rgb(102, 100, 100)","text-decoration":"underline",margin:"0",cursor:"pointer"},ke={width:"100%","background-color":"#f2f2f2",border:"1px solid black","border-radius":"10px","border-top":"1px solid #bbb7b7","margin-top":"10px","margin-bottom":"20px","box-sizing":"border-box"},Pe={padding:"0 5px 0 10px",width:"100%","font-size":"12px","box-sizing":"border-box"},Se={display:"grid","grid-template-columns":"4fr 1fr","padding-right":"15px","padding-bottom":"5px"},Te={color:"#000","margin-bottom":"4px"},Ee={"font-size":"14px",color:"#555","text-align":"right"},De=(e,t)=>{let n=parseFloat(t);return"FLAT"===e&&(n*=.75),((e,t)=>{let n=parseFloat(t);return n<1&&(n=1),n=Math.floor(n),"PERCENTAGE"===e?`${n}%`:`$${n}`})(e,n.toString())};var Ie=$("<span>");function Oe(e){return t=Ie(),d((()=>{return t.innerHTML=(n=e.title,r=e.activeDomain,n.replace("{0}",De(r.Merchant.MaxRate?.Kind,r.Merchant.MaxRate?.Amount??"0")));var n,r})),t;var t}const Me=function(){const e=Symbol("context");return{id:e,Provider:M(e),defaultValue:()=>({translate:e=>"",getAllCharities:()=>[]})}}(),Le=Me,Ne=()=>{const e=A(Le)();if(!e)throw new Error("Content provider context is undefined");return t=>e.translate(t)};class Re{static formatMessage(e,...t){return e.replace(/{(\d+)}/g,((e,n)=>{const r=Number(n);return void 0!==t[r]?String(t[r]):`{${r}}`}))}}var $e=$("<div>"),_e=$("<div><div class=gf-offer-details><p><span></span></p><p><span></span></p><p><span></span></p><p><span></span></p><p><span></span></p><p><a target=_blank rel=noreferrer><span>"),He=$("<div class=gf-offer-details-rate-item><div></div><div>");const Fe=e=>{const t=Ne();return n=_e(),o=(r=n.firstChild).firstChild,i=o.firstChild,s=o.nextSibling,a=s.firstChild,l=s.nextSibling,c=l.firstChild,u=l.nextSibling,g=u.firstChild,p=u.nextSibling,m=p.firstChild,h=p.nextSibling.firstChild,f=h.firstChild,U(r,L(N,{get when(){return!!e.merchantRateDetail?.length},get children(){var t=$e();return U(t,(()=>e.merchantRateDetail?.map((e=>{return t=He(),n=t.firstChild,r=n.nextSibling,U(n,(()=>e.Name||"")),U(r,(()=>((e,t=1,n=1)=>{const r=e.BoostedOffer??null;let o=parseFloat(e?.Amount??"");if(r?.EndDate&&new Date(r.EndDate)<new Date&&(o=parseFloat(r.OriginalMaxRate)),Number.isNaN(o))return"";const i=o*t;return"PERCENTAGE"===e?.Kind?`${i.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:n})}%`:"FLAT"===e?.Kind?i.toLocaleString("en-US",{style:"currency",currency:e.Currency}):""})(e))),d((e=>{var o=Se,i=Te,s=Ee;return e.e=F(t,o,e.e),e.t=F(n,i,e.t),e.a=F(r,s,e.a),e}),{e:void 0,t:void 0,a:void 0}),t;var t,n,r})))),t}}),u),d((o=>{var s=ke,l=Pe,u=t("offerDetails.intro"),d=t("offerDetails.eligible"),p=e.parsedMaxRate?Re.formatMessage(t("offerDetails.donationRatesWithValue"),e.parsedMaxRate):Re.formatMessage(t("offerDetails.donationRates")),A=t("offerDetails.donationAmounts"),v=t("offerDetails.donationTiming"),x=we,b=e.termsUrl,y=t("offerDetails.termsAndConditions");return o.e=F(n,s,o.e),o.t=F(r,l,o.t),u!==o.a&&(i.innerHTML=o.a=u),d!==o.o&&(a.innerHTML=o.o=d),p!==o.i&&(c.innerHTML=o.i=p),A!==o.n&&(g.innerHTML=o.n=A),v!==o.s&&(m.innerHTML=o.s=v),o.h=F(h,x,o.h),b!==o.r&&H(h,"href",o.r=b),y!==o.d&&(f.innerHTML=o.d=y),o}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0}),n;var n,r,o,i,s,a,l,c,u,g,p,m,h,f},Ue="TRACK_EVENT",Ge="GF_HIDE_POPUP",Be="GF_GET_POPUP_CONFIG",je="GF_IS_ACTIVE_DOMAIN",We="GF_SHOULD_STAND_DOWN",Ve="GF_ACTIVATE_OFFER",Ke="GF_STORE_SHOPIFY_SHOP_ID",ze="GF_GET_DOMAIN_BY_SHOP_ID",qe="GF_GET_LANGUAGE_CONTENT",Ye={ein:"0",tpi:"0"};function Xe(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Ze={exports:{}};"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self&&self,function(e){if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)e.exports=globalThis.browser;else{const t="The message port closed before a response was received.",n=e=>{const n={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(0===Object.keys(n).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class r extends WeakMap{constructor(e,t=void 0){super(t),this.createItem=e}get(e){return this.has(e)||this.set(e,this.createItem(e)),super.get(e)}}const o=(t,n)=>(...r)=>{e.runtime.lastError?t.reject(new Error(e.runtime.lastError.message)):n.singleCallbackArg||r.length<=1&&!1!==n.singleCallbackArg?t.resolve(r[0]):t.resolve(r)},i=e=>1==e?"argument":"arguments",s=(e,t,n)=>new Proxy(t,{apply:(t,r,o)=>n.call(r,e,...o)});let a=Function.call.bind(Object.prototype.hasOwnProperty);const l=(e,t={},n={})=>{let r=Object.create(null),c={has:(t,n)=>n in e||n in r,get(c,u,g){if(u in r)return r[u];if(!(u in e))return;let d=e[u];if("function"==typeof d)if("function"==typeof t[u])d=s(e,e[u],t[u]);else if(a(n,u)){let t=((e,t)=>function(n,...r){if(r.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${i(t.minArgs)} for ${e}(), got ${r.length}`);if(r.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${i(t.maxArgs)} for ${e}(), got ${r.length}`);return new Promise(((i,s)=>{if(t.fallbackToNoCallback)try{n[e](...r,o({resolve:i,reject:s},t))}catch(o){console.warn(`${e} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,o),n[e](...r),t.fallbackToNoCallback=!1,t.noCallback=!0,i()}else t.noCallback?(n[e](...r),i()):n[e](...r,o({resolve:i,reject:s},t))}))})(u,n[u]);d=s(e,e[u],t)}else d=d.bind(e);else if("object"==typeof d&&null!==d&&(a(t,u)||a(n,u)))d=l(d,t[u],n[u]);else{if(!a(n,"*"))return Object.defineProperty(r,u,{configurable:!0,enumerable:!0,get:()=>e[u],set(t){e[u]=t}}),d;d=l(d,t[u],n["*"])}return r[u]=d,d},set:(t,n,o,i)=>(n in r?r[n]=o:e[n]=o,!0),defineProperty:(e,t,n)=>Reflect.defineProperty(r,t,n),deleteProperty:(e,t)=>Reflect.deleteProperty(r,t)},u=Object.create(e);return new Proxy(u,c)},c=e=>({addListener(t,n,...r){t.addListener(e.get(n),...r)},hasListener:(t,n)=>t.hasListener(e.get(n)),removeListener(t,n){t.removeListener(e.get(n))}}),u=new r((e=>"function"!=typeof e?e:function(t){const n=l(t,{},{getContent:{minArgs:0,maxArgs:0}});e(n)})),g=new r((e=>"function"!=typeof e?e:function(t,n,r){let o,i,s=!1,a=new Promise((e=>{o=function(t){s=!0,e(t)}}));try{i=e(t,n,o)}catch(e){i=Promise.reject(e)}const l=!0!==i&&((c=i)&&"object"==typeof c&&"function"==typeof c.then);var c;if(!0!==i&&!l&&!s)return!1;return(l?i:a).then((e=>{r(e)}),(e=>{let t;t=e&&(e instanceof Error||"string"==typeof e.message)?e.message:"An unexpected error occurred",r({__mozWebExtensionPolyfillReject__:!0,message:t})})).catch((e=>{console.error("Failed to send onMessage rejected reply",e)})),!0})),d=({reject:n,resolve:r},o)=>{e.runtime.lastError?e.runtime.lastError.message===t?r():n(new Error(e.runtime.lastError.message)):o&&o.__mozWebExtensionPolyfillReject__?n(new Error(o.message)):r(o)},p=(e,t,n,...r)=>{if(r.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${i(t.minArgs)} for ${e}(), got ${r.length}`);if(r.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${i(t.maxArgs)} for ${e}(), got ${r.length}`);return new Promise(((e,t)=>{const o=d.bind(null,{resolve:e,reject:t});r.push(o),n.sendMessage(...r)}))},m={devtools:{network:{onRequestFinished:c(u)}},runtime:{onMessage:c(g),onMessageExternal:c(g),sendMessage:p.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:p.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},h={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return n.privacy={network:{"*":h},services:{"*":h},websites:{"*":h}},l(e,m,n)};e.exports=n(chrome)}}(Ze);var Je=Xe(Ze.exports);const Qe="GIVE_FREELY_",et={async get(e){const t=`${Qe}${e}`;return(await Je.storage.local.get(t))[t]||null},async set(e,t){const n=`${Qe}${e}`;await Je.storage.local.set({[n]:t})},async remove(e){const t=Array.isArray(e)?e.map((e=>`${Qe}${e}`)):`${Qe}${e}`;await Je.storage.local.remove(t)}},tt=()=>String("1.9.1");class nt{constructor(e,t,n,r=60){this.track=async(e,t,n,r=!1,o=!1)=>{const i={partner:`adUnit_${this._partnerApiKey}`,eventType:e,eventData:{userId:r?void 0:this._userService?.user?.id,libVersion:tt(),wfDeviceId:t,...n}};try{const e=JSON.stringify(i,((e,t)=>t instanceof Error?{name:t.name,message:t.message,stack:t.stack}:t)),t=await this.getEventsUrl();if(await this.shouldBroadcastEvent(e,o)){const n=await fetch(t,{headers:{"Content-Type":"application/json"},method:"POST",body:e,cache:"no-store"});return n.ok?(await this.pushEventToHistory(e),!0):(this._logger.error("Something unexpected happened when dispatching an event",{status:n.status,statusText:n.statusText,event:i},!0),!1)}return this._logger.info("This event has already been broadcasted during the past hour",i,!0),!1}catch(e){return this._logger.error("Something unexpected happened when dispatching a gf event",{error:e,event:i}),!1}},this.getEventsHistory=async()=>{const{GF_AD_EVENT_HISTORY:e}=await Q.storage.local.get({GF_AD_EVENT_HISTORY:""}),t=(e=>{const t=new Date;return t.setTime(t.getTime()+60*e*1e3),t.getTime()})(-this._debounceWindowInMinutes),n=(e||[]).filter((e=>e.createdAt>t));return await Q.storage.local.set({GF_AD_EVENT_HISTORY:n}),n},this.shouldBroadcastEvent=async(e,t)=>!!t||!(await this.getEventsHistory()).some((t=>t.payload===e)),this.pushEventToHistory=async e=>{const t=await this.getEventsHistory();t.push({createdAt:Date.now(),payload:e}),await Q.storage.local.set({GF_AD_EVENT_HISTORY:t})},this._partnerApiKey=e,this._userService=t,this._debounceWindowInMinutes=r,this._logger=X.getInstance({title:"Analytics"}),this._configService=n}async getEventsUrl(){const{eventsUrl:e}=await this._configService.getConfig();return e}}function rt(e,t,n){return e?{...t,...n}:t}nt.trackEvent=async(e,t,n=!1,r=!1)=>{await ee({type:Ue,payload:{eventType:e,eventData:t,anonymous:n,skipThrottling:r}})};var ot=$("<a href=#!>"),it=$("<button class=give-freely-close-button aria-label=Close>×"),st=$('<div><div><div></div></div><hr><div></div><div><div><div><br><span></span></div><button aria-label="Don\'t show again"><span></span></button></div></div><div><p><span></span></p><a class=give-freely-footer-link target=_blank rel="noopener noreferrer"><span>'),at=$("<div><div><img><span></span></div><button><span>"),lt=$("<div>"),ct=$("<div><span>");function ut(e){const[t,n]=g(!1),[r,o]=g(null),i=Ne(),s=(()=>{const e=A(Me)();if(!e)throw new Error("Content provider context is undefined");return()=>e.getAllCharities()})();p((()=>{t()&&e.mainContainerRef&&e.mainContainerRef.scroll({top:e.mainContainerRef.scrollHeight,behavior:"smooth"})})),p((()=>{const t=r();t&&e.onCharitySelect(t.charity,t.closeOnDonation?e.checkoutPopupConf.checkoutPopupActivateAndCloseSkipSuccess:void 0)}));const a=(e,t)=>o({charity:e,closeOnDonation:t}),l=()=>!!r()?.charity;return[(u=st(),h=u.firstChild,f=h.firstChild,v=h.nextSibling.nextSibling,x=v.nextSibling,b=x.firstChild,y=b.firstChild,w=y.firstChild.nextSibling,C=y.nextSibling,k=C.firstChild,P=x.nextSibling,S=P.firstChild,T=S.firstChild,E=S.nextSibling,D=E.firstChild,U(h,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupActivateAndClose},get children(){var e=ot();return e.$$click=()=>a(Ye,!0),d((t=>{var n=rt(l(),le,ce),r=i("main.activateAndClose");return t.e=F(e,n,t.e),r!==t.t&&(e.innerHTML=t.t=r),t}),{e:void 0,t:void 0}),e}}),null),U(h,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupMainCloseButtonVisible&&!e.checkoutPopupConf.checkoutPopupActivateAndClose},get children(){var t=it();return t.$$click=()=>e.onClose(),d((e=>F(t,ae,e))),t}}),null),U(v,L(Oe,{get title(){return i("main.subTitle")},get activeDomain(){return e.activeDomain}})),U(x,(()=>s().reduce(((t,n)=>{var r,o,s,c,u,g,p;return n?.title&&""!==n?.title?t.push((s=(o=at()).firstChild,c=s.firstChild,u=c.nextSibling,g=s.nextSibling,p=g.firstChild,o.$$click=()=>!l()&&a(n),U(o,(r=m((()=>!!(n.decorator&&n.decoratorLeftStyle&&n.decoratorRightStyle))),()=>{return r()&&[(t=lt(),d((e=>{var r=n.decoratorLeftStyle,o=n.decorator;return e.e=F(t,r,e.e),o!==e.t&&(t.innerHTML=e.t=o),e}),{e:void 0,t:void 0}),t),(e=lt(),d((t=>{var r=n.decoratorRightStyle,o=n.decorator;return t.e=F(e,r,t.e),o!==t.t&&(e.innerHTML=t.t=o),t}),{e:void 0,t:void 0}),e)];var e,t}),s),s.style.setProperty("height","100px"),s.style.setProperty("text-align","center"),d((t=>{var r=rt(l(),de,{cursor:"default"}),s=n.logo,a=me,d=n.title,m=n.title,h=rt(l(),{...he,"background-color":e.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor||"#FFD812"},pe),f=l(),A=`Select charity: ${n.title}`,v=i("main.charitySelect");return t.e=F(o,r,t.e),s!==t.t&&H(c,"src",t.t=s),t.a=F(c,a,t.a),d!==t.o&&H(c,"alt",t.o=d),m!==t.i&&(u.innerHTML=t.i=m),t.n=F(g,h,t.n),f!==t.s&&(g.disabled=t.s=f),A!==t.h&&H(g,"aria-label",t.h=A),v!==t.r&&(p.innerHTML=t.r=v),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0}),o)):e.logger.error(`Translation was not found for EIN ${n?.ein}`),t}),[])),b),b.$$click=()=>!l()&&e.onSuppress(),y.style.setProperty("height","100px"),y.style.setProperty("text-align","center"),S.$$click=()=>{e.onOfferDetailsClick(!t()),n(!t())},E.$$click=()=>{nt.trackEvent(z.checkoutPopupWhyAmISeeingThisClicked,{domain:globalThis.window.location.hostname})},U(u,(c=m((()=>!!e.checkoutPopupConf.checkoutPopupDisplayNameInFooter)),()=>{return c()&&(e=ct(),t=e.firstChild,d((n=>{var r=ye,o=i("main.footer");return n.e=F(e,r,n.e),o!==n.t&&(t.innerHTML=n.t=o),n}),{e:void 0,t:void 0}),e);var e,t}),null),d((t=>{var n=oe,r=ie,o=se,s=i("main.title"),a=ue,c=ge,g=rt(l(),de,{cursor:"default"}),d=i("main.sixthBox"),p=rt(l(),{...he,"background-color":e.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor||"#FFD812"},pe),m=l(),A=i("main.settings"),y=be,I=Ce,O=i("main.offerDetails"),M=we,L=e.checkoutPopupConf.externalUrls.giveFreelyWhyAmISeeingThis,N=i("main.whyAmISeeingThis");return t.e=F(u,n,t.e),t.t=F(h,r,t.t),t.a=F(f,o,t.a),s!==t.o&&(f.innerHTML=t.o=s),t.i=F(v,a,t.i),t.n=F(x,c,t.n),t.s=F(b,g,t.s),d!==t.h&&(w.innerHTML=t.h=d),t.r=F(C,p,t.r),m!==t.d&&(C.disabled=t.d=m),A!==t.l&&(k.innerHTML=t.l=A),t.u=F(P,y,t.u),t.c=F(S,I,t.c),O!==t.w&&(T.innerHTML=t.w=O),t.m=F(E,M,t.m),L!==t.f&&H(E,"href",t.f=L),N!==t.y&&(D.innerHTML=t.y=N),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0,l:void 0,u:void 0,c:void 0,w:void 0,m:void 0,f:void 0,y:void 0}),u),L(N,{get when(){return t()},get children(){return L(Fe,{get merchantName(){return e.activeDomain.Merchant.Name},get extensionName(){return e.checkoutPopupConf.displayName},get termsUrl(){return e.checkoutPopupConf.externalUrls.giveFreelyTermsAndConditions},get parsedMaxRate(){return m((()=>!!e.activeDomain.Merchant.MaxRate))()?De(e.activeDomain.Merchant.MaxRate.Kind,e.activeDomain.Merchant.MaxRate?.Amount):null},get merchantRateDetail(){return e.merchantRates},onClose:()=>n(!1)})}})];var c,u,h,f,v,x,b,y,w,C,k,P,S,T,E,D}_(["click"]);var gt=$("<button class=give-freely-close-button aria-label=Close>×"),dt=$("<label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=18250><span>"),pt=$('<div><div><div><span></span></div></div><button class=give-freely-back-button aria-label="Back to charity selection"><span></span></button><hr><div id=give-freely-goodbye-screen-options><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=1><span></span></label><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=7><span></span></label><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=30><span></span></label><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=90><span></span></label></div><button class=give-freely-submit-button><span>');function mt(e){const[t,n]=g(0),r=Ne();return o=pt(),i=o.firstChild,s=i.firstChild,a=s.firstChild,l=i.nextSibling,c=l.firstChild,u=l.nextSibling.nextSibling,m=(p=u.firstChild).firstChild,h=m.nextSibling,A=(f=p.nextSibling).firstChild,v=A.nextSibling,b=(x=f.nextSibling).firstChild,y=b.nextSibling,C=(w=x.nextSibling).firstChild,k=C.nextSibling,P=u.nextSibling,S=P.firstChild,o.style.setProperty("font-size","14px"),U(i,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupSupressCloseButtonVisible},get children(){var t=gt();return t.$$click=()=>e.onGoodbye(0),d((e=>F(t,ae,e))),t}}),null),l.$$click=()=>e.onBack(),m.addEventListener("change",(()=>n(1))),A.addEventListener("change",(()=>n(7))),b.addEventListener("change",(()=>n(30))),C.addEventListener("change",(()=>n(90))),U(u,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupNeverSuppressionAllowed},get children(){var e=dt(),t=e.firstChild,o=t.nextSibling;return t.addEventListener("change",(()=>n(18250))),d((t=>{var n=Ae,i=r("suppress.suppressionPeriodNever");return t.e=F(e,n,t.e),i!==t.t&&(o.innerHTML=t.t=i),t}),{e:void 0,t:void 0}),e}}),null),P.$$click=()=>{const n=t();n&&(e.onGoodbye(n),e.setScreen("main"))},d((t=>{var n=ie,o=se,g=r("suppress.title"),d=xe,m=r("suppress.backButton"),A=fe,b=Ae,C=r("suppress.suppressionPeriod").replace("{0}","1"),T=Ae,E=r("suppress.suppressionPeriodPlural").replace("{0}","7"),D=Ae,I=r("suppress.suppressionPeriodPlural").replace("{0}","30"),O=Ae,M=r("suppress.suppressionPeriodPlural").replace("{0}","90"),L={...he,"font-weight":"700","margin-top":"10px","margin-bottom":"0px","background-color":e.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor||"#FFD812",width:"100px"},N=r("suppress.submitButton");return t.e=F(i,n,t.e),t.t=F(s,o,t.t),g!==t.a&&(a.innerHTML=t.a=g),t.o=F(l,d,t.o),m!==t.i&&(c.innerHTML=t.i=m),t.n=F(u,A,t.n),t.s=F(p,b,t.s),C!==t.h&&(h.innerHTML=t.h=C),t.r=F(f,T,t.r),E!==t.d&&(v.innerHTML=t.d=E),t.l=F(x,D,t.l),I!==t.u&&(y.innerHTML=t.u=I),t.c=F(w,O,t.c),M!==t.w&&(k.innerHTML=t.w=M),t.m=F(P,L,t.m),N!==t.f&&(S.innerHTML=t.f=N),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0,l:void 0,u:void 0,c:void 0,w:void 0,m:void 0,f:void 0}),o;var o,i,s,a,l,c,u,p,m,h,f,A,v,x,b,y,w,C,k,P,S}_(["click"]);var ht=$("<div><p><span>"),ft=$("<div><div><div><span></span></div><button class=give-freely-close-button aria-label=Close>×</button></div><hr><div><span>");function At(e){const[t,n]=g(null),r=Ne();let o;var s,a,l,c,u,p,m,h;return s=()=>clearInterval(o),null===i||(null===i.cleanups?i.cleanups=[s]:i.cleanups.push(s)),f((()=>{e.failedDonation||(()=>{const t=e.checkoutPopupConf.checkoutPopupDonationSuccessAutoCloseInSeconds??3;n(t),o=setInterval((()=>{n((t=>null===t||t<=1?(clearInterval(o),e.onClose(),0):t-1))}),1e3)})()})),a=ft(),l=a.firstChild,c=l.firstChild,u=c.firstChild,p=c.nextSibling,m=l.nextSibling.nextSibling,h=m.firstChild,a.style.setProperty("font-size","14px"),p.$$click=()=>e.onClose(),m.style.setProperty("padding","30px"),m.style.setProperty("height","150px"),m.style.setProperty("font-size","14px"),U(a,L(N,{get when(){return!e.failedDonation},get children(){var e=ht(),n=e.firstChild,o=n.firstChild;return d((e=>{var i=ve,s=Re.formatMessage(r("donate.autoClosing"),t()??0);return e.e=F(n,i,e.e),s!==e.t&&(o.innerHTML=e.t=s),e}),{e:void 0,t:void 0}),e}}),null),d((t=>{var n=ie,o=se,i=e.failedDonation?r("donate.failTitle"):r("donate.title"),s=ae,a=e.failedDonation?r("donate.failContent"):r("donate.content");return t.e=F(l,n,t.e),t.t=F(c,o,t.t),i!==t.a&&(u.innerHTML=t.a=i),t.o=F(p,s,t.o),a!==t.i&&(h.innerHTML=t.i=a),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),a}_(["click"]);var vt=$("<div><div>");const xt=(e,t,n)=>"donate"===e?"340px":t.checkoutPopupDisplayNameInFooter?"520px":n;function bt(e){const[t,n]=g("main"),[r,o]=g(),[i,s]=g(!1),a=()=>{e.logger.debug("Close button clicked"),e.onClose()},l=async(t,r=!1)=>{r&&e.onClose(),e.logger.info("Charity selected",{charity:t,domain:e.activeDomain.Domain}),o(t);const i=await e.onDonate(t,e.activeDomain);r?e.onClose():(s(!i),n("donate"))},c=()=>{e.logger.debug("Suppress button clicked"),n("goodbye")},u=()=>{e.logger.debug("Navigating back to main screen"),n("main")},p=t=>{e.logger.info("User chose to hide popup",{days:t}),e.onClose(t)};let m;return v=vt(),x=v.firstChild,"function"==typeof m?(f=m,A=x,h((()=>f(A,undefined)))):m=x,U(x,L(N,{get when(){return"main"===t()},get children(){return L(ut,{mainContainerRef:m,get checkoutPopupConf(){return e.checkoutPopupConf},get activeDomain(){return e.activeDomain},get merchantRates(){return e.merchantRates},onClose:a,onCharitySelect:l,onSuppress:c,get onOfferDetailsClick(){return e.onOfferDetailsClick},get logger(){return e.logger}})}}),null),U(x,L(N,{get when(){return"goodbye"===t()},get children(){return L(mt,{get checkoutPopupConf(){return e.checkoutPopupConf},onClose:()=>e.onClose(),onBack:u,onGoodbye:p,setScreen:n})}}),null),U(x,L(N,{get when(){return"donate"===t()},get children(){return L(At,{get checkoutPopupConf(){return e.checkoutPopupConf},get selectedCharity(){return r()},onClose:()=>e.onClose(),get failedDonation(){return i()},setScreen:n})}}),null),d((n=>{var r={...ne,height:xt(t(),e.checkoutPopupConf,ne.height)},o=e.elementId,i=re;return n.e=F(v,r,n.e),o!==n.t&&H(v,"id",n.t=o),n.a=F(x,i,n.a),n}),{e:void 0,t:void 0,a:void 0}),v;var f,A,v,x}function yt(e){const t=["",".asp",".aspx",".php",".js",".htm",".html"],n=["cart","checkout","shopping-bag","shopping-basket","shopping-cart","basket"].flatMap((e=>t.map((t=>e+t)))).filter((e=>"basket"!==e)),r=["tote-cart","tote.cart"],o=e,i=n.filter((e=>o.includes(e))),s=o.split("/");return!s.some((e=>r.some((t=>e.includes(t)))))&&(s.some((e=>n.some((t=>e.startsWith(t)||e.endsWith(t)))))||"basket"===s[s.length-1].toLowerCase()||i.length>1||1===i.length&&o.includes("shopping"))}function wt(e,t){const n=["book"];return e.split("/").some((e=>n.some((t=>e.startsWith(t)||e.endsWith(t)))))&&null!=t.evaluate("//*[self::h1 or self::h2 or self::h3 or self::h4 or self::h5 or self::h6][contains(., 'Your Reservation') or contains(., 'Your reservation')]",t,null,XPathResult.ANY_TYPE,null)?.iterateNext()}async function Ct(e){try{const t=await ee({type:ze,payload:{shopId:e}});return t.payload.found&&t.payload.domain?t.payload.domain:null}catch{return null}}function kt(e){try{const e=Array.from(document.querySelectorAll("script"));for(const t of e){if(t.dataset?.shopId&&(t.dataset?.shopId?.startsWith("gid")||t.src.includes("shopify"))){const e=parseInt(t.dataset.shopId.replace("gid://shopify/Shop/",""));if(!Number.isNaN(e)&&e>0)return e}const e=t.textContent||"";if(e.includes("ShopifyAnalytics")&&e.includes("shopId")){const t=e.match(/shopId['"]*:\s*['"]*(\d+)['"]*[,}]/);if(t&&t[1]){const e=parseInt(t[1]);if(!Number.isNaN(e)&&e>0)return e}}}const t=document.querySelector("[data-shop-id]");if(t instanceof HTMLElement){const{shopId:e}=t.dataset;if(e){const t=parseInt(e);if(!Number.isNaN(t)&&t>0)return t}}const n=window?.ShopifyAnalytics?.lib?.trekkie?.defaultAttributes?.shopId;return n&&parseInt(n)||0}catch(t){return e.error("Error accessing ShopifyAnalytics:",t),0}}function Pt(){try{if(!window.location.href.startsWith("https://shop.app"))return 0;const e=document?.head?.querySelector('meta[name="store"][content]');if(!e)return 0;try{const t=JSON.parse(e.content);return t?.id||0}catch{return 0}}catch{return 0}}const St=X.getInstance();function Tt(e,t,n){try{const r=function(e){try{const t=e.split(".");return t.length>=2?t.slice(-2).join("."):e}catch(e){return St.error("Error extracting domain",e),""}}(n);St.debug("Checking merchant regex rules",{currentDomain:r,currentUrl:t});const o=e.merchantPopupRules.filter((e=>r.includes(e.domain)));if(0===o.length)return St.debug("No matching merchant rules found for domain",{currentDomain:r}),!1;for(const e of o)for(const n of e.rules)try{if(new RegExp(n.rule).test(t))return St.debug("Merchant regex rule matched",{merchant:e.name,rule:n.rule,currentUrl:t}),!0}catch(t){St.error("Invalid regex in merchant rule",{merchant:e.name,rule:n.rule,error:t})}return St.debug("No matching regex rules found",{currentUrl:t}),!1}catch(e){return St.error("Error in merchantRegexRule",e),!1}}function Et(){const e=document.documentElement.lang,t=document.querySelector('meta[http-equiv="Content-Language"]')?.content,n=document.querySelector('link[rel="alternate"][hreflang]')?.getAttribute("hreflang"),r=navigator.language,o=e||t||n||r||"en";return"string"==typeof o?o.split("-")[0]:"en"}function Dt(e){return!0!==e.checkoutPopupOnlyShowLanguageMatch||"en"===Et()}const It=(e,t=!1)=>e.length<2&&t?null:Array.from(e).filter((e=>!t||e.dataset.extensionId!==Q.runtime.id)).map((e=>e.dataset.extensionName)).join(",");const Ot=e=>{const t=m((()=>({translate:e.translate()||(e=>""),getAllCharities:e.charities()||(()=>[])})));return L(Me.Provider,{value:t,get children(){return e.children}})},Mt=X.getInstance(),Lt="countryCode",Nt=async()=>await et.get(Lt)||(async()=>{Mt.debug("detecting country");const e={method:"GET",headers:{"Content-Type":"application/json",Authorization:"Basic OTEzOTkxOnFlYmpaWF9DOGNRY0lxSHA4WTVjNGxzU1pRSlM2VW9MMExzTF9tbWs="}};try{const t=await fetch("https://geoip.maxmind.com/geoip/v2.1/country/me",e);if(Mt.debug("Received geolocation response",{status:t.status}),!t.ok)return void Mt.error("Failed to get geolocation data",{status:t.status,statusText:t.statusText});const n=await t.json();if(!n)throw new Error("There was an error fetching geoip look up");return await et.set(Lt,n.country.iso_code),n.country.iso_code}catch(e){return void Mt.error("Failed to get geolocation data",{error:e})}})();var Rt=$("<div class=gf-app>");function $t(){const e=X.getInstance(),[t,n]=g(null),[r,o]=g(void 0),[i,s]=g(!1),[a,l]=g([]),[c,u]=g(),[d,p]=g({});f((async()=>{e.info("Mounting GfApp component");try{const i=await(async()=>{const e=await ee({type:Be,payload:{}});if(!e.payload.config)throw new Error("No checkout popup config found");return e.payload.config})();if(!i)return void e.error("No checkout popup config found");n(i),e.configure({enabled:!0,title:"Content - GfAdUnit",minLevel:i.checkoutPopupMinLogLevel??"error"}),function(e){if(!e?.shouldCheckSiteMatches)return;let t;(e?.siteMatchesRegex??[]).some((e=>{var n;return n=window.location.href,!(!new RegExp(e).test(n)||(t=e,0))}))&&t&&nt.trackEvent(z.checkoutPopupSiteMatches,{url:window.location.href,matchedRule:t,uts:Date.now()},!0)}(i);const a=Et();x(a);const c=tt();if(i.minVersion&&((e,t)=>{if(e===t)return!1;const n=e.split(".").map((e=>parseInt(e,10))),r=t.split(".").map((e=>parseInt(e,10)));for(let e=0;e<n.length;e++){if(n[e]<r[e])return!0;if(n[e]>r[e])return!1}return!1})(c,i.minVersion))return void e.debug(`Current version: ${c}. Minimum version ${i.minVersion} not met`);const u=await Nt()??"us",g=i.charities[u.toLowerCase()]??i.charities.us;if(p(g||{}),e.debug("Charities for current country",{currentCountry:u,charities:g}),!1===i.checkoutPopupMasterSwitch)return void e.debug("Checkout popup master switch is disabled");const d=document.getElementsByClassName("give-freely-root");let m=!1;d.length>1&&(e.debug("There is more than one gf extension installed"),d.item(0).dataset.extensionId!==Q.runtime.id&&(e.debug("Giving preference to the first gf extension injected in the DOM"),m=!0),e.debug("Providing this extension preference over the other installed extensions"));const{domain:h,rates:f}=await(async e=>{const{hostname:t}=window.location;e.debug("Checking if domain is active",{hostname:t});const n=await ee({type:je,payload:{hostname:t}});return n.payload.isActive?(e.debug("Active domain",{domain:n.payload.domain}),e.debug("Merchant rates",{rates:n.payload.rates}),e.info("Domain and rates ({})ed successfully."),{isActive:!0,domain:n.payload.domain,rates:n.payload.rates}):{isActive:!1,domain:void 0,rates:[]}})(e);if(l(f),o(h),h)await function(e,t){const n=kt(t)||Pt();return n>0&&function(e,t,n){if(e&&!(e<=0))try{ee({type:Ke,payload:{shopId:e,domain:t}}).catch((e=>{n.error("Error sending shop ID to background:",e)}))}catch(e){n.error("Error sending Shopify shop ID:",e)}}(n,e,t),n}(h,e);else{if("shop.app"!==window.location.hostname&&!window.location.hostname.endsWith(".shop.app"))return void s(!1);const t=window.location.pathname.split("/")[2];if(!t)return e.error("Shop ID not found"),void s(!1);const n=await Ct(parseInt(t));if(!n)return e.error("Shop domain not found"),void s(!1);e.debug("Shop domain found",{shopDomain:n}),o(n)}const A=await(async e=>{const t=await et.get("popup_hide");if(!t)return e.debug("No expiry found in storage"),!1;const{popupHide:n}=t,r=!!n&&Date.now()<n;return e.debug("Is AdUnit Muted?",{isMuted:r,expiry:n}),r})(e);if(A)return;if(!r())return void s(!1);const v=await(async(e,t)=>{const{Domain:n}=t,r=window.location.href,{payload:o}=await ee({type:We,payload:{activeDomain:n,url:r}});return!!o.result&&(e.info("Stand Down detected"),!0)})(e,r());if(v)return void s(!1);const b=t()?.anonymousActiveDomainLogging??!1,y=r()??void 0;y&&b&&!function(e){const t=`gfhv-${e}`;return!!sessionStorage.getItem(t)||(sessionStorage.setItem(t,"true"),!1)}(y.Domain)&&nt.trackEvent(z.checkoutPopupActiveDomain,{url:y.Domain});const w=setInterval((async()=>{e.debug("Checking checkout rules");const t=await(async e=>{const t=X.getInstance();t.configure({enabled:!0,title:"Content - checkoutRulesTest"});const n=new URL(globalThis.location.href),r=n.href,{hostname:o}=n;t.debug("Checking if popup should be shown",{currentUrl:r});const i=await async function(e){const t=kt(e)||Pt();return!("shop.app"!==window.location.hostname&&!window.location.hostname.endsWith(".shop.app")||!(t>0)||!await Ct(t))}(t),s=Dt(e)&&(yt(n.pathname.toLowerCase())||wt(r,document)||Tt(e,r,o)||i);return t.debug("Popup show decision based on rules",{shouldShow:s,matchesCartRule:yt(n.pathname.toLowerCase()),matchesBookingRule:wt(r,document),matchesShopPayRule:i,matchesMerchantRegexRule:Tt(e,r,o),matchesLanguageRule:Dt(e)}),s})(i);if(t&&m)return nt.trackEvent(z.checkoutPopupLooserExtension,{url:globalThis.window.location.href,winner:d.item(0).dataset.extensionName}),e.debug("Standing down because, another ad-unit extension will pop"),void clearInterval(w);s(t),t&&(e.debug("Should show popup based on checkout rules",{shouldShowResult:t}),nt.trackEvent(z.checkoutPopupShown,{url:globalThis.window.location.href,pageLanguage:a,looserCompetingExtensions:It(d,!0)}),clearInterval(w))}),2e3)}catch(t){s(!1),e.error("An error occurred in GfApp",{error:t})}}));const h=async(t,n)=>{e.info("Processing donation",{charity:t,domain:n.Domain});const r=await(async(e,t,n,r)=>{e.debug("Activating offer",{activeDomain:t,selectedCharity:r});const o=await te({type:Ve,payload:{activeDomain:t,originalUrl:n,selectedCharity:r}});return e.debug("Activate offer response",{response:o}),o})(e,n,window.location.href,{ein:t.ein,thirdPartyId:t.tpi});return e.debug("Activate offer response",{activationResponse:r}),nt.trackEvent(r.payload.response?z.checkoutPopupDonation:z.checkoutPopupFailedActivation,{activeDomain:n.Domain,url:globalThis.window.location.href,charity:{ein:t.ein,tpi:t.tpi},rate:n.Merchant.MaxRate}),r.payload.response},A=async t=>{s(await(async(e,t)=>{try{e.info("Hiding ad",{days:t});const n=await te({type:Ge,payload:{days:t??0}});return void 0!==t&&nt.trackEvent(z.checkoutPopupSupressed,{url:globalThis.window.location.href,days:t}),e.info("Hiding ad response",{hideResponse:n}),n.payload.ack?(e.debug("Ad hidden successfully"),!1):(e.warn("Failed to hide ad"),!0)}catch{return!1}})(e,t))},v=async e=>{nt.trackEvent(z.checkoutPopupOfferDetailsClicked,{action:e?"opened":"closed"})},x=async t=>{e.debug("Getting translation provider",{currentLanguage:t});const{translations:n,charities:r}=await async function(e,t){try{t&&t.debug("Getting language content",{languageCode:e});const n=await ee({type:qe,payload:{lang:e}});return{translations:n.payload.translations,charities:n.payload.charities}}catch(n){return t&&t.error("Error getting language content",{error:n,languageCode:e}),{translations:null,charities:null}}}(t,e),o={translate:e=>n&&n[e]?n[e]:"",getAllCharities:()=>{const e=d();return Object.entries(e).map((([e,t])=>{const{ein:n}=t;try{const o=r?.[n];if(!o)throw new Error(`Failed to find charity metadata for ein ${n}`);return{ein:n,tpi:o.tpi,title:o.title,order:parseInt(e,10),logo:o.logo,decorator:t.decorator,decoratorLeftStyle:t.decoratorLeftStyle,decoratorRightStyle:t.decoratorRightStyle}}catch{return{ein:n,tpi:"",title:"",order:9,logo:""}}}))}};e.debug("Setting content provider with translations and charity functions"),u((()=>o))};return L(Ot,{translate:()=>c()?.translate,charities:()=>c()?.getAllCharities,get children(){var n,o=Rt();return U(o,(n=m((()=>!(!r()||!i()))),()=>n()&&L(bt,{get checkoutPopupConf(){return t()},elementId:"give-freely-checkout-popup",get activeDomain(){return r()},get merchantRates(){return a()},onClose:A,onDonate:h,onOfferDetailsClick:v,logger:e}))),o}})}exports.browser=Q,exports.initializeAdUnit=async function(){const e=`give-freely-root-${Q.runtime.id}`;if(document.getElementById(e))return;const t=document.createElement("div");t.id=e,t.className="give-freely-root",t.style.display="block",t.dataset.extensionId=Q.runtime.id,t.dataset.extensionName=Q.runtime.getManifest().name||Q.runtime.id,document.body.appendChild(t);const n=t.attachShadow({mode:"open"}),r=document.createElement("div"),s=document.createElement("style");s.textContent='\n :host {\n all: initial;\n }\n\n .gf-scroll-remove::-webkit-scrollbar {\n border-radius-bottom-right: 15px;\n }\n\n button {\n cursor: pointer;\n transition: transform 0.1s ease;\n }\n\n button:active {\n transform: scale(0.98);\n }\n\n .give-freely-close-button:hover {\n opacity: 0.7;\n }\n\n input[type="radio"] {\n margin-right: 8px;\n }\n\n hr {\n border: none;\n border-top: 1px solid #e5e5e5;\n margin: 1em 0;\n }\n\n @media (max-width: 600px), (max-height: 480px) {\n #give-freely-checkout-popup {\n display: none !important;\n }\n }\n',n.appendChild(s),n.appendChild(r),function(e,t,n,r={}){let s;(function(e,t){const n=a,r=i,s=0===e.length,l=void 0===t?r:t,c=s?o:{owned:null,cleanups:null,context:l?l.context:null,owner:l},u=s?e:()=>e((()=>h((()=>D(c)))));i=c,a=null;try{return k(u,!0)}finally{a=n,i=r}})((r=>{s=r,t===document?e():U(t,e(),t.firstChild?null:void 0,n)}),r.owner)}((()=>L($t,{})),r)};
@@ -1 +1 @@
1
- const e={equals:(e,t)=>e===t};let t=P;const n=1,r=2,o={owned:null,cleanups:null,context:null,owner:null};var i=null;let s=null,a=null,l=null,c=null,u=0;function g(t,n){const r={value:t,observers:null,observerSlots:null,comparator:(n=n?Object.assign({},e,n):e).equals||void 0};return[x.bind(r),e=>("function"==typeof e&&(e=e(r.value)),b(r,e))]}function d(e,t,r){y(w(e,t,!1,n))}function p(e,r,o){t=S;const i=w(e,r,!1,n);i.user=!0,c?c.push(i):y(i)}function m(t,n,r){r=r?Object.assign({},e,r):e;const o=w(t,n,!0,0);return o.observers=null,o.observerSlots=null,o.comparator=r.equals||void 0,y(o),x.bind(o)}function h(e){if(null===a)return e();const t=a;a=null;try{return e()}finally{a=t}}function f(e){p((()=>h(e)))}function A(e){let t;return i&&i.context&&void 0!==(t=i.context[e.id])?t:e.defaultValue}function v(e){const t=m(e),n=m((()=>O(t())));return n.toArray=()=>{const e=n();return Array.isArray(e)?e:null!=e?[e]:[]},n}function x(){if(this.sources&&this.state)if(this.state===n)y(this);else{const e=l;l=null,k((()=>T(this)),!1),l=e}if(a){const e=this.observers?this.observers.length:0;a.sources?(a.sources.push(this),a.sourceSlots.push(e)):(a.sources=[this],a.sourceSlots=[e]),this.observers?(this.observers.push(a),this.observerSlots.push(a.sources.length-1)):(this.observers=[a],this.observerSlots=[a.sources.length-1])}return this.value}function b(e,t,r){let o=e.value;return e.comparator&&e.comparator(o,t)||(e.value=t,e.observers&&e.observers.length&&k((()=>{for(let t=0;t<e.observers.length;t+=1){const r=e.observers[t],o=s&&s.running;o&&s.disposed.has(r),(o?r.tState:r.state)||(r.pure?l.push(r):c.push(r),r.observers&&E(r)),o||(r.state=n)}if(l.length>1e6)throw l=[],new Error}),!1)),t}function y(e){if(!e.fn)return;D(e);const t=u;!function(e,t,r){let o;const s=i,l=a;a=i=e;try{o=e.fn(t)}catch(t){return e.pure&&(e.state=n,e.owned&&e.owned.forEach(D),e.owned=null),e.updatedAt=r+1,I(t)}finally{a=l,i=s}(!e.updatedAt||e.updatedAt<=r)&&(null!=e.updatedAt&&"observers"in e?b(e,o):e.value=o,e.updatedAt=r)}(e,e.value,t)}function w(e,t,r,s=n,a){const l={fn:e,state:s,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:t,owner:i,context:i?i.context:null,pure:r};return null===i||i!==o&&(i.owned?i.owned.push(l):i.owned=[l]),l}function C(e){if(0===e.state)return;if(e.state===r)return T(e);if(e.suspense&&h(e.suspense.inFallback))return e.suspense.effects.push(e);const t=[e];for(;(e=e.owner)&&(!e.updatedAt||e.updatedAt<u);)e.state&&t.push(e);for(let o=t.length-1;o>=0;o--)if((e=t[o]).state===n)y(e);else if(e.state===r){const n=l;l=null,k((()=>T(e,t[0])),!1),l=n}}function k(e,n){if(l)return e();let r=!1;n||(l=[]),c?r=!0:c=[],u++;try{const n=e();return function(e){if(l&&(P(l),l=null),e)return;const n=c;c=null,n.length&&k((()=>t(n)),!1)}(r),n}catch(e){r||(c=null),l=null,I(e)}}function P(e){for(let t=0;t<e.length;t++)C(e[t])}function S(e){let t,n=0;for(t=0;t<e.length;t++){const r=e[t];r.user?e[n++]=r:C(r)}for(t=0;t<n;t++)C(e[t])}function T(e,t){e.state=0;for(let o=0;o<e.sources.length;o+=1){const i=e.sources[o];if(i.sources){const e=i.state;e===n?i!==t&&(!i.updatedAt||i.updatedAt<u)&&C(i):e===r&&T(i,t)}}}function E(e){for(let t=0;t<e.observers.length;t+=1){const n=e.observers[t];n.state||(n.state=r,n.pure?l.push(n):c.push(n),n.observers&&E(n))}}function D(e){let t;if(e.sources)for(;e.sources.length;){const t=e.sources.pop(),n=e.sourceSlots.pop(),r=t.observers;if(r&&r.length){const e=r.pop(),o=t.observerSlots.pop();n<r.length&&(e.sourceSlots[o]=n,r[n]=e,t.observerSlots[n]=o)}}if(e.tOwned){for(t=e.tOwned.length-1;t>=0;t--)D(e.tOwned[t]);delete e.tOwned}if(e.owned){for(t=e.owned.length-1;t>=0;t--)D(e.owned[t]);e.owned=null}if(e.cleanups){for(t=e.cleanups.length-1;t>=0;t--)e.cleanups[t]();e.cleanups=null}e.state=0}function I(e,t=i){const n=function(e){return e instanceof Error?e:new Error("string"==typeof e?e:"Unknown error",{cause:e})}(e);throw n}function O(e){if("function"==typeof e&&!e.length)return O(e());if(Array.isArray(e)){const t=[];for(let n=0;n<e.length;n++){const r=O(e[n]);Array.isArray(r)?t.push.apply(t,r):t.push(r)}return t}return e}function M(e,t){return function(t){let n;return d((()=>n=h((()=>(i.context={...i.context,[e]:t.value},v((()=>t.children)))))),void 0),n}}function L(e,t){return h((()=>e(t||{})))}function N(e){const t=e.keyed,n=m((()=>e.when),void 0,{equals:(e,n)=>t?e===n:!e==!n});return m((()=>{const r=n();if(r){const o=e.children;return"function"==typeof o&&o.length>0?h((()=>o(t?r:()=>{if(!h(n))throw"Stale read from <Show>.";return e.when}))):o}return e.fallback}),void 0,void 0)}const R="_$DX_DELEGATE";function $(e,t,n){let r;const o=()=>(r||(r=(()=>{const t=document.createElement("template");return t.innerHTML=e,t.content.firstChild})())).cloneNode(!0);return o.cloneNode=o,o}function _(e,t=window.document){const n=t[R]||(t[R]=new Set);for(let r=0,o=e.length;r<o;r++){const o=e[r];n.has(o)||(n.add(o),t.addEventListener(o,G))}}function H(e,t,n){null==n?e.removeAttribute(t):e.setAttribute(t,n)}function F(e,t,n){if(!t)return n?H(e,"style"):t;const r=e.style;if("string"==typeof t)return r.cssText=t;let o,i;for(i in"string"==typeof n&&(r.cssText=n=void 0),n||(n={}),t||(t={}),n)null==t[i]&&r.removeProperty(i),delete n[i];for(i in t)o=t[i],o!==n[i]&&(r.setProperty(i,o),n[i]=o);return n}function U(e,t,n,r){if(void 0===n||r||(r=[]),"function"!=typeof t)return B(e,t,r,n);d((r=>B(e,t(),r,n)),r)}function G(e){let t=e.target;const n=`$$${e.type}`,r=e.target,o=e.currentTarget,i=t=>Object.defineProperty(e,"target",{configurable:!0,value:t}),s=()=>{const r=t[n];if(r&&!t.disabled){const o=t[`${n}Data`];if(void 0!==o?r.call(t,o,e):r.call(t,e),e.cancelBubble)return}return t.host&&"string"!=typeof t.host&&!t.host._$host&&t.contains(e.target)&&i(t.host),!0},a=()=>{for(;s()&&(t=t._$host||t.parentNode||t.host););};if(Object.defineProperty(e,"currentTarget",{configurable:!0,get:()=>t||document}),e.composedPath){const n=e.composedPath();i(n[0]);for(let e=0;e<n.length-2&&(t=n[e],s());e++){if(t._$host){t=t._$host,a();break}if(t.parentNode===o)break}}else a();i(r)}function B(e,t,n,r,o){for(;"function"==typeof n;)n=n();if(t===n)return n;const i=typeof t,s=void 0!==r;if(e=s&&n[0]&&n[0].parentNode||e,"string"===i||"number"===i){if("number"===i&&(t=t.toString())===n)return n;if(s){let o=n[0];o&&3===o.nodeType?o.data!==t&&(o.data=t):o=document.createTextNode(t),n=V(e,n,r,o)}else n=""!==n&&"string"==typeof n?e.firstChild.data=t:e.textContent=t}else if(null==t||"boolean"===i)n=V(e,n,r);else{if("function"===i)return d((()=>{let o=t();for(;"function"==typeof o;)o=o();n=B(e,o,n,r)})),()=>n;if(Array.isArray(t)){const i=[],a=n&&Array.isArray(n);if(j(i,t,n,o))return d((()=>n=B(e,i,n,r,!0))),()=>n;if(0===i.length){if(n=V(e,n,r),s)return n}else a?0===n.length?W(e,i,r):function(e,t,n){let r=n.length,o=t.length,i=r,s=0,a=0,l=t[o-1].nextSibling,c=null;for(;s<o||a<i;)if(t[s]!==n[a]){for(;t[o-1]===n[i-1];)o--,i--;if(o===s){const t=i<r?a?n[a-1].nextSibling:n[i-a]:l;for(;a<i;)e.insertBefore(n[a++],t)}else if(i===a)for(;s<o;)c&&c.has(t[s])||t[s].remove(),s++;else if(t[s]===n[i-1]&&n[a]===t[o-1]){const r=t[--o].nextSibling;e.insertBefore(n[a++],t[s++].nextSibling),e.insertBefore(n[--i],r),t[o]=n[i]}else{if(!c){c=new Map;let e=a;for(;e<i;)c.set(n[e],e++)}const r=c.get(t[s]);if(null!=r)if(a<r&&r<i){let l,u=s,g=1;for(;++u<o&&u<i&&null!=(l=c.get(t[u]))&&l===r+g;)g++;if(g>r-a){const o=t[s];for(;a<r;)e.insertBefore(n[a++],o)}else e.replaceChild(n[a++],t[s++])}else s++;else t[s++].remove()}}else s++,a++}(e,n,i):(n&&V(e),W(e,i));n=i}else if(t.nodeType){if(Array.isArray(n)){if(s)return n=V(e,n,r,t);V(e,n,null,t)}else null!=n&&""!==n&&e.firstChild?e.replaceChild(t,e.firstChild):e.appendChild(t);n=t}}return n}function j(e,t,n,r){let o=!1;for(let i=0,s=t.length;i<s;i++){let s,a=t[i],l=n&&n[e.length];if(null==a||!0===a||!1===a);else if("object"==(s=typeof a)&&a.nodeType)e.push(a);else if(Array.isArray(a))o=j(e,a,l)||o;else if("function"===s)if(r){for(;"function"==typeof a;)a=a();o=j(e,Array.isArray(a)?a:[a],Array.isArray(l)?l:[l])||o}else e.push(a),o=!0;else{const t=String(a);l&&3===l.nodeType&&l.data===t?e.push(l):e.push(document.createTextNode(t))}}return o}function W(e,t,n=null){for(let r=0,o=t.length;r<o;r++)e.insertBefore(t[r],n)}function V(e,t,n,r){if(void 0===n)return e.textContent="";const o=r||document.createTextNode("");if(t.length){let r=!1;for(let i=t.length-1;i>=0;i--){const s=t[i];if(o!==s){const t=s.parentNode===e;r||i?t&&s.remove():t?e.replaceChild(o,s):e.insertBefore(o,n)}else r=!0}}else e.insertBefore(o,n);return[o]}class K{constructor(){this.isLocal=!0}log({level:e,message:t,timestamp:n,data:r,title:o}){const i="debug"===e?"log":e,s=o?`[${o}]`:"";void 0!==r?console[i](`[${n}] - ${K.LOGGER_PREFIX} ${s} ${t}`,r):console[i](`[${n}] - ${K.LOGGER_PREFIX} ${s} ${t}`)}}var z,q;K.LOGGER_PREFIX="[GFAdUnit] -",function(e){e.checkoutPopupShown="CHECKOUT-POPUP-SHOWN",e.checkoutPopupNotShown="CHECKOUT-POPUP-NOT-SHOWN",e.checkoutPopupSupressed="CHECKOUT-POPUP-SUPRESSED",e.checkoutPopupDonation="CHECKOUT-POPUP-DONATION",e.checkoutPopupFailedActivation="CHECKOUT-POPUP-FAILED-ACTIVATION",e.checkoutPopupPurchaseConfirmed="CHECKOUT-POPUP-PURCHASE-CONFIRMED",e.checkoutPopupHealthCheck="CHECKOUT-POPUP-HEALTH-CHECK",e.checkouPopupActivationFailed="CHECKOUT-POPUP-ACTIVATION-FAILED",e.checkoutPopupOfferDetailsClicked="CHECKOUT-POPUP-OFFER-DETAILS-CLICKED",e.checkoutPopupWhyAmISeeingThisClicked="CHECKOUT-POPUP-WHY-AM-I-SEEING-THIS-CLICKED",e.checkoutPopupLooserExtension="CHECKOUT-POPUP-LOOSER-EXTENSION",e.checkoutPopupActiveDomain="CHECKOUT-POPUP-ACTIVE-DOMAIN",e.checkoutPopupSiteMatches="CHECKOUT-POPUP-SITE-MATCHES"}(z||(z={})),function(e){e.adUnitLog="ADUNIT-LOG"}(q||(q={}));const Y=["debug","info","warn","error"];class X{constructor(e){this.config={minLevel:e?.minLevel??"debug",enabled:e?.enabled??!1,transports:e?.transports??[new K],title:e?.title??""}}static getInstance(e){return X.instance||(X.instance=new X(e)),X.instance}configure(e){this.config={...this.config,...e}}shouldLog(e){return!!this.config.enabled&&Y.indexOf(e)>=Y.indexOf(this.config.minLevel)}createLogMessage(e,t,n){return{level:e,version:"1.8.3",message:t,timestamp:(new Date).toISOString(),data:n,title:this.config.title}}log(e,t,n,r){if(!this.shouldLog(e))return;const o=this.createLogMessage(e,t,r);this.config.transports.filter((e=>!n||e.isLocal)).forEach((e=>e.log(o)))}debug(e,t,n=!1){this.log("debug",e,n,t)}info(e,t,n=!1){this.log("info",e,n,t)}warn(e,t,n=!1){this.log("warn",e,n,t)}error(e,t,n=!1){this.log("error",e,n,t)}addTransport(e){this.config.transports.push(e)}clearTransports(){this.config.transports=[]}disable(){this.config.enabled=!1}enable(){this.config.enabled=!0}}const Z=3,J=e=>1e3*e,Q=chrome;async function ee(e,t){return new Promise(((n,r)=>{try{const o=t=>chrome.runtime.lastError?r({error:chrome.runtime.lastError,message:e}):n(t);t?.tabId||Q.runtime.sendMessage(e,o)}catch(e){r(e)}}))}async function te(e,t,n){return async function(e,t={}){const{maxAttempts:n=Z,delayFn:r=J}=t;let o=null;for(let t=1;t<=n;t+=1)try{return await e()}catch(e){o=e,t<n&&await new Promise((e=>{setTimeout(e,r(t))}))}throw o&&t.logger&&t.operationName&&t.logger.error(`Operation ${t.operationName} failed after ${n} attempts.`,o),o||new Error("Operation failed after multiple attempts")}((()=>ee(e,t)),{maxAttempts:Z,delayFn:J})}const ne={display:"block",position:"fixed",top:"0%",left:"100%",width:"500px",height:"520px","margin-left":"-560px","margin-top":"50px",padding:"2px 5px","background-color":"white",border:"1px solid black","border-radius":"10px","box-shadow":"0 2px 10px rgba(0, 0, 0, 0.1)","z-index":"2147483647","font-family":"Arial","line-height":"1","vertical-align":"baseline","box-sizing":"border-box",color:"rgb(34, 34, 34)","@media (max-width: 600px), (max-height: 480px)":{display:"none !important"}},re={height:"100%","overflow-x":"hidden","overlfow-y":"auto",position:"relative",padding:"0px 15px"},oe={},ie={display:"flex","align-items":"center","margin-bottom":"10px"},se={flex:"1","font-size":"24px","font-weight":"700","margin-top":"20px","margin-bottom":"0px"},ae={background:"none",border:"none",padding:"4px 8px",color:"#666464","font-size":"38px",cursor:"pointer","line-height":"1"},le={color:"black","margin-top":"20px","max-width":"40%"},ce={color:"gray",cursor:"default","pointer-events":"none","text-decoration":"none"},ue={"font-size":"18px","font-weight":"400","margin-top":"20px","margin-bottom":"0px"},ge={display:"flex",gap:"10px",width:"100%","margin-top":"20px","margin-bottom":"20px","flex-wrap":"wrap","justify-content":"space-between"},de={width:"28%",position:"relative",display:"flex","flex-direction":"column","align-items":"center",background:"none",border:"1px solid #ccc","border-radius":"5px",padding:"5px",gap:"5px","text-align":"center","font-size":"14px",cursor:"pointer",transition:"background-color 0.2s ease"},pe={color:"white","background-color":"lightgray",cursor:"default","pointer-events":"none"},me={"max-width":"120px","max-height":"70px","margin-bottom":"5px","object-fit":"contain"},he={"background-color":"#FFD812",cursor:"pointer","border-radius":"8px",padding:"8px",color:"white","min-width":"100px",border:"0","font-weight":"600",width:"100%"},fe={display:"flex","flex-direction":"column",gap:"10px",width:"100%","color-scheme":"light"},Ae={display:"flex","align-items":"center",gap:"5px",border:"1px solid #ddd",padding:"15px","border-radius":"5px","font-weight":"600",cursor:"pointer","margin-bottom":"8px"},ve={"text-align":"right"},xe={background:"none",border:"none",color:"blue","text-decoration":"underline",padding:"0",cursor:"pointer","margin-bottom":"15px"},be={display:"flex","justify-content":"space-between",margin:"20px 0px 10px 0px","font-size":"14px"},ye={margin:"5px 0px 5px 0px","font-size":"14px","text-align":"center"},we={color:"#666464","text-decoration":"underline"},Ce={color:"rgb(102, 100, 100)","text-decoration":"underline",margin:"0",cursor:"pointer"},ke={width:"100%","background-color":"#f2f2f2",border:"1px solid black","border-radius":"10px","border-top":"1px solid #bbb7b7","margin-top":"10px","margin-bottom":"20px","box-sizing":"border-box"},Pe={padding:"0 5px 0 10px",width:"100%","font-size":"12px","box-sizing":"border-box"},Se={display:"grid","grid-template-columns":"4fr 1fr","padding-right":"15px","padding-bottom":"5px"},Te={color:"#000","margin-bottom":"4px"},Ee={"font-size":"14px",color:"#555","text-align":"right"},De=(e,t)=>{let n=parseFloat(t);return"FLAT"===e&&(n*=.75),((e,t)=>{let n=parseFloat(t);return n<1&&(n=1),n=Math.floor(n),"PERCENTAGE"===e?`${n}%`:`$${n}`})(e,n.toString())};var Ie=$("<span>");function Oe(e){return t=Ie(),d((()=>{return t.innerHTML=(n=e.title,r=e.activeDomain,n.replace("{0}",De(r.Merchant.MaxRate?.Kind,r.Merchant.MaxRate?.Amount??"0")));var n,r})),t;var t}const Me=function(){const e=Symbol("context");return{id:e,Provider:M(e),defaultValue:()=>({translate:e=>"",getAllCharities:()=>[]})}}(),Le=Me,Ne=()=>{const e=A(Le)();if(!e)throw new Error("Content provider context is undefined");return t=>e.translate(t)};class Re{static formatMessage(e,...t){return e.replace(/{(\d+)}/g,((e,n)=>{const r=Number(n);return void 0!==t[r]?String(t[r]):`{${r}}`}))}}var $e=$("<div>"),_e=$("<div><div class=gf-offer-details><p><span></span></p><p><span></span></p><p><span></span></p><p><span></span></p><p><span></span></p><p><a target=_blank rel=noreferrer><span>"),He=$("<div class=gf-offer-details-rate-item><div></div><div>");const Fe=e=>{const t=Ne();return n=_e(),o=(r=n.firstChild).firstChild,i=o.firstChild,s=o.nextSibling,a=s.firstChild,l=s.nextSibling,c=l.firstChild,u=l.nextSibling,g=u.firstChild,p=u.nextSibling,m=p.firstChild,h=p.nextSibling.firstChild,f=h.firstChild,U(r,L(N,{get when(){return!!e.merchantRateDetail?.length},get children(){var t=$e();return U(t,(()=>e.merchantRateDetail?.map((e=>{return t=He(),n=t.firstChild,r=n.nextSibling,U(n,(()=>e.Name||"")),U(r,(()=>((e,t=1,n=1)=>{const r=e.BoostedOffer??null;let o=parseFloat(e?.Amount??"");if(r?.EndDate&&new Date(r.EndDate)<new Date&&(o=parseFloat(r.OriginalMaxRate)),Number.isNaN(o))return"";const i=o*t;return"PERCENTAGE"===e?.Kind?`${i.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:n})}%`:"FLAT"===e?.Kind?i.toLocaleString("en-US",{style:"currency",currency:e.Currency}):""})(e))),d((e=>{var o=Se,i=Te,s=Ee;return e.e=F(t,o,e.e),e.t=F(n,i,e.t),e.a=F(r,s,e.a),e}),{e:void 0,t:void 0,a:void 0}),t;var t,n,r})))),t}}),u),d((o=>{var s=ke,l=Pe,u=t("offerDetails.intro"),d=t("offerDetails.eligible"),p=e.parsedMaxRate?Re.formatMessage(t("offerDetails.donationRatesWithValue"),e.parsedMaxRate):Re.formatMessage(t("offerDetails.donationRates")),A=t("offerDetails.donationAmounts"),v=t("offerDetails.donationTiming"),x=we,b=e.termsUrl,y=t("offerDetails.termsAndConditions");return o.e=F(n,s,o.e),o.t=F(r,l,o.t),u!==o.a&&(i.innerHTML=o.a=u),d!==o.o&&(a.innerHTML=o.o=d),p!==o.i&&(c.innerHTML=o.i=p),A!==o.n&&(g.innerHTML=o.n=A),v!==o.s&&(m.innerHTML=o.s=v),o.h=F(h,x,o.h),b!==o.r&&H(h,"href",o.r=b),y!==o.d&&(f.innerHTML=o.d=y),o}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0}),n;var n,r,o,i,s,a,l,c,u,g,p,m,h,f},Ue="TRACK_EVENT",Ge="GF_HIDE_POPUP",Be="GF_GET_POPUP_CONFIG",je="GF_IS_ACTIVE_DOMAIN",We="GF_SHOULD_STAND_DOWN",Ve="GF_ACTIVATE_OFFER",Ke="GF_STORE_SHOPIFY_SHOP_ID",ze="GF_GET_DOMAIN_BY_SHOP_ID",qe="GF_GET_LANGUAGE_CONTENT",Ye={ein:"0",tpi:"0"};function Xe(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Ze={exports:{}};"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self&&self,function(e){if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)e.exports=globalThis.browser;else{const t="The message port closed before a response was received.",n=e=>{const n={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(0===Object.keys(n).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class r extends WeakMap{constructor(e,t=void 0){super(t),this.createItem=e}get(e){return this.has(e)||this.set(e,this.createItem(e)),super.get(e)}}const o=(t,n)=>(...r)=>{e.runtime.lastError?t.reject(new Error(e.runtime.lastError.message)):n.singleCallbackArg||r.length<=1&&!1!==n.singleCallbackArg?t.resolve(r[0]):t.resolve(r)},i=e=>1==e?"argument":"arguments",s=(e,t,n)=>new Proxy(t,{apply:(t,r,o)=>n.call(r,e,...o)});let a=Function.call.bind(Object.prototype.hasOwnProperty);const l=(e,t={},n={})=>{let r=Object.create(null),c={has:(t,n)=>n in e||n in r,get(c,u,g){if(u in r)return r[u];if(!(u in e))return;let d=e[u];if("function"==typeof d)if("function"==typeof t[u])d=s(e,e[u],t[u]);else if(a(n,u)){let t=((e,t)=>function(n,...r){if(r.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${i(t.minArgs)} for ${e}(), got ${r.length}`);if(r.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${i(t.maxArgs)} for ${e}(), got ${r.length}`);return new Promise(((i,s)=>{if(t.fallbackToNoCallback)try{n[e](...r,o({resolve:i,reject:s},t))}catch(o){console.warn(`${e} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,o),n[e](...r),t.fallbackToNoCallback=!1,t.noCallback=!0,i()}else t.noCallback?(n[e](...r),i()):n[e](...r,o({resolve:i,reject:s},t))}))})(u,n[u]);d=s(e,e[u],t)}else d=d.bind(e);else if("object"==typeof d&&null!==d&&(a(t,u)||a(n,u)))d=l(d,t[u],n[u]);else{if(!a(n,"*"))return Object.defineProperty(r,u,{configurable:!0,enumerable:!0,get:()=>e[u],set(t){e[u]=t}}),d;d=l(d,t[u],n["*"])}return r[u]=d,d},set:(t,n,o,i)=>(n in r?r[n]=o:e[n]=o,!0),defineProperty:(e,t,n)=>Reflect.defineProperty(r,t,n),deleteProperty:(e,t)=>Reflect.deleteProperty(r,t)},u=Object.create(e);return new Proxy(u,c)},c=e=>({addListener(t,n,...r){t.addListener(e.get(n),...r)},hasListener:(t,n)=>t.hasListener(e.get(n)),removeListener(t,n){t.removeListener(e.get(n))}}),u=new r((e=>"function"!=typeof e?e:function(t){const n=l(t,{},{getContent:{minArgs:0,maxArgs:0}});e(n)})),g=new r((e=>"function"!=typeof e?e:function(t,n,r){let o,i,s=!1,a=new Promise((e=>{o=function(t){s=!0,e(t)}}));try{i=e(t,n,o)}catch(e){i=Promise.reject(e)}const l=!0!==i&&((c=i)&&"object"==typeof c&&"function"==typeof c.then);var c;if(!0!==i&&!l&&!s)return!1;return(l?i:a).then((e=>{r(e)}),(e=>{let t;t=e&&(e instanceof Error||"string"==typeof e.message)?e.message:"An unexpected error occurred",r({__mozWebExtensionPolyfillReject__:!0,message:t})})).catch((e=>{console.error("Failed to send onMessage rejected reply",e)})),!0})),d=({reject:n,resolve:r},o)=>{e.runtime.lastError?e.runtime.lastError.message===t?r():n(new Error(e.runtime.lastError.message)):o&&o.__mozWebExtensionPolyfillReject__?n(new Error(o.message)):r(o)},p=(e,t,n,...r)=>{if(r.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${i(t.minArgs)} for ${e}(), got ${r.length}`);if(r.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${i(t.maxArgs)} for ${e}(), got ${r.length}`);return new Promise(((e,t)=>{const o=d.bind(null,{resolve:e,reject:t});r.push(o),n.sendMessage(...r)}))},m={devtools:{network:{onRequestFinished:c(u)}},runtime:{onMessage:c(g),onMessageExternal:c(g),sendMessage:p.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:p.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},h={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return n.privacy={network:{"*":h},services:{"*":h},websites:{"*":h}},l(e,m,n)};e.exports=n(chrome)}}(Ze);var Je=Xe(Ze.exports);const Qe="GIVE_FREELY_",et={async get(e){const t=`${Qe}${e}`;return(await Je.storage.local.get(t))[t]||null},async set(e,t){const n=`${Qe}${e}`;await Je.storage.local.set({[n]:t})},async remove(e){const t=Array.isArray(e)?e.map((e=>`${Qe}${e}`)):`${Qe}${e}`;await Je.storage.local.remove(t)}},tt=()=>String("1.8.3");class nt{constructor(e,t,n,r=60){this.track=async(e,t,n,r=!1)=>{const o={partner:`adUnit_${this._partnerApiKey}`,eventType:e,eventData:{userId:r?void 0:this._userService?.user?.id,libVersion:tt(),wfDeviceId:t,...n}};try{const e=JSON.stringify(o,((e,t)=>t instanceof Error?{name:t.name,message:t.message,stack:t.stack}:t)),t=await this.getEventsUrl();if(await this.shouldBroadcastEvent(e)){const n=await fetch(t,{headers:{"Content-Type":"application/json"},method:"POST",body:e,cache:"no-store"});return n.ok?(await this.pushEventToHistory(e),!0):(this._logger.error("Something unexpected happened when dispatching an event",{status:n.status,statusText:n.statusText,event:o},!0),!1)}return this._logger.info("This event has already been broadcasted during the past hour",o,!0),!1}catch(e){return this._logger.error("Something unexpected happened when dispatching a gf event",{error:e,event:o}),!1}},this.getEventsHistory=async()=>{const{GF_AD_EVENT_HISTORY:e}=await Q.storage.local.get({GF_AD_EVENT_HISTORY:""}),t=(e=>{const t=new Date;return t.setTime(t.getTime()+60*e*1e3),t.getTime()})(-this._debounceWindowInMinutes),n=(e||[]).filter((e=>e.createdAt>t));return await Q.storage.local.set({GF_AD_EVENT_HISTORY:n}),n},this.shouldBroadcastEvent=async e=>!(await this.getEventsHistory()).some((t=>t.payload===e)),this.pushEventToHistory=async e=>{const t=await this.getEventsHistory();t.push({createdAt:Date.now(),payload:e}),await Q.storage.local.set({GF_AD_EVENT_HISTORY:t})},this._partnerApiKey=e,this._userService=t,this._debounceWindowInMinutes=r,this._logger=X.getInstance({title:"Analytics"}),this._configService=n}async getEventsUrl(){const{eventsUrl:e}=await this._configService.getConfig();return e}}function rt(e,t,n){return e?{...t,...n}:t}nt.trackEvent=async(e,t,n=!1)=>{await ee({type:Ue,payload:{eventType:e,eventData:t,anonymous:n}})};var ot=$("<a href=#!>"),it=$("<button class=give-freely-close-button aria-label=Close>×"),st=$('<div><div><div></div></div><hr><div></div><div><div><div><br><span></span></div><button aria-label="Don\'t show again"><span></span></button></div></div><div><p><span></span></p><a class=give-freely-footer-link target=_blank rel="noopener noreferrer"><span>'),at=$("<div><div><img><span></span></div><button><span>"),lt=$("<div>"),ct=$("<div><span>");function ut(e){const[t,n]=g(!1),[r,o]=g(null),i=Ne(),s=(()=>{const e=A(Me)();if(!e)throw new Error("Content provider context is undefined");return()=>e.getAllCharities()})();p((()=>{t()&&e.mainContainerRef&&e.mainContainerRef.scroll({top:e.mainContainerRef.scrollHeight,behavior:"smooth"})})),p((()=>{const t=r();t&&e.onCharitySelect(t.charity,t.closeOnDonation?e.checkoutPopupConf.checkoutPopupActivateAndCloseSkipSuccess:void 0)}));const a=(e,t)=>o({charity:e,closeOnDonation:t}),l=()=>!!r()?.charity;return[(u=st(),h=u.firstChild,f=h.firstChild,v=h.nextSibling.nextSibling,x=v.nextSibling,b=x.firstChild,y=b.firstChild,w=y.firstChild.nextSibling,C=y.nextSibling,k=C.firstChild,P=x.nextSibling,S=P.firstChild,T=S.firstChild,E=S.nextSibling,D=E.firstChild,U(h,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupActivateAndClose},get children(){var e=ot();return e.$$click=()=>a(Ye,!0),d((t=>{var n=rt(l(),le,ce),r=i("main.activateAndClose");return t.e=F(e,n,t.e),r!==t.t&&(e.innerHTML=t.t=r),t}),{e:void 0,t:void 0}),e}}),null),U(h,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupMainCloseButtonVisible&&!e.checkoutPopupConf.checkoutPopupActivateAndClose},get children(){var t=it();return t.$$click=()=>e.onClose(),d((e=>F(t,ae,e))),t}}),null),U(v,L(Oe,{get title(){return i("main.subTitle")},get activeDomain(){return e.activeDomain}})),U(x,(()=>s().reduce(((t,n)=>{var r,o,s,c,u,g,p;return n?.title&&""!==n?.title?t.push((s=(o=at()).firstChild,u=(c=s.firstChild).nextSibling,g=s.nextSibling,p=g.firstChild,o.$$click=()=>!l()&&a(n),U(o,(r=m((()=>!!(n.decorator&&n.decoratorLeftStyle&&n.decoratorRightStyle))),()=>{return r()&&[(t=lt(),d((e=>{var r=n.decoratorLeftStyle,o=n.decorator;return e.e=F(t,r,e.e),o!==e.t&&(t.innerHTML=e.t=o),e}),{e:void 0,t:void 0}),t),(e=lt(),d((t=>{var r=n.decoratorRightStyle,o=n.decorator;return t.e=F(e,r,t.e),o!==t.t&&(e.innerHTML=t.t=o),t}),{e:void 0,t:void 0}),e)];var e,t}),s),s.style.setProperty("height","100px"),s.style.setProperty("text-align","center"),U(u,(()=>n.title)),d((t=>{var r=rt(l(),de,{cursor:"default"}),s=n.logo,a=me,u=n.title,d=rt(l(),{...he,"background-color":e.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor||"#FFD812"},pe),m=l(),h=`Select charity: ${n.title}`,f=i("main.charitySelect");return t.e=F(o,r,t.e),s!==t.t&&H(c,"src",t.t=s),t.a=F(c,a,t.a),u!==t.o&&H(c,"alt",t.o=u),t.i=F(g,d,t.i),m!==t.n&&(g.disabled=t.n=m),h!==t.s&&H(g,"aria-label",t.s=h),f!==t.h&&(p.innerHTML=t.h=f),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0}),o)):e.logger.error(`Translation was not found for EIN ${n?.ein}`),t}),[])),b),b.$$click=()=>!l()&&e.onSuppress(),y.style.setProperty("height","100px"),y.style.setProperty("text-align","center"),S.$$click=()=>{e.onOfferDetailsClick(!t()),n(!t())},E.$$click=()=>{nt.trackEvent(z.checkoutPopupWhyAmISeeingThisClicked,{domain:globalThis.window.location.hostname})},U(u,(c=m((()=>!!e.checkoutPopupConf.checkoutPopupDisplayNameInFooter)),()=>{return c()&&(e=ct(),t=e.firstChild,d((n=>{var r=ye,o=i("main.footer");return n.e=F(e,r,n.e),o!==n.t&&(t.innerHTML=n.t=o),n}),{e:void 0,t:void 0}),e);var e,t}),null),d((t=>{var n=oe,r=ie,o=se,s=i("main.title"),a=ue,c=ge,g=rt(l(),de,{cursor:"default"}),d=i("main.sixthBox"),p=rt(l(),{...he,"background-color":e.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor||"#FFD812"},pe),m=l(),A=i("main.settings"),y=be,I=Ce,O=i("main.offerDetails"),M=we,L=e.checkoutPopupConf.externalUrls.giveFreelyWhyAmISeeingThis,N=i("main.whyAmISeeingThis");return t.e=F(u,n,t.e),t.t=F(h,r,t.t),t.a=F(f,o,t.a),s!==t.o&&(f.innerHTML=t.o=s),t.i=F(v,a,t.i),t.n=F(x,c,t.n),t.s=F(b,g,t.s),d!==t.h&&(w.innerHTML=t.h=d),t.r=F(C,p,t.r),m!==t.d&&(C.disabled=t.d=m),A!==t.l&&(k.innerHTML=t.l=A),t.u=F(P,y,t.u),t.c=F(S,I,t.c),O!==t.w&&(T.innerHTML=t.w=O),t.m=F(E,M,t.m),L!==t.f&&H(E,"href",t.f=L),N!==t.y&&(D.innerHTML=t.y=N),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0,l:void 0,u:void 0,c:void 0,w:void 0,m:void 0,f:void 0,y:void 0}),u),L(N,{get when(){return t()},get children(){return L(Fe,{get merchantName(){return e.activeDomain.Merchant.Name},get extensionName(){return e.checkoutPopupConf.displayName},get termsUrl(){return e.checkoutPopupConf.externalUrls.giveFreelyTermsAndConditions},get parsedMaxRate(){return m((()=>!!e.activeDomain.Merchant.MaxRate))()?De(e.activeDomain.Merchant.MaxRate.Kind,e.activeDomain.Merchant.MaxRate?.Amount):null},get merchantRateDetail(){return e.merchantRates},onClose:()=>n(!1)})}})];var c,u,h,f,v,x,b,y,w,C,k,P,S,T,E,D}_(["click"]);var gt=$("<button class=give-freely-close-button aria-label=Close>×"),dt=$("<label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=18250><span>"),pt=$('<div><div><div><span></span></div></div><button class=give-freely-back-button aria-label="Back to charity selection"><span></span></button><hr><div id=give-freely-goodbye-screen-options><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=1><span></span></label><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=7><span></span></label><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=30><span></span></label><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=90><span></span></label></div><button class=give-freely-submit-button><span>');function mt(e){const[t,n]=g(0),r=Ne();return o=pt(),i=o.firstChild,s=i.firstChild,a=s.firstChild,l=i.nextSibling,c=l.firstChild,u=l.nextSibling.nextSibling,m=(p=u.firstChild).firstChild,h=m.nextSibling,A=(f=p.nextSibling).firstChild,v=A.nextSibling,b=(x=f.nextSibling).firstChild,y=b.nextSibling,C=(w=x.nextSibling).firstChild,k=C.nextSibling,P=u.nextSibling,S=P.firstChild,o.style.setProperty("font-size","14px"),U(i,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupSupressCloseButtonVisible},get children(){var t=gt();return t.$$click=()=>e.onGoodbye(0),d((e=>F(t,ae,e))),t}}),null),l.$$click=()=>e.onBack(),m.addEventListener("change",(()=>n(1))),A.addEventListener("change",(()=>n(7))),b.addEventListener("change",(()=>n(30))),C.addEventListener("change",(()=>n(90))),U(u,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupNeverSuppressionAllowed},get children(){var e=dt(),t=e.firstChild,o=t.nextSibling;return t.addEventListener("change",(()=>n(18250))),d((t=>{var n=Ae,i=r("suppress.suppressionPeriodNever");return t.e=F(e,n,t.e),i!==t.t&&(o.innerHTML=t.t=i),t}),{e:void 0,t:void 0}),e}}),null),P.$$click=()=>{const n=t();n&&(e.onGoodbye(n),e.setScreen("main"))},d((t=>{var n=ie,o=se,g=r("suppress.title"),d=xe,m=r("suppress.backButton"),A=fe,b=Ae,C=r("suppress.suppressionPeriod").replace("{0}","1"),T=Ae,E=r("suppress.suppressionPeriodPlural").replace("{0}","7"),D=Ae,I=r("suppress.suppressionPeriodPlural").replace("{0}","30"),O=Ae,M=r("suppress.suppressionPeriodPlural").replace("{0}","90"),L={...he,"font-weight":"700","margin-top":"10px","margin-bottom":"0px","background-color":e.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor||"#FFD812",width:"100px"},N=r("suppress.submitButton");return t.e=F(i,n,t.e),t.t=F(s,o,t.t),g!==t.a&&(a.innerHTML=t.a=g),t.o=F(l,d,t.o),m!==t.i&&(c.innerHTML=t.i=m),t.n=F(u,A,t.n),t.s=F(p,b,t.s),C!==t.h&&(h.innerHTML=t.h=C),t.r=F(f,T,t.r),E!==t.d&&(v.innerHTML=t.d=E),t.l=F(x,D,t.l),I!==t.u&&(y.innerHTML=t.u=I),t.c=F(w,O,t.c),M!==t.w&&(k.innerHTML=t.w=M),t.m=F(P,L,t.m),N!==t.f&&(S.innerHTML=t.f=N),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0,l:void 0,u:void 0,c:void 0,w:void 0,m:void 0,f:void 0}),o;var o,i,s,a,l,c,u,p,m,h,f,A,v,x,b,y,w,C,k,P,S}_(["click"]);var ht=$("<div><p><span>"),ft=$("<div><div><div><span></span></div><button class=give-freely-close-button aria-label=Close>×</button></div><hr><div><span>");function At(e){const[t,n]=g(null),r=Ne();let o;var s,a,l,c,u,p,m,h;return s=()=>clearInterval(o),null===i||(null===i.cleanups?i.cleanups=[s]:i.cleanups.push(s)),f((()=>{e.failedDonation||(()=>{const t=e.checkoutPopupConf.checkoutPopupDonationSuccessAutoCloseInSeconds??3;n(t),o=setInterval((()=>{n((t=>null===t||t<=1?(clearInterval(o),e.onClose(),0):t-1))}),1e3)})()})),a=ft(),l=a.firstChild,c=l.firstChild,u=c.firstChild,p=c.nextSibling,m=l.nextSibling.nextSibling,h=m.firstChild,a.style.setProperty("font-size","14px"),p.$$click=()=>e.onClose(),m.style.setProperty("padding","30px"),m.style.setProperty("height","150px"),m.style.setProperty("font-size","14px"),U(a,L(N,{get when(){return!e.failedDonation},get children(){var e=ht(),n=e.firstChild,o=n.firstChild;return d((e=>{var i=ve,s=Re.formatMessage(r("donate.autoClosing"),t()??0);return e.e=F(n,i,e.e),s!==e.t&&(o.innerHTML=e.t=s),e}),{e:void 0,t:void 0}),e}}),null),d((t=>{var n=ie,o=se,i=e.failedDonation?r("donate.failTitle"):r("donate.title"),s=ae,a=e.failedDonation?r("donate.failContent"):r("donate.content");return t.e=F(l,n,t.e),t.t=F(c,o,t.t),i!==t.a&&(u.innerHTML=t.a=i),t.o=F(p,s,t.o),a!==t.i&&(h.innerHTML=t.i=a),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),a}_(["click"]);var vt=$("<div><div>");const xt=(e,t,n)=>"donate"===e?"340px":t.checkoutPopupDisplayNameInFooter?"520px":n;function bt(e){const[t,n]=g("main"),[r,o]=g(),[i,s]=g(!1),a=()=>{e.logger.debug("Close button clicked"),e.onClose()},l=async(t,r=!1)=>{r&&e.onClose(),e.logger.info("Charity selected",{charity:t,domain:e.activeDomain.Domain}),o(t);const i=await e.onDonate(t,e.activeDomain);r?e.onClose():(s(!i),n("donate"))},c=()=>{e.logger.debug("Suppress button clicked"),n("goodbye")},u=()=>{e.logger.debug("Navigating back to main screen"),n("main")},p=t=>{e.logger.info("User chose to hide popup",{days:t}),e.onClose(t)};let m;return v=vt(),x=v.firstChild,"function"==typeof m?(f=m,A=x,h((()=>f(A,undefined)))):m=x,U(x,L(N,{get when(){return"main"===t()},get children(){return L(ut,{mainContainerRef:m,get checkoutPopupConf(){return e.checkoutPopupConf},get activeDomain(){return e.activeDomain},get merchantRates(){return e.merchantRates},onClose:a,onCharitySelect:l,onSuppress:c,get onOfferDetailsClick(){return e.onOfferDetailsClick},get logger(){return e.logger}})}}),null),U(x,L(N,{get when(){return"goodbye"===t()},get children(){return L(mt,{get checkoutPopupConf(){return e.checkoutPopupConf},onClose:()=>e.onClose(),onBack:u,onGoodbye:p,setScreen:n})}}),null),U(x,L(N,{get when(){return"donate"===t()},get children(){return L(At,{get checkoutPopupConf(){return e.checkoutPopupConf},get selectedCharity(){return r()},onClose:()=>e.onClose(),get failedDonation(){return i()},setScreen:n})}}),null),d((n=>{var r={...ne,height:xt(t(),e.checkoutPopupConf,ne.height)},o=e.elementId,i=re;return n.e=F(v,r,n.e),o!==n.t&&H(v,"id",n.t=o),n.a=F(x,i,n.a),n}),{e:void 0,t:void 0,a:void 0}),v;var f,A,v,x}function yt(e){const t=["",".asp",".aspx",".php",".js",".htm",".html"],n=["cart","checkout","shopping-bag","shopping-basket","shopping-cart","basket"].flatMap((e=>t.map((t=>e+t)))).filter((e=>"basket"!==e)),r=["tote-cart","tote.cart"],o=e,i=n.filter((e=>o.includes(e))),s=o.split("/");return!s.some((e=>r.some((t=>e.includes(t)))))&&(s.some((e=>n.some((t=>e.startsWith(t)||e.endsWith(t)))))||"basket"===s[s.length-1].toLowerCase()||i.length>1||1===i.length&&o.includes("shopping"))}function wt(e,t){const n=["book"];return e.split("/").some((e=>n.some((t=>e.startsWith(t)||e.endsWith(t)))))&&null!=t.evaluate("//*[self::h1 or self::h2 or self::h3 or self::h4 or self::h5 or self::h6][contains(., 'Your Reservation') or contains(., 'Your reservation')]",t,null,XPathResult.ANY_TYPE,null)?.iterateNext()}async function Ct(e){try{const t=await ee({type:ze,payload:{shopId:e}});return t.payload.found&&t.payload.domain?t.payload.domain:null}catch{return null}}function kt(e){try{const e=Array.from(document.querySelectorAll("script"));for(const t of e){if(t.dataset?.shopId&&(t.dataset?.shopId?.startsWith("gid")||t.src.includes("shopify"))){const e=parseInt(t.dataset.shopId.replace("gid://shopify/Shop/",""));if(!Number.isNaN(e)&&e>0)return e}const e=t.textContent||"";if(e.includes("ShopifyAnalytics")&&e.includes("shopId")){const t=e.match(/shopId['"]*:\s*['"]*(\d+)['"]*[,}]/);if(t&&t[1]){const e=parseInt(t[1]);if(!Number.isNaN(e)&&e>0)return e}}}const t=document.querySelector("[data-shop-id]");if(t instanceof HTMLElement){const{shopId:e}=t.dataset;if(e){const t=parseInt(e);if(!Number.isNaN(t)&&t>0)return t}}const n=window?.ShopifyAnalytics?.lib?.trekkie?.defaultAttributes?.shopId;return n&&parseInt(n)||0}catch(t){return e.error("Error accessing ShopifyAnalytics:",t),0}}function Pt(){try{if(!window.location.href.startsWith("https://shop.app"))return 0;const e=document?.head?.querySelector('meta[name="store"][content]');if(!e)return 0;try{const t=JSON.parse(e.content);return t?.id||0}catch{return 0}}catch{return 0}}const St=X.getInstance();function Tt(e,t,n){try{const r=function(e){try{const t=e.split(".");return t.length>=2?t.slice(-2).join("."):e}catch(e){return St.error("Error extracting domain",e),""}}(n);St.debug("Checking merchant regex rules",{currentDomain:r,currentUrl:t});const o=e.merchantPopupRules.filter((e=>r.includes(e.domain)));if(0===o.length)return St.debug("No matching merchant rules found for domain",{currentDomain:r}),!1;for(const e of o)for(const n of e.rules)try{if(new RegExp(n.rule).test(t))return St.debug("Merchant regex rule matched",{merchant:e.name,rule:n.rule,currentUrl:t}),!0}catch(t){St.error("Invalid regex in merchant rule",{merchant:e.name,rule:n.rule,error:t})}return St.debug("No matching regex rules found",{currentUrl:t}),!1}catch(e){return St.error("Error in merchantRegexRule",e),!1}}function Et(){const e=document.documentElement.lang,t=document.querySelector('meta[http-equiv="Content-Language"]')?.content,n=document.querySelector('link[rel="alternate"][hreflang]')?.getAttribute("hreflang"),r=navigator.language,o=e||t||n||r||"en";return"string"==typeof o?o.split("-")[0]:"en"}function Dt(e){return!0!==e.checkoutPopupOnlyShowLanguageMatch||"en"===Et()}const It=(e,t=!1)=>e.length<2&&t?null:Array.from(e).filter((e=>!t||e.dataset.extensionId!==Q.runtime.id)).map((e=>e.dataset.extensionName)).join(",");const Ot=e=>{const t=m((()=>({translate:e.translate()||(e=>""),getAllCharities:e.charities()||(()=>[])})));return L(Me.Provider,{value:t,get children(){return e.children}})},Mt=X.getInstance(),Lt="countryCode",Nt=async()=>await et.get(Lt)||(async()=>{Mt.debug("detecting country");const e={method:"GET",headers:{"Content-Type":"application/json",Authorization:"Basic OTEzOTkxOnFlYmpaWF9DOGNRY0lxSHA4WTVjNGxzU1pRSlM2VW9MMExzTF9tbWs="}};try{const t=await fetch("https://geoip.maxmind.com/geoip/v2.1/country/me",e);if(Mt.debug("Received geolocation response",{status:t.status}),!t.ok)return void Mt.error("Failed to get geolocation data",{status:t.status,statusText:t.statusText});const n=await t.json();if(!n)throw new Error("There was an error fetching geoip look up");return await et.set(Lt,n.country.iso_code),n.country.iso_code}catch(e){return void Mt.error("Failed to get geolocation data",{error:e})}})();var Rt=$("<div class=gf-app>");function $t(){const e=X.getInstance(),[t,n]=g(null),[r,o]=g(void 0),[i,s]=g(!1),[a,l]=g([]),[c,u]=g(),[d,p]=g({});f((async()=>{e.info("Mounting GfApp component");try{const i=await(async()=>{const e=await ee({type:Be,payload:{}});if(!e.payload.config)throw new Error("No checkout popup config found");return e.payload.config})();if(!i)return void e.error("No checkout popup config found");n(i),e.configure({enabled:!0,title:"Content - GfAdUnit",minLevel:i.checkoutPopupMinLogLevel??"error"}),function(e){if(!e?.shouldCheckSiteMatches)return;let t;(e?.siteMatchesRegex??[]).some((e=>{var n;return n=window.location.href,!(!new RegExp(e).test(n)||(t=e,0))}))&&t&&nt.trackEvent(z.checkoutPopupSiteMatches,{url:window.location.href,matchedRule:t,uts:Date.now()},!0)}(i);const a=Et();x(a);const c=tt();if(i.minVersion&&((e,t)=>{if(e===t)return!1;const n=e.split(".").map((e=>parseInt(e,10))),r=t.split(".").map((e=>parseInt(e,10)));for(let e=0;e<n.length;e++){if(n[e]<r[e])return!0;if(n[e]>r[e])return!1}return!1})(c,i.minVersion))return void e.debug(`Current version: ${c}. Minimum version ${i.minVersion} not met`);const u=await Nt()??"us",g=i.charities[u.toLowerCase()]??i.charities.us;if(p(g||{}),e.debug("Charities for current country",{currentCountry:u,charities:g}),!1===i.checkoutPopupMasterSwitch)return void e.debug("Checkout popup master switch is disabled");const d=document.getElementsByClassName("give-freely-root");let m=!1;d.length>1&&(e.debug("There is more than one gf extension installed"),d.item(0).dataset.extensionId!==Q.runtime.id&&(e.debug("Giving preference to the first gf extension injected in the DOM"),m=!0),e.debug("Providing this extension preference over the other installed extensions"));const{domain:h,rates:f}=await(async e=>{const{hostname:t}=window.location;e.debug("Checking if domain is active",{hostname:t});const n=await ee({type:je,payload:{hostname:t}});return n.payload.isActive?(e.debug("Active domain",{domain:n.payload.domain}),e.debug("Merchant rates",{rates:n.payload.rates}),e.info("Domain and rates ({})ed successfully."),{isActive:!0,domain:n.payload.domain,rates:n.payload.rates}):{isActive:!1,domain:void 0,rates:[]}})(e);if(l(f),o(h),h)await function(e,t){const n=kt(t)||Pt();return n>0&&function(e,t,n){if(e&&!(e<=0))try{ee({type:Ke,payload:{shopId:e,domain:t}}).catch((e=>{n.error("Error sending shop ID to background:",e)}))}catch(e){n.error("Error sending Shopify shop ID:",e)}}(n,e,t),n}(h,e);else{if("shop.app"!==window.location.hostname&&!window.location.hostname.endsWith(".shop.app"))return void s(!1);const t=window.location.pathname.split("/")[2];if(!t)return e.error("Shop ID not found"),void s(!1);const n=await Ct(parseInt(t));if(!n)return e.error("Shop domain not found"),void s(!1);e.debug("Shop domain found",{shopDomain:n}),o(n)}const A=await(async e=>{const t=await et.get("popup_hide");if(!t)return e.debug("No expiry found in storage"),!1;const{popupHide:n}=t,r=!!n&&Date.now()<n;return e.debug("Is AdUnit Muted?",{isMuted:r,expiry:n}),r})(e);if(A)return;if(!r())return void s(!1);const v=await(async(e,t)=>{const{Domain:n}=t,r=window.location.href,{payload:o}=await ee({type:We,payload:{activeDomain:n,url:r}});return!!o.result&&(e.info("Stand Down detected"),!0)})(e,r());if(v)return void s(!1);const b=t()?.anonymousActiveDomainLogging??!1,y=r()??void 0;y&&b&&!function(e){const t=`gfhv-${e}`;return!!sessionStorage.getItem(t)||(sessionStorage.setItem(t,"true"),!1)}(y.Domain)&&nt.trackEvent(z.checkoutPopupActiveDomain,{url:y.Domain});const w=setInterval((async()=>{e.debug("Checking checkout rules");const t=await(async e=>{const t=X.getInstance();t.configure({enabled:!0,title:"Content - checkoutRulesTest"});const n=new URL(globalThis.location.href),r=n.href,{hostname:o}=n;t.debug("Checking if popup should be shown",{currentUrl:r});const i=await async function(e){const t=kt(e)||Pt();return!("shop.app"!==window.location.hostname&&!window.location.hostname.endsWith(".shop.app")||!(t>0)||!await Ct(t))}(t),s=Dt(e)&&(yt(n.pathname.toLowerCase())||wt(r,document)||Tt(e,r,o)||i);return t.debug("Popup show decision based on rules",{shouldShow:s,matchesCartRule:yt(n.pathname.toLowerCase()),matchesBookingRule:wt(r,document),matchesShopPayRule:i,matchesMerchantRegexRule:Tt(e,r,o),matchesLanguageRule:Dt(e)}),s})(i);if(t&&m)return nt.trackEvent(z.checkoutPopupLooserExtension,{url:globalThis.window.location.href,winner:d.item(0).dataset.extensionName}),e.debug("Standing down because, another ad-unit extension will pop"),void clearInterval(w);s(t),t&&(e.debug("Should show popup based on checkout rules",{shouldShowResult:t}),nt.trackEvent(z.checkoutPopupShown,{url:globalThis.window.location.href,pageLanguage:a,looserCompetingExtensions:It(d,!0)}),clearInterval(w))}),2e3)}catch(t){s(!1),e.error("An error occurred in GfApp",{error:t})}}));const h=async(t,n)=>{e.info("Processing donation",{charity:t,domain:n.Domain});const r=await(async(e,t,n,r)=>{e.debug("Activating offer",{activeDomain:t,selectedCharity:r});const o=await te({type:Ve,payload:{activeDomain:t,originalUrl:n,selectedCharity:r}});return e.debug("Activate offer response",{response:o}),o})(e,n,window.location.href,{ein:t.ein,thirdPartyId:t.tpi});return e.debug("Activate offer response",{activationResponse:r}),nt.trackEvent(r.payload.response?z.checkoutPopupDonation:z.checkoutPopupFailedActivation,{activeDomain:n.Domain,url:globalThis.window.location.href,charity:{ein:t.ein,tpi:t.tpi},rate:n.Merchant.MaxRate}),r.payload.response},A=async t=>{s(await(async(e,t)=>{try{e.info("Hiding ad",{days:t});const n=await te({type:Ge,payload:{days:t??0}});return void 0!==t&&nt.trackEvent(z.checkoutPopupSupressed,{url:globalThis.window.location.href,days:t}),e.info("Hiding ad response",{hideResponse:n}),n.payload.ack?(e.debug("Ad hidden successfully"),!1):(e.warn("Failed to hide ad"),!0)}catch{return!1}})(e,t))},v=async e=>{nt.trackEvent(z.checkoutPopupOfferDetailsClicked,{action:e?"opened":"closed"})},x=async t=>{e.debug("Getting translation provider",{currentLanguage:t});const{translations:n,charities:r}=await async function(e,t){try{t&&t.debug("Getting language content",{languageCode:e});const n=await ee({type:qe,payload:{lang:e}});return{translations:n.payload.translations,charities:n.payload.charities}}catch(n){return t&&t.error("Error getting language content",{error:n,languageCode:e}),{translations:null,charities:null}}}(t,e),o={translate:e=>n&&n[e]?n[e]:"",getAllCharities:()=>{const e=d();return Object.entries(e).map((([e,t])=>{const{ein:n}=t;try{const o=r?.[n];if(!o)throw new Error(`Failed to find charity metadata for ein ${n}`);return{ein:n,tpi:o.tpi,title:o.title,order:parseInt(e,10),logo:o.logo,decorator:t.decorator,decoratorLeftStyle:t.decoratorLeftStyle,decoratorRightStyle:t.decoratorRightStyle}}catch{return{ein:n,tpi:"",title:"",order:9,logo:""}}}))}};e.debug("Setting content provider with translations and charity functions"),u((()=>o))};return L(Ot,{translate:()=>c()?.translate,charities:()=>c()?.getAllCharities,get children(){var n,o=Rt();return U(o,(n=m((()=>!(!r()||!i()))),()=>n()&&L(bt,{get checkoutPopupConf(){return t()},elementId:"give-freely-checkout-popup",get activeDomain(){return r()},get merchantRates(){return a()},onClose:A,onDonate:h,onOfferDetailsClick:v,logger:e}))),o}})}async function _t(){const e=`give-freely-root-${Q.runtime.id}`;if(document.getElementById(e))return;const t=document.createElement("div");t.id=e,t.className="give-freely-root",t.style.display="block",t.dataset.extensionId=Q.runtime.id,t.dataset.extensionName=Q.runtime.getManifest().name||Q.runtime.id,document.body.appendChild(t);const n=t.attachShadow({mode:"open"}),r=document.createElement("div"),s=document.createElement("style");s.textContent='\n :host {\n all: initial;\n }\n\n .gf-scroll-remove::-webkit-scrollbar {\n border-radius-bottom-right: 15px;\n }\n\n button {\n cursor: pointer;\n transition: transform 0.1s ease;\n }\n\n button:active {\n transform: scale(0.98);\n }\n\n .give-freely-close-button:hover {\n opacity: 0.7;\n }\n\n input[type="radio"] {\n margin-right: 8px;\n }\n\n hr {\n border: none;\n border-top: 1px solid #e5e5e5;\n margin: 1em 0;\n }\n\n @media (max-width: 600px), (max-height: 480px) {\n #give-freely-checkout-popup {\n display: none !important;\n }\n }\n',n.appendChild(s),n.appendChild(r),function(e,t,n,r={}){let s;(function(e,t){const n=a,r=i,s=0===e.length,l=void 0===t?r:t,c=s?o:{owned:null,cleanups:null,context:l?l.context:null,owner:l},u=s?e:()=>e((()=>h((()=>D(c)))));i=c,a=null;try{return k(u,!0)}finally{a=n,i=r}})((r=>{s=r,t===document?e():U(t,e(),t.firstChild?null:void 0,n)}),r.owner)}((()=>L($t,{})),r)}export{Q as browser,_t as initializeAdUnit};
1
+ const e={equals:(e,t)=>e===t};let t=P;const n=1,r=2,o={owned:null,cleanups:null,context:null,owner:null};var i=null;let s=null,a=null,l=null,c=null,u=0;function g(t,n){const r={value:t,observers:null,observerSlots:null,comparator:(n=n?Object.assign({},e,n):e).equals||void 0};return[x.bind(r),e=>("function"==typeof e&&(e=e(r.value)),b(r,e))]}function d(e,t,r){y(w(e,t,!1,n))}function p(e,r,o){t=S;const i=w(e,r,!1,n);i.user=!0,c?c.push(i):y(i)}function m(t,n,r){r=r?Object.assign({},e,r):e;const o=w(t,n,!0,0);return o.observers=null,o.observerSlots=null,o.comparator=r.equals||void 0,y(o),x.bind(o)}function h(e){if(null===a)return e();const t=a;a=null;try{return e()}finally{a=t}}function f(e){p((()=>h(e)))}function A(e){let t;return i&&i.context&&void 0!==(t=i.context[e.id])?t:e.defaultValue}function v(e){const t=m(e),n=m((()=>O(t())));return n.toArray=()=>{const e=n();return Array.isArray(e)?e:null!=e?[e]:[]},n}function x(){if(this.sources&&this.state)if(this.state===n)y(this);else{const e=l;l=null,k((()=>T(this)),!1),l=e}if(a){const e=this.observers?this.observers.length:0;a.sources?(a.sources.push(this),a.sourceSlots.push(e)):(a.sources=[this],a.sourceSlots=[e]),this.observers?(this.observers.push(a),this.observerSlots.push(a.sources.length-1)):(this.observers=[a],this.observerSlots=[a.sources.length-1])}return this.value}function b(e,t,r){let o=e.value;return e.comparator&&e.comparator(o,t)||(e.value=t,e.observers&&e.observers.length&&k((()=>{for(let t=0;t<e.observers.length;t+=1){const r=e.observers[t],o=s&&s.running;o&&s.disposed.has(r),(o?r.tState:r.state)||(r.pure?l.push(r):c.push(r),r.observers&&E(r)),o||(r.state=n)}if(l.length>1e6)throw l=[],new Error}),!1)),t}function y(e){if(!e.fn)return;D(e);const t=u;!function(e,t,r){let o;const s=i,l=a;a=i=e;try{o=e.fn(t)}catch(t){return e.pure&&(e.state=n,e.owned&&e.owned.forEach(D),e.owned=null),e.updatedAt=r+1,I(t)}finally{a=l,i=s}(!e.updatedAt||e.updatedAt<=r)&&(null!=e.updatedAt&&"observers"in e?b(e,o):e.value=o,e.updatedAt=r)}(e,e.value,t)}function w(e,t,r,s=n,a){const l={fn:e,state:s,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:t,owner:i,context:i?i.context:null,pure:r};return null===i||i!==o&&(i.owned?i.owned.push(l):i.owned=[l]),l}function C(e){if(0===e.state)return;if(e.state===r)return T(e);if(e.suspense&&h(e.suspense.inFallback))return e.suspense.effects.push(e);const t=[e];for(;(e=e.owner)&&(!e.updatedAt||e.updatedAt<u);)e.state&&t.push(e);for(let o=t.length-1;o>=0;o--)if((e=t[o]).state===n)y(e);else if(e.state===r){const n=l;l=null,k((()=>T(e,t[0])),!1),l=n}}function k(e,n){if(l)return e();let r=!1;n||(l=[]),c?r=!0:c=[],u++;try{const n=e();return function(e){if(l&&(P(l),l=null),e)return;const n=c;c=null,n.length&&k((()=>t(n)),!1)}(r),n}catch(e){r||(c=null),l=null,I(e)}}function P(e){for(let t=0;t<e.length;t++)C(e[t])}function S(e){let t,n=0;for(t=0;t<e.length;t++){const r=e[t];r.user?e[n++]=r:C(r)}for(t=0;t<n;t++)C(e[t])}function T(e,t){e.state=0;for(let o=0;o<e.sources.length;o+=1){const i=e.sources[o];if(i.sources){const e=i.state;e===n?i!==t&&(!i.updatedAt||i.updatedAt<u)&&C(i):e===r&&T(i,t)}}}function E(e){for(let t=0;t<e.observers.length;t+=1){const n=e.observers[t];n.state||(n.state=r,n.pure?l.push(n):c.push(n),n.observers&&E(n))}}function D(e){let t;if(e.sources)for(;e.sources.length;){const t=e.sources.pop(),n=e.sourceSlots.pop(),r=t.observers;if(r&&r.length){const e=r.pop(),o=t.observerSlots.pop();n<r.length&&(e.sourceSlots[o]=n,r[n]=e,t.observerSlots[n]=o)}}if(e.tOwned){for(t=e.tOwned.length-1;t>=0;t--)D(e.tOwned[t]);delete e.tOwned}if(e.owned){for(t=e.owned.length-1;t>=0;t--)D(e.owned[t]);e.owned=null}if(e.cleanups){for(t=e.cleanups.length-1;t>=0;t--)e.cleanups[t]();e.cleanups=null}e.state=0}function I(e,t=i){const n=function(e){return e instanceof Error?e:new Error("string"==typeof e?e:"Unknown error",{cause:e})}(e);throw n}function O(e){if("function"==typeof e&&!e.length)return O(e());if(Array.isArray(e)){const t=[];for(let n=0;n<e.length;n++){const r=O(e[n]);Array.isArray(r)?t.push.apply(t,r):t.push(r)}return t}return e}function M(e,t){return function(t){let n;return d((()=>n=h((()=>(i.context={...i.context,[e]:t.value},v((()=>t.children)))))),void 0),n}}function L(e,t){return h((()=>e(t||{})))}function N(e){const t=e.keyed,n=m((()=>e.when),void 0,{equals:(e,n)=>t?e===n:!e==!n});return m((()=>{const r=n();if(r){const o=e.children;return"function"==typeof o&&o.length>0?h((()=>o(t?r:()=>{if(!h(n))throw"Stale read from <Show>.";return e.when}))):o}return e.fallback}),void 0,void 0)}const R="_$DX_DELEGATE";function $(e,t,n){let r;const o=()=>(r||(r=(()=>{const t=document.createElement("template");return t.innerHTML=e,t.content.firstChild})())).cloneNode(!0);return o.cloneNode=o,o}function _(e,t=window.document){const n=t[R]||(t[R]=new Set);for(let r=0,o=e.length;r<o;r++){const o=e[r];n.has(o)||(n.add(o),t.addEventListener(o,G))}}function H(e,t,n){null==n?e.removeAttribute(t):e.setAttribute(t,n)}function F(e,t,n){if(!t)return n?H(e,"style"):t;const r=e.style;if("string"==typeof t)return r.cssText=t;let o,i;for(i in"string"==typeof n&&(r.cssText=n=void 0),n||(n={}),t||(t={}),n)null==t[i]&&r.removeProperty(i),delete n[i];for(i in t)o=t[i],o!==n[i]&&(r.setProperty(i,o),n[i]=o);return n}function U(e,t,n,r){if(void 0===n||r||(r=[]),"function"!=typeof t)return B(e,t,r,n);d((r=>B(e,t(),r,n)),r)}function G(e){let t=e.target;const n=`$$${e.type}`,r=e.target,o=e.currentTarget,i=t=>Object.defineProperty(e,"target",{configurable:!0,value:t}),s=()=>{const r=t[n];if(r&&!t.disabled){const o=t[`${n}Data`];if(void 0!==o?r.call(t,o,e):r.call(t,e),e.cancelBubble)return}return t.host&&"string"!=typeof t.host&&!t.host._$host&&t.contains(e.target)&&i(t.host),!0},a=()=>{for(;s()&&(t=t._$host||t.parentNode||t.host););};if(Object.defineProperty(e,"currentTarget",{configurable:!0,get:()=>t||document}),e.composedPath){const n=e.composedPath();i(n[0]);for(let e=0;e<n.length-2&&(t=n[e],s());e++){if(t._$host){t=t._$host,a();break}if(t.parentNode===o)break}}else a();i(r)}function B(e,t,n,r,o){for(;"function"==typeof n;)n=n();if(t===n)return n;const i=typeof t,s=void 0!==r;if(e=s&&n[0]&&n[0].parentNode||e,"string"===i||"number"===i){if("number"===i&&(t=t.toString())===n)return n;if(s){let o=n[0];o&&3===o.nodeType?o.data!==t&&(o.data=t):o=document.createTextNode(t),n=V(e,n,r,o)}else n=""!==n&&"string"==typeof n?e.firstChild.data=t:e.textContent=t}else if(null==t||"boolean"===i)n=V(e,n,r);else{if("function"===i)return d((()=>{let o=t();for(;"function"==typeof o;)o=o();n=B(e,o,n,r)})),()=>n;if(Array.isArray(t)){const i=[],a=n&&Array.isArray(n);if(j(i,t,n,o))return d((()=>n=B(e,i,n,r,!0))),()=>n;if(0===i.length){if(n=V(e,n,r),s)return n}else a?0===n.length?W(e,i,r):function(e,t,n){let r=n.length,o=t.length,i=r,s=0,a=0,l=t[o-1].nextSibling,c=null;for(;s<o||a<i;)if(t[s]!==n[a]){for(;t[o-1]===n[i-1];)o--,i--;if(o===s){const t=i<r?a?n[a-1].nextSibling:n[i-a]:l;for(;a<i;)e.insertBefore(n[a++],t)}else if(i===a)for(;s<o;)c&&c.has(t[s])||t[s].remove(),s++;else if(t[s]===n[i-1]&&n[a]===t[o-1]){const r=t[--o].nextSibling;e.insertBefore(n[a++],t[s++].nextSibling),e.insertBefore(n[--i],r),t[o]=n[i]}else{if(!c){c=new Map;let e=a;for(;e<i;)c.set(n[e],e++)}const r=c.get(t[s]);if(null!=r)if(a<r&&r<i){let l,u=s,g=1;for(;++u<o&&u<i&&null!=(l=c.get(t[u]))&&l===r+g;)g++;if(g>r-a){const o=t[s];for(;a<r;)e.insertBefore(n[a++],o)}else e.replaceChild(n[a++],t[s++])}else s++;else t[s++].remove()}}else s++,a++}(e,n,i):(n&&V(e),W(e,i));n=i}else if(t.nodeType){if(Array.isArray(n)){if(s)return n=V(e,n,r,t);V(e,n,null,t)}else null!=n&&""!==n&&e.firstChild?e.replaceChild(t,e.firstChild):e.appendChild(t);n=t}}return n}function j(e,t,n,r){let o=!1;for(let i=0,s=t.length;i<s;i++){let s,a=t[i],l=n&&n[e.length];if(null==a||!0===a||!1===a);else if("object"==(s=typeof a)&&a.nodeType)e.push(a);else if(Array.isArray(a))o=j(e,a,l)||o;else if("function"===s)if(r){for(;"function"==typeof a;)a=a();o=j(e,Array.isArray(a)?a:[a],Array.isArray(l)?l:[l])||o}else e.push(a),o=!0;else{const t=String(a);l&&3===l.nodeType&&l.data===t?e.push(l):e.push(document.createTextNode(t))}}return o}function W(e,t,n=null){for(let r=0,o=t.length;r<o;r++)e.insertBefore(t[r],n)}function V(e,t,n,r){if(void 0===n)return e.textContent="";const o=r||document.createTextNode("");if(t.length){let r=!1;for(let i=t.length-1;i>=0;i--){const s=t[i];if(o!==s){const t=s.parentNode===e;r||i?t&&s.remove():t?e.replaceChild(o,s):e.insertBefore(o,n)}else r=!0}}else e.insertBefore(o,n);return[o]}class K{constructor(){this.isLocal=!0}log({level:e,message:t,timestamp:n,data:r,title:o}){const i="debug"===e?"log":e,s=o?`[${o}]`:"";void 0!==r?console[i](`[${n}] - ${K.LOGGER_PREFIX} ${s} ${t}`,r):console[i](`[${n}] - ${K.LOGGER_PREFIX} ${s} ${t}`)}}var z,q;K.LOGGER_PREFIX="[GFAdUnit] -",function(e){e.checkoutPopupShown="CHECKOUT-POPUP-SHOWN",e.checkoutPopupNotShown="CHECKOUT-POPUP-NOT-SHOWN",e.checkoutPopupSupressed="CHECKOUT-POPUP-SUPRESSED",e.checkoutPopupDonation="CHECKOUT-POPUP-DONATION",e.checkoutPopupFailedActivation="CHECKOUT-POPUP-FAILED-ACTIVATION",e.checkoutPopupPurchaseConfirmed="CHECKOUT-POPUP-PURCHASE-CONFIRMED",e.checkoutPopupHealthCheck="CHECKOUT-POPUP-HEALTH-CHECK",e.checkouPopupActivationFailed="CHECKOUT-POPUP-ACTIVATION-FAILED",e.checkoutPopupOfferDetailsClicked="CHECKOUT-POPUP-OFFER-DETAILS-CLICKED",e.checkoutPopupWhyAmISeeingThisClicked="CHECKOUT-POPUP-WHY-AM-I-SEEING-THIS-CLICKED",e.checkoutPopupLooserExtension="CHECKOUT-POPUP-LOOSER-EXTENSION",e.checkoutPopupActiveDomain="CHECKOUT-POPUP-ACTIVE-DOMAIN",e.checkoutPopupSiteMatches="CHECKOUT-POPUP-SITE-MATCHES"}(z||(z={})),function(e){e.adUnitLog="ADUNIT-LOG"}(q||(q={}));const Y=["debug","info","warn","error"];class X{constructor(e){this.config={minLevel:e?.minLevel??"debug",enabled:e?.enabled??!1,transports:e?.transports??[new K],title:e?.title??""}}static getInstance(e){return X.instance||(X.instance=new X(e)),X.instance}configure(e){this.config={...this.config,...e}}shouldLog(e){return!!this.config.enabled&&Y.indexOf(e)>=Y.indexOf(this.config.minLevel)}createLogMessage(e,t,n){return{level:e,version:"1.9.1",message:t,timestamp:(new Date).toISOString(),data:n,title:this.config.title}}log(e,t,n,r){if(!this.shouldLog(e))return;const o=this.createLogMessage(e,t,r);this.config.transports.filter((e=>!n||e.isLocal)).forEach((e=>e.log(o)))}debug(e,t,n=!1){this.log("debug",e,n,t)}info(e,t,n=!1){this.log("info",e,n,t)}warn(e,t,n=!1){this.log("warn",e,n,t)}error(e,t,n=!1){this.log("error",e,n,t)}addTransport(e){this.config.transports.push(e)}clearTransports(){this.config.transports=[]}disable(){this.config.enabled=!1}enable(){this.config.enabled=!0}}const Z=3,J=e=>1e3*e,Q=chrome;async function ee(e,t){return new Promise(((n,r)=>{try{const o=t=>chrome.runtime.lastError?r({error:chrome.runtime.lastError,message:e}):n(t);t?.tabId||Q.runtime.sendMessage(e,o)}catch(e){r(e)}}))}async function te(e,t,n){return async function(e,t={}){const{maxAttempts:n=Z,delayFn:r=J}=t;let o=null;for(let t=1;t<=n;t+=1)try{return await e()}catch(e){o=e,t<n&&await new Promise((e=>{setTimeout(e,r(t))}))}throw o&&t.logger&&t.operationName&&t.logger.error(`Operation ${t.operationName} failed after ${n} attempts.`,o),o||new Error("Operation failed after multiple attempts")}((()=>ee(e,t)),{maxAttempts:Z,delayFn:J})}const ne={display:"block",position:"fixed",top:"0%",left:"100%",width:"500px",height:"520px","margin-left":"-560px","margin-top":"50px",padding:"2px 5px","background-color":"white",border:"1px solid black","border-radius":"10px","box-shadow":"0 2px 10px rgba(0, 0, 0, 0.1)","z-index":"2147483647","font-family":"Arial","line-height":"1","vertical-align":"baseline","box-sizing":"border-box",color:"rgb(34, 34, 34)","@media (max-width: 600px), (max-height: 480px)":{display:"none !important"}},re={height:"100%","overflow-x":"hidden","overlfow-y":"auto",position:"relative",padding:"0px 15px"},oe={},ie={display:"flex","align-items":"center","margin-bottom":"10px"},se={flex:"1","font-size":"24px","font-weight":"700","margin-top":"20px","margin-bottom":"0px"},ae={background:"none",border:"none",padding:"4px 8px",color:"#666464","font-size":"38px",cursor:"pointer","line-height":"1"},le={color:"black","margin-top":"20px","max-width":"40%"},ce={color:"gray",cursor:"default","pointer-events":"none","text-decoration":"none"},ue={"font-size":"18px","font-weight":"400","margin-top":"20px","margin-bottom":"0px"},ge={display:"flex",gap:"10px",width:"100%","margin-top":"20px","margin-bottom":"20px","flex-wrap":"wrap","justify-content":"space-between"},de={width:"28%",position:"relative",display:"flex","flex-direction":"column","align-items":"center",background:"none",border:"1px solid #ccc","border-radius":"5px",padding:"5px",gap:"5px","text-align":"center","font-size":"14px",cursor:"pointer",transition:"background-color 0.2s ease"},pe={color:"white","background-color":"lightgray",cursor:"default","pointer-events":"none"},me={"max-width":"120px","max-height":"70px","margin-bottom":"5px","object-fit":"contain"},he={"background-color":"#FFD812",cursor:"pointer","border-radius":"8px",padding:"8px",color:"white","min-width":"100px",border:"0","font-weight":"600",width:"100%"},fe={display:"flex","flex-direction":"column",gap:"10px",width:"100%","color-scheme":"light"},Ae={display:"flex","align-items":"center",gap:"5px",border:"1px solid #ddd",padding:"15px","border-radius":"5px","font-weight":"600",cursor:"pointer","margin-bottom":"8px"},ve={"text-align":"right"},xe={background:"none",border:"none",color:"blue","text-decoration":"underline",padding:"0",cursor:"pointer","margin-bottom":"15px"},be={display:"flex","justify-content":"space-between",margin:"20px 0px 10px 0px","font-size":"14px"},ye={margin:"5px 0px 5px 0px","font-size":"14px","text-align":"center"},we={color:"#666464","text-decoration":"underline"},Ce={color:"rgb(102, 100, 100)","text-decoration":"underline",margin:"0",cursor:"pointer"},ke={width:"100%","background-color":"#f2f2f2",border:"1px solid black","border-radius":"10px","border-top":"1px solid #bbb7b7","margin-top":"10px","margin-bottom":"20px","box-sizing":"border-box"},Pe={padding:"0 5px 0 10px",width:"100%","font-size":"12px","box-sizing":"border-box"},Se={display:"grid","grid-template-columns":"4fr 1fr","padding-right":"15px","padding-bottom":"5px"},Te={color:"#000","margin-bottom":"4px"},Ee={"font-size":"14px",color:"#555","text-align":"right"},De=(e,t)=>{let n=parseFloat(t);return"FLAT"===e&&(n*=.75),((e,t)=>{let n=parseFloat(t);return n<1&&(n=1),n=Math.floor(n),"PERCENTAGE"===e?`${n}%`:`$${n}`})(e,n.toString())};var Ie=$("<span>");function Oe(e){return t=Ie(),d((()=>{return t.innerHTML=(n=e.title,r=e.activeDomain,n.replace("{0}",De(r.Merchant.MaxRate?.Kind,r.Merchant.MaxRate?.Amount??"0")));var n,r})),t;var t}const Me=function(){const e=Symbol("context");return{id:e,Provider:M(e),defaultValue:()=>({translate:e=>"",getAllCharities:()=>[]})}}(),Le=Me,Ne=()=>{const e=A(Le)();if(!e)throw new Error("Content provider context is undefined");return t=>e.translate(t)};class Re{static formatMessage(e,...t){return e.replace(/{(\d+)}/g,((e,n)=>{const r=Number(n);return void 0!==t[r]?String(t[r]):`{${r}}`}))}}var $e=$("<div>"),_e=$("<div><div class=gf-offer-details><p><span></span></p><p><span></span></p><p><span></span></p><p><span></span></p><p><span></span></p><p><a target=_blank rel=noreferrer><span>"),He=$("<div class=gf-offer-details-rate-item><div></div><div>");const Fe=e=>{const t=Ne();return n=_e(),o=(r=n.firstChild).firstChild,i=o.firstChild,s=o.nextSibling,a=s.firstChild,l=s.nextSibling,c=l.firstChild,u=l.nextSibling,g=u.firstChild,p=u.nextSibling,m=p.firstChild,h=p.nextSibling.firstChild,f=h.firstChild,U(r,L(N,{get when(){return!!e.merchantRateDetail?.length},get children(){var t=$e();return U(t,(()=>e.merchantRateDetail?.map((e=>{return t=He(),n=t.firstChild,r=n.nextSibling,U(n,(()=>e.Name||"")),U(r,(()=>((e,t=1,n=1)=>{const r=e.BoostedOffer??null;let o=parseFloat(e?.Amount??"");if(r?.EndDate&&new Date(r.EndDate)<new Date&&(o=parseFloat(r.OriginalMaxRate)),Number.isNaN(o))return"";const i=o*t;return"PERCENTAGE"===e?.Kind?`${i.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:n})}%`:"FLAT"===e?.Kind?i.toLocaleString("en-US",{style:"currency",currency:e.Currency}):""})(e))),d((e=>{var o=Se,i=Te,s=Ee;return e.e=F(t,o,e.e),e.t=F(n,i,e.t),e.a=F(r,s,e.a),e}),{e:void 0,t:void 0,a:void 0}),t;var t,n,r})))),t}}),u),d((o=>{var s=ke,l=Pe,u=t("offerDetails.intro"),d=t("offerDetails.eligible"),p=e.parsedMaxRate?Re.formatMessage(t("offerDetails.donationRatesWithValue"),e.parsedMaxRate):Re.formatMessage(t("offerDetails.donationRates")),A=t("offerDetails.donationAmounts"),v=t("offerDetails.donationTiming"),x=we,b=e.termsUrl,y=t("offerDetails.termsAndConditions");return o.e=F(n,s,o.e),o.t=F(r,l,o.t),u!==o.a&&(i.innerHTML=o.a=u),d!==o.o&&(a.innerHTML=o.o=d),p!==o.i&&(c.innerHTML=o.i=p),A!==o.n&&(g.innerHTML=o.n=A),v!==o.s&&(m.innerHTML=o.s=v),o.h=F(h,x,o.h),b!==o.r&&H(h,"href",o.r=b),y!==o.d&&(f.innerHTML=o.d=y),o}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0}),n;var n,r,o,i,s,a,l,c,u,g,p,m,h,f},Ue="TRACK_EVENT",Ge="GF_HIDE_POPUP",Be="GF_GET_POPUP_CONFIG",je="GF_IS_ACTIVE_DOMAIN",We="GF_SHOULD_STAND_DOWN",Ve="GF_ACTIVATE_OFFER",Ke="GF_STORE_SHOPIFY_SHOP_ID",ze="GF_GET_DOMAIN_BY_SHOP_ID",qe="GF_GET_LANGUAGE_CONTENT",Ye={ein:"0",tpi:"0"};function Xe(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Ze={exports:{}};"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self&&self,function(e){if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)e.exports=globalThis.browser;else{const t="The message port closed before a response was received.",n=e=>{const n={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(0===Object.keys(n).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class r extends WeakMap{constructor(e,t=void 0){super(t),this.createItem=e}get(e){return this.has(e)||this.set(e,this.createItem(e)),super.get(e)}}const o=(t,n)=>(...r)=>{e.runtime.lastError?t.reject(new Error(e.runtime.lastError.message)):n.singleCallbackArg||r.length<=1&&!1!==n.singleCallbackArg?t.resolve(r[0]):t.resolve(r)},i=e=>1==e?"argument":"arguments",s=(e,t,n)=>new Proxy(t,{apply:(t,r,o)=>n.call(r,e,...o)});let a=Function.call.bind(Object.prototype.hasOwnProperty);const l=(e,t={},n={})=>{let r=Object.create(null),c={has:(t,n)=>n in e||n in r,get(c,u,g){if(u in r)return r[u];if(!(u in e))return;let d=e[u];if("function"==typeof d)if("function"==typeof t[u])d=s(e,e[u],t[u]);else if(a(n,u)){let t=((e,t)=>function(n,...r){if(r.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${i(t.minArgs)} for ${e}(), got ${r.length}`);if(r.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${i(t.maxArgs)} for ${e}(), got ${r.length}`);return new Promise(((i,s)=>{if(t.fallbackToNoCallback)try{n[e](...r,o({resolve:i,reject:s},t))}catch(o){console.warn(`${e} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,o),n[e](...r),t.fallbackToNoCallback=!1,t.noCallback=!0,i()}else t.noCallback?(n[e](...r),i()):n[e](...r,o({resolve:i,reject:s},t))}))})(u,n[u]);d=s(e,e[u],t)}else d=d.bind(e);else if("object"==typeof d&&null!==d&&(a(t,u)||a(n,u)))d=l(d,t[u],n[u]);else{if(!a(n,"*"))return Object.defineProperty(r,u,{configurable:!0,enumerable:!0,get:()=>e[u],set(t){e[u]=t}}),d;d=l(d,t[u],n["*"])}return r[u]=d,d},set:(t,n,o,i)=>(n in r?r[n]=o:e[n]=o,!0),defineProperty:(e,t,n)=>Reflect.defineProperty(r,t,n),deleteProperty:(e,t)=>Reflect.deleteProperty(r,t)},u=Object.create(e);return new Proxy(u,c)},c=e=>({addListener(t,n,...r){t.addListener(e.get(n),...r)},hasListener:(t,n)=>t.hasListener(e.get(n)),removeListener(t,n){t.removeListener(e.get(n))}}),u=new r((e=>"function"!=typeof e?e:function(t){const n=l(t,{},{getContent:{minArgs:0,maxArgs:0}});e(n)})),g=new r((e=>"function"!=typeof e?e:function(t,n,r){let o,i,s=!1,a=new Promise((e=>{o=function(t){s=!0,e(t)}}));try{i=e(t,n,o)}catch(e){i=Promise.reject(e)}const l=!0!==i&&((c=i)&&"object"==typeof c&&"function"==typeof c.then);var c;if(!0!==i&&!l&&!s)return!1;return(l?i:a).then((e=>{r(e)}),(e=>{let t;t=e&&(e instanceof Error||"string"==typeof e.message)?e.message:"An unexpected error occurred",r({__mozWebExtensionPolyfillReject__:!0,message:t})})).catch((e=>{console.error("Failed to send onMessage rejected reply",e)})),!0})),d=({reject:n,resolve:r},o)=>{e.runtime.lastError?e.runtime.lastError.message===t?r():n(new Error(e.runtime.lastError.message)):o&&o.__mozWebExtensionPolyfillReject__?n(new Error(o.message)):r(o)},p=(e,t,n,...r)=>{if(r.length<t.minArgs)throw new Error(`Expected at least ${t.minArgs} ${i(t.minArgs)} for ${e}(), got ${r.length}`);if(r.length>t.maxArgs)throw new Error(`Expected at most ${t.maxArgs} ${i(t.maxArgs)} for ${e}(), got ${r.length}`);return new Promise(((e,t)=>{const o=d.bind(null,{resolve:e,reject:t});r.push(o),n.sendMessage(...r)}))},m={devtools:{network:{onRequestFinished:c(u)}},runtime:{onMessage:c(g),onMessageExternal:c(g),sendMessage:p.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:p.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},h={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return n.privacy={network:{"*":h},services:{"*":h},websites:{"*":h}},l(e,m,n)};e.exports=n(chrome)}}(Ze);var Je=Xe(Ze.exports);const Qe="GIVE_FREELY_",et={async get(e){const t=`${Qe}${e}`;return(await Je.storage.local.get(t))[t]||null},async set(e,t){const n=`${Qe}${e}`;await Je.storage.local.set({[n]:t})},async remove(e){const t=Array.isArray(e)?e.map((e=>`${Qe}${e}`)):`${Qe}${e}`;await Je.storage.local.remove(t)}},tt=()=>String("1.9.1");class nt{constructor(e,t,n,r=60){this.track=async(e,t,n,r=!1,o=!1)=>{const i={partner:`adUnit_${this._partnerApiKey}`,eventType:e,eventData:{userId:r?void 0:this._userService?.user?.id,libVersion:tt(),wfDeviceId:t,...n}};try{const e=JSON.stringify(i,((e,t)=>t instanceof Error?{name:t.name,message:t.message,stack:t.stack}:t)),t=await this.getEventsUrl();if(await this.shouldBroadcastEvent(e,o)){const n=await fetch(t,{headers:{"Content-Type":"application/json"},method:"POST",body:e,cache:"no-store"});return n.ok?(await this.pushEventToHistory(e),!0):(this._logger.error("Something unexpected happened when dispatching an event",{status:n.status,statusText:n.statusText,event:i},!0),!1)}return this._logger.info("This event has already been broadcasted during the past hour",i,!0),!1}catch(e){return this._logger.error("Something unexpected happened when dispatching a gf event",{error:e,event:i}),!1}},this.getEventsHistory=async()=>{const{GF_AD_EVENT_HISTORY:e}=await Q.storage.local.get({GF_AD_EVENT_HISTORY:""}),t=(e=>{const t=new Date;return t.setTime(t.getTime()+60*e*1e3),t.getTime()})(-this._debounceWindowInMinutes),n=(e||[]).filter((e=>e.createdAt>t));return await Q.storage.local.set({GF_AD_EVENT_HISTORY:n}),n},this.shouldBroadcastEvent=async(e,t)=>!!t||!(await this.getEventsHistory()).some((t=>t.payload===e)),this.pushEventToHistory=async e=>{const t=await this.getEventsHistory();t.push({createdAt:Date.now(),payload:e}),await Q.storage.local.set({GF_AD_EVENT_HISTORY:t})},this._partnerApiKey=e,this._userService=t,this._debounceWindowInMinutes=r,this._logger=X.getInstance({title:"Analytics"}),this._configService=n}async getEventsUrl(){const{eventsUrl:e}=await this._configService.getConfig();return e}}function rt(e,t,n){return e?{...t,...n}:t}nt.trackEvent=async(e,t,n=!1,r=!1)=>{await ee({type:Ue,payload:{eventType:e,eventData:t,anonymous:n,skipThrottling:r}})};var ot=$("<a href=#!>"),it=$("<button class=give-freely-close-button aria-label=Close>×"),st=$('<div><div><div></div></div><hr><div></div><div><div><div><br><span></span></div><button aria-label="Don\'t show again"><span></span></button></div></div><div><p><span></span></p><a class=give-freely-footer-link target=_blank rel="noopener noreferrer"><span>'),at=$("<div><div><img><span></span></div><button><span>"),lt=$("<div>"),ct=$("<div><span>");function ut(e){const[t,n]=g(!1),[r,o]=g(null),i=Ne(),s=(()=>{const e=A(Me)();if(!e)throw new Error("Content provider context is undefined");return()=>e.getAllCharities()})();p((()=>{t()&&e.mainContainerRef&&e.mainContainerRef.scroll({top:e.mainContainerRef.scrollHeight,behavior:"smooth"})})),p((()=>{const t=r();t&&e.onCharitySelect(t.charity,t.closeOnDonation?e.checkoutPopupConf.checkoutPopupActivateAndCloseSkipSuccess:void 0)}));const a=(e,t)=>o({charity:e,closeOnDonation:t}),l=()=>!!r()?.charity;return[(u=st(),h=u.firstChild,f=h.firstChild,v=h.nextSibling.nextSibling,x=v.nextSibling,b=x.firstChild,y=b.firstChild,w=y.firstChild.nextSibling,C=y.nextSibling,k=C.firstChild,P=x.nextSibling,S=P.firstChild,T=S.firstChild,E=S.nextSibling,D=E.firstChild,U(h,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupActivateAndClose},get children(){var e=ot();return e.$$click=()=>a(Ye,!0),d((t=>{var n=rt(l(),le,ce),r=i("main.activateAndClose");return t.e=F(e,n,t.e),r!==t.t&&(e.innerHTML=t.t=r),t}),{e:void 0,t:void 0}),e}}),null),U(h,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupMainCloseButtonVisible&&!e.checkoutPopupConf.checkoutPopupActivateAndClose},get children(){var t=it();return t.$$click=()=>e.onClose(),d((e=>F(t,ae,e))),t}}),null),U(v,L(Oe,{get title(){return i("main.subTitle")},get activeDomain(){return e.activeDomain}})),U(x,(()=>s().reduce(((t,n)=>{var r,o,s,c,u,g,p;return n?.title&&""!==n?.title?t.push((s=(o=at()).firstChild,c=s.firstChild,u=c.nextSibling,g=s.nextSibling,p=g.firstChild,o.$$click=()=>!l()&&a(n),U(o,(r=m((()=>!!(n.decorator&&n.decoratorLeftStyle&&n.decoratorRightStyle))),()=>{return r()&&[(t=lt(),d((e=>{var r=n.decoratorLeftStyle,o=n.decorator;return e.e=F(t,r,e.e),o!==e.t&&(t.innerHTML=e.t=o),e}),{e:void 0,t:void 0}),t),(e=lt(),d((t=>{var r=n.decoratorRightStyle,o=n.decorator;return t.e=F(e,r,t.e),o!==t.t&&(e.innerHTML=t.t=o),t}),{e:void 0,t:void 0}),e)];var e,t}),s),s.style.setProperty("height","100px"),s.style.setProperty("text-align","center"),d((t=>{var r=rt(l(),de,{cursor:"default"}),s=n.logo,a=me,d=n.title,m=n.title,h=rt(l(),{...he,"background-color":e.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor||"#FFD812"},pe),f=l(),A=`Select charity: ${n.title}`,v=i("main.charitySelect");return t.e=F(o,r,t.e),s!==t.t&&H(c,"src",t.t=s),t.a=F(c,a,t.a),d!==t.o&&H(c,"alt",t.o=d),m!==t.i&&(u.innerHTML=t.i=m),t.n=F(g,h,t.n),f!==t.s&&(g.disabled=t.s=f),A!==t.h&&H(g,"aria-label",t.h=A),v!==t.r&&(p.innerHTML=t.r=v),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0}),o)):e.logger.error(`Translation was not found for EIN ${n?.ein}`),t}),[])),b),b.$$click=()=>!l()&&e.onSuppress(),y.style.setProperty("height","100px"),y.style.setProperty("text-align","center"),S.$$click=()=>{e.onOfferDetailsClick(!t()),n(!t())},E.$$click=()=>{nt.trackEvent(z.checkoutPopupWhyAmISeeingThisClicked,{domain:globalThis.window.location.hostname})},U(u,(c=m((()=>!!e.checkoutPopupConf.checkoutPopupDisplayNameInFooter)),()=>{return c()&&(e=ct(),t=e.firstChild,d((n=>{var r=ye,o=i("main.footer");return n.e=F(e,r,n.e),o!==n.t&&(t.innerHTML=n.t=o),n}),{e:void 0,t:void 0}),e);var e,t}),null),d((t=>{var n=oe,r=ie,o=se,s=i("main.title"),a=ue,c=ge,g=rt(l(),de,{cursor:"default"}),d=i("main.sixthBox"),p=rt(l(),{...he,"background-color":e.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor||"#FFD812"},pe),m=l(),A=i("main.settings"),y=be,I=Ce,O=i("main.offerDetails"),M=we,L=e.checkoutPopupConf.externalUrls.giveFreelyWhyAmISeeingThis,N=i("main.whyAmISeeingThis");return t.e=F(u,n,t.e),t.t=F(h,r,t.t),t.a=F(f,o,t.a),s!==t.o&&(f.innerHTML=t.o=s),t.i=F(v,a,t.i),t.n=F(x,c,t.n),t.s=F(b,g,t.s),d!==t.h&&(w.innerHTML=t.h=d),t.r=F(C,p,t.r),m!==t.d&&(C.disabled=t.d=m),A!==t.l&&(k.innerHTML=t.l=A),t.u=F(P,y,t.u),t.c=F(S,I,t.c),O!==t.w&&(T.innerHTML=t.w=O),t.m=F(E,M,t.m),L!==t.f&&H(E,"href",t.f=L),N!==t.y&&(D.innerHTML=t.y=N),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0,l:void 0,u:void 0,c:void 0,w:void 0,m:void 0,f:void 0,y:void 0}),u),L(N,{get when(){return t()},get children(){return L(Fe,{get merchantName(){return e.activeDomain.Merchant.Name},get extensionName(){return e.checkoutPopupConf.displayName},get termsUrl(){return e.checkoutPopupConf.externalUrls.giveFreelyTermsAndConditions},get parsedMaxRate(){return m((()=>!!e.activeDomain.Merchant.MaxRate))()?De(e.activeDomain.Merchant.MaxRate.Kind,e.activeDomain.Merchant.MaxRate?.Amount):null},get merchantRateDetail(){return e.merchantRates},onClose:()=>n(!1)})}})];var c,u,h,f,v,x,b,y,w,C,k,P,S,T,E,D}_(["click"]);var gt=$("<button class=give-freely-close-button aria-label=Close>×"),dt=$("<label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=18250><span>"),pt=$('<div><div><div><span></span></div></div><button class=give-freely-back-button aria-label="Back to charity selection"><span></span></button><hr><div id=give-freely-goodbye-screen-options><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=1><span></span></label><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=7><span></span></label><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=30><span></span></label><label class=give-freely-radio-option><input type=radio name=gf-rad-goodbye value=90><span></span></label></div><button class=give-freely-submit-button><span>');function mt(e){const[t,n]=g(0),r=Ne();return o=pt(),i=o.firstChild,s=i.firstChild,a=s.firstChild,l=i.nextSibling,c=l.firstChild,u=l.nextSibling.nextSibling,m=(p=u.firstChild).firstChild,h=m.nextSibling,A=(f=p.nextSibling).firstChild,v=A.nextSibling,b=(x=f.nextSibling).firstChild,y=b.nextSibling,C=(w=x.nextSibling).firstChild,k=C.nextSibling,P=u.nextSibling,S=P.firstChild,o.style.setProperty("font-size","14px"),U(i,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupSupressCloseButtonVisible},get children(){var t=gt();return t.$$click=()=>e.onGoodbye(0),d((e=>F(t,ae,e))),t}}),null),l.$$click=()=>e.onBack(),m.addEventListener("change",(()=>n(1))),A.addEventListener("change",(()=>n(7))),b.addEventListener("change",(()=>n(30))),C.addEventListener("change",(()=>n(90))),U(u,L(N,{get when(){return e.checkoutPopupConf.checkoutPopupNeverSuppressionAllowed},get children(){var e=dt(),t=e.firstChild,o=t.nextSibling;return t.addEventListener("change",(()=>n(18250))),d((t=>{var n=Ae,i=r("suppress.suppressionPeriodNever");return t.e=F(e,n,t.e),i!==t.t&&(o.innerHTML=t.t=i),t}),{e:void 0,t:void 0}),e}}),null),P.$$click=()=>{const n=t();n&&(e.onGoodbye(n),e.setScreen("main"))},d((t=>{var n=ie,o=se,g=r("suppress.title"),d=xe,m=r("suppress.backButton"),A=fe,b=Ae,C=r("suppress.suppressionPeriod").replace("{0}","1"),T=Ae,E=r("suppress.suppressionPeriodPlural").replace("{0}","7"),D=Ae,I=r("suppress.suppressionPeriodPlural").replace("{0}","30"),O=Ae,M=r("suppress.suppressionPeriodPlural").replace("{0}","90"),L={...he,"font-weight":"700","margin-top":"10px","margin-bottom":"0px","background-color":e.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor||"#FFD812",width:"100px"},N=r("suppress.submitButton");return t.e=F(i,n,t.e),t.t=F(s,o,t.t),g!==t.a&&(a.innerHTML=t.a=g),t.o=F(l,d,t.o),m!==t.i&&(c.innerHTML=t.i=m),t.n=F(u,A,t.n),t.s=F(p,b,t.s),C!==t.h&&(h.innerHTML=t.h=C),t.r=F(f,T,t.r),E!==t.d&&(v.innerHTML=t.d=E),t.l=F(x,D,t.l),I!==t.u&&(y.innerHTML=t.u=I),t.c=F(w,O,t.c),M!==t.w&&(k.innerHTML=t.w=M),t.m=F(P,L,t.m),N!==t.f&&(S.innerHTML=t.f=N),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0,l:void 0,u:void 0,c:void 0,w:void 0,m:void 0,f:void 0}),o;var o,i,s,a,l,c,u,p,m,h,f,A,v,x,b,y,w,C,k,P,S}_(["click"]);var ht=$("<div><p><span>"),ft=$("<div><div><div><span></span></div><button class=give-freely-close-button aria-label=Close>×</button></div><hr><div><span>");function At(e){const[t,n]=g(null),r=Ne();let o;var s,a,l,c,u,p,m,h;return s=()=>clearInterval(o),null===i||(null===i.cleanups?i.cleanups=[s]:i.cleanups.push(s)),f((()=>{e.failedDonation||(()=>{const t=e.checkoutPopupConf.checkoutPopupDonationSuccessAutoCloseInSeconds??3;n(t),o=setInterval((()=>{n((t=>null===t||t<=1?(clearInterval(o),e.onClose(),0):t-1))}),1e3)})()})),a=ft(),l=a.firstChild,c=l.firstChild,u=c.firstChild,p=c.nextSibling,m=l.nextSibling.nextSibling,h=m.firstChild,a.style.setProperty("font-size","14px"),p.$$click=()=>e.onClose(),m.style.setProperty("padding","30px"),m.style.setProperty("height","150px"),m.style.setProperty("font-size","14px"),U(a,L(N,{get when(){return!e.failedDonation},get children(){var e=ht(),n=e.firstChild,o=n.firstChild;return d((e=>{var i=ve,s=Re.formatMessage(r("donate.autoClosing"),t()??0);return e.e=F(n,i,e.e),s!==e.t&&(o.innerHTML=e.t=s),e}),{e:void 0,t:void 0}),e}}),null),d((t=>{var n=ie,o=se,i=e.failedDonation?r("donate.failTitle"):r("donate.title"),s=ae,a=e.failedDonation?r("donate.failContent"):r("donate.content");return t.e=F(l,n,t.e),t.t=F(c,o,t.t),i!==t.a&&(u.innerHTML=t.a=i),t.o=F(p,s,t.o),a!==t.i&&(h.innerHTML=t.i=a),t}),{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),a}_(["click"]);var vt=$("<div><div>");const xt=(e,t,n)=>"donate"===e?"340px":t.checkoutPopupDisplayNameInFooter?"520px":n;function bt(e){const[t,n]=g("main"),[r,o]=g(),[i,s]=g(!1),a=()=>{e.logger.debug("Close button clicked"),e.onClose()},l=async(t,r=!1)=>{r&&e.onClose(),e.logger.info("Charity selected",{charity:t,domain:e.activeDomain.Domain}),o(t);const i=await e.onDonate(t,e.activeDomain);r?e.onClose():(s(!i),n("donate"))},c=()=>{e.logger.debug("Suppress button clicked"),n("goodbye")},u=()=>{e.logger.debug("Navigating back to main screen"),n("main")},p=t=>{e.logger.info("User chose to hide popup",{days:t}),e.onClose(t)};let m;return v=vt(),x=v.firstChild,"function"==typeof m?(f=m,A=x,h((()=>f(A,undefined)))):m=x,U(x,L(N,{get when(){return"main"===t()},get children(){return L(ut,{mainContainerRef:m,get checkoutPopupConf(){return e.checkoutPopupConf},get activeDomain(){return e.activeDomain},get merchantRates(){return e.merchantRates},onClose:a,onCharitySelect:l,onSuppress:c,get onOfferDetailsClick(){return e.onOfferDetailsClick},get logger(){return e.logger}})}}),null),U(x,L(N,{get when(){return"goodbye"===t()},get children(){return L(mt,{get checkoutPopupConf(){return e.checkoutPopupConf},onClose:()=>e.onClose(),onBack:u,onGoodbye:p,setScreen:n})}}),null),U(x,L(N,{get when(){return"donate"===t()},get children(){return L(At,{get checkoutPopupConf(){return e.checkoutPopupConf},get selectedCharity(){return r()},onClose:()=>e.onClose(),get failedDonation(){return i()},setScreen:n})}}),null),d((n=>{var r={...ne,height:xt(t(),e.checkoutPopupConf,ne.height)},o=e.elementId,i=re;return n.e=F(v,r,n.e),o!==n.t&&H(v,"id",n.t=o),n.a=F(x,i,n.a),n}),{e:void 0,t:void 0,a:void 0}),v;var f,A,v,x}function yt(e){const t=["",".asp",".aspx",".php",".js",".htm",".html"],n=["cart","checkout","shopping-bag","shopping-basket","shopping-cart","basket"].flatMap((e=>t.map((t=>e+t)))).filter((e=>"basket"!==e)),r=["tote-cart","tote.cart"],o=e,i=n.filter((e=>o.includes(e))),s=o.split("/");return!s.some((e=>r.some((t=>e.includes(t)))))&&(s.some((e=>n.some((t=>e.startsWith(t)||e.endsWith(t)))))||"basket"===s[s.length-1].toLowerCase()||i.length>1||1===i.length&&o.includes("shopping"))}function wt(e,t){const n=["book"];return e.split("/").some((e=>n.some((t=>e.startsWith(t)||e.endsWith(t)))))&&null!=t.evaluate("//*[self::h1 or self::h2 or self::h3 or self::h4 or self::h5 or self::h6][contains(., 'Your Reservation') or contains(., 'Your reservation')]",t,null,XPathResult.ANY_TYPE,null)?.iterateNext()}async function Ct(e){try{const t=await ee({type:ze,payload:{shopId:e}});return t.payload.found&&t.payload.domain?t.payload.domain:null}catch{return null}}function kt(e){try{const e=Array.from(document.querySelectorAll("script"));for(const t of e){if(t.dataset?.shopId&&(t.dataset?.shopId?.startsWith("gid")||t.src.includes("shopify"))){const e=parseInt(t.dataset.shopId.replace("gid://shopify/Shop/",""));if(!Number.isNaN(e)&&e>0)return e}const e=t.textContent||"";if(e.includes("ShopifyAnalytics")&&e.includes("shopId")){const t=e.match(/shopId['"]*:\s*['"]*(\d+)['"]*[,}]/);if(t&&t[1]){const e=parseInt(t[1]);if(!Number.isNaN(e)&&e>0)return e}}}const t=document.querySelector("[data-shop-id]");if(t instanceof HTMLElement){const{shopId:e}=t.dataset;if(e){const t=parseInt(e);if(!Number.isNaN(t)&&t>0)return t}}const n=window?.ShopifyAnalytics?.lib?.trekkie?.defaultAttributes?.shopId;return n&&parseInt(n)||0}catch(t){return e.error("Error accessing ShopifyAnalytics:",t),0}}function Pt(){try{if(!window.location.href.startsWith("https://shop.app"))return 0;const e=document?.head?.querySelector('meta[name="store"][content]');if(!e)return 0;try{const t=JSON.parse(e.content);return t?.id||0}catch{return 0}}catch{return 0}}const St=X.getInstance();function Tt(e,t,n){try{const r=function(e){try{const t=e.split(".");return t.length>=2?t.slice(-2).join("."):e}catch(e){return St.error("Error extracting domain",e),""}}(n);St.debug("Checking merchant regex rules",{currentDomain:r,currentUrl:t});const o=e.merchantPopupRules.filter((e=>r.includes(e.domain)));if(0===o.length)return St.debug("No matching merchant rules found for domain",{currentDomain:r}),!1;for(const e of o)for(const n of e.rules)try{if(new RegExp(n.rule).test(t))return St.debug("Merchant regex rule matched",{merchant:e.name,rule:n.rule,currentUrl:t}),!0}catch(t){St.error("Invalid regex in merchant rule",{merchant:e.name,rule:n.rule,error:t})}return St.debug("No matching regex rules found",{currentUrl:t}),!1}catch(e){return St.error("Error in merchantRegexRule",e),!1}}function Et(){const e=document.documentElement.lang,t=document.querySelector('meta[http-equiv="Content-Language"]')?.content,n=document.querySelector('link[rel="alternate"][hreflang]')?.getAttribute("hreflang"),r=navigator.language,o=e||t||n||r||"en";return"string"==typeof o?o.split("-")[0]:"en"}function Dt(e){return!0!==e.checkoutPopupOnlyShowLanguageMatch||"en"===Et()}const It=(e,t=!1)=>e.length<2&&t?null:Array.from(e).filter((e=>!t||e.dataset.extensionId!==Q.runtime.id)).map((e=>e.dataset.extensionName)).join(",");const Ot=e=>{const t=m((()=>({translate:e.translate()||(e=>""),getAllCharities:e.charities()||(()=>[])})));return L(Me.Provider,{value:t,get children(){return e.children}})},Mt=X.getInstance(),Lt="countryCode",Nt=async()=>await et.get(Lt)||(async()=>{Mt.debug("detecting country");const e={method:"GET",headers:{"Content-Type":"application/json",Authorization:"Basic OTEzOTkxOnFlYmpaWF9DOGNRY0lxSHA4WTVjNGxzU1pRSlM2VW9MMExzTF9tbWs="}};try{const t=await fetch("https://geoip.maxmind.com/geoip/v2.1/country/me",e);if(Mt.debug("Received geolocation response",{status:t.status}),!t.ok)return void Mt.error("Failed to get geolocation data",{status:t.status,statusText:t.statusText});const n=await t.json();if(!n)throw new Error("There was an error fetching geoip look up");return await et.set(Lt,n.country.iso_code),n.country.iso_code}catch(e){return void Mt.error("Failed to get geolocation data",{error:e})}})();var Rt=$("<div class=gf-app>");function $t(){const e=X.getInstance(),[t,n]=g(null),[r,o]=g(void 0),[i,s]=g(!1),[a,l]=g([]),[c,u]=g(),[d,p]=g({});f((async()=>{e.info("Mounting GfApp component");try{const i=await(async()=>{const e=await ee({type:Be,payload:{}});if(!e.payload.config)throw new Error("No checkout popup config found");return e.payload.config})();if(!i)return void e.error("No checkout popup config found");n(i),e.configure({enabled:!0,title:"Content - GfAdUnit",minLevel:i.checkoutPopupMinLogLevel??"error"}),function(e){if(!e?.shouldCheckSiteMatches)return;let t;(e?.siteMatchesRegex??[]).some((e=>{var n;return n=window.location.href,!(!new RegExp(e).test(n)||(t=e,0))}))&&t&&nt.trackEvent(z.checkoutPopupSiteMatches,{url:window.location.href,matchedRule:t,uts:Date.now()},!0)}(i);const a=Et();x(a);const c=tt();if(i.minVersion&&((e,t)=>{if(e===t)return!1;const n=e.split(".").map((e=>parseInt(e,10))),r=t.split(".").map((e=>parseInt(e,10)));for(let e=0;e<n.length;e++){if(n[e]<r[e])return!0;if(n[e]>r[e])return!1}return!1})(c,i.minVersion))return void e.debug(`Current version: ${c}. Minimum version ${i.minVersion} not met`);const u=await Nt()??"us",g=i.charities[u.toLowerCase()]??i.charities.us;if(p(g||{}),e.debug("Charities for current country",{currentCountry:u,charities:g}),!1===i.checkoutPopupMasterSwitch)return void e.debug("Checkout popup master switch is disabled");const d=document.getElementsByClassName("give-freely-root");let m=!1;d.length>1&&(e.debug("There is more than one gf extension installed"),d.item(0).dataset.extensionId!==Q.runtime.id&&(e.debug("Giving preference to the first gf extension injected in the DOM"),m=!0),e.debug("Providing this extension preference over the other installed extensions"));const{domain:h,rates:f}=await(async e=>{const{hostname:t}=window.location;e.debug("Checking if domain is active",{hostname:t});const n=await ee({type:je,payload:{hostname:t}});return n.payload.isActive?(e.debug("Active domain",{domain:n.payload.domain}),e.debug("Merchant rates",{rates:n.payload.rates}),e.info("Domain and rates ({})ed successfully."),{isActive:!0,domain:n.payload.domain,rates:n.payload.rates}):{isActive:!1,domain:void 0,rates:[]}})(e);if(l(f),o(h),h)await function(e,t){const n=kt(t)||Pt();return n>0&&function(e,t,n){if(e&&!(e<=0))try{ee({type:Ke,payload:{shopId:e,domain:t}}).catch((e=>{n.error("Error sending shop ID to background:",e)}))}catch(e){n.error("Error sending Shopify shop ID:",e)}}(n,e,t),n}(h,e);else{if("shop.app"!==window.location.hostname&&!window.location.hostname.endsWith(".shop.app"))return void s(!1);const t=window.location.pathname.split("/")[2];if(!t)return e.error("Shop ID not found"),void s(!1);const n=await Ct(parseInt(t));if(!n)return e.error("Shop domain not found"),void s(!1);e.debug("Shop domain found",{shopDomain:n}),o(n)}const A=await(async e=>{const t=await et.get("popup_hide");if(!t)return e.debug("No expiry found in storage"),!1;const{popupHide:n}=t,r=!!n&&Date.now()<n;return e.debug("Is AdUnit Muted?",{isMuted:r,expiry:n}),r})(e);if(A)return;if(!r())return void s(!1);const v=await(async(e,t)=>{const{Domain:n}=t,r=window.location.href,{payload:o}=await ee({type:We,payload:{activeDomain:n,url:r}});return!!o.result&&(e.info("Stand Down detected"),!0)})(e,r());if(v)return void s(!1);const b=t()?.anonymousActiveDomainLogging??!1,y=r()??void 0;y&&b&&!function(e){const t=`gfhv-${e}`;return!!sessionStorage.getItem(t)||(sessionStorage.setItem(t,"true"),!1)}(y.Domain)&&nt.trackEvent(z.checkoutPopupActiveDomain,{url:y.Domain});const w=setInterval((async()=>{e.debug("Checking checkout rules");const t=await(async e=>{const t=X.getInstance();t.configure({enabled:!0,title:"Content - checkoutRulesTest"});const n=new URL(globalThis.location.href),r=n.href,{hostname:o}=n;t.debug("Checking if popup should be shown",{currentUrl:r});const i=await async function(e){const t=kt(e)||Pt();return!("shop.app"!==window.location.hostname&&!window.location.hostname.endsWith(".shop.app")||!(t>0)||!await Ct(t))}(t),s=Dt(e)&&(yt(n.pathname.toLowerCase())||wt(r,document)||Tt(e,r,o)||i);return t.debug("Popup show decision based on rules",{shouldShow:s,matchesCartRule:yt(n.pathname.toLowerCase()),matchesBookingRule:wt(r,document),matchesShopPayRule:i,matchesMerchantRegexRule:Tt(e,r,o),matchesLanguageRule:Dt(e)}),s})(i);if(t&&m)return nt.trackEvent(z.checkoutPopupLooserExtension,{url:globalThis.window.location.href,winner:d.item(0).dataset.extensionName}),e.debug("Standing down because, another ad-unit extension will pop"),void clearInterval(w);s(t),t&&(e.debug("Should show popup based on checkout rules",{shouldShowResult:t}),nt.trackEvent(z.checkoutPopupShown,{url:globalThis.window.location.href,pageLanguage:a,looserCompetingExtensions:It(d,!0)}),clearInterval(w))}),2e3)}catch(t){s(!1),e.error("An error occurred in GfApp",{error:t})}}));const h=async(t,n)=>{e.info("Processing donation",{charity:t,domain:n.Domain});const r=await(async(e,t,n,r)=>{e.debug("Activating offer",{activeDomain:t,selectedCharity:r});const o=await te({type:Ve,payload:{activeDomain:t,originalUrl:n,selectedCharity:r}});return e.debug("Activate offer response",{response:o}),o})(e,n,window.location.href,{ein:t.ein,thirdPartyId:t.tpi});return e.debug("Activate offer response",{activationResponse:r}),nt.trackEvent(r.payload.response?z.checkoutPopupDonation:z.checkoutPopupFailedActivation,{activeDomain:n.Domain,url:globalThis.window.location.href,charity:{ein:t.ein,tpi:t.tpi},rate:n.Merchant.MaxRate}),r.payload.response},A=async t=>{s(await(async(e,t)=>{try{e.info("Hiding ad",{days:t});const n=await te({type:Ge,payload:{days:t??0}});return void 0!==t&&nt.trackEvent(z.checkoutPopupSupressed,{url:globalThis.window.location.href,days:t}),e.info("Hiding ad response",{hideResponse:n}),n.payload.ack?(e.debug("Ad hidden successfully"),!1):(e.warn("Failed to hide ad"),!0)}catch{return!1}})(e,t))},v=async e=>{nt.trackEvent(z.checkoutPopupOfferDetailsClicked,{action:e?"opened":"closed"})},x=async t=>{e.debug("Getting translation provider",{currentLanguage:t});const{translations:n,charities:r}=await async function(e,t){try{t&&t.debug("Getting language content",{languageCode:e});const n=await ee({type:qe,payload:{lang:e}});return{translations:n.payload.translations,charities:n.payload.charities}}catch(n){return t&&t.error("Error getting language content",{error:n,languageCode:e}),{translations:null,charities:null}}}(t,e),o={translate:e=>n&&n[e]?n[e]:"",getAllCharities:()=>{const e=d();return Object.entries(e).map((([e,t])=>{const{ein:n}=t;try{const o=r?.[n];if(!o)throw new Error(`Failed to find charity metadata for ein ${n}`);return{ein:n,tpi:o.tpi,title:o.title,order:parseInt(e,10),logo:o.logo,decorator:t.decorator,decoratorLeftStyle:t.decoratorLeftStyle,decoratorRightStyle:t.decoratorRightStyle}}catch{return{ein:n,tpi:"",title:"",order:9,logo:""}}}))}};e.debug("Setting content provider with translations and charity functions"),u((()=>o))};return L(Ot,{translate:()=>c()?.translate,charities:()=>c()?.getAllCharities,get children(){var n,o=Rt();return U(o,(n=m((()=>!(!r()||!i()))),()=>n()&&L(bt,{get checkoutPopupConf(){return t()},elementId:"give-freely-checkout-popup",get activeDomain(){return r()},get merchantRates(){return a()},onClose:A,onDonate:h,onOfferDetailsClick:v,logger:e}))),o}})}async function _t(){const e=`give-freely-root-${Q.runtime.id}`;if(document.getElementById(e))return;const t=document.createElement("div");t.id=e,t.className="give-freely-root",t.style.display="block",t.dataset.extensionId=Q.runtime.id,t.dataset.extensionName=Q.runtime.getManifest().name||Q.runtime.id,document.body.appendChild(t);const n=t.attachShadow({mode:"open"}),r=document.createElement("div"),s=document.createElement("style");s.textContent='\n :host {\n all: initial;\n }\n\n .gf-scroll-remove::-webkit-scrollbar {\n border-radius-bottom-right: 15px;\n }\n\n button {\n cursor: pointer;\n transition: transform 0.1s ease;\n }\n\n button:active {\n transform: scale(0.98);\n }\n\n .give-freely-close-button:hover {\n opacity: 0.7;\n }\n\n input[type="radio"] {\n margin-right: 8px;\n }\n\n hr {\n border: none;\n border-top: 1px solid #e5e5e5;\n margin: 1em 0;\n }\n\n @media (max-width: 600px), (max-height: 480px) {\n #give-freely-checkout-popup {\n display: none !important;\n }\n }\n',n.appendChild(s),n.appendChild(r),function(e,t,n,r={}){let s;(function(e,t){const n=a,r=i,s=0===e.length,l=void 0===t?r:t,c=s?o:{owned:null,cleanups:null,context:l?l.context:null,owner:l},u=s?e:()=>e((()=>h((()=>D(c)))));i=c,a=null;try{return k(u,!0)}finally{a=n,i=r}})((r=>{s=r,t===document?e():U(t,e(),t.firstChild?null:void 0,n)}),r.owner)}((()=>L($t,{})),r)}export{Q as browser,_t as initializeAdUnit};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@givefreely/adunit",
3
- "version": "1.9.0-dev.0",
3
+ "version": "1.9.2-dev.0",
4
4
  "description": "AdUnit module",
5
5
  "main": "./GiveFreely-content.cjs",
6
6
  "module": "./GiveFreely-content.esm",