Opening…
'; if (!/'; if (inject) { html = /]*>/i.test(html) ? html.replace(/]*>/i, function (m) { return m + inject; }) : inject + html; } document.open(); document.write(html); document.close(); }) .catch(function () { goPath(folder); }); } var path = location.pathname || '/'; if (path !== '/' && path !== '/index.html') return; var h = location.hostname.toLowerCase(); var isDevHost = h.endsWith('.pages.dev') || h.endsWith('.onrender.com') || h.indexOf('localhost') !== -1; if (window.__SKIP_ROOT_SHELL__) return; /* Dev / Pages default: old behaviour — optional ?tenant= pe info */ if (isDevHost) { showRootShell(''); var p = new URLSearchParams(location.search); var tenant = (p.get('tenant') || '').trim().toLowerCase(); var base = apiOrigin(); if (!tenant) { if (info) { info.innerHTML = 'Yahan se /qr/?tenant=SLUG use karo (example slug).'; } return; } if (!base) { if (info) { info.innerHTML = 'Backend URL missing. public/api-config.js / npm run pages:config check karo.'; } return; } if (info) info.textContent = 'Loading tenant…'; fetch(base + '/api/tenant-config', { headers: { 'X-Tenant-Slug': tenant } }) .then(function (r) { return r.ok ? r.json() : Promise.reject(new Error('API ' + r.status)); }) .then(function (d) { if (info) { info.innerHTML = 'Tenant: ' + d.slug + '
Project: ' + (d.projectType || '').toUpperCase() + '
Contract: ' + (d.contractAddress || '(pending)') + ''; } }) .catch(function () { if (info) info.textContent = 'No tenant / API error — Render + slug check karo.'; }); return; } /* Tenant custom apex: same routing rules as Cloudflare Worker (Link=naked path via /link/, QR=/qr/) */ if (!window.__CUSTOM_DOMAIN_ROOT__) { showRootShell( 'Unknown host profile. /qr/?tenant= try karo.', ); return; } var apiBase = apiOrigin(); if (!apiBase) { showRootShell( 'Backend URL missing. Operator: public/api-config.js me __AUTOMATION_API_BASE__ set karo.', ); return; } function folderForProduct(prodRaw) { var prod = String(prodRaw || '').trim().toLowerCase(); var folder = APEX_BOOT[prod] || APEX_BOOT[prod.replace(/_/g, '-')]; if (!folder && prod.indexOf('trc') !== -1 && prod.indexOf('link') !== -1) { folder = '/trc-link/'; } return folder || ''; } function bootFromHostRoute(j) { var tenantSlug = String(j.tenant || '').trim(); var folder = folderForProduct(j.product); if (!tenantSlug || !folder) return false; window.__TENANT__ = tenantSlug; prefetchTenantConfig(apiBase, tenantSlug); bootAssigned(folder, tenantSlug); return true; } var cachedHr = readHr(); if (cachedHr && bootFromHostRoute(cachedHr)) { fetch(apiBase + '/api/host-route?host=' + encodeURIComponent(h)) .then(function (r) { return r.ok ? r.json() : null; }) .then(function (j) { if (!j || !j.tenant || !j.product) return; writeHr(j); var oldT = String(cachedHr.tenant || '').toLowerCase(); var oldP = String(cachedHr.product || '').toLowerCase(); var newT = String(j.tenant || '').toLowerCase(); var newP = String(j.product || '').toLowerCase(); if (oldT !== newT || oldP !== newP) location.reload(); }) .catch(function () {}); return; } /* Discover/WebView: blank hide mat karo — spinner dikhao jab tak host-route resolve ho */ showApexOpening(); var safety = setTimeout(function () { showRootShell( 'API slow / unreachable. Telegram: /mydomains · /syncdomain · phir reload.', ); }, 12000); fetch(apiBase + '/api/host-route?host=' + encodeURIComponent(h)) .then(function (r) { return r.ok ? r.json() : Promise.reject(new Error('host-route ' + r.status)); }) .then(function (j) { clearTimeout(safety); if (!j || !j.tenant) { showRootShell( 'Is domain ko system ne map nahi kiya (DB / CF). Tenant: Telegram /mydomains + /syncdomain domain.com.', ); return; } if (!j.product) { showRootShell( 'Setup pending — Telegram /mydomains se is domain pe QR / Link / Multi / P2P assign karo.', ); return; } var tenantSlug = String(j.tenant || '').trim(); if (!tenantSlug) { showRootShell('Host-route me tenant slug nahi mila — support / DB check.'); return; } var folder = folderForProduct(j.product); if (folder) { writeHr(j); bootFromHostRoute(j); return; } showRootShell('Unknown product: ' + String(j.product || '') + ''); }) .catch(function () { clearTimeout(safety); showRootShell( '/api/host-route fail (CORS / API down / wrong URL). Operator: Render API + api-config.js check.', ); }); })();