Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
53 lines (53 loc) · 26 KB
/
Copy pathindex.html
File metadata and controls
53 lines (53 loc) · 26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>APK Tester Skill — Muse tests your APK, screenshots prove it</title>
<meta name="description" content="Run-test Android APKs on a virtual phone. Walk flows, check logcat, and return screenshots as proof.">
<meta property="og:title" content="APK Tester Skill — Muse tests your APK, screenshots prove it">
<meta property="og:description" content="Your AI tests the APK. Screenshots prove it.">
<meta property="og:image" content="assets/og-image.png"><meta property="og:type" content="website">
<link rel="icon" href="assets/favicon/favicon.ico" sizes="any">
<link rel="icon" type="image/svg+xml" href="assets/favicon/favicon.svg">
<link rel="icon" type="image/png" sizes="32x32" href="assets/favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/favicon/favicon-16x16.png">
<link rel="apple-touch-icon" sizes="180x180" href="assets/favicon/apple-touch-icon.png">
<link rel="manifest" href="assets/favicon/site.webmanifest">
<meta name="theme-color" content="#25d982">
<style>
:root{color-scheme:dark;--bg:#0b1020;--panel:#121a2b;--panel2:#18233a;--ink:#f4f7ff;--muted:#a7b2c9;--accent:#25d982;--line:#2a3853;--purple:#8567ff}*{box-sizing:border-box}html{scroll-behavior:smooth}.ticker{overflow:hidden;border-bottom:1px solid var(--line);background:#0a1221d9;color:var(--muted);white-space:nowrap}.ticker-track{display:flex;width:max-content;animation:ticker-loop 30s linear infinite}.ticker-track span{display:inline-flex;align-items:center;gap:12px;padding:11px 19px;font:750 .78rem ui-monospace,monospace;letter-spacing:.08em;text-transform:uppercase}.ticker-track b{color:var(--accent)}@keyframes ticker-loop{to{transform:translateX(-50%)}}@keyframes float-phone{0%,100%{transform:translateY(0) rotate(2deg)}50%{transform:translateY(-12px) rotate(1deg)}}@keyframes pulse-pass{0%,100%{box-shadow:0 0 0 0 #25d98244;transform:scale(1)}50%{box-shadow:0 0 0 10px #25d98200;transform:scale(1.045)}}@keyframes rise-in{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:translateY(0)}}body{margin:0;background:radial-gradient(ellipse at 75% -15%,#203756 0,transparent 38%),var(--bg);color:var(--ink);font:16px/1.55 Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,sans-serif}a{color:inherit} .wrap{width:min(1120px,calc(100% - 40px));margin:auto}.hero{animation:rise-in .8s ease both;padding:82px 0 62px;display:grid;grid-template-columns:1.05fr .95fr;gap:48px;align-items:center}.eyebrow{color:var(--accent);font-weight:800;letter-spacing:.15em;text-transform:uppercase;font-size:.76rem}h1{font-size:clamp(2.7rem,6vw,5.4rem);line-height:.98;letter-spacing:-.055em;margin:16px 0 22px}.hero p,.lead{color:var(--muted);font-size:1.1rem}.btn{display:inline-flex;padding:13px 20px;border-radius:999px;background:var(--accent);color:#062114;text-decoration:none;font-weight:850;margin-top:14px;transition:transform .2s ease,box-shadow .2s ease}.btn:hover{transform:translateY(-3px);box-shadow:0 10px 28px #25d98255}.phone{width:min(310px,80vw);margin:auto;border:8px solid #5a6982;border-radius:38px;background:#0b1324;padding:17px;box-shadow:0 35px 90px #0009;transform:rotate(2deg);animation:float-phone 5s ease-in-out infinite}.speaker{height:8px;width:72px;border-radius:9px;background:#64728c;margin:0 auto 20px}.screen{border-radius:18px;background:#111c30;padding:18px;min-height:420px}.screen h3{margin:0 0 10px}.terminal{font:12px/1.9 ui-monospace,monospace;color:#b8c6dd}.terminal b{color:var(--accent)}.pass{display:inline-block;margin-top:22px;padding:8px 20px;border-radius:40px;background:#25d982;color:#052415;font-weight:900;letter-spacing:.12em;animation:pulse-pass 2.4s ease-in-out infinite}.mock-note{color:#8492aa;font-size:11px;margin-top:12px}.section{padding:58px 0}.section h2{font-size:clamp(2rem,4vw,3rem);letter-spacing:-.04em;margin:0 0 12px}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:28px}.card{background:linear-gradient(145deg,var(--panel),#101726);border:1px solid var(--line);border-radius:20px;padding:22px;transition:transform .25s ease,border-color .25s ease,box-shadow .25s ease}.card:hover{transform:translateY(-5px);border-color:#25d98288;box-shadow:0 18px 42px #0005}.num{font:800 13px ui-monospace,monospace;color:var(--accent)}.card h3{margin:9px 0 4px}.card p{color:var(--muted);margin:0}.report{font:14px/1.8 ui-monospace,monospace}.report span{color:var(--muted)}.report strong{color:var(--accent)}.note{border-left:3px solid #edc466;padding:12px 16px;background:#342b1838;color:#e5d5a9;border-radius:0 12px 12px 0}.promo-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:26px}.promo-card{overflow:hidden;background:linear-gradient(145deg,var(--panel),#101726);border:1px solid var(--line);border-radius:20px;transition:transform .25s ease,border-color .25s ease;animation:rise-in .75s ease both}.promo-card:hover{transform:translateY(-6px) rotate(-.4deg);border-color:#25d98288}.promo-card img{display:block;width:100%;aspect-ratio:4/3;object-fit:cover;background:#111a2b;transition:transform .45s ease}.promo-card:hover img{transform:scale(1.035)}.promo-copy{padding:18px 20px 20px}.promo-copy h3{margin:0 0 6px}.promo-copy p{color:var(--muted);margin:0}.offer{display:flex;justify-content:space-between;align-items:center;gap:12px}.code{font:800 1.4rem ui-monospace,monospace;color:var(--accent)}.support{position:relative;min-height:310px}.gate{position:absolute;inset:0;z-index:5;background:#0b1020f2;display:grid;place-items:center;text-align:center;border:1px solid var(--line);border-radius:20px;padding:24px}.gate button,.copy{border:0;border-radius:999px;padding:12px 18px;background:var(--accent);color:#062114;font-weight:850;cursor:pointer}.payment-content{display:grid;gap:20px}.pay-option{border:1px solid var(--line);border-radius:15px;padding:18px;background:var(--panel)}.pay-title{font-weight:800;margin-bottom:10px}.footer{border-top:1px solid var(--line);padding:38px 0 22px}.footer-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:24px}.footer h3{font-size:.88rem;color:var(--accent)}.footer a{display:block;color:var(--muted);text-decoration:none;margin:7px 0;font-size:.9rem}.byline{color:#8390a7;margin-top:28px;font-size:.88rem}.fed-auth{margin:26px auto;max-width:680px;color:#f4f4f8;display:grid;justify-items:center}.discord-invite-widget{width:min(100%,620px);margin-inline:auto;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:12px;padding:22px;background:#2b2d31;border:1px solid #41434a;border-radius:16px;cursor:pointer}.status-dot{width:12px;height:12px;border-radius:50%;background:#23a55a;box-shadow:0 0 12px #23a55a;flex:0 0 auto}.widget-main{width:100%;max-width:480px}.widget-main input{width:100%;background:#1e1e2f;border:0;color:#fff;border-radius:9px;padding:11px}.widget-hint{color:#aeb2bb;font-size:.82rem}.fed-auth button{cursor:pointer}.authModal{display:none;position:fixed;inset:0;z-index:20;background:#000b;backdrop-filter:blur(8px);place-items:center;padding:16px}.authModal.open{display:grid}.modal-card{width:min(440px,100%);background:#14141e;border:1px solid #343344;border-radius:1.5rem;padding:26px;position:relative}.modal-card input{width:100%;padding:12px;margin:7px 0;background:#1e1e2f;border:1px solid #343344;border-radius:10px;color:#fff}.modal-close{position:absolute;right:18px;top:13px;font-size:1.5rem;background:none;border:0;color:#fff}.auth-primary{width:100%;border:0;border-radius:999px;padding:12px;background:linear-gradient(90deg,#7c5cfc,#a78bfa);color:white;font-weight:800}.auth-msg{min-height:22px;color:#ffb4b4;font-size:.88rem}.auth-msg.success{color:#25d982}.auth-links{display:flex;justify-content:space-between;margin:10px 0;font-size:.88rem}.logged-in{display:none}.logged-in.show{display:block}.avatar{display:inline-grid;place-items:center;border-radius:50%;width:42px;height:42px;background:linear-gradient(135deg,#7c5cfc,#a78bfa);font-weight:900}.thank{background:#1e1e2f;padding:14px;border-radius:12px}.muted{color:var(--muted)}
@media(max-width:760px){.hero{grid-template-columns:1fr;padding-top:52px}.grid{grid-template-columns:1fr 1fr}.promo-grid{grid-template-columns:1fr 1fr}.footer-grid{grid-template-columns:1fr 1fr}.screen{min-height:340px}}@media(max-width:480px){.grid,.promo-grid,.footer-grid{grid-template-columns:1fr}.offer{align-items:flex-start;flex-direction:column}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.ticker-track,.phone,.pass,.hero,.promo-card{animation:none!important}.card,.promo-card,.promo-card img,.btn{transition:none!important}.card:hover,.promo-card:hover,.btn:hover{transform:none}}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
</style>
</head>
<body>
<header class="ticker" aria-label="APK Tester highlights"><div class="ticker-track" aria-hidden="true"><span><b>Install</b> → Launch → Capture → Check Logcat → Walk Flows → Prove It ✦</span><span><b>Install</b> → Launch → Capture → Check Logcat → Walk Flows → Prove It ✦</span></div><span class="sr-only">Install, launch, capture screens, check logcat, walk flows, and report with proof.</span></header>
<main>
<section class="wrap hero"><div><div class="eyebrow">APK Tester Skill</div><h1>Your AI tests the APK. Screenshots prove it.</h1><p>Install → launch → screenshot every screen → check logcat → walk the flows → get a PASS/FAIL report with evidence.</p><a class="btn" href="#routine">See how it works</a></div><div class="phone" aria-label="Illustrative phone mockup of a test run"><div class="speaker"></div><div class="screen"><h3>APK test run</h3><div class="terminal">$ install app.apk<br><b>✓</b> installed<br>$ launch app<br><b>✓</b> screenshots saved<br>$ inspect logcat<br><b>✓</b> no fatal exception<br>$ walk flow.json<br><b>✓</b> 16 / 16 steps<br><br><span>Example UI only — not a real test run.</span></div><div class="pass">PASS</div><div class="mock-note">Illustrative preview, not test evidence</div></div></div></section>
<section class="wrap section" id="routine"><div class="eyebrow">The routine</div><h2>Six steps. Evidence at the end.</h2><div class="grid"><article class="card"><div class="num">01</div><h3>Install</h3><p>Put the APK on the configured virtual phone.</p></article><article class="card"><div class="num">02</div><h3>Launch</h3><p>Open the app and verify it reaches foreground.</p></article><article class="card"><div class="num">03</div><h3>Screenshot</h3><p>Capture the visible screens as proof.</p></article><article class="card"><div class="num">04</div><h3>Logcat</h3><p>Look for fatal exceptions and crash markers.</p></article><article class="card"><div class="num">05</div><h3>Walk flows</h3><p>Execute safe, data-driven actions and assertions.</p></article><article class="card"><div class="num">06</div><h3>Report</h3><p>Return a fixed-shape verdict with evidence paths.</p></article></div></section>
<section class="wrap section"><div class="eyebrow">Sample report shape</div><h2>Not a claim. A format.</h2><div class="card report"><div><span>Package:</span> com.fedos.musenumberthree</div><div><span>SHA-256:</span> recorded from APK at run time</div><div><span>Screens:</span> numbered PNG files (real run required)</div><div><span>Flow:</span> Muse Number 3 sample (16 steps)</div><div><span>Logcat:</span> CLEAN / CRASH / EMPTY (real evidence required)</div><div><strong>Verdict: NOT RUN — illustrative only</strong></div><p class="mock-note">No APK has been tested here. A PASS requires actual screenshots and a logcat verdict.</p></div></section>
<section class="wrap section"><div class="eyebrow">First job</div><h2>Built around a real isolation question.</h2><p class="lead">The first planned use checks Muse Number 3: all three slots open, swipe switching works, and three logins stay separate. The included automated flow checks navigation only. Separate-login isolation requires human review of genuine screenshots from distinct test sessions; it is not claimed as an automated assertion.</p></section>
<section class="wrap section" aria-labelledby="promo-heading"><div class="eyebrow">A little QA comedy</div><h2 id="promo-heading">The APK is acting suspicious.</h2><p class="lead">A tiny detective, an overconfident app, and screenshots that remember everything.</p><p class="mock-note">These are playful illustrations, not screenshots from an actual test run.</p><div class="promo-grid"><article class="promo-card"><img src="assets/promo/apk-detective.png" alt="A tiny robot QA detective examines a nervous app icon with a magnifying glass." width="2176" height="1632" loading="lazy"><div class="promo-copy"><h3>Case of the mysterious APK</h3><p>One magnifying glass. Zero unverified “works on my phone” claims.</p></div></article><article class="promo-card"><img src="assets/promo/screenshot-paparazzi.png" alt="A phone poses on a red carpet as screenshot cards flash like paparazzi." width="2176" height="1632" loading="lazy"><div class="promo-copy"><h3>Every screen gets its close-up</h3><p>The screenshots are real evidence, not celebrity gossip.</p></div></article><article class="promo-card"><img src="assets/promo/logcat-fire-drill.png" alt="A small QA robot uses a toy extinguisher on a puff of smoke from a phone." width="2176" height="1632" loading="lazy"><div class="promo-copy"><h3>Logcat: please remain calm</h3><p>Find the crash before it turns into a dramatic season finale.</p></div></article></div></section>
<section class="wrap section"><div class="eyebrow">Stay in the loop</div><h2>Join the email list</h2><div class="fed-auth" id="fedAuth"><div class="discord-invite-widget" id="openSignupBtn" role="button" tabindex="0" aria-label="Join email list"><span class="status-dot" id="statusDot"></span><div class="widget-main"><strong id="statusText">Join now</strong><input id="emailInput" readonly aria-label="Email invite" placeholder="Type your email here…"><div class="widget-hint">Click to join our email list</div></div></div><div class="authModal" id="authModal" aria-modal="true" role="dialog"><div class="modal-card"><button class="modal-close" id="closeModal" aria-label="Close">×</button><h2 id="modalTitle">Join Email List</h2><p class="muted">Stay updated with FEDPromptly</p><form id="loginForm"><input id="loginEmail" type="email" placeholder="Email" required autocomplete="email"><input id="loginPassword" type="password" placeholder="Password" minlength="6" required autocomplete="current-password"><div class="auth-links"><a href="#" id="forgotPassword">Forgot password?</a><span></span></div><button class="auth-primary" id="authSubmitBtn" type="submit">Join Email List</button><div class="auth-msg" id="authMessage" aria-live="polite"></div></form><div class="auth-links"><span>or</span><a href="#" id="toggleAuthMode">Already joined? <span id="toggleText">Sign In</span></a></div><div class="logged-in" id="loggedInView"><div class="avatar" id="loggedInAvatar"></div> <strong id="loggedInName"></strong><div id="loggedInEmail" class="muted"></div><p class="thank">Thank you for joining our email list!<br>We will be reaching out soon… email me anytime: <a href="mailto:contact@fedpromptly.com">contact@fedpromptly.com</a></p><button id="logoutBtn" class="auth-primary">Logout</button></div></div></div></div></section>
<section class="wrap section" id="support"><div class="eyebrow">Age-gated support</div><h2>Support the work</h2><div class="support card"><div class="gate" id="ageGate"><div><h3>Adults only</h3><p>Confirm that you are of legal age before revealing the payment options.</p><button id="confirmAge">I confirm I am of legal age</button><noscript><p>Enable JavaScript and confirm age to reveal this section.</p></noscript></div></div><div id="paymentOptions" class="payment-content" aria-live="polite"><noscript><p>Enable JavaScript and confirm age to reveal payment options.</p></noscript></div></div></section>
<section class="wrap section"><div class="eyebrow">Promo codes</div><h2>Offers from Git-FED</h2><div class="grid"><article class="card"><h3>Muse</h3><p>Check out Muse, your personal AI agent. Redeem my code in Settings within 48 hours of joining and we'll both get 1 billion Muse tokens.</p><p class="code">5F2V31 <button class="copy" data-copy="5F2V31">Copy</button></p><a href="https://muse.ai/join" target="_blank" rel="noopener noreferrer">Join Muse</a></article><article class="card"><h3>Manus AI</h3><p class="code">G3ADN <button class="copy" data-copy="G3ADN">Copy</button></p><p>Manus Ai Invite Code: G3ADN</p></article><article class="card"><h3>Teamily</h3><p>Join me on Teamily, the human-agent platform, where you and always-on agents get work done together in one unified and context-aware space. Redeem my code in Settings - Credits Center and you'll get 5 CREDITS right away.</p><p class="code">2U6Q8D <button class="copy" data-copy="2U6Q8D">Copy</button></p><a href="https://teamily.ai/i/2U6Q8D" target="_blank" rel="noopener noreferrer">Join Teamily</a></article></div></section>
</main>
<footer class="footer"><div class="wrap"><div class="footer-grid"><div><h3>FED-OS</h3><a href="https://www.fedpromptly.org">Explore the Ecosystem</a><a href="https://www.fedpromptly.com/aid">Join FED-OS Membership</a><a href="https://www.jabburr.com/fed-os">Storefront</a><a href="https://whop.com/fedpromptly/">Whop</a></div><div><h3>Contact</h3><a href="mailto:contact@fedpromptly.com">General</a><a href="mailto:support@fedpromptly.com">Support</a><a href="mailto:business@fedpromptly.com">Business</a><a href="mailto:careers@fedpromptly.com">Careers</a></div><div><h3>Media</h3><a href="https://substack.com/@fedpromptly">Articles</a><a href="https://fedpromptly.wordpress.com/">Blog Post</a><a href="https://gitfed.substack.com/">GitFed Blog</a><a href="https://www.deviantart.com/fedpromptly">Artwork</a><a href="https://bsky.app/profile/fed-os.bsky.social">Social Media</a><a href="https://x.com/Fedpromptly">Advertisement / X</a></div><div><h3>Support</h3><a href="https://www.patreon.com/c/FEDpromptly">Supporters</a><a href="https://buymeacoffee.com/fedpromptly">Tips / Donations</a><a href="https://discord.gg/Jm4XStx4Pf">Developers (Discord)</a></div></div><div class="byline">APK Tester Skill by Git-FED — FedPromptly</div></div></footer>
<script>
// Payment HTML remains base64 data outside the DOM and is decoded only after explicit confirmation.
const gatedPayload="ICAgPGRpdiBpZD0icGF5cGFsLWJ1dHRvbi1jb250YWluZXItUC00RkQyNDIzOFZYNDkwMjIxNE5LMlhQMlkiPjwvZGl2PgogICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9zZGsvanM/Y2xpZW50LWlkPUJBQV9uZHFhV015UXdUbkRaMExYd0xRMjJqZEpvOXV4a2VYWXFtQmJGLWhENDFITWlaODNtdk9jeDFLdGkwYjZaZlhmamU3UTFpZXZOYVM4T2smdmF1bHQ9dHJ1ZSZpbnRlbnQ9c3Vic2NyaXB0aW9uIiBkYXRhLXNkay1pbnRlZ3JhdGlvbi1zb3VyY2U9ImJ1dHRvbi1mYWN0b3J5Ij48L3NjcmlwdD4KICAgPHNjcmlwdD4KICAgICBwYXlwYWwuQnV0dG9ucyh7CiAgICAgICAgIHN0eWxlOiB7IHNoYXBlOiAncmVjdCcsIGNvbG9yOiAnZ29sZCcsIGxheW91dDogJ3ZlcnRpY2FsJywgbGFiZWw6ICdzdWJzY3JpYmUnIH0sCiAgICAgICAgIGNyZWF0ZVN1YnNjcmlwdGlvbjogZnVuY3Rpb24oZGF0YSwgYWN0aW9ucykgewogICAgICAgICAgIHJldHVybiBhY3Rpb25zLnN1YnNjcmlwdGlvbi5jcmVhdGUoeyBwbGFuX2lkOiAnUC00RkQyNDIzOFZYNDkwMjIxNE5LMlhQMlknLCBxdWFudGl0eTogMSB9KTsKICAgICAgICAgfSwKICAgICAgICAgb25BcHByb3ZlOiBmdW5jdGlvbihkYXRhLCBhY3Rpb25zKSB7IGFsZXJ0KGRhdGEuc3Vic2NyaXB0aW9uSUQpOyB9CiAgICAgfSkucmVuZGVyKCcjcGF5cGFsLWJ1dHRvbi1jb250YWluZXItUC00RkQyNDIzOFZYNDkwMjIxNE5LMlhQMlknKTsKICAgPC9zY3JpcHQ+CiAgIDxpZnJhbWUgc3JjPSJodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvR2l0LUZFRC9idXR0b24iIHRpdGxlPSJTcG9uc29yIEdpdC1GRUQiIGhlaWdodD0iMzIiIHdpZHRoPSIxMTQiIHN0eWxlPSJib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDZweDsiPjwvaWZyYW1lPgogICA8YSBocmVmPSJodHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tL2ZlZHByb21wdGx5Ij48aW1nIHNyYz0iaHR0cHM6Ly9pbWcuYnV5bWVhY29mZmVlLmNvbS9idXR0b24tYXBpLz90ZXh0PUJ1eSBtZSBhIGJvb2smZW1vamk98J+TliZzbHVnPWZlZHByb21wdGx5JmJ1dHRvbl9jb2xvdXI9RkZERDAwJmZvbnRfY29sb3VyPTAwMDAwMCZmb250X2ZhbWlseT1Db29raWUmb3V0bGluZV9jb2xvdXI9MDAwMDAwJmNvZmZlZV9jb2xvdXI9ZmZmZmZmIiAvPjwvYT4KICAgPGEgaHJlZj0iaHR0cHM6Ly9ub3dwYXltZW50cy5pby9wYXltZW50Lz9paWQ9NTk5Nzk1ODU3MCZzb3VyY2U9YnV0dG9uIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub3JlZmVycmVyIG5vb3BlbmVyIj48aW1nIHNyYz0iaHR0cHM6Ly9ub3dwYXltZW50cy5pby9pbWFnZXMvZW1iZWRzL3BheW1lbnRzLWJ1dHRvbi13aGl0ZS5zdmciIGFsdD0iQ3J5cHRvY3VycmVuY3kgJiBCaXRjb2luIHBheW1lbnQgYnV0dG9uIGJ5IE5PV1BheW1lbnRzIiAvPjwvYT4KICAgPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vanMuc3RyaXBlLmNvbS92My9idXktYnV0dG9uLmpzIj48L3NjcmlwdD4KICAgPHN0cmlwZS1idXktYnV0dG9uIGJ1eS1idXR0b24taWQ9ImJ1eV9idG5fMVVKS2FhSmFSZjIzM2tmV0taODFmY0llIiBwdWJsaXNoYWJsZS1rZXk9InBrX2xpdmVfNTFVSWRBR0phUmYyMzNrZldsRmFjUjMxSVlWR2RqQ1ZBdHRORnpJZ1FHWFF6clVkYzg5NGlKY0JxYW1SWk53RjExejJBTjVrdmp5eml0b3I0NjJmMmVnVkkwMFVtS2owc2Q4Ij48L3N0cmlwZS1idXktYnV0dG9uPg==";
const gate=document.getElementById('ageGate'), pay=document.getElementById('paymentOptions');
async function loadGate(){if(sessionStorage.getItem('apkTesterAgeConfirmed')==='yes'){await revealPayments();}}
async function revealPayments(){if(pay.dataset.loaded==='yes')return;sessionStorage.setItem('apkTesterAgeConfirmed','yes');gate.hidden=true;gate.style.display='none';pay.dataset.loaded='yes';const raw=atob(gatedPayload);const doc=new DOMParser().parseFromString(raw,'text/html');for(const n of Array.from(doc.body.childNodes)){if(n.nodeName==='SCRIPT'){await new Promise((resolve,reject)=>{const s=document.createElement('script');for(const a of n.attributes)s.setAttribute(a.name,a.value);if(n.src){s.src=n.src;s.onload=resolve;s.onerror=reject;}else{s.textContent=n.textContent;resolve();}document.body.appendChild(s);});}else{pay.appendChild(n.cloneNode(true));}}}
document.getElementById('confirmAge').addEventListener('click',()=>revealPayments().catch(e=>{pay.dataset.loaded='no';pay.textContent='Payment options could not load. Reload and try again.';console.error(e);}));loadGate();
document.querySelectorAll('[data-copy]').forEach(b=>b.addEventListener('click',async()=>{try{await navigator.clipboard.writeText(b.dataset.copy);b.textContent='Copied';setTimeout(()=>b.textContent='Copy',1200)}catch(e){b.textContent=b.dataset.copy}}));
const phrases=['Type your email here…','Join our newsletter…','Get early access…','Stay in the loop…'];let pi=0,ci=0,del=false;const input=document.getElementById('emailInput');function type(){const s=phrases[pi];input.placeholder=s.slice(0,ci)+(del?'|':'');if(!del&&ci<s.length)ci++;else if(!del){setTimeout(()=>{del=true;type()},1600);return}else if(ci>0)ci--;else{del=false;pi=(pi+1)%phrases.length;setTimeout(type,350);return}setTimeout(type,del?30:65)}type();
const modal=document.getElementById('authModal'), form=document.getElementById('loginForm'), msg=document.getElementById('authMessage');let signIn=false,sb=null,user=null;function open(){modal.classList.add('open');document.getElementById('loginEmail').focus()}function close(){modal.classList.remove('open')}document.getElementById('openSignupBtn').addEventListener('click',open);document.getElementById('openSignupBtn').addEventListener('keydown',e=>{if(e.key==='Enter'||e.key===' '){e.preventDefault();open()}});document.getElementById('closeModal').onclick=close;modal.addEventListener('click',e=>{if(e.target===modal)close()});document.addEventListener('keydown',e=>{if(e.key==='Escape')close()});
function setMessage(text,kind=''){msg.textContent=text;msg.className='auth-msg '+kind}function paint(){document.getElementById('modalTitle').textContent=user?'Welcome back':'Join Email List';form.style.display=user?'none':'block';document.getElementById('loggedInView').classList.toggle('show',!!user);if(user){const email=user.email||'';document.getElementById('loggedInAvatar').textContent=email.charAt(0).toUpperCase();document.getElementById('loggedInName').textContent=email.split('@')[0];document.getElementById('loggedInEmail').textContent=email;document.getElementById('statusText').textContent='Signed in'}else{document.getElementById('statusText').textContent='Join now';document.getElementById('authSubmitBtn').textContent=signIn?'Sign In':'Join Email List';document.getElementById('toggleText').textContent=signIn?'Join Email List':'Sign In';document.querySelector('#toggleAuthMode').firstChild.textContent=signIn?'New here? ':'Already joined? '}}
document.getElementById('toggleAuthMode').onclick=e=>{e.preventDefault();signIn=!signIn;setMessage('');paint()};
const supabaseSrc='https://cdn.jsdelivr.net/npm/@supabase/supabase-js@2';const script=document.createElement('script');script.src=supabaseSrc;script.onload=()=>{sb=window.supabase.createClient('https://qyuczfpgydgqywgthgrz.supabase.co','sb_publishable_2NLEuDREplLS9DgUXeA8Tw_f8MJOhCq');sb.auth.getSession().then(({data})=>{user=data.session?.user||null;paint()});sb.auth.onAuthStateChange((_event,session)=>{user=session?.user||null;paint()})};document.head.appendChild(script);
form.addEventListener('submit',async e=>{e.preventDefault();if(!sb){setMessage('Authentication is still loading. Please try again.');return}const email=document.getElementById('loginEmail').value.trim(),password=document.getElementById('loginPassword').value;setMessage('Working…','info');let r;if(signIn)r=await sb.auth.signInWithPassword({email,password});else r=await sb.auth.signUp({email,password,options:{emailRedirectTo:location.href}});if(r.error){const m=r.error.message.toLowerCase();if(m.includes('already registered')||r.data?.user?.identities?.length===0)setMessage('This email is already registered. Please sign in.');else if(m.includes('not confirmed'))setMessage('Please confirm your email before signing in.');else if(m.includes('invalid login credentials'))setMessage('Email or password is incorrect.');else setMessage(r.error.message);return}if(!signIn&&!r.data.session)setMessage('Check your email to confirm your account.','success');else{user=r.data.user;paint();setMessage('Signed in successfully.','success')}});
document.getElementById('forgotPassword').onclick=async e=>{e.preventDefault();if(!sb)return setMessage('Authentication is still loading.');const email=document.getElementById('loginEmail').value.trim();if(!email)return setMessage('Enter your email address first.');const {error}=await sb.auth.resetPasswordForEmail(email,{redirectTo:location.href});setMessage(error?error.message:'Password reset email sent.','success')};document.getElementById('logoutBtn').onclick=async()=>{if(sb)await sb.auth.signOut();user=null;paint()};
</script>
</body></html>