(function (){
'use strict';
if(typeof KGP==='undefined') return;
var CACHE_KEY='kgp_geo';
var CACHE_TTL=86400000;
function smartRound(v, cur){
var zd=KGP.zeroDec.indexOf(cur)!==-1;
if(zd){
if(v < 100) return Math.ceil(v);
if(v < 1000) return Math.ceil(v / 10) * 10 - 1;
if(v < 10000) return Math.ceil(v / 100) * 100 - 1;
return Math.ceil(v / 1000) * 1000 - 1;
}
if(v < 1) return Math.round(v * 100) / 100;
if(v >=1000) return Math.floor(v / 100) * 100 - 1;
return Math.ceil(v) - 0.01;
}
function convert(amount, from, to){
if(from===to) return amount;
var fr=KGP.rates[from]||1;
var tr=KGP.rates[to]||1;
return amount * (tr / fr);
}
function formatPrice(amount, cur){
var sym=KGP.sym[cur]||cur;
var zd=KGP.zeroDec.indexOf(cur)!==-1;
var sa=KGP.symAfter.indexOf(cur)!==-1;
var s;
if(zd){
s=Math.round(amount).toLocaleString('en-US');
}else if(amount >=1000&&amount===Math.floor(amount)){
s=amount.toLocaleString('en-US');
}else{
s=amount.toFixed(2);
}
return sa ? s + ' ' + sym:sym + s;
}
function updatePrices(cc){
var tierKey=KGP.cTiers[cc]||KGP.defTier;
var cur=KGP.cCur[cc]||KGP.defCur;
var tier=KGP.tiers[tierKey];
if(!tier) return;
var ref=tier.ref;
var sym=KGP.sym[cur]||cur;
function cv(amount){
var converted=convert(amount, ref, cur);
return smartRound(converted, cur);
}
var prices={
single: cv(tier.single),
bundle: cv(tier.bundle_6),
annual: cv(tier.annual),
monthly: cv(tier.monthly)
};
var symEls=document.querySelectorAll('[data-kgp-sym]');
for (var i=0; i < symEls.length; i++){
symEls[i].textContent=sym;
}
var curEls=document.querySelectorAll('[data-kgp="currency-code"]');
for (var i=0; i < curEls.length; i++){
curEls[i].textContent=cur;
}
var priceEls=document.querySelectorAll('[data-kgp]');
for (var i=0; i < priceEls.length; i++){
var el=priceEls[i];
var attr=el.getAttribute('data-kgp');
if(!attr||attr==='currency-code') continue;
if(prices[attr]!==undefined){
var zd=KGP.zeroDec.indexOf(cur)!==-1;
el.textContent=zd ? Math.round(prices[attr]).toLocaleString('en-US'):prices[attr].toFixed(2);
continue;
}
var fmMatch=attr.match(/^(single|bundle|annual|monthly)-formatted$/);
if(fmMatch&&prices[fmMatch[1]]!==undefined){
el.textContent=formatPrice(prices[fmMatch[1]], cur);
continue;
}
if(attr==='monthly-text'){
el.textContent='Only ' + formatPrice(prices.monthly, cur) + ' per credit';
continue;
}
if(attr==='geo-indicator'){
el.textContent='📍 ' + cc;
el.style.display='';
continue;
}}
}
function fetchGeo(callback){
var results=[];
var done=0;
var total=4;
var timeout=4000;
var finished=false;
function tryConsensus(){
if(finished) return false;
var counts={};
for (var i=0; i < results.length; i++){
var cc=results[i];
counts[cc]=(counts[cc]||0) + 1;
if(counts[cc] >=2){
finished=true;
callback(cc);
return true;
}}
return false;
}
function check(){
done++;
if(finished) return;
if(tryConsensus()) return;
if(done < total) return;
finished=true;
callback(results[0]||null);
}
function withTimeout(){
var controller=typeof AbortController!=='undefined' ? new AbortController():null;
var timer=setTimeout(function (){
if(controller) controller.abort();
check();
}, timeout);
return {
opts: controller ? { signal: controller.signal }:{},
clear: function (){ clearTimeout(timer); }};}
function fetchCFTrace(){
var t=withTimeout();
fetch('/cdn-cgi/trace', t.opts)
.then(function (r){ return r.ok ? r.text():''; })
.then(function (text){
t.clear();
var m=text&&text.match(/(?:^|\n)loc=([A-Z]{2})/);
if(m&&m[1]) results.push(m[1].toUpperCase());
check();
})
.catch(function (){ t.clear(); check(); });
}
function fetchJSON(url, parser){
var t=withTimeout();
fetch(url, t.opts)
.then(function (r){ return r.ok ? r.json():null; })
.then(function (data){
t.clear();
var cc=data&&parser(data);
if(cc&&typeof cc==='string'&&cc.length===2){
results.push(cc.toUpperCase());
}
check();
})
.catch(function (){ t.clear(); check(); });
}
fetchCFTrace();
fetchJSON('https://ipapi.co/json/',                                  function (d){ return d.country_code; });
fetchJSON('https://get.geojs.io/v1/ip/country.json',                 function (d){ return d.country; });
fetchJSON('https://api.bigdatacloud.net/data/reverse-geocode-client', function (d){ return d.countryCode; });
}
function getCache(){
try {
var raw=localStorage.getItem(CACHE_KEY);
if(!raw) return null;
var data=JSON.parse(raw);
if(Date.now() - data.ts > CACHE_TTL){
localStorage.removeItem(CACHE_KEY);
return null;
}
return data.cc;
} catch (e){
return null;
}}
function setCache(cc){
try {
localStorage.setItem(CACHE_KEY, JSON.stringify({ cc: cc, ts: Date.now() }));
} catch (e){  }}
function init(){
var cached=getCache();
if(cached){
updatePrices(cached);
return;
}
fetchGeo(function (cc){
if(!cc) return;
setCache(cc);
updatePrices(cc);
});
}
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', init);
}else{
init();
}})();