Add the printable 48-Hour Fast Start sheet

/fast-start: one-page checklist that personalizes with the member's
ID, invite link, and a scannable QR of /join/<id> when opened from
their dashboard (or with ?id=). Print stylesheet flips it to clean
black-on-white letter format; floating translate/chat widgets are
now excluded from printing on every page. Dashboard share card
links to it; chatbot + AI prompt synced.
This commit is contained in:
martbost
2026-08-21 12:08:05 -05:00
parent 75863ad581
commit d936093c56
7 changed files with 135 additions and 4 deletions
+2
View File
@@ -34,6 +34,8 @@
a:()=>`Great question — and we checked it on-chain, not just in theory. The contract needs <strong>no one</strong> to keep it running: joins, upgrades, placement and every payout are fully automatic — no button anyone has to press, no expiry. If the creators walked away, lost their keys, or vanished, member payments keep flowing exactly as coded. We also verified that the founder, development and fee wallets are <strong>ordinary wallets, not programs</strong> — an ordinary wallet always accepts an incoming payment even if its key is lost forever, so a dead admin wallet can't jam a single member payment (at worst the project's <em>own</em> fee sits there uncollected). And the contract holds no stored balance — every payment is delivered in the same transaction. Full write-up in section 6 of <a href="/contract">rmcircle.team/contract</a>.`},
{k:['pyramid','ponzi','pyramid scheme','ponzi scheme','mlm','recruiting scheme','is this a scheme'],
a:()=>`A pyramid or Ponzi scheme funnels everyone's money to a central company and pays earlier joiners out of later joiners' deposits — and you can't verify any of it. This is the opposite: <strong>no company holds the money</strong>. A public smart contract on Polygon sends each payment person-to-person in the same transaction it arrives, and you can read the code and every payout yourself on-chain — nothing pooled, nothing hidden, rules that can't be changed. It <em>is</em> a team build, so it takes real effort and carries real crypto risk — not a passive investment. But you don't have to trust anyone; verify it at <a href="/contract">rmcircle.team/contract</a>. No income is guaranteed.`},
{k:['fast start','checklist','printable','print','48 hour','48-hour','getting started sheet'],
a:()=>`Grab the <a href="/fast-start">48-Hour Fast Start sheet</a> — a printable one-page checklist for your first two days. Open it from YOUR dashboard and it comes pre-filled with your invite link and a scannable QR code, then hit the print button (it prints clean black-on-white, in whatever language you've picked with the 🌐 button).`},
{k:['translate','translation','language','español','espanol','spanish','french','portuguese','not in english','other language'],
a:()=>`Tap the 🌐 Translate button in the bottom-left corner of any page — pick your language once and every page stays translated while you browse. Your phone's browser also usually offers its own "Translate page" option. And you can type to me here in ANY language — I'll answer in yours.`},
{k:['how many people','team size','organization size','org size','how big is my team','total team','people in my team','members below'],
+102
View File
@@ -0,0 +1,102 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="robots" content="noindex"><meta name="description" content="Your RM Circle 48-hour fast start — the printable checklist with your personal invite link and QR code."><title>48-Hour Fast Start | RM Circle Team Build</title><link rel="icon" type="image/png" href="/favicon.png"><link rel="stylesheet" href="/styles.css">
<style>
.fs-wrap{max-width:820px;margin:0 auto;padding:24px 20px 60px}
.fs-sheet{background:var(--card,#0d2236);border:1px solid var(--line,#24425d);border-radius:18px;padding:28px 30px}
.fs-sheet h1{font-size:30px;margin:0 0 2px}
.fs-sheet .tag{color:var(--muted,#aebdca);margin:0 0 18px;font-weight:600}
.fs-box{border:2px solid var(--gold,#f3be43);border-radius:14px;padding:16px 18px;margin:0 0 20px;display:flex;gap:18px;align-items:center;flex-wrap:wrap}
.fs-box .nums{flex:1;min-width:230px;font-size:15px;line-height:2}
.fs-box .nums b{color:var(--gold,#f3be43)}
.fs-qr{background:#fff;border-radius:12px;padding:8px;line-height:0;width:132px;height:132px;flex:0 0 auto}
.fs-qr svg{width:100%;height:100%}
.fs-sec{margin:20px 0 0}
.fs-sec h2{font-size:19px;margin:0 0 8px;border-bottom:1px solid var(--line,#24425d);padding-bottom:6px}
.fs-item{display:flex;gap:10px;align-items:flex-start;margin:7px 0;font-size:15px;line-height:1.45}
.fs-item .cb{width:16px;height:16px;border:2px solid var(--gold,#f3be43);border-radius:4px;flex:0 0 auto;margin-top:2px}
.fs-blanks{display:grid;grid-template-columns:1fr 1fr;gap:4px 18px;margin:8px 0 0 26px;font-size:14px;color:var(--muted,#aebdca)}
.fs-blank{border-bottom:1px solid var(--line,#24425d);padding:6px 2px 2px}
.fs-foot{margin-top:22px;padding-top:12px;border-top:1px solid var(--line,#24425d);font-size:13px;color:var(--muted,#aebdca);line-height:1.6}
.fs-foot b{color:var(--text,#f7f9fc)}
.fs-print-btn{margin:18px 0 0}
@media print{
@page{size:letter;margin:0.55in}
body{background:#fff!important;color:#111!important}
header,footer,nav,#fsPrintBtn,#rmcTrBtn,#rmcTrPanel,.chat-fab,.chat-panel{display:none!important}
.fs-wrap{max-width:none;padding:0}
.fs-sheet{background:#fff;border:0;border-radius:0;padding:0;color:#111}
.fs-sheet h1,.fs-sec h2{color:#111}
.fs-sheet .tag,.fs-blanks,.fs-foot{color:#444}
.fs-box{border-color:#111}
.fs-box .nums b{color:#111}
.fs-item .cb{border-color:#111}
.fs-sec h2,.fs-blank,.fs-foot{border-color:#bbb}
.gold{color:#111!important}
.fs-item{page-break-inside:avoid}
}
</style></head>
<body>
<div class="fs-wrap">
<div class="fs-sheet">
<h1>⚡ RM Circle 48-Hour Fast Start</h1>
<p class="tag">Print this. Stick it on the fridge. Check the boxes.</p>
<div class="fs-box">
<div class="nums">
<div>My position ID: <b id="fsId">#______</b></div>
<div>My invite link: <b id="fsLink">rmcircle.team/join/______</b></div>
<div>Team Telegram: <b>t.me/cryptoteambuild</b></div>
<div id="fsQrHint">Scan the code → my personal page</div>
</div>
<div class="fs-qr" id="fsQr"></div>
</div>
<div class="fs-sec"><h2>☐ Hour One — Lock it in</h2>
<div class="fs-item"><span class="cb"></span><span>Open your dashboard (rmcircle.team/my) and bookmark it on your phone</span></div>
<div class="fs-item"><span class="cb"></span><span>Find your invite link on the dashboard — send it to yourself so it's always one copy-paste away</span></div>
<div class="fs-item"><span class="cb"></span><span>Sign in to Messages on your dashboard (free wallet signature) and say hello to your sponsor</span></div>
<div class="fs-item"><span class="cb"></span><span>Join the team Telegram — say hi, that's it</span></div>
</div>
<div class="fs-sec"><h2>☐ Day One — Learn the machine (about 30 minutes)</h2>
<div class="fs-item"><span class="cb"></span><span>Watch the Team Overview video (Training page, Video 1)</span></div>
<div class="fs-item"><span class="cb"></span><span>Watch How Payments Work — so you can say "every payment is public" and mean it</span></div>
<div class="fs-item"><span class="cb"></span><span>Open your Pipeline panel and look at it — this is your scoreboard from now on</span></div>
<div class="fs-item"><span class="cb"></span><span>Open the Promo Tools page FROM your dashboard — everything arrives pre-loaded with YOUR link</span></div>
</div>
<div class="fs-sec"><h2>☐ Day One — First shares (before you feel ready)</h2>
<div class="fs-item"><span class="cb"></span><span>Write your list of 10 curious people (curious — not desperate, not "needs convincing")</span></div>
<div class="fs-blanks">
<span class="fs-blank">1.</span><span class="fs-blank">2.</span>
<span class="fs-blank">3.</span><span class="fs-blank">4.</span>
<span class="fs-blank">5.</span><span class="fs-blank">6.</span>
<span class="fs-blank">7.</span><span class="fs-blank">8.</span>
<span class="fs-blank">9.</span><span class="fs-blank">10.</span>
</div>
<div class="fs-item" style="margin-top:10px"><span class="cb"></span><span>Send the "$27" video (or the one that hooked YOU) to your first 3 people — one at a time, never a group blast</span></div>
<div class="fs-item"><span class="cb"></span><span>Use the ready-made message from Promo Tools — tweak one word so it sounds like you</span></div>
<div class="fs-item"><span class="cb"></span><span>Then stop typing. Send the link and let it work.</span></div>
</div>
<div class="fs-sec"><h2>☐ Day Two — Follow up + set the rhythm</h2>
<div class="fs-item"><span class="cb"></span><span>Follow up with your 3: "Did you get a chance to watch it? What did you think?" (opinion, not pressure)</span></div>
<div class="fs-item"><span class="cb"></span><span>Send to 3 more people from your list</span></div>
<div class="fs-item"><span class="cb"></span><span>Show someone the QR code on this sheet — let one person scan it just to see it work</span></div>
<div class="fs-item"><span class="cb"></span><span>Put 20 minutes in your calendar, same time every week: check pipeline → message one mover → share one video</span></div>
<div class="fs-item"><span class="cb"></span><span>Message your sponsor: "First 48 done. Who can I help?"</span></div>
</div>
<div class="fs-foot">
<b>The only goal that matters this week: two curious people looking at a short video.</b><br>
Get your 2. Help your 2 get theirs. The team helps them do the same.<br>
Real effort, real crypto, no guarantees — never use money you can't afford to lose.<br>
Questions any hour of the day: the chat bubble on rmcircle.team speaks your language.
</div>
</div>
<div class="fs-print-btn"><button id="fsPrintBtn" class="btn btn-gold" style="font-size:16px;padding:12px 22px">🖨️ Print my Fast Start sheet</button>
<a href="/my" class="btn btn-secondary" style="margin-left:8px">← Back to my dashboard</a></div>
</div>
<script src="/qrlib.js"></script>
<script src="/fast-start.js"></script>
<script src="/chat.js" defer></script>
<script src="/translate.js" defer></script></body></html>
+25
View File
@@ -0,0 +1,25 @@
// Personalize the printable Fast Start sheet: member ID from ?id= or the
// dashboard's saved ID, invite link + high-res QR of /join/<id> (the moving
// link — scans route to the member's page and self-rotate like the share card).
(function(){
function getId(){
var q=new URLSearchParams(location.search).get('id');
if(q&&/^\d+$/.test(q))return q;
try{var s=localStorage.getItem('ctb.myId');if(s&&/^\d+$/.test(s))return s;}catch(e){}
return '';
}
var id=getId();
if(!id)return; // blank sheet still prints fine with fill-in-by-hand blanks
var link='rmcircle.team/join/'+id;
var el=document.getElementById('fsId'); if(el)el.textContent='#'+id;
el=document.getElementById('fsLink'); if(el)el.textContent=link;
var qr=document.getElementById('fsQr');
if(qr&&typeof qrcode==='function'){
try{
var q=qrcode(0,'M');q.addData('https://'+link);q.make();
qr.innerHTML=q.createSvgTag({cellSize:4,margin:2,scalable:true});
}catch(e){}
}
var btn=document.getElementById('fsPrintBtn');
if(btn)btn.addEventListener('click',function(){window.print();});
})();
+1 -1
View File
@@ -22,7 +22,7 @@
<div id="dCoachCard" class="table-card" style="margin-bottom:18px;display:none;border-color:rgba(240,197,109,.35)"><h2 style="margin:0 0 4px">Coach your team</h2><p style="color:var(--muted);font-size:13px;margin:0 0 12px">The fastest way to grow your own income is helping the people below you take their next step. Here's who in <em>your</em> team could use a nudge today — updated live from the blockchain.</p><div id="dCoach"></div></div>
<div class="table-card" style="margin-bottom:18px;border-color:rgba(120,160,255,.35)"><h2 style="margin:0 0 4px">Messages <span id="msgBell" class="hidden" style="font-size:14px;background:var(--gold);color:#132;border-radius:20px;padding:2px 10px;vertical-align:middle;font-weight:800">🔔 0</span></h2><p style="color:var(--muted);font-size:13px;margin:0 0 12px">Wallet-verified messaging along your matrix lines — your upline and your team can reach you here, and you can reach them. No email needed; your wallet is your identity. <span class="micro">Messages are member-to-member; the team admin can review them for abuse.</span></p><div id="dMsg"><div class="empty">Loading…</div></div></div>
<div class="table-card" style="margin-bottom:18px;border-color:rgba(78,214,203,.35)"><h2 style="margin:0 0 4px">Email me my alerts</h2><p style="color:var(--muted);font-size:13px;margin:0 0 12px">Get an email the moment this position is <strong>paid</strong>, and when it <strong>needs an upgrade</strong> to catch incoming pay — so you never miss one. Opt in with your email; unsubscribe anytime.</p><div id="dAlerts"></div></div>
<div class="table-card" style="margin-bottom:18px;border-color:rgba(240,197,109,.45)"><h2 style="margin:0 0 4px">Share this position</h2><div id="dShare"></div><a class="btn btn-primary" href="/tools" style="display:block;text-align:center;margin-top:14px;padding:14px 18px;font-size:16px;font-weight:800">🎬 Get Your Promo Tools — posts, swipes, videos &amp; banners →</a><p class="micro" style="text-align:center;margin:8px 0 0">Ready-made content to share with your invite link — no writing needed.</p></div>
<div class="table-card" style="margin-bottom:18px;border-color:rgba(240,197,109,.45)"><h2 style="margin:0 0 4px">Share this position</h2><div id="dShare"></div><a class="btn btn-primary" href="/tools" style="display:block;text-align:center;margin-top:14px;padding:14px 18px;font-size:16px;font-weight:800">🎬 Get Your Promo Tools — posts, swipes, videos &amp; banners →</a><a class="btn btn-secondary" href="/fast-start" style="display:block;text-align:center;margin-top:8px">🖨️ Print your 48-Hour Fast Start sheet</a><p class="micro" style="text-align:center;margin:8px 0 0">Ready-made content to share with your invite link — no writing needed.</p></div>
<div class="table-card" style="margin-bottom:18px;border-color:var(--gold)"><h2 style="margin:0 0 4px">Just joined under this position?</h2><p style="color:var(--muted);font-size:13px;margin:0 0 12px">Welcome to the team! Enter the <strong>new member ID</strong> the RM Circle dApp gave you — we'll verify it on the blockchain and let the team know you're in.</p><form id="dJoinForm" style="display:grid;gap:8px;max-width:480px"><input name="newId" class="input" inputmode="numeric" pattern="[0-9]{1,10}" maxlength="10" placeholder="Your NEW RM Circle ID (numbers only)" required><input name="memberName" class="input" maxlength="60" placeholder="Your name or Telegram @handle" required><button class="btn btn-primary">Submit My ID →</button></form><div id="dJoinMsg" style="margin-top:10px;font-size:14px"></div></div>
<div class="table-card" style="margin-bottom:18px"><h2 style="margin:0 0 4px">Payments received</h2><p style="color:var(--muted);font-size:13px;margin:0 0 10px">Every payment your position has received, straight from the smart contract.</p><div id="dIncome"></div></div>
<div class="table-card"><h2 style="margin:0 0 4px">Your lineage</h2><p id="dLineage" style="color:var(--muted);font-size:14px;line-height:1.8;margin:8px 0 0"></p></div>
+1
View File
@@ -114,6 +114,7 @@
document.getElementById('dTitle').textContent='#'+d.id;
// hand the member's id to the tools page so every promo asset arrives pre-personalized
document.querySelectorAll('a[href="/tools"]').forEach(function(a){a.href='/tools?id='+d.id;});
document.querySelectorAll('a[href="/fast-start"]').forEach(function(a){a.href='/fast-start?id='+d.id;});
const qb=document.getElementById('dQualified');
if(qb)qb.outerHTML=d.directCount>=2
?'<span id="dQualified" class="q-badge q-yes">★ Qualified</span>'
+2 -1
View File
@@ -19,7 +19,8 @@
'#rmcTrPanel button{display:block;width:100%;text-align:left;background:none;border:none;color:#f7f9fc;'+
'padding:8px 10px;border-radius:8px;font:600 14px/1 Inter,system-ui,sans-serif;cursor:pointer}'+
'#rmcTrPanel button:hover{background:#123049}'+
'#rmcTrPanel button.on{background:#123049;color:#4ed6cb}';
'#rmcTrPanel button.on{background:#123049;color:#4ed6cb}'+
'@media print{#rmcTrBtn,#rmcTrPanel,.chat-fab,.chat-panel{display:none!important}}';
var lang=null;
try{ lang=localStorage.getItem('rmc.lang')||null; }catch(e){}
var cacheKey=function(){ return 'rmc.tr.'+lang; };
+2 -2
View File
@@ -46,7 +46,7 @@ FACTS:
- MEMBER DASHBOARD & ALERTS: each member has a live dashboard at https://rmcircle.team/my (enter your ID) showing position, team, payments, pipeline (incoming money forming below), a team-depth summary (members per generation below you and which level's upgrade each generation pays you at), a "Coach Your Team" panel (who in YOUR leg needs a nudge — qualified-but-not-upgraded members sitting on entry rewards, members about to miss forming payments, members one direct from qualifying), spillover tags, and qualification badges. Members can turn on opt-in EMAIL ALERTS there (notified when paid, and when they need to upgrade to catch incoming pay). A member's personal invite page to share is https://rmcircle.team/join/<their-id>.
- RESILIENCE ("what if the creators disappear / owner loses keys / it falls apart over time"): the contract is autonomous and immutable — NO admin action, heartbeat, or living operator is required for joins, upgrades, matrix placement, or payouts; there is no pause switch and no expiry. Verified on-chain that the founder, development, and fee-receiver wallets are ordinary wallets (EOAs), NOT smart contracts — an ordinary wallet always accepts incoming POL even if its key is lost forever, so a dead or abandoned admin wallet cannot block any member payment (only the project's OWN uncollected fee would sit idle). The contract stores no balance (every payment is delivered in the same transaction). If the owner's key were lost, only the four limited admin powers freeze in place; members are unaffected. Details in section 6 of https://rmcircle.team/contract.
- Current team sponsor: ${a ? `ID ${a.id}${c.showSponsorName && a.name ? ` (${a.name})` : ''}, ${a.directs}/2 directs` : 'shown on the start page'}. ${waiting} placement(s) waiting. Placements rotate as positions qualify — always verify on https://rmcircle.team/start right before joining.
- Site pages: https://rmcircle.team/ (strategy overview + roadmap + live team stats), https://rmcircle.team/start (current sponsor + join steps), https://rmcircle.team/training (7 videos — team overview, wallet setup, funding, the new connect-wallet join flow on the site, the dApp backup method, how payments work, and a full 14-min Member Dashboard walkthrough — + spillover article), https://rmcircle.team/how-pay-works (the two income streams shown as a pay-flow diagram + Premium/Standard tier comparison), https://rmcircle.team/contract (plain-language security review of the verified smart contract — code can't change, no pooled funds, locked rules, honest list of operator powers), https://rmcircle.team/my (member dashboard — its "Your team" panel opens with an organization bar: total members in your org, generations deep, qualified count below you, POL earned below you, and its approximate USD value at an hourly-cached POL price; the matrix under it drills leg by leg), https://rmcircle.team/tools (for existing team members who want to promote — share-ready promo videos (including the “$27” curiosity hook video — 25 ways people burn $27 with nothing to show for it, then the side-hustle flip; it deliberately shows no URL so the poster's invite link in the caption/description carries the credit, and matching $27-angle post copy sits in the Social posts section), copy-paste social posts, short/long email swipes, a downloadable banner kit in every standard size, and an Official RM Circle Media library (13 vertical social videos + 15 graphics from the creators — pair them with your own invite link in the caption); open it from the gold Promo Tools button on your dashboard and every post/swipe arrives pre-personalized with YOUR invite link; to write promos in their own voice, mybrandedvoice.com), https://rmcircle.team/disclaimer (affiliate/earnings/risk disclosures).
- Site pages: https://rmcircle.team/ (strategy overview + roadmap + live team stats), https://rmcircle.team/start (current sponsor + join steps), https://rmcircle.team/training (7 videos — team overview, wallet setup, funding, the new connect-wallet join flow on the site, the dApp backup method, how payments work, and a full 14-min Member Dashboard walkthrough — + spillover article), https://rmcircle.team/how-pay-works (the two income streams shown as a pay-flow diagram + Premium/Standard tier comparison), https://rmcircle.team/contract (plain-language security review of the verified smart contract — code can't change, no pooled funds, locked rules, honest list of operator powers), https://rmcircle.team/fast-start (printable 48-Hour Fast Start checklist — personalized with the member's invite link and a scannable QR code when opened from their dashboard; prints clean black-on-white, and prints in whatever language the member selected with the 🌐 button), https://rmcircle.team/my (member dashboard — its "Your team" panel opens with an organization bar: total members in your org, generations deep, qualified count below you, POL earned below you, and its approximate USD value at an hourly-cached POL price; the matrix under it drills leg by leg), https://rmcircle.team/tools (for existing team members who want to promote — share-ready promo videos (including the “$27” curiosity hook video — 25 ways people burn $27 with nothing to show for it, then the side-hustle flip; it deliberately shows no URL so the poster's invite link in the caption/description carries the credit, and matching $27-angle post copy sits in the Social posts section), copy-paste social posts, short/long email swipes, a downloadable banner kit in every standard size, and an Official RM Circle Media library (13 vertical social videos + 15 graphics from the creators — pair them with your own invite link in the caption); open it from the gold Promo Tools button on your dashboard and every post/swipe arrives pre-personalized with YOUR invite link; to write promos in their own voice, mybrandedvoice.com), https://rmcircle.team/disclaimer (affiliate/earnings/risk disclosures).
- UPGRADING FROM THE DASHBOARD: a qualified member can upgrade their level directly on their dashboard (rmcircle.team/my/<id>) — an "Upgrade" card appears with the exact next-level cost read live from the contract; they connect the wallet that OWNS the position, confirm one transaction, done. The site never touches the funds (wallet pays the contract directly). If the wallet doesn't cover the cost, the card offers the MoonPay card-buy option. On phones, open the page inside the wallet app's browser.
- MESSAGES (on-site, wallet-verified): every member dashboard has a Messages panel — sign in once with the wallet that owns your position (a free signature, cannot move funds), then message your upline or anyone in your own team, or broadcast to your whole team. Spam-proof by design: messaging only works along your own matrix lines, so strangers can't message you. Unread messages show as a bell on your dashboard. Members are told the team admin can review messages for abuse. No email address needed.
- BUYING POL WITH A CARD (for people brand new to crypto): the site links to MoonPay (moonpay.com/buy/pol) on the training page, the start page, and automatically on the join page when a connected wallet's balance is short. Guidance to give: choose POL on the POLYGON network, send it to YOUR OWN wallet address, buy about entry + gas (~385 POL). MoonPay is an independent company (merchant of record) — it handles ID verification and charges its own card fee (~4.5%); this site never touches or holds anyone's money. First purchases can take a few minutes to arrive.
@@ -800,7 +800,7 @@ const server=http.createServer(async(req,res)=>{
if((mj=pathname.match(/^\/join\/(\d{1,15})$/)))return serveMemberPage(req,res,path.join(PUBLIC_DIR,'join.html'),'join',mj[1]);
}
let file;
if(pathname==='/')file=path.join(PUBLIC_DIR,'index.html');else if(pathname==='/start'||pathname==='/start/')file=path.join(PUBLIC_DIR,'start.html');else if(pathname==='/training'||pathname==='/training/')file=path.join(PUBLIC_DIR,'training.html');else if(pathname==='/admin'||pathname==='/admin/')file=path.join(PUBLIC_DIR,'admin.html');else if(pathname==='/my'||pathname==='/my/'||/^\/my\/\d{1,15}$/.test(pathname))file=path.join(PUBLIC_DIR,'my.html');else if(pathname==='/contract'||pathname==='/contract/')file=path.join(PUBLIC_DIR,'contract.html');else if(pathname==='/disclaimer'||pathname==='/disclaimer/')file=path.join(PUBLIC_DIR,'disclaimer.html');else if(pathname==='/how-pay-works'||pathname==='/how-pay-works/')file=path.join(PUBLIC_DIR,'how-pay-works.html');else if(pathname==='/tools'||pathname==='/tools/')file=path.join(PUBLIC_DIR,'tools.html');else if(pathname==='/direct-join'||pathname==='/direct-join/'){if(!getSession(req)){res.writeHead(302,{Location:'/admin'});return res.end();}file=path.join(ROOT,'private','direct-join.html');}else if(pathname==='/join-now'||pathname==='/join-now/'){if(!getConfig().dappFallbackPublic){res.writeHead(302,{Location:'/start'});return res.end();}file=path.join(ROOT,'private','join-now.html');}else if(/^\/join\/\d{1,15}$/.test(pathname))file=path.join(PUBLIC_DIR,'join.html');else if(pathname==='/join'||pathname==='/join/'){res.writeHead(302,{Location:'/join-now'});return res.end();}else{
if(pathname==='/')file=path.join(PUBLIC_DIR,'index.html');else if(pathname==='/start'||pathname==='/start/')file=path.join(PUBLIC_DIR,'start.html');else if(pathname==='/training'||pathname==='/training/')file=path.join(PUBLIC_DIR,'training.html');else if(pathname==='/admin'||pathname==='/admin/')file=path.join(PUBLIC_DIR,'admin.html');else if(pathname==='/my'||pathname==='/my/'||/^\/my\/\d{1,15}$/.test(pathname))file=path.join(PUBLIC_DIR,'my.html');else if(pathname==='/contract'||pathname==='/contract/')file=path.join(PUBLIC_DIR,'contract.html');else if(pathname==='/disclaimer'||pathname==='/disclaimer/')file=path.join(PUBLIC_DIR,'disclaimer.html');else if(pathname==='/how-pay-works'||pathname==='/how-pay-works/')file=path.join(PUBLIC_DIR,'how-pay-works.html');else if(pathname==='/tools'||pathname==='/tools/')file=path.join(PUBLIC_DIR,'tools.html');else if(pathname==='/fast-start'||pathname==='/fast-start/')file=path.join(PUBLIC_DIR,'fast-start.html');else if(pathname==='/direct-join'||pathname==='/direct-join/'){if(!getSession(req)){res.writeHead(302,{Location:'/admin'});return res.end();}file=path.join(ROOT,'private','direct-join.html');}else if(pathname==='/join-now'||pathname==='/join-now/'){if(!getConfig().dappFallbackPublic){res.writeHead(302,{Location:'/start'});return res.end();}file=path.join(ROOT,'private','join-now.html');}else if(/^\/join\/\d{1,15}$/.test(pathname))file=path.join(PUBLIC_DIR,'join.html');else if(pathname==='/join'||pathname==='/join/'){res.writeHead(302,{Location:'/join-now'});return res.end();}else{
const safe=path.normalize(pathname).replace(/^([.][.][/\\])+/, '').replace(/^[/\\]+/,'');file=path.join(PUBLIC_DIR,safe);if(!file.startsWith(PUBLIC_DIR))file='';
}
if(file&&staticFile(req,res,file))return;return staticFile(req,res,path.join(PUBLIC_DIR,'404.html'),404);