PageSourceSearch

https://sharkearnings.com/

html sharkearnings.com collected 2026-10-02 00:32:49 UTC 376,750 bytes, 5,360 lines download raw bytes

1    
2    <!DOCTYPE html>
3    <html lang="en">
4    <head>
5        <meta charset="UTF-8">
6        <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
7        <meta name="theme-color" content="#00070f">
8        <title>Get Paid for Games, Offers &amp; Surveys | Shark Earnings</title>
9        <meta name="title" content="Get Paid for Games, Offers &amp; Surveys | Shark Earnings">
10        <meta name="description" content="Get paid for playing games, testing apps, and taking surveys. 5,000+ offers and cash out via PayPal, crypto, or gift cards from just $1.">
11        <meta name="keywords" content="earn money online, make money from home, paid surveys that pay, get paid to play games, how to make money fast, cash rewards app, online tasks for money, referral program passive income, PayPal payouts, cryptocurrency rewards, gift card rewards, earn money without investment">
12        
13        <link rel="canonical" href="https://sharkearnings.com/">
14
15        <meta property="og:type" content="website">
16        <meta property="og:url" content="https://sharkearnings.com/">
17        <meta property="og:title" content="Get Paid for Games, Offers &amp; Surveys | Shark Earnings">
18        <meta property="og:description" content="Get paid for playing games, testing apps, and taking surveys. 5,000+ offers and cash out via PayPal, crypto, or gift cards from just $1.">
19        <meta property="og:image" content="https://sharkearnings.com/assets/images/sharkearnings_link.webp">
20        <meta property="og:image:type" content="image/webp">
21        <meta property="og:image:width" content="1200">
22        <meta property="og:image:height" content="630">
23        <meta property="og:image:alt" content="Get Paid for Games, Offers &amp; Surveys | Shark Earnings">
24        <meta property="og:site_name" content="Shark Earnings">
25        <meta property="og:locale" content="en_US">
26                
27        <meta name="twitter:card" content="summary_large_image">
28        <meta name="twitter:url" content="https://sharkearnings.com/">
29        <meta name="twitter:title" content="Get Paid for Games, Offers &amp; Surveys | Shark Earnings">
30        <meta name="twitter:description" content="Get paid for playing games, testing apps, and taking surveys. 5,000+ offers and cash out via PayPal, crypto, or gift cards from just $1.">
31        <meta name="twitter:image" content="https://sharkearnings.com/assets/images/sharkearnings_link.webp">
32        <meta name="twitter:site" content="@ofcsharknetwork">
33        <meta name="twitter:creator" content="@ofcsharknetwork">
34        
35        <meta name="robots" content="index, follow">
36        <meta name="googlebot" content="index, follow">
37
38        <meta http-equiv="X-UA-Compatible" content="IE=edge">
39        <meta name="referrer" content="strict-origin-when-cross-origin">
40        
41        <meta name="mobile-web-app-capable" content="yes">
42        <meta name="apple-mobile-web-app-status-bar-style" content="default">
43        <meta name="apple-mobile-web-app-title" content="Shark Earnings">
44        
45        <link rel="icon" type="image/x-icon" href="/favicon.ico" sizes="16x16 32x32 48x48">
46        <link rel="icon" type="image/svg+xml" href="/assets/images/logos/sharklogo.svg?v=1777139805">
47        <link rel="icon" type="image/png" sizes="192x192" href="/favicon-192x192.png">
48        <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
49        <link rel="preload" href="/assets/images/logos/sharklogo.webp" as="image" type="image/webp" fetchpriority="high">
50        <link rel="sitemap" type="application/xml" href="/sitemap.xml">
51
52                <link rel="preload" href="/assets/images/callofdragons.webp" as="image" type="image/webp" fetchpriority="high">
53        <link rel="preload" href="/assets/images/landbg.webp" as="image" type="image/webp" fetchpriority="high">
54        
55        
56        
57                <link rel="dns-prefetch" href="https://www.googletagmanager.com">
58        <link rel="dns-prefetch" href="https://connect.facebook.net">
59
60        <style>
61:root{--bg:#00070f;--accent:#00e5ff;--text:#e5e7eb;--sidebar-w:240px;--sidebar-w-collapsed:70px}
62*,::before,::after{box-sizing:border-box}
63html,body{margin:0;padding:0;background:#00070f;color:#e5e7eb;font-family:ui-sans-serif,system-ui,-apple-system,sans-serif;min-height:100vh}
64body{display:flex;flex-direction:column;min-height:100vh}
65body>.container{flex:0 0 auto}
66body>.gf-footer{margin-top:auto}
67body>aside,body>header,body>nav,body>.mobile-header-bar{flex:0 0 auto}
68#sidebar,#sidebar-nav{background:linear-gradient(180deg,#010918 0%,#00070f 100%);border-right:1px solid rgba(0,229,255,.08)}
69#sidebar{position:fixed;top:0;left:0;height:100vh;width:var(--sidebar-w);z-index:100;transition:width .25s}
70body.sidebar-collapsed #sidebar{width:var(--sidebar-w-collapsed)}
71/* A fenti #sidebar / #main-content szabalyok egy regi markup-strukturara keszultek
72   es egyetlen elemre sem illeszkednek. A valodi elemek: .sidebar-menu es .container.
73   Enelkul az elso festeskor az oldalsav normal blokkent folyik be, es az earn.css
74   betoltesekor az egesz elrendezes atugrik (merve: CLS 0.47-0.78 az account tabon). */
75@media(min-width:769px){
76  .sidebar-menu{position:fixed;top:0;left:0;height:100vh;width:var(--sidebar-w);z-index:1200}
77  body.sidebar-collapsed .sidebar-menu{width:var(--sidebar-w-collapsed)}
78  .container{margin-left:var(--sidebar-w)}
79  body.sidebar-collapsed .container{margin-left:var(--sidebar-w-collapsed)}
80  /* A fejlec es a ticker fixed poziciojuak, igy a magassaguk nem szamit a
81     folyamban - a tartalom helyet a body felso paddingja tartja fenn.
82     Merve minden desktop szelessegen: ticker top=80px, magassag=48px, body padding=128px. */
83  .main-header{position:fixed;top:0;right:0;display:flex;align-items:center;justify-content:space-between}
84  #live-earnings-ticker{position:fixed;top:80px;height:48px;overflow:hidden;display:flex;align-items:center}
85}
86@media(min-width:769px){body.has-live-ticker{padding-top:128px}}
87@media(max-width:768px){body.has-live-ticker{padding-top:100px}
88  #live-earnings-ticker{position:fixed;top:60px;height:44px;overflow:hidden;display:flex;align-items:center}}
89/* A skip-link kepernyon kivul all; enelkul az elso festeskor a folyamban van
90   es lejjebb tolja a tartalmat, majd eltunik (merve: 1440x18px eltolas). */
91.skip-link{position:absolute;left:-9999px;top:0}
92.header-content{display:flex;align-items:center;justify-content:space-between;width:100%}
93@media(max-width:768px){}
94@media(min-width:1200px){
95  .container,#main-content,#page-content,.main-content-wrap,.shark-footer{padding-left:max(1.5rem,calc((100% - var(--sidebar-w) - 1600px)/2))!important;padding-right:max(1.5rem,calc((100% - var(--sidebar-w) - 1600px)/2))!important}
96  body.sidebar-collapsed .container,body.sidebar-collapsed #main-content,body.sidebar-collapsed #page-content,body.sidebar-collapsed .main-content-wrap,body.sidebar-collapsed .shark-footer{padding-left:max(1.5rem,calc((100% - var(--sidebar-w-collapsed) - 1600px)/2))!important;padding-right:max(1.5rem,calc((100% - var(--sidebar-w-collapsed) - 1600px)/2))!important}
97  .main-header,#live-earnings-ticker,.maintenance-banner{left:calc(var(--sidebar-w) + max(0px,(100% - var(--sidebar-w) - 1600px)/2));right:auto;width:min(1600px,calc(100% - var(--sidebar-w) - 3rem));max-width:none;margin:0}
98  body.sidebar-collapsed .main-header,body.sidebar-collapsed #live-earnings-ticker,body.sidebar-collapsed .maintenance-banner{left:calc(var(--sidebar-w-collapsed) + max(0px,(100% - var(--sidebar-w-collapsed) - 1600px)/2))!important;width:min(1600px,calc(100% - var(--sidebar-w-collapsed) - 3rem))!important}
99  .gf-footer{margin-left:calc(var(--sidebar-w) + max(0px,(100% - var(--sidebar-w) - 1600px)/2));margin-right:0;width:min(1600px,calc(100% - var(--sidebar-w) - 3rem));max-width:none}
100  body.sidebar-collapsed .gf-footer{margin-left:calc(var(--sidebar-w-collapsed) + max(0px,(100% - var(--sidebar-w-collapsed) - 1600px)/2))!important;width:min(1600px,calc(100% - var(--sidebar-w-collapsed) - 3rem))!important}
101  .gf-main,.gf-bottom,.shark-footer-main,.shark-footer-bottom{max-width:1600px;margin-left:auto;margin-right:auto;width:100%}
102  .gf-main,.gf-bottom{padding-left:1.5rem;padding-right:1.5rem}
103  .sidebar-close-btn{display:none!important}
104}
105.sidebar-logo img{height:36px;width:auto}
106body{visibility:visible}
107.hero-left-content h1{margin-bottom:0!important}
108@media(max-width:768px){.hero-left-content h1{font-size:clamp(1.6rem,7vw,2.8rem)!important}}
109</style>
110
111                <link rel="dns-prefetch" href="https://cdn.discordapp.com">
112        <link rel="preconnect" href="https://cdn.gtranslate.net">
113        <link rel="dns-prefetch" href="https://flagcdn.com">
114        
115        <style>body,html{margin:0;padding:0;background:#00070f;color:#edfcff;font-family:'Poppins','Poppins Fallback',sans-serif}body{min-height:100vh}*{box-sizing:border-box}#pt{position:fixed;inset:0;background:#00070f;z-index:99999;display:flex;align-items:center;justify-content:center}#pt-c{display:flex;align-items:center;justify-content:center;position:relative}#pt-logo{width:68px;height:68px}</style>
116                        <link rel="preload" href="/assets/earn.css?v=1790333025" as="style" onload="this.onload=null;this.rel='stylesheet'">
117        <noscript><link rel="stylesheet" href="/assets/earn.css?v=1790333025"></noscript>
118        
119                
119<script src="/assets/js/tooltip.js?v=1789110447" defer nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"></script>
119
120                                                <style>@media (min-width:769px) and (max-width:1024px){.how-it-works-main{grid-template-columns:1fr;gap:1.5rem;text-align:center;padding:0 15px}.hero-auth-side{max-width:480px;margin:0 auto;width:100%}.testimonial-slider{overflow:hidden}}@media (min-width:769px) and (max-width:1024px) and (orientation:portrait){.hero-auth-side{width:100%;max-width:480px;margin:0 auto}.hero-cards-row{max-width:100%;grid-template-columns:repeat(3,1fr)}.how-it-works-main{grid-template-columns:1fr;padding:0 10px}}@media (min-width:769px) and (max-width:1024px) and (orientation:landscape){.hero-main-content{flex-direction:row;align-items:center;gap:2rem}}.hero-main-content{position:relative;z-index:1;flex-direction:column;align-items:center;justify-content:flex-start;gap:.5rem;padding-top:3rem;padding-bottom:1rem;width:100%;min-height:auto;max-width:100%;overflow-x:clip;margin:0 auto}.how-it-works-grid{display:grid;gap:25px;grid-template-columns:1fr}.hero-main-content::after,.hero-main-content::before{display:none;content:none}@media (min-width:1400px){.hero-main-content{gap:.4rem;padding-bottom:.3rem}.hero-trust-section{margin:.1rem auto .6rem}}@media (min-width:1025px){.hero-trust-section{margin:.3rem auto 1rem;padding:18px 25px}}@media (max-width:968px){.hero-main-content{max-width:100vw;overflow-x:clip;padding:0 10px}.hero-cta-group{flex-direction:column;gap:15px}}@media (max-height:700px){.hero-main-content{min-height:auto;padding-top:1rem;padding-bottom:2rem}}.how-it-works-main{display:grid;grid-template-columns:1fr 2fr;gap:3rem;align-items:center;margin-top:2rem}@media (max-width:968px){.how-it-works-main{grid-template-columns:1fr;gap:1.5rem;text-align:center;padding:0 15px}}@media (max-width:768px){.how-it-works-main{padding:0 10px;gap:1rem}.hero-main-content{padding:1rem 10px 3rem;overflow-x:clip;max-width:100%}}@media (max-width:480px){.hero-cta-group{flex-direction:column;width:100%;gap:12px}.hero-trust-section{margin:.1rem auto .8rem}.hero-main-content{padding:1rem 5px 2rem}}@media (max-width:768px){.hero-main-content,.hero-trust-section{width:100%;box-sizing:border-box}.hero-main-content{padding-left:10px;padding-right:10px}.hero-trust-section{padding:15px 10px;margin:0}.hero-cta-group{width:100%;padding:0 10px}.hero-main-content::after,.hero-main-content::before{display:none;content:none}}@media (max-width:480px){.hero-main-content{min-height:auto;padding:1rem 5px 2rem}}@media (min-width:1201px){.hero-main-content{gap:.3rem;padding-top:.5rem;padding-bottom:.5rem;min-height:calc(100vh - var(--desktop-top-nav-height) - 2rem);min-height:calc(100dvh - var(--desktop-top-nav-height) - 2rem)}.hero-trust-section{margin:.1rem auto .8rem;padding:20px 35px}.hero-cta-group{margin-bottom:.3rem}}@media (min-width:769px) and (max-width:1024px) and (orientation:landscape){.hero-main-content{flex-direction:row;align-items:center;gap:2rem}}.testimonials-section{position:relative;padding:8rem 0;background:0 0;width:100%;overflow:hidden;z-index:1}.testimonials-section::after,.testimonials-section::before{content:"";position:absolute;left:-25%;width:150%;height:150px;background:var(--deep-ocean-start);z-index:-1}.testimonials-section::before{top:-75px;border-radius:0 0 50% 50%}.testimonials-section::after{bottom:-75px;border-radius:50% 50% 0 0}.testimonials-slider-wrapper{position:relative;margin-top:3rem;padding:0 60px;width:100%;box-sizing:border-box}.testimonials-slider-container{overflow:hidden;border-radius:var(--radius-md);width:100%;padding-top:8px}.testimonials-slider{display:flex;transition:transform .6s cubic-bezier(.25, 1, .5, 1);gap:20px;align-items:stretch;cursor:grab;will-change:transform}.testimonials-slider:active{cursor:grabbing}.testimonials-slider.dragging{transition:none!important;cursor:grabbing}.testimonial-slide{min-width:260px;max-width:260px;flex-shrink:0;display:flex}.testimonial-card{background:linear-gradient(135deg,rgba(3,12,26,.95),rgba(0,20,40,.88));border:1px solid rgba(0,229,255,.15);border-radius:var(--radius-lg);padding:18px;width:100%;position:relative;overflow:hidden;transition:transform .3s,box-shadow .3s,border-color .3s;display:flex;flex-direction:column}.testimonial-header{display:flex;align-items:flex-start;gap:12px;margin-bottom:12px;padding-right:26px}.testimonial-content{font-style:italic;color:var(--text-secondary);line-height:1.4;margin:0 0 auto;padding:0;border:none;font-size:.85rem;position:relative;flex-grow:1}@media (min-width:1400px){.testimonial-slide{min-width:240px;max-width:240px}.testimonials-slider-wrapper{padding:0 80px}}@media (min-width:1201px) and (max-width:1399px){.testimonial-slide{min-width:220px;max-width:220px}.testimonial-card{padding:16px}.testimonials-slider-wrapper{padding:0 70px}}
120@media (max-width:900px) and (min-width:601px){.testimonial-slide{min-width:180px;max-width:180px}.testimonial-card{padding:12px}.testimonials-slider-wrapper{padding:0 50px}}@media (max-width:768px){.testimonials-section{padding:5rem 0}.testimonial-content{font-size:.8rem;line-height:1.3}.testimonials-slider-wrapper{padding:0 28px}.testimonial-slide{min-width:160px;max-width:160px}.testimonial-card{padding:10px}}@media (max-width:480px){.testimonials-slider-wrapper{padding:0 40px}.testimonial-slide{min-width:calc(100vw - 100px)}.testimonial-card{padding:14px}.testimonial-header{gap:10px;margin-bottom:10px}.testimonial-content{font-size:.8rem;line-height:1.3}}@media (max-width:380px){.testimonials-slider-wrapper{padding:0 30px}.testimonial-slide{min-width:calc(100vw - 80px)}}.hero-split-layout{display:grid;grid-template-columns:1.4fr 1fr;gap:3rem;align-items:start;padding:1rem 0 3rem;width:100%;max-width:1300px;margin:0 auto}.hero-cards-row{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:10px;align-items:end}@media (max-width:968px){.hero-split-layout{grid-template-columns:1fr;gap:1.5rem;padding:1rem 12px;overflow-x:clip}.hero-auth-side{width:100%;display:flex;justify-content:center;padding:0;box-sizing:border-box}.hero-cards-row{max-width:600px;margin:20px auto 0}}@media (max-width:768px){.hero-cards-row{grid-template-columns:repeat(3,1fr);gap:5px}.gtc-img{height:55px}}@media (max-width:600px){.hero-cards-row{grid-template-columns:repeat(3,1fr)}.gtc-img{height:55px}}@media (min-width:769px) and (max-width:1024px){.hero-cta-group{gap:18px}.hero-main-content{padding:2rem 20px}.hero-split-layout{grid-template-columns:1fr;gap:3rem;padding:2rem 20px;text-align:center}.hero-auth-side{margin:0 auto;width:100%;max-width:500px}.hero-cards-row{grid-template-columns:repeat(3,1fr);gap:15px;max-width:100%;margin-top:30px}.gtc-img{height:105px;overflow:hidden;flex-shrink:0}.testimonials-slider-wrapper{padding:0 40px}.testimonial-slide{min-width:calc(50% - 15px)}}@media (min-width:901px) and (max-width:1200px){.testimonial-slide{min-width:200
120px;max-width:200px}.testimonial-card{padding:14px}.testimonials-slider-wrapper{padding:0 60px}}@media (min-width:1920px){.testimonial-slide{min-width:280px;max-width:280px}.testimonial-card{padding:20px}.testimonials-slider-wrapper{padding:0 100px}}.hero-cards-row .glass-task-card:first-child{animation:1.1s cubic-bezier(.22,1,.36,1) .1s both cardDeal}.hero-cards-row .glass-task-card:nth-child(2){animation:1.1s cubic-bezier(.22,1,.36,1) .45s both cardDeal,3.2s ease-in-out 1.7s infinite cardFloat}.hero-cards-row .glass-task-card:nth-child(3){animation:1.1s cubic-bezier(.22,1,.36,1) .8s both cardDeal}@media(max-width:768px){.how-it-works-grid .step-card.animate-on-scroll{opacity:0;transform:translateY(48px) scale(.94);transition:opacity .55s cubic-bezier(.25, 1, .5, 1),transform .55s cubic-bezier(.25, 1, .5, 1)}.how-it-works-grid .step-card.animate-on-scroll.visible{opacity:1;transform:translateY(0) scale(1)}.hero-cards-row .glass-task-card: first-child,.hero-cards-row .glass-task-card:nth-child(2),.hero-cards-row .glass-task-card:nth-child(3){animation:none}}@media(prefers-reduced-motion:reduce){.how-it-works-grid .step-card{transform:none;transition:opacity .3s}.hero-cards-row .glass-task-card:first-child,.hero-cards-row .glass-task-card:nth-child(2),.hero-cards-row .glass-task-card:nth-child(3){animation:none;opacity:1;transform:none}.glass-task-card .gtc-img::before{animation:none}}.testimonial-dots{display:flex;justify-content:center;align-items:center;gap:8px;margin-top:8px;flex-wrap:wrap}.testimonial-card .user-avatar{background:linear-gradient(135deg,#005f8a,var(--accent-secondary))}.testimonial-card blockquote.testimonial-content{quotes:none;font-size:.9rem;line-height:1.55;color:var(--text-primary);opacity:.9}.testimonial-trust-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:10px;margin:0 auto 1.5rem;color:var(--text-secondary);font-size:.95rem}@media(min-width:769px){.testimonial-dots{display:none!important}}.glass-task-card .gtc-img img{width:100%;height:100%;object-fit:cover;display:block;border-radius:0}.glass-task-card .gtc-img{background:rgba(0,229,255,.05);position:relative}.glass-task-card .gtc-img::before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(0,229,255,.1),transparent);pointer-events:none;animation:1.8s ease-in-out infinite shimmer-gtc}.glass-task-card .gtc-img img[src]{animation:none;background:0 0}@media (hover:hover){.testimonial-card:hover .user-avatar{box-shadow:0 6px 16px rgba(0,229,255,.28),inset 0 1px 2px rgba(255,255,255,.1);border-color:rgba(0,229,255,.45)}}@media(max-width:480px){.testimonial-card{padding:16px}.testimonial-trust-bar{font-size:.72rem;flex-direction:column;align-items:center;gap:3px;margin:0 0 .8rem;line-height:1.5}.testimonials-slider-wrapper{padding:0 8px}}.faq-q-heading{margin:0;padding:0;font:inherit;color:inherit}@media (max-width:420px){.hero-cards-row{display:flex;gap:10px;overflow-x:auto;overscroll-behavior-x:contain;scroll-snap-type:x proximity;scrollbar-width:none;-ms-overflow-style:none;padding:0 5px 4px;margin:10px -5px 0}.hero-cards-row::-webkit-scrollbar{display:none}.hero-cards-row .glass-task-card{flex:0 0 44%;scroll-snap-align:start}.hero-cards-row .gtc-img{height:72px}}</style>
121                        
122        <link rel="preload" href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'">
123        <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800&display=swap"></noscript>
124        
125        <style>
126@font-face{font-family:"Poppins Fallback";font-style:normal;font-weight:400;size-adjust:100%;ascent-override:105%;descent-override:normal;line-gap-override:normal;src:local("Arial")}
127@font-face{font-family:"Poppins Fallback";font-style:normal;font-weight:600;size-adjust:100%;ascent-override:105%;descent-override:normal;line-gap-override:normal;src:local("Arial Bold")}
128@font-face{font-family:"Poppins Fallback";font-style:normal;font-weight:700;size-adjust:100%;ascent-override:105%;descent-override:normal;line-gap-override:normal;src:local("Arial Bold")}
129@font-face{font-family:"Poppins Fallback";font-style:normal;font-weight:800;size-adjust:100%;ascent-override:105%;descent-override:normal;line-gap-override:normal;src:local("Arial Bold")}
130.partner-card{position:relative;}
131.partner-bonus-badge{position:absolute;top:8px;right:8px;background:linear-gradient(135deg,#ffe44d,#ffc107);
131color:#1a0a00;font-size:.78rem;font-weight:800;padding:4px 9px;border-radius:20px;z-index:10;letter-spacing:.5px;box-shadow:0 2px 10px rgba(255,193,7,.6);animation:bonusPulse 2s ease-in-out infinite;}
132@keyframes bonusPulse{0%,100%{box-shadow:0 2px 10px rgba(255,193,7,.6)}50%{box-shadow:0 2px 18px rgba(255,193,7,.9)}}
133.partner-trending-badge{position:absolute;top:8px;left:8px;z-index:12;width:30px;height:30px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:radial-gradient(circle,rgba(0,60,80,.75) 0%,rgba(0,40,60,.4) 70%,transparent 100%);pointer-events:none}
134.partner-trending-badge .ptb-flame{position:relative;width:22px;height:22px;flex:none;display:flex;align-items:center;justify-content:center;filter:drop-shadow(0 0 4px rgba(0,200,255,.85));animation:trendingGlow 2.2s ease-in-out infinite}
135.partner-trending-badge .ptb-flame i{font-size:1.2rem;background:linear-gradient(180deg,#a5f3ff 0%,#22d3ee 45%,#0099cc 100%);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
136@keyframes trendingGlow{0%,100%{filter:drop-shadow(0 0 3px rgba(0,190,255,.6))}50%{filter:drop-shadow(0 0 9px rgba(0,210,255,1))}}
137@media(max-width:600px){.partner-trending-badge{width:24px;height:24px;top:6px;left:6px}.partner-trending-badge .ptb-flame{width:17px;height:17px}.partner-trending-badge .ptb-flame i{font-size:.95rem}}
138.popular-offer-card .bonus-pct-badge{position:absolute;top:6px;left:6px;background:linear-gradient(135deg,#ffe44d,#ffc107);color:#1a0a00;font-size:.7rem;font-weight:800;padding:3px 7px;border-radius:10px;z-index:10;letter-spacing:.3px;pointer-events:none;}
139.popular-offer-card .payout-original{text-decoration:line-through;opacity:.5;font-size:.82em;margin-right:4px;color:#aaa;}
140.popular-offer-card .popular-offer-reward{display:flex!important;align-items:center;flex-wrap:nowrap;gap:3px;overflow:hidden;max-width:100%}
141.popular-offer-card .popular-offer-reward .payout-original{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
142.step-payout-bonus{display:flex;align-items:center;gap:4px;}.step-payout-orig{text-decoration:line-through;opacity:.5;font-size:.85em;}
143.step-right{display:flex;align-items:center;gap:5px;flex-shrink:0}.req-hold-badge{position:relative;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:6px;cursor:pointer;flex-shrink:0}.req-hold-instant{background:rgba(76,175,80,.12);color:#4caf50;border:1px solid rgba(76,175,80,.25)}.req-hold-lock{background:rgba(255,152,0,.1);color:#ff9800;border:1px solid rgba(255,152,0,.25)}.req-hold-badge .rhb-tip{position:absolute;bottom:calc(100% + 7px);right:0;background:rgba(15,30,55,.97);border:1px solid rgba(255,152,0,.35);border-radius:10px;padding:.55rem .75rem;white-space:normal;width:190px;max-width:min(190px,calc(100vw - 20px));font-size:.76rem;font-weight:600;color:#fff;pointer-events:none;opacity:0;transform:translateY(4px);transition:opacity .18s,transform .18s;z-index:9999;box-shadow:0 8px 24px rgba(0,0,0,.45);text-align:left;line-height:1.4}.req-hold-badge .rhb-tip strong{display:block;color:#ff9800;font-size:.79rem;margin-bottom:.18rem}.req-hold-badge .rhb-tip span{color:rgba(255,255,255,.62);font-size:.71rem;font-weight:400}.req-hold-badge:focus .rhb-tip{opacity:1;transform:translateY(0)}@media (hover:hover){.req-hold-badge:hover .rhb-tip{opacity:1;transform:translateY(0)}}.req-hold-instant .rhb-tip{border-color:rgba(76,175,80,.35)}.req-hold-instant .rhb-tip strong{color:#4caf50}.hold-info-why{background:linear-gradient(135deg,rgba(76,175,147,.07),rgba(76,175,147,.02));border:1px solid rgba(76,175,147,.2)}.hold-info-why>i{color:#4caf93}.hold-ranks-link{color:#29b6f6;text-decoration:none;font-weight:600}@media (hover:hover){.hold-ranks-link:hover{text-decoration:underline}}
144.streak-flame-badge{display:flex;align-items:center;min-height:24px;gap:5px;padding:.5rem .4rem;color:#ffb84d;text-decoration:none;font-weight:800;font-size:.95rem;line-height:1;transition:.2s}
145@media (hover:hover){.streak-flame-badge:hover{opacity:.8}}
146.streak-flame-badge i{font-size:1.1rem;background:linear-gradient(180deg,#ffe082 0%,#ff9800 45%,#ff3d00 100%);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;filter:drop-shadow(0 0 3px rgba(255,120,0,.7));animation:trendingGlow 2.2s ease-in-out infinite}.ticket-badge{color:#f59e0b}.tick-ico-badge{height:1.5rem;width:auto;display:block;object-fit:contain;flex-shrink:0;filter:drop-shadow(0 0 4px rgba(245,158,11,.4))}
147@media(max-width:600px){.tick-ico-badge{height:.95rem}.streak-flame-badge--mobile{padding:.3rem .45rem;gap:3px}}
148@media(max-width:400px){.tick-ico-badge{height:.85rem}.streak-flame-badge--mobile{padding:.28rem .4rem;font-size:.74rem}}
149.streak-flame-badge--mobile{padding:.4rem .6rem;font-size:.85rem;gap:4px}
150.streak-flame-badge--mobile i{font-size:1rem}
151@media(max-width:480px){.streak-flame-badge--mobile{padding:.35rem .5rem;font-size:.8rem}}
152#headerTicketCountMobile.tick-count-lg{font-size:.82em}
153.header-user-avatar-link{display:inline-flex;align-items:center;gap:8px;text-decoration:none;border-radius:20px;color:var(--text-primary);transition:.2s}
154.header-user-avatar-link--mobile{border-radius:50%}
155@media (hover:hover){.header-user-avatar-link:hover{opacity:.85}}
156.sidebar-new-badge{display:inline-flex;align-items:center;justify-content:center;margin-left:6px;padding:2px 7px;border-radius:10px;background:linear-gradient(135deg,#00e5ff,#00b8d4);color:#00171f;font-size:.62rem;font-weight:800;letter-spacing:.4px;line-height:1.4;position:relative}.sidebar-new-badge::after{content:"";position:absolute;inset:0;border-radius:inherit;box-shadow:0 0 6px 2px rgba(0,229,255,.5);opacity:0;pointer-events:none;animation:sidebarNewPulse 2s ease-in-out infinite}
157@keyframes sidebarNewPulse{0%,100%{opacity:0}
15750%{opacity:1}}
158body.sidebar-collapsed .sidebar-new-badge{display:none}
159@media(prefers-reduced-motion:reduce){.sidebar-new-badge{animation:none}}
160
161</style>
162                        <link rel="preload" href="/assets/fontawesome/css/all.subset.css?v=4" as="style" onload="this.onload=null;this.rel='stylesheet'">
163        <noscript><link rel="stylesheet" href="/assets/fontawesome/css/all.subset.css?v=4"></noscript>
164                
165
166    
167        
167<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
168    (function () {
169        var loaded = false;
170        function hasAnalyticsConsent() {
171            try {
172                var p = JSON.parse(localStorage.getItem('shark_cookie_prefs') || 'null');
173                return !!(p && p.analytics);
174            } catch (e) {
175                return false;
176            }
177        }
178        function loadMetaPixel() {
179            if (loaded || !hasAnalyticsConsent()) return;
180            loaded = true;
vendor: 508 bytes, lines 180-190
180
181            !function(f,b,e,v,n,t,s)
182            {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
183            n.callMethod.apply(n,arguments):n.queue.push(arguments)};
184            if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
185            n.queue=[];t=b.createElement(e);t.async=!0;
186            t.src=v;s=b.getElementsByTagName(e)[0];
187            s.parentNode.insertBefore(t,s)}(window, document,'script',
188            'https://connect.facebook.net/en_US/fbevents.js');
189
190            fbq('init', '
1901515592016142292
vendor: 62 bytes, lines 190-192
190');
191            fbq('track', 'PageView');
192                    
192}
193        window.sharkOnAnalyticsConsent = loadMetaPixel;
194        setTimeout(loadMetaPixel, 5000);
195    })();
196    </script>
196
197        
198    
198<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
199    window.formatAmountExact = function (amount) {
200        var n = parseFloat(amount);
201        if (!isFinite(n)) n = 0;
202        var s = n.toFixed(3);
203        var neg = s.charAt(0) === '-';
204        if (neg) s = s.slice(1);
205        var parts = s.split('.');
206        var dec = (parts[1] || '').replace(/0+$/, '');
207        while (dec.length < 2) dec += '0';
208        var int = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
209        return (neg ? '-' : '') + int + '.' + dec;
210    };
211
212    window.csrfToken = "998e8f34e9355502848cd48edfcac4aca9c6e20a319f93593cdd2f8f0ad64f93";
213    window.loginErrorMessage = "";
214        if (window.loginErrorMessage && window.loginErrorMessage.length > 0) {
215        document.addEventListener('DOMContentLoaded', function() {
216            if (typeof window.openAuthModal === 'function') window.openAuthModal('login');
217        });
218    }
219    (function(){if(localStorage.getItem('vote_banner_dismissed')==='1'){var b=document.getElementById('voteBanner');if(b)b.style.display='none';}})();
220    window.HOLD_INFO = {
221        tier: null,
222        tierName: "No Tier",
223        hasChargeback: false,
224        nextTier: "bronze",
225        nextTierName: "Bronze"    };
226        window.SHARK_HOLD_MATRIX = {"none":[[5,"Instant","Instant"],[10,"1 day","3 days"],[15,"7 days","14 days"],[20,"12 days","20 days"],[30,"20 days","30 days"],[null,"30 days","45 days"]],"bronze":[[5,"Instant","Instant"],[10,"12 hours","2 days"],[15,"5 days","12 days"],[20,"10 days","14 days"],[30,"14 days","20 days"],[null,"20 days","30 days"]],"silver":[[5,"Instant","Instant"],[10,"3 hours","12 hours"],[15,"5 days","10 days"],[20,"10 days","12 days"],[30,"12 days","20 days"],[null,"20 days","30 days"]],"gold":[[5,"Instant","Instant"],[10,"3 hours","12 hours"],[15,"3 days","10 days"],[20,"7 days","12 days"],[30,"10 days","20 days"],[null,"14 days","30 days"]],"diamond":[[5,"Instant","Instant"],[10,"Instant","6 hours"],[15,"2 days","7 days"],[20,"5 days","10 days"],[30,"7 days","14 days"],[null,"12 days","20 days"]],"obsidian":[[10,"Instant","Instant"],[15,"Instant","6 hours"],[20,"1 day","5 days"],[30,"3 days","7 days"],[null,"7 days","12 days"]]};
227    </script>
227
228    
228<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
229    console.log(`%c
230    ███████╗████████╗ ██████╗ ██████╗
231    ██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗
232    ███████╗   ██║   ██║   ██║██████╔╝
233    ╚════██║   ██║   ██║   ██║██╔═══╝
234    ███████║   ██║   ╚██████╔╝██║
235    ╚══════╝   ╚═╝    ╚═════╝ ╚═╝
236    `, "color: red; font-weight: bold; font-size: 14px;");
237
238    console.log(
239        "%cHold Up!",
240        "color: #ffcc00; font-size: 48px; font-weight: bold; text-shadow: 2px 2px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000;"
241    );
242
243    console.log(
244        "%cThis is a browser feature for developers. If someone told you to copy-paste something here, they are trying to scam you and steal your account.",
245        "color: white; font-size: 16px; background-color: #c0392b; padding: 10px; border-radius: 5px; margin-top: 10px;"
246    );
247    </script>
247
248        
248<script type="application/ld+json" nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
249        {"@context":"https://schema.org","@type":"WebSite","name":"Shark Earnings","url":"https://sharkearnings.com","description":"Earn real cash by completing surveys, playing games, and completing offers. Withdraw via PayPal, crypto, or gift cards from $1.","publisher":{"@id":"https://sharkearnings.com/#organization"},"potentialAction":{"@type":"SearchAction","target":"https://sharkearnings.com/offers?q={search_term_string}","query-input":"required name=search_term_string"}}        </script>
249
250        
250<script type="application/ld+json" nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
251        {
252            "@context": "https://schema.org",
253            "@type": "Organization",
254            "@id": "https://sharkearnings.com/#organization",
255            "name": "Shark Earnings",
256            "url": "https://sharkearnings.com",
257            "description": "Earn real cash by completing surveys, playing games, and completing offers. Withdraw via PayPal, crypto, or gift cards from $1.",
258            "logo": {
259                "@type": "ImageObject",
260                "url": "https://sharkearnings.com/assets/images/logos/sharklogofull.webp",
261                "width": 920,
262                "height": 882
263            },
264            "sameAs": [
265                "https://www.facebook.com/officialsharknetwork",
266                "https://x.com/ofcsharknetwork",
267                "https://www.instagram.com/officialsharknetwork/",
268                "https://www.linkedin.com/company/sharknetwork",
269                "https://discord.gg/shark-earnings-earn-cash-rewards-897403167820636190"
270            ],
271            "contactPoint": {
272                "@type": "ContactPoint",
273                "contactType": "customer service",
274                "email": "[email protected]"
275            }
276        }
277        </script>
277
278        
279    
280        
280<script type="application/ld+json" nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
281    {
282        "@context": "https://schema.org",
283        "@type": "FAQPage",
284        "mainEntity": [
285            {
286                "@type": "Question",
287                "name": "How much can I earn?",
288                "acceptedAnswer": {"@type": "Answer", "text": "There is no fixed or guaranteed amount - it depends on how many offers you complete, which ones are available in your country, and how active your referrals are. Every offer shows its exact reward before you start, and you can cash out from $1.00."}
289            },
290            {
291                "@type": "Question",
292                "name": "How fast do I get paid?",
293                "acceptedAnswer": {"@type": "Answer", "text": "We process payments daily. Cash out via PayPal (min $1.00), Crypto (min $2.50), or Gift Cards (min $1.00). Most users receive their money within a few hours."}
294            },
295            {
296                "@type": "Question",
297                "name": "How does the referral program work?",
298                "acceptedAnswer": {"@type": "Answer", "text": "Invite friends and earn up to 30% commission on their earnings for life. It's a great way to build passive income."}
299            },
300            {
301                "@type": "Question",
302                "name": "Is Shark Earnings free and safe?",
303                "acceptedAnswer": {"@type": "Answer", "text": "Yes! Registration is 100% free. Your data is protected by SSL encryption and we are fully GDPR compliant."}
304            },
305            {
306                "@type": "Question",
307                "name": "Do I need to invest money to start earning?",
308                "acceptedAnswer": {"@type": "Answer", "text": "No! Shark Earnings is 100% free to join and use. You can start earning immediately after registration without any upfront costs or hidden fees."}
309            },
310            {
311                "@type": "Question",
312                "name": "What payment methods do you support?",
313                "acceptedAnswer": {"@type": "Answer", "text": "We offer PayPal, Cryptocurrency (Litecoin), and popular Gift Cards (Amazon, Google Play, Steam, etc.). Minimum cashout starts at $1.00."}
314            },
315            {
316                "@type": "Question",
317                "name": "Can I use Shark Earnings on mobile?",
318                "acceptedAnswer": {"@type": "Answer", "text": "Absolutely! Our platform is fully responsive and works on all devices. Many game offers are specifically designed for mobile devices (Android/iOS)."}
319            },
320            {
321                "@type": "Question",
322                "name": "Does Shark Earnings work in my country?",
323                "acceptedAnswer": {"@type": "Answer", "text": "Yes! Shark Earnings is available in 160+ countries. Offer availability depends on your region, but every country has access to at least some earning methods."}
324            }
325        ]
326    }
327    </script>
327
328    
329    
329<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz" src="/assets/js/ayet_surveys.js?v=1787901965" defer></script>
329
330
331    
331<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
332            window.currentUser = {
333                id: 0,
334                name: "Guest",
335                isAdmin: false,
336                verificationStatus: "unverified"            };
337            window.isMaintenanceEnabled = false;
338            window.maintenanceStartTime = null;
339            window.isAdmin = false;
340            window.showSidebar = false;
341
342            document.addEventListener('DOMContentLoaded', () => {
343                
344                                
345                if (window.currentUser.verificationStatus === 'verify') {
346                    setTimeout(() => {
347                        openVerificationModal();
348                    }, 1000);
349                }
350                
351                const htmlspecialchars = (str) => {
352                    if (typeof str !== 'string') return '';
353                    const map = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#039;' };
354                    return str.replace(/[&<>"']/g, m => map[m]);
355                };
356                
357        const notificationBellDesktop = document.querySelector('.notification-bell-desktop');
358        const notificationBellMobile = document.querySelector('.notification-bell-mobile');
359        
360        const notificationDropdown = document.getElementById('notificationDropdown');
361        const notificationList = document.getElementById('notificationList');
362        const notificationBadgeDesktop = document.getElementById('notificationBadge');
363        const notificationBadgeMobile = document.getElementById('notificationBadgeMobile');
364        const tabBadgeGeneral = document.getElementById('tabBadgeGeneral');
365        const tabBadgeTasks = document.getElementById('tabBadgeTasks');
366        let activeNotifTab = 'general';
367        let allNotifications = [];
368
369        document.querySelectorAll('.notif-tab').forEach(btn => {
370            btn.addEventListener('click', (e) => {
371                e.stopPropagation();
372                activeNotifTab = btn.dataset.tab;
373                document.querySelectorAll('.notif-tab').forEach(b => b.classList.remove('active'));
374                btn.classList.add('active');
375                renderNotificationList();
376            });
377        });
378
379        const markAllReadBtn = document.getElementById('markAllRead');
380        if (markAllReadBtn) {
381            markAllReadBtn.addEventListener('click', (e) => {
382                e.stopPropagation();
383                markAllAsRead();
384            });
385        }
386
387    const toggleNotificationDropdown = (e) => {
388        e.stopPropagation();
389        const isVisible = notificationDropdown.classList.contains('active');
390
391        if (isVisible) {
392        } else {
393
394            const clickedBell = e.currentTarget;
395            const rect = clickedBell.getBoundingClientRect();
396            
397            const isMobile = window.innerWidth <= 768;
398            
399            if (isMobile) {
400                notificationDropdown.style.position = 'fixed';
401                notificationDropdown.style.top = '65px';
402                notificationDropdown.style.left = '15px';
403                notificationDropdown.style.right = '15px';
404                notificationDropdown.style.width = 'auto';
405            } else {
406                notificationDropdown.style.position = 'fixed';
407                notificationDropdown.style.top = (rect.bottom + 10) + 'px';
408                notificationDropdown.style.left = 'auto';
409                notificationDropdown.style.right = (window.innerWidth - rect.right) + 'px';
410                notificationDropdown.style.width = '380px';
411            }
412            
413            loadNotifications();
414            
415            if (notificationBadgeDesktop) {
416                notificationBadgeDesktop.style.opacity = '0';
417            }
418            if (notificationBadgeMobile) {
419                notificationBadgeMobile.style.opacity = '0';
420            }
421        }
422        
423        notificationDropdown.classList.toggle('active', !isVisible);
424    };
425
426    if (notificationBellDesktop) {
427            notificationBellDesktop.addEventListener('click', toggleNotificationDropdown);
428        }
429        if (notificationBellMobile) {
430            notificationBellMobile.addEventListener('click', toggleNotificationDropdown);
431        }
432
433    document.addEventListener('click', (e) => {
434        if (notificationDropdown && !notificationDropdown.contains(e.target) && 
435            !e.target.closest('.notification-bell')) {
436
437            if (!notificationDropdown.classList.contains('active')) {
438                if (notificationBadgeDesktop) {
439                    notificationBadgeDesktop.style.opacity = '1';
440                }
441                if (notificationBadgeMobile) {
442                    notificationBadgeMobile.style.opacity = '1';
443                }
444            }
445            
446            notificationDropdown.classList.remove('active');
447        }
448    });
449
450        const throttledNotificationResize = throttle(function() {
451            if (notificationDropdown && notificationDropdown.classList.contains('active')) {
452                notificationDropdown.classList.remove('active');
453            }
454        }, 150);
455
456        window.addEventListener('resize', throttledNotificationResize);
457
458    function getNotifTypeAndIcon(notif) {
459        const type = (notif.type || '').toLowerCase();
460        if (/Weekly Lottery #\d+/i.test(notif.message || '')) {
461            const won = /you won/i.test(notif.message);
462            return won
463                ? { notifType: 'giveaway', iconClass: 'fas fa-trophy' }
464                : { notifType: 'system',   iconHtml: '<img width="200" height="78" src="/assets/images/rewards/lottery_ticket.svg" alt="" style="width:20px;height:20px;object-fit:contain">' };
465        }
466        if (type === 'credit')                  return { notifType: 'credit',      iconClass: 'fas fa-coins' };
467        if (type === 'processing')              return { notifType: 'cashout',     iconClass: 'fas fa-money-bill-wave' };
468        if (type === 'chargeback' ||
469            type === 'chargeback_pending')      return { notifType: 'chargeback',  iconClass: 'fas fa-triangle-exclamation' };
470        if (type === 'warning')                 return { notifType: 'warning',     iconClass: 'fas fa-shield-halved' };
471        if (type === 'error')                   return { notifType: 'rejection',   iconClass: 'fas fa-ban' };
472        if (type === 'alert')                   return { notifType: 'warning',     iconClass: 'fas fa-circle-exclamation' };
473        if (type === 'dispute_staff_approved')  return { notifType: 'credit',      iconClass: 'fas fa-circle-check' };
474        if (type === 'dispute_staff_rejected')  return { notifType: 'rejection',   iconClass: 'fas fa-ban' };
475        if (type === 'dispute_staff_decision')  return { notifType: 'warning',     iconClass: 'fas fa-gavel' };
476        if (type === 'announcement')            return { notifType: 'announcement',iconClass: 'fas fa-bullhorn' };
477        if (type === 'giveaway')                return { notifType: 'giveaway',    iconClass: 'fas fa-trophy' };
478        if (type === 'info')                    return { notifType: 'cashout',     iconClass: 'fas fa-money-bill-wave' };
479        if (type === 'ticket_reply')            return { notifType: 'system',      iconClass: 'fas fa-headset' };
480        if (type === 'task_approved' ||
481            type === 'task_auto_approved')      return { notifType: 'credit',      iconClass: 'fas fa-circle-check' };
482        if (type === 'task_rejected')           return { notifType: 'rejection',   iconClass: 'fas fa-ban' };
483        if (type === 'task_campaign_review' ||
484            type === 'task_dispute')            return { notifType: 'warning',     iconClass: 'fas fa-flag' };
485        if (type === 'task_submission')         return { notifType: 'system',      iconClass: 'fas fa-paper-plane' };
486        if (type === 'reward')                  return { notifType: 'giveaway',    iconClass: 'fas fa-gift' };
487        return { notifType: 'system', iconClass: 'fas fa-bell' };
488    }
489
490    const NOTIF_PAYOUT_RE   = /\b(withdrawal|withdraw|payout|cash(?:ed)?[ -]?out)\b/i;
491    const NOTIF_NEGATIVE_RE = /\b(chargeback|charge-back|deduct|deducted|deduction|reversed|reversal|removed|penalt)\b/i;
492    const NOTIF_POSITIVE_RE = /\b(credited|earned|you won|approved|added|bonus|received|reward is being processed|refunded to your balance)\b/i;
493
494    function highlightAmounts(escapedMsg, rawMsg) {
495        let cls, sign;
496        if (NOTIF_NEGATIVE_RE.test(rawMsg))      { cls = 'notif-amt-neg';  sign = '-'; }
497        else if (NOTIF_PAYOUT_RE.test(rawMsg))   { cls = 'notif-amt-out';  sign = '';  }
498        else if (NOTIF_POSITIVE_RE.test(rawMsg)) { cls = 'notif-amt-pos';  sign = '+'; }
499        else return escapedMsg;
500
501        return escapedMsg.replace(/([+-]?)\$(\d[\d,]*(?:\.\d+)?)/g, function (m, pre, num) {
502            const shown = pre ? pre : sign;
503            return '<span class="notif-amt ' + cls + '">' + shown + '$' + num + '</span>';
504        });
505    }
506
507    function renderNotificationList() {
508        const filtered = allNotifications.filter(n => n.tab === activeNotifTab);
509        if (filtered.length === 0) {
510            notificationList.innerHTML = '<div class="notification-empty">No notifications</div>';
511            return;
512        }
513        notificationList.innerHTML = filtered.map(notif => {
514            const { notifType, iconClass, iconHtml } = getNotifTypeAndIcon(notif);
515            const rawMsg = notif.message || notif.title || '';
516            const msg = highlightAmounts(htmlspecialchars(rawMsg), rawMsg);
517            const rawType = (notif.type || '').toLowerCase();
518            let ticketLinkHtml = '';
519            if (rawType === 'ticket_reply' && (notif.ticket_status === 'open' || notif.ticket_status === 'pending')) {
520                const ticketMatch = (notif.message || '').match(/#([A-F0-9]{8})/);
521                if (ticketMatch) {
522                    ticketLinkHtml = `<a href="/support/${ticketMatch[1]}" class="notification-action-btn"><i class="fas fa-headset"></i> View Ticket</a>`;
523                }
524            }
525            if (!ticketLinkHtml && notif.action_label && notif.action_url
526                && /^\/(?!\/)/.test(notif.action_url)) {
527                ticketLinkHtml = `<a href="${htmlspecialchars(notif.action_url)}" class="notification-action-btn">`
528                    + `<i class="fas fa-arrow-right"></i> ${htmlspecialchars(notif.action_label)}</a>`;
529            }
530            if (!ticketLinkHtml && /Weekly Lottery #\d+/i.test(notif.message || '')) {
531                const won = /you won/i.test(notif.message);
532                ticketLinkHtml = won
533                    ? `<a href="/rewards/lottery" class="notification-action-btn"><i class="fas fa-trophy"></i> View your win</a>`
534                    : `<a href="/rewards/challenges" class="notification-action-btn"><i class="fas fa-bolt"></i> Collect more tickets</a>`;
535            }
536            return `
537                <div class="notification-item ${notif.is_read == 0 ? 'unread' : ''}" data-id="${notif.id}" data-type="${notifType}">
538                    <div class="notification-icon-area">
539                        ${iconHtml || `<i class="${iconClass}"></i>`}
540                    </div>
541                    <div class="notification-content-area">
542                        ${msg ? `<div class="notification-content">${msg}</div>` : ''}
543                        <div class="notification-time">${notif.time_ago}</div>
544                        ${ticketLinkHtml}
545                    </div>
546                </div>`;
547        }).join('');
548    }
549
550    function loadNotifications() {
551        if (!notificationList || !notificationBadgeDesktop || !notificationBadgeMobile) { return; }
552        if (document.hidden) return;
553
554        const formData = new FormData();
555        formData.append('action', 'get_notifications');
556        formData.append('csrf_token', window.csrfToken);
557
558        fetch('/api/secure_handler.php', {
559            method: 'POST',
560            body: formData
561        })
562        .then(response => {
563            if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
564            return response.json();
565        })
566        .then(data => {
567            if (data.error) {
568                notificationList.innerHTML = '<div class="notification-empty">Could not load notifications.</div>';
569                return;
570            }
571            const hasUnread = data.unread_count > 0;
572
573            notificationBadgeDesktop.textContent = data.unread_count > 0 ? data.unread_count : '';
574            notificationBadgeDesktop.classList.toggle('active', hasUnread);
575            notificationBadgeMobile.textContent = data.unread_count > 0 ? data.unread_count : '';
576            notificationBadgeMobile.classList.toggle('active', hasUnread);
577
578            if (tabBadgeGeneral) {
579                tabBadgeGeneral.textContent = data.unread_general > 0 ? data.unread_general : '';
580                tabBadgeGeneral.classList.toggle('active', data.unread_general > 0);
581            }
582            if (tabBadgeTasks) {
583                tabBadgeTasks.textContent = data.unread_tasks > 0 ? data.unread_tasks : '';
584                tabBadgeTasks.classList.toggle('active', data.unread_tasks > 0);
585            }
586
587            allNotifications = data.notifications;
588            updateTabBadgesFromLocal();
589            renderNotificationList();
590        })
591        .catch(error => {
592            notificationList.innerHTML = '<div class="notification-empty">Failed to load. Check connection.</div>';
593        });
594    }
595
596    function updateTabBadgesFromLocal() {
597        const unreadGeneral = allNotifications.filter(n => n.tab === 'general' && n.is_read == 0).length;
598        const unreadTasks = allNotifications.filter(n => n.tab === 'tasks' && n.is_read == 0).length;
599        const totalUnread = unreadGeneral + unreadTasks;
600        if (tabBadgeGeneral) { tabBadgeGeneral.textContent = unreadGeneral > 0 ? unreadGeneral : ''; tabBadgeGeneral.classList.toggle('active', unreadGeneral > 0); }
601        if (tabBadgeTasks) { tabBadgeTasks.textContent = unreadTasks > 0 ? unreadTasks : ''; tabBadgeTasks.classList.toggle('active', unreadTasks > 0); }
602        if (notificationBadgeDesktop) { notificationBadgeDesktop.textContent = totalUnread > 0 ? totalUnread : ''; notificationBadgeDesktop.classList.toggle('active', totalUnread > 0); }
603        if (notificationBadgeMobile) { notificationBadgeMobile.textContent = totalUnread > 0 ? totalUnread : ''; notificationBadgeMobile.classList.toggle('active', totalUnread > 0); }
604        const mb = document.getElementById('markAllRead');
605        if (mb) { mb.disabled = totalUnread === 0; mb.classList.toggle('is-disabled', totalUnread === 0); }
606    }
607
608    function markSingleNotificationAsRead(notificationId) {
609        if (!notificationId) return;
610
611        const formData = new FormData();
612        formData.append('action', 'mark_notifications_read');
613        formData.append('notification_id', notificationId);
614        formData.append('csrf_token', window.csrfToken);
615
616        fetch('/api/secure_handler.php', {
617            method: 'POST',
618            body: formData
619        })
620        .then(response => {
621            if (!response.ok) throw new Error('Network response was not ok');
622            return response.json();
623        })
624        .then(data => {
625            if (data.success) {
626                const notif = allNotifications.find(n => n.id == notificationId);
627                if (notif) notif.is_read = 1;
628                updateTabBadgesFromLocal();
629            }
630        })
631        .catch(error => {
632            console.error('Error marking notification as read:', error);
633        });
634    }
635    if (notificationList) {
636        notificationList.addEventListener('click', (event) => {
637            const notificationItem = event.target.closest('.notification-item.unread');
638            if (!notificationItem) return;
639            const notificationId = notificationItem.dataset.id;
640            if (notificationId) {
641                notificationItem.classList.remove('unread');
642                markSingleNotificationAsRead(notificationId);
643            }
644        });
645    }
646
647    function markAllAsRead() {
648        if (!notificationBadgeDesktop || !notificationBadgeMobile || !notificationDropdown) { return; }
649        const formData = new FormData();
650        formData.append('action', 'mark_notifications_read');
651        formData.append('user_id', window.currentUser.id);
652        formData.append('mark_all', 'true');
653        formData.append('csrf_token', window.csrfToken);
654
655        fetch('/api/secure_handler.php', {
656            method: 'POST',
657            body: formData
658        })
659        .then(response => {
660            if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
661            return response.json();
662        })
663        .then(data => {
664            if (data.success) {
665                allNotifications.forEach(n => n.is_read = 1);
666                updateTabBadgesFromLocal();
667                renderNotificationList();
668            } else {
669                console.error('Failed to mark notifications as read: ' + (data.message || 'Error.'));
670            }
671        })
672        .catch(error => {
673            console.error('Network error marking notifications as read:', error);
674        });
675    }
676
677                
678                const countdownMessageSpan = document.getElementById('maintenance-countdown-message');
679                let countdownInterval;
680                const genericScheduledMessage = "Maintenance is scheduled. Please finish your tasks before the specified time.";
681                const genericActiveMessage = "Maintenance is currently active.";
682
683                function updateCountdown() {
684                    if (!countdownMessageSpan) {
685                        if (countdownInterval) clearInterval(countdownInterval);
686                        return;
687                    }
688                    const maintenanceBanner = document.querySelector('.maintenance-banner');
689                    if (!window.isMaintenanceEnabled || !window.maintenanceStartTime) {
690                        if (maintenanceBanner) maintenanceBanner.style.display = 'none';
691                        if (countdownInterval) clearInterval(countdownInterval);
692                        return;
693                    }
694                    if (maintenanceBanner) maintenanceBanner.style.display = 'flex';
695                    const startTime = new Date(window.maintenanceStartTime).getTime();
696                    const now = new Date().getTime();
697                    let timeLeft = startTime - now;
698
699                    if (isNaN(startTime)) {
700                        countdownMessageSpan.innerHTML = `Error: Invalid maintenance start time. ${genericScheduledMessage}`;
701                        if (countdownInterval) clearInterval(countdownInterval);
702                        return;
703                    }
704
705                    if (timeLeft <= 0) {
706                        if (countdownInterval) clearInterval(countdownInterval);
707                        
708                        if (!window.isAdmin) {
709                            countdownMessageSpan.innerHTML = "Maintenance has started. Redirecting...";
710                            setTimeout(() => {
711                                window.location.href = '/maintenance';
712                            }, 2000);
713                            return;
714                        }
715                        
716                        countdownMessageSpan.innerHTML = genericActiveMessage + " (You have access as admin).";
717                        return;
718                    }
719
720                    const days = Math.floor(timeLeft / (1000 * 60 * 60 * 24));
721                    const hours = Math.floor((timeLeft % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
722                    const minutes = Math.floor((timeLeft % (1000 * 60 * 60)) / (1000 * 60));
723                    const seconds = Math.floor((timeLeft % (1000 * 60)) / 1000);
724
725                    let countdownText = "Maintenance starts in: ";
726                    if (days > 0) countdownText += `${days}d `;
727                    if (hours > 0 || days > 0) countdownText += `${String(hours).padStart(2, '0')}h `;
728                    countdownText += `${String(minutes).padStart(2, '0')}m ${String(seconds).padStart(2, '0')}s`;
729                    countdownMessageSpan.innerHTML = `<span class='font-bold'>${countdownText}</span>. ${genericScheduledMessage}`;
730                }
731
732                if (window.isMaintenanceEnabled) {
733                    if (window.maintenanceStartTime) {
734                        const now = new Date().getTime();
735                        const startTime = new Date(window.maintenanceStartTime).getTime();
736                        if (!isNaN(startTime) && startTime > now) {
737                            updateCountdown();
738                            countdownInterval = setInterval(updateCountdown, 1000);
739                        } else if (!isNaN(startTime) && startTime <= now) {
740                            updateCountdown();
741                        } else {
742                            if(countdownMessageSpan) countdownMessageSpan.innerHTML = `Maintenance is scheduled, but the start time is unclear. ${genericScheduledMessage}`;
743                        }
744                    } else {
745                        if(countdownMessageSpan) countdownMessageSpan.innerHTML = genericActiveMessage + (window.isAdmin ? " (You have access as admin)." : "");
746                        if (document.querySelector('.maintenance-banner')) document.querySelector('.maintenance-banner').style.display = 'flex';
747                    }
748                } else {
749                    if (document.querySelector('.maintenance-banner')) document.querySelector('.maintenance-banner').style.display = 'none';
750                }
751
752                                const currentUserData = {
753                    id: "0",
754                    name: "Guest",
755                    isAdmin: false                };
756
757            });
758
759    let currentOfferData = null; 
760    window.popularOffersData = []; 
761    let originalOffersData = [];
762    let activeDeviceFilters = new Set();  
763
764    document.addEventListener('DOMContentLoaded', () => {
765        const progressBar = document.querySelector('.progress-bar-fill');
766        if (progressBar) {
767            const targetProgress = progressBar.getAttribute('data-progress');
768            setTimeout(() => {
769                progressBar.style.setProperty('--progress-width', targetProgress + '%');
770                progressBar.classList.add('animate');
771            }, 300);
772        }
773        
774        const iframeModal = document.getElementById('iframeModal');
775        const partnerHeaderName = document.getElementById('partnerHeaderName');
776        const partnerHeaderLogo = document.getElementById('partnerHeaderLogo');
777        
778    let currentOfferUrl = '';
779
780    let currentOfferProvider;
781    const openModal = (partnerName, partnerLogo, iframeSrc, provider) => {
782        if (iframeModal) {
783            currentOfferUrl = iframeSrc;
784            currentOfferProvider = provider;
785
786            if (partnerHeaderName && partnerName) {
787                partnerHeaderName.textContent = partnerName;
788            }
789            if (partnerHeaderLogo && partnerLogo) {
790                partnerHeaderLogo.src = partnerLogo;
791                partnerHeaderLogo.alt = partnerName + ' Logo';
792            }
793
794            const conversionRateElement = document.getElementById('partnerConversionRate');
795            if (conversionRateElement) {
796                const showCoinRate = provider !== 'hangmyads' && provider !== 'taprain';
797                conversionRateElement.textContent = showCoinRate ? '$1 = 1,000 Shark Coins' : '';
798                conversionRateElement.style.display = showCoinRate ? '' : 'none';
799            }
800            
801            const iframeLoader = document.querySelector('.iframe-loader');
802            const iframeErrorEl = document.querySelector('.iframe-error');
803            if (iframeErrorEl) iframeErrorEl.style.display = 'none';
804            if (iframeLoader) iframeLoader.style.display = 'flex';
805            window._iframeOpenedAt = Date.now();
806
807            clearTimeout(window._iframeLoadTimeout);
808            window._iframeLoadTimeout = setTimeout(() => {
809                if (iframeLoader) iframeLoader.style.display = 'none';
810                if (iframeErrorEl) iframeErrorEl.style.display = 'flex';
811            }, 20000);
812
813            const iframe = document.getElementById('offerwallIframe');
814            if (iframe && iframeSrc) {
815                iframe.src = 'about:blank';
816                requestAnimationFrame(() => {
817                    setTimeout(() => {
818                        iframe.src = iframeSrc;
819                    }, 150);
820                });
821            }
822
823            iframeModal.classList.add('show');
824            document.body.classList.add('offer-modal-open');
825            pushModalBack();
826        }
827    };
828
829    document.getElementById('iframeRetryBtn')?.addEventListener('click', () => {
830        if (currentOfferUrl) openModal(partnerHeaderName?.textContent, partnerHeaderLogo?.src, currentOfferUrl, currentOfferProvider);
831    });
832    document.getElementById('iframeOpenExternalBtn')?.addEventListener('click', () => {
833        if (currentOfferUrl) window.open(currentOfferUrl, '_blank', 'noopener,noreferrer');
834    });
835
836    document.getElementById('openExternalBtn')?.addEventListener('click', () => {
837        if (currentOfferUrl) {
838            window.open(currentOfferUrl, '_blank', 'noopener,noreferrer');
839        }
840    });
841        
842        let _modalBackPushed = false;
843        function pushModalBack() {
844            if (!_modalBackPushed) { _modalBackPushed = true; history.pushState({ sharkModal: 1 }, ''); }
845        }
846        function consumeModalBack() {
847            if (_modalBackPushed) { _modalBackPushed = false; history.back(); }
848        }
849        window.pushModalBack = pushModalBack;
850        window.consumeModalBack = consumeModalBack;
851        window.addEventListener('popstate', () => {
852            if (!_modalBackPushed) return;
853            _modalBackPushed = false;
854            const im = document.getElementById('iframeModal');
855            const pm = document.getElementById('popularOfferModal');
856            if (im && im.classList.contains('show')) closeModal();
857            else if (pm && pm.classList.contains('show')) closePopularOfferModal();
858        });
859
860        const closeModal = () => {
861            if (iframeModal) {
862                clearTimeout(window._iframeLoadTimeout);
863                iframeModal.classList.remove('show');
864                document.body.classList.remove('offer-modal-open');
865                const iframe = iframeModal.querySelector('iframe');
866                if (iframe) {
867                    const currentSrc = iframe.src;
868                    iframe.src = 'about:blank';
869                    setTimeout(() => {
870                        if (currentSrc.includes('bitlabs')) {
871                            const newSrc = currentSrc.replace(/&_t=\d+/, '') + '&_t=' + Date.now();
872                            iframe.src = newSrc;
873                        }
874                    }, 100);
875                }
876                consumeModalBack();
877            }
878        };
879
880        if (iframeModal) {
881            iframeModal.addEventListener('click', e => { if (e.target === iframeModal) closeModal(); });
882            iframeModal.querySelector('.partner-header-close')?.addEventListener('click', closeModal);
883        }
884        
885        document.addEventListener('keydown', e => { if (e.key === 'Escape') { closeModal(); closePopularOfferModal(); } });
886        document.addEventListener('keydown', e => { if (e.key === 'Escape') { closeModal(); closePopularOfferModal(); } });
887
888        document.querySelectorAll('.horizontal-scroll-wrapper').forEach(wrapper => {
889            const container = wrapper.querySelector('.card-grid');
890            const section = wrapper.closest('.earn-section');
891            
892            const headerPrevBtn = section.querySelector('.section-header-modern .scroll-btn.prev');
893            const headerNextBtn = section.querySelector('.section-header-modern .scroll-btn.next');
894            const wrapperPrevBtn = wrapper.querySelector('.scroll-btn.prev');
895            const wrapperNextBtn = wrapper.querySelector('.scroll-btn.next');
896            
897            if (!container) return;
898            
899            const getCardWidth = () => {
900                const card = container.querySelector('.offer-card, .partner-card, .popular-offer-card, .survey-card');
901                if (card) {
902                    return card.offsetWidth + 16;
903                }
904                return 200;
905            };
906            
907            const updateButtons = () => {
908                const scrollLeft = container.scrollLeft;
909                const maxScroll = container.scrollWidth - container.clientWidth;
910                const atStart = scrollLeft <= 1;
911                const atEnd = scrollLeft >= maxScroll - 1;
912                
913                [headerPrevBtn, wrapperPrevBtn].forEach(btn => {
914                    if (btn) {
915                        if (atStart) {
916                            btn.classList.add('disabled');
917                        } else {
918                            btn.classList.remove('disabled');
919                        }
920                    }
921                });
922                [headerNextBtn, wrapperNextBtn].forEach(btn => {
923                    if (btn) {
924                        if (atEnd) {
925                            btn.classList.add('disabled');
926                        } else {
927                            btn.classList.remove('disabled');
928                        }
929                    }
930                });
931            };
932            
933            const scrollLeft = () => {
934                const scrollAmount = getCardWidth() * 2;
935                container.scrollBy({ left: -scrollAmount, behavior: 'smooth' });
936            };
937            
938            const scrollRight = () => {
939                const scrollAmount = getCardWidth() * 2;
940                container.scrollBy({ left: scrollAmount, behavior: 'smooth' });
941            };
942            
943            [headerPrevBtn, wrapperPrevBtn].forEach(btn => {
944                if (btn) {
945                    btn.addEventListener('click', (e) => {
946                        if (!btn.classList.contains('disabled')) {
947                            scrollLeft();
948                        }
949                    });
950                }
951            });
952            [headerNextBtn, wrapperNextBtn].forEach(btn => {
953                if (btn) {
954                    btn.addEventListener('click', (e) => {
955                        if (!btn.classList.contains('disabled')) {
956                            scrollRight();
957                        }
958                    });
959                }
960            });
961            
962            container.addEventListener('scroll', updateButtons, { passive: true });
963            
964            updateButtons();
965            requestAnimationFrame(() => {
966                updateButtons();
967            });
968            setTimeout(() => {
969                updateButtons();
970            }, 100);
971            
972            const observer = new MutationObserver(() => {
973                updateButtons();
974            });
975            observer.observe(container, { childList: true, subtree: true });
976        });
977
978        const popularGrid = document.querySelector('#popular-offers .card-grid');
979        if (window.matchMedia('(min-width: 769px)').matches && popularGrid) {
980            let isDown = false, startX = 0, scrollLeftStart = 0;
981            let dragMoved = false;
982            let dragRafId = null;
983            let targetScrollLeft = 0;
984
985            popularGrid.style.cursor = 'grab';
986            popularGrid.style.userSelect = 'none';
987            popularGrid.style.scrollBehavior = 'auto';
988            popularGrid.style.scrollSnapType = 'none';
989
990            const setDraggingState = (dragging) => {
991                if (dragging) {
992                    popularGrid.classList.add('dragging');
993                    popularGrid.style.cursor = 'grabbing';
994                    document.body.style.userSelect = 'none';
995                } else {
996                    popularGrid.classList.remove('dragging');
997                    popularGrid.style.cursor = 'grab';
998                    document.body.style.userSelect = '';
999                }
1000            };
1001
1002            const flushDragScroll = () => {
1003                dragRafId = null;
1004                popularGrid.scrollLeft = targetScrollLeft;
1005            };
1006
1007            const scheduleDragScroll = () => {
1008                if (dragRafId) return;
1009                dragRafId = requestAnimationFrame(flushDragScroll);
1010            };
1011
1012            popularGrid.addEventListener('mousedown', e => {
1013                if (e.button !== 0) return;
1014                isDown = true;
1015                dragMoved = false;
1016                setDraggingState(true);
1017                startX = e.clientX;
1018                scrollLeftStart = popularGrid.scrollLeft;
1019                targetScrollLeft = scrollLeftStart;
1020                e.preventDefault();
1021            });
1022
1023            document.addEventListener('mousemove', e => {
1024                if (!isDown) return;
1025                e.preventDefault();
1026                const dx = e.clientX - startX;
1027                if (Math.abs(dx) > 4) dragMoved = true;
1028                targetScrollLeft = scrollLeftStart - dx;
1029                scheduleDragScroll();
1030            }, { passive: false });
1031
1032            document.addEventListener('mouseup', () => {
1033                if (!isDown) return;
1034                isDown = false;
1035                if (dragRafId) {
1036                    cancelAnimationFrame(dragRafId);
1037                    dragRafId = null;
1038                }
1039                popularGrid.scrollLeft = targetScrollLeft;
1040                setDraggingState(false);
1041            });
1042
1043            document.addEventListener('mouseleave', () => {
1044                if (isDown) {
1045                    isDown = false;
1046                    if (dragRafId) {
1047                        cancelAnimationFrame(dragRafId);
1048                        dragRafId = null;
1049                    }
1050                    popularGrid.scrollLeft = targetScrollLeft;
1051                    setDraggingState(false);
1052                }
1053            });
1054
1055            popularGrid.addEventListener('click', ev => {
1056                if (dragMoved) {
1057                    ev.preventDefault();
1058                    ev.stopPropagation();
1059                    dragMoved = false;
1060                }
1061            }, true);
1062
1063            popularGrid.querySelectorAll('img').forEach(img => {
1064                img.addEventListener('dragstart', ev => ev.preventDefault());
1065            });
1066        }
1067
1068        const surveysGrid = document.getElementById('featuredSurveysGrid');
1069        if (window.matchMedia('(min-width: 769px)').matches && surveysGrid) {
1070            let svIsDown = false, svStartX = 0, svScrollStart = 0;
1071            let svDragMoved = false, svRafId = null, svTarget = 0;
1072
1073            surveysGrid.style.cursor = 'grab';
1074            surveysGrid.style.userSelect = 'none';
1075            surveysGrid.style.scrollBehavior = 'auto';
1076            surveysGrid.style.scrollSnapType = 'none';
1077
1078            const svSetDrag = (on) => {
1079                surveysGrid.classList.toggle('dragging', on);
1080                surveysGrid.style.cursor = on ? 'grabbing' : 'grab';
1081                document.body.style.userSelect = on ? 'none' : '';
1082            };
1083
1084            surveysGrid.addEventListener('mousedown', e => {
1085                if (e.button !== 0) return;
1086                svIsDown = true; svDragMoved = false;
1087                svSetDrag(true);
1088                svStartX = e.clientX;
1089                svScrollStart = surveysGrid.scrollLeft;
1090                svTarget = svScrollStart;
1091                e.preventDefault();
1092            });
1093
1094            document.addEventListener('mousemove', e => {
1095                if (!svIsDown) return;
1096                e.preventDefault();
1097                const dx = e.clientX - svStartX;
1098                if (Math.abs(dx) > 4) svDragMoved = true;
1099                svTarget = svScrollStart - dx;
1100                if (!svRafId) svRafId = requestAnimationFrame(() => { svRafId = null; surveysGrid.scrollLeft = svTarget; });
1101            }, { passive: false });
1102
1103            document.addEventListener('mouseup', () => {
1104                if (!svIsDown) return;
1105                svIsDown = false;
1106                if (svRafId) { cancelAnimationFrame(svRafId); svRafId = null; }
1107                surveysGrid.scrollLeft = svTarget;
1108                svSetDrag(false);
1109            });
1110
1111            surveysGrid.addEventListener('click', ev => {
1112                if (svDragMoved) { ev.preventDefault(); ev.stopPropagation(); svDragMoved = false; }
1113            }, true);
1114
1115            surveysGrid.addEventListener('dragstart', ev => ev.preventDefault());
1116        }
1117
1118        document.getElementById('offerwallIframe')?.addEventListener('load', () => {
1119            const iframeEl = document.getElementById('offerwallIframe');
1120            if (iframeEl && iframeEl.src === 'about:blank') return;
1121
1122            clearTimeout(window._iframeLoadTimeout);
1123            const iframeErrorLate = document.querySelector('.iframe-error');
1124            if (iframeErrorLate) iframeErrorLate.style.display = 'none';
1125            const iframeLoader = document.querySelector('.iframe-loader');
1126            if (!iframeLoader) return;
1127            const elapsed = Date.now() - (window._iframeOpenedAt || Date.now());
1128            const remaining = Math.max(0, 500 - elapsed);
1129            setTimeout(() => { iframeLoader.style.display = 'none'; }, remaining);
1130        });
1131
1132        document.getElementById('popularOfferModal')?.addEventListener('click', e => {
1133            if (e.target.id === 'popularOfferModal') {
1134                closePopularOfferModal();
1135            }
1136        });
1137
1138        initializeDeviceFilter();
1139        
1140        const detectedPlatform = "";
1141        if (detectedPlatform) {
1142            activeDeviceFilters.add(detectedPlatform);
1143        }
1144        
1145        let offersLoaded = false;
1146        const loadOffersOnScroll = () => {
1147            if (offersLoaded) return;
1148            
1149            const popularOffersSection = document.querySelector('#popular-offers');
1150            if (!popularOffersSection) {
1151                offersLoaded = true;
1152                if ('requestIdleCallback' in window) {
1153                    requestIdleCallback(() => loadEarnOffers(), { timeout: 500 });
1154                } else {
1155                    setTimeout(() => loadEarnOffers(), 50);
1156                }
1157                return;
1158            }
1159            
1160            const rect = popularOffersSection.getBoundingClientRect();
1161            const isVisible = rect.top < window.innerHeight && rect.bottom > 0;
1162            
1163            if (isVisible) {
1164                offersLoaded = true;
1165                if ('requestIdleCallback' in window) {
1166                    requestIdleCallback(() => loadEarnOffers(), { timeout: 500 });
1167                } else {
1168                    setTimeout(() => loadEarnOffers(), 50);
1169                }
1170            } else {
1171                const observer = new IntersectionObserver((entries) => {
1172                    entries.forEach(entry => {
1173                        if (entry.isIntersecting && !offersLoaded) {
1174                            offersLoaded = true;
1175                            if ('requestIdleCallback' in window) {
1176                                requestIdleCallback(() => loadEarnOffers(), { timeout: 500 });
1177                            } else {
1178                                setTimeout(() => loadEarnOffers(), 100);
1179                            }
1180                            observer.disconnect();
1181                        }
1182                    });
1183                }, { rootMargin: '300px' });
1184                
1185                observer.observe(popularOffersSection);
1186            }
1187        };
1188        
1189        if ('requestIdleCallback' in window) {
1190            requestIdleCallback(() => loadOffersOnScroll(), { timeout: 100 });
1191        } else {
1192            setTimeout(() => loadOffersOnScroll(), 50);
1193        }
1194
1195    document.querySelectorAll('.partner-card').forEach(card => {
1196            card.addEventListener('click', function(e) {
1197                if (this.classList.contains('placeholder')) return;
1198                if (this.classList.contains('partner-card--unavailable')) return;
1199                if (this.classList.contains('mychips-offer')) return;
1200                if (!false) {
1201                    openAuthModal('register');
1202                    return;
1203                }
1204                
1205                const provider = this.dataset.provider;
1206                const iframeSrc = this.dataset.iframeSrc;
1207                const partnerName = this.dataset.partnerName || this.querySelector('.partner-name')?.textContent || 'Partner';
1208    const partnerLogo = this.dataset.partnerLogo || this.querySelector('.partner-logo')?.src || '';
1209
1210    if (provider === 'cpxresearch') {
1211        const cpxUrl = `https://offers.cpx-research.com/index.php?app_id=&ext_user_id=&secure_hash=&email=&username=Guest&subid_1=shark_earnings&subid_2=partner_card`;
1212        
1213        openModal('CPX Research Surveys', '/assets/images/partners/cpxresearch.svg', 
1213cpxUrl, 'cpxresearch');
1214        return;
1215    }
1216
1217    if (provider === 'theoremreach' || provider === 'theoremreach-offers') {
1218        trackOfferClick('theoremreach_direct_', 'theoremreach').catch(() => {});
1219        openModal(partnerName, partnerLogo, iframeSrc, provider);
1220        return;
1221    }
1222
1223    if (provider === 'hangmyads') {
1224        trackOfferClick('hangmyads_', 'hangmyads').then(() => {
1225            if (iframeSrc) {
1226                openModal(partnerName, partnerLogo, iframeSrc, provider);
1227            }
1228        }).catch(() => {
1229            if (iframeSrc) {
1230                openModal(partnerName, partnerLogo, iframeSrc, provider);
1231            }
1232        });
1233        return;
1234    }
1235
1236    if (provider === 'mmwall') {
1237        trackOfferClick('mmwall_', 'mmwall').then(() => {
1238            if (iframeSrc) {
1239                openModal(partnerName, partnerLogo, iframeSrc, provider);
1240            }
1241        }).catch(() => {
1242            if (iframeSrc) {
1243                openModal(partnerName, partnerLogo, iframeSrc, provider);
1244            }
1245        });
1246        
1247        return;
1248    }
1249                
1250                if (provider === 'cheddar') {
1251                    if (navigator.userAgent.includes('SharkEarningsApp')) {
1252                        window.location.href = iframeSrc;
1253                    } else {
1254                        window.open(iframeSrc, '_blank', 'noopener,noreferrer');
1255                    }
1256                    return;
1257                }
1258
1259                if (iframeSrc) {
1260                    openModal(partnerName, partnerLogo, iframeSrc, provider);
1261                }
1262            });
1263        });
1264
1265        (function() {
1266            const urlParams = new URLSearchParams(window.location.search);
1267            let wallParam = urlParams.get('wall');
1268            if (!wallParam) {
1269                const pathMatch = window.location.pathname.match(/^\/wall\/([a-zA-Z0-9_-]+)/);
1270                if (pathMatch) wallParam = pathMatch[1];
1271            }
1272            if (wallParam) {
1273                setTimeout(() => openWallForProvider(wallParam), 600);
1274            }
1275        })();
1276
1277        
1278    const earningsList = document.getElementById('earnings-list');
1279    if (earningsList) {
1280        let lastId = 0;
1281        let isFetching = false;
1282        const MAX_ITEMS = 50;
1283        let tickerOffset = 0;
1284        let origWidth = 0;
1285        let rafId = null;
1286
1287        // A kulso avatarok (Discord, Google) idovel 404-re valtanak, amikor a user
1288        // lecsereli a kepet nalunk - a Discord CDN a regi hash-t nem szolgalja ki
1289        // tovabb. Kep helyett ilyenkor ugyanaz a monogramos csempe jon, amit a
1290        // szerver rak ki, ha egyaltalan nincs avatar_url. Az error esemeny nem
1291        // buborekol, ezert capture fazisban figyeljuk: igy a kesobb bepollozott es a
1292        // klonozott sorokra is all, es nem kell inline onerror (script-src-attr).
1293        earningsList.addEventListener('error', (e) => {
1294            const img = e.target;
1295            if (!(img instanceof HTMLImageElement) || !img.classList.contains('earning-avatar')) return;
1296            const item = img.closest('.earning-item');
1297            const name = (item && (item.dataset.username || item.querySelector('.ei-label-alt')?.textContent)) || '?';
1298            const fallback = document.createElement('div');
1299            fallback.className = 'earning-avatar earning-avatar-fallback';
1300            fallback.style.cssText = 'background:#00a3ff;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:.7em;';
1301            fallback.textContent = (name.trim().charAt(0) || '?').toUpperCase();
1302            img.replaceWith(fallback);
1303        }, true);
1304
1305        const userProfileModal = new UserProfileModal(); 
1306        earningsList.addEventListener('click', (e) => {
1307            const item = e.target.closest('.earning-item');
1308            if (item && item.dataset.username && !item.classList.contains('private-item')) {
1309                userProfileModal.openProfile(item.dataset.username);
1310            }
1311        });
1312
1313        // The label/username swap is pure CSS now (see .ei-top-stack): both texts
1314        // are rendered stacked in one grid cell, hover just flips visibility. No JS
1315        // measuring, and the box cannot resize because neither text ever leaves
1316        // the layout.
1317
1318        function getOriginalItems() {
1319            return Array.from(earningsList.children).filter(i => !i.classList.contains('clone'));
1320        }
1321
1322        function rebuildClones() {
1323            Array.from(earningsList.children).filter(i => i.classList.contains('clone')).forEach(i => i.remove());
1324            const originals = getOriginalItems();
1325            originals.forEach(item => {
1326                const clone = item.cloneNode(true);
1327                clone.classList.add('clone');
1328                earningsList.appendChild(clone);
1329            });
1330            origWidth = earningsList.scrollWidth / 2;
1331        }
1332
1333        function startTicker() {
1334            if (rafId) cancelAnimationFrame(rafId);
1335            rafId = null;
1336            function frame() {
1337                if (origWidth > 0) {
1338                    tickerOffset += 0.5;
1339                    if (tickerOffset >= origWidth) tickerOffset -= origWidth;
1340                    earningsList.style.transform = `translateX(-${tickerOffset}px)`;
1341                }
1342                rafId = requestAnimationFrame(frame);
1343            }
1344            rafId = requestAnimationFrame(frame);
1345        }
1346
1347        document.addEventListener('visibilitychange', () => {
1348            if (!document.hidden && origWidth > 0) startTicker();
1349        });
1350
1351        
1352        if (earningsList.children.length > 0) {
1353            const startTickerWhenIdle = () => { rebuildClones(); startTicker(); };
1354            if ('requestIdleCallback' in window) {
1355                requestIdleCallback(startTickerWhenIdle, { timeout: 1000 });
1356            } else {
1357                setTimeout(startTickerWhenIdle, 200);
1358            }
1359        }
1360
1361        async function fetchAndRenderEarnings() {
1362            if (isFetching) return;
1363            if (document.hidden) return;
1364            isFetching = true;
1365            const formData = new FormData();
1366            formData.append('action', 'get_recent_earnings');
1367            formData.append('last_id', lastId);
1368            formData.append('csrf_token', window.csrfToken);
1369            try {
1370                const response = await fetch('/api/secure_handler.php', { method: 'POST', body: formData });
1371                if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
1372                const data = await response.json();
1373                if (data.success && typeof data.balance === 'number' && window.__animateBalance) {
1374                    const nb = Math.round(data.balance * 1000) / 1000;
1375                    const cur = window.__sharkBalance;
1376                    if (typeof cur !== 'number') { window.__sharkBalance = nb; }
1377                    else if (Math.abs(nb - cur) >= 0.005) {
1378                        window.__sharkBalance = nb;
1379                        window.__animateBalance(cur, nb);
1380                        document.dispatchEvent(new CustomEvent('sharkbalance:change', { detail: { balance: nb } }));
1381                    }
1382                    const holdEl = document.getElementById('walletHoldAmount');
1383                    if (holdEl && typeof data.hold === 'number') holdEl.textContent = '$' + formatAmountExact(data.hold);
1384                }
1385                if (data.success && data.earnings.length > 0) {
1386                    data.earnings.forEach(earning => {
1387                        const newItem = createEarningElement(earning);
1388                        const firstClone = earningsList.querySelector('.clone');
1389                        if (firstClone) earningsList.insertBefore(newItem, firstClone);
1390                        else earningsList.appendChild(newItem);
1391                        lastId = Math.max(lastId, earning.id);
1392                    });
1393                    manageTickerSize();
1394                    rebuildClones();
1395                    startTicker();
1396                }
1397            } catch (error) {
1398                console.error('Error fetching recent earnings:', error);
1399            } finally {
1400                isFetching = false;
1401            }
1402        }
1403        
1404        function createEarningElement(earning) {
1405            const li = document.createElement('li');
1406            li.className = 'earning-item';
1407            if (earning.is_cashout) li.classList.add('cashout-item');
1408            if (earning.is_private) li.classList.add('private-item');
1409
1410            li.dataset.userId = earning.user_id;
1411            if (!earning.is_private) li.dataset.username = earning.username;
1412            li.dataset.description = earning.description;
1413
1414            const amountClass = earning.is_cashout ? 'ei-amount cashout-amount' : 'ei-amount';
1415
1416            const nt = earning.is_private ? '' : ' notranslate';
1417            li.innerHTML = `<div class="ei-avatar-wrap">${earning.avatar_html}</div>
1418                <div class="ei-info">
1419                    <span class="ei-top-stack">
1420                        <span class="ei-label-top${nt}">${earning.label_top}</span>
1421                        <span class="ei-label-alt${nt}">${earning.username}</span>
1422                    </span>
1423                    <span class="ei-label-bot">${earning.label_bottom}</span>
1424                </div>
1425                <span class="${amountClass}">${earning.amount_display}</span>`;
1426            return li;
1427        }
1428
1429        function manageTickerSize() {
1430            // Count the excess ONCE, then drop exactly that many from the front.
1431            // The previous version tested a cached `originals.length` inside the
1432            // loop - Array.from().filter() hands back a static copy, so removing
1433            // nodes never shrank it and the loop ran until every original was
1434            // gone. Past 50 items the ticker emptied itself and stopped (origWidth
1435            // fell to 0) until the next poll refilled it 15s later.
1436            let excess = getOriginalItems().length - MAX_ITEMS;
1437            while (excess-- > 0) {
1438                const firstOriginal = earningsList.querySelector('li:not(.clone)');
1439                if (!firstOriginal) break;
1440                earningsList.removeChild(firstOriginal);
1441            }
1442        }
1443    }
1444
1445    
1446    });
1447
1448    function initializeDeviceFilter() {
1449        const filterContainer = document.querySelector('.featured-grid-container');
1450        if (!filterContainer) return;
1451        
1452        const hideEarnOnSection = false;
1453        if (hideEarnOnSection) {
1454            return;
1455        }
1456
1457    const filterHTML = `
1458    <div class="device-filter-buttons sec-device-icons" role="group" aria-label="Filter offers by device">
1459        <button class="device-filter-btn" data-device="web" onclick="toggleDeviceFilter('web')" title="Desktop" aria-label="Desktop" aria-pressed="false">
1460            <i class="fas fa-desktop"></i>
1461        </button>
1462        <button class="device-filter-btn" data-device="android" onclick="toggleDeviceFilter('android')" title="Android" aria-label="Android" aria-pressed="false">
1463            <i class="fab fa-android"></i>
1464        </button>
1465        <button class="device-filter-btn" data-device="ios" onclick="toggleDeviceFilter('ios')" title="iOS" aria-label="iOS" aria-pressed="false">
1466            <i class="fab fa-apple"></i>
1467        </button>
1468    </div>
1469    `;
1470
1471        const headingLeft = filterContainer.querySelector('#popular-offers .section-left');
1472        if (headingLeft) {
1473            headingLeft.insertAdjacentHTML('beforeend', filterHTML);
1474        } else {
1475            filterContainer.insertAdjacentHTML('afterbegin', filterHTML);
1476        }
1477        updateFilterCounts();
1478    }
1479
1480    function debounce(func, wait) {
1481        let timeout;
1482        return function executedFunction(...args) {
1483            const later = () => {
1484                clearTimeout(timeout);
1485                func(...args);
1486            };
1487            clearTimeout(timeout);
1488            timeout = setTimeout(later, wait);
1489        };
1490    }
1491
1492    function throttle(func, wait) {
1493        let waiting = false;
1494        return function executedFunction(...args) {
1495            if (!waiting) {
1496                func.apply(this, args);
1497                waiting = true;
1498                setTimeout(() => { waiting = false; }, wait);
1499            }
1500        };
1501    }
1502
1503    const debouncedApplyFilters = debounce(applyDeviceFilters, 150);
1504
1505    function toggleDeviceFilter(device) {
1506        const btn = document.querySelector(`.featured-grid-container [data-device="${device}"]`);
1507        if (!btn) return;
1508        
1509        if (activeDeviceFilters.has(device)) {
1510            activeDeviceFilters.delete(device);
1511            btn.classList.remove('active');
1512        } else {
1513            activeDeviceFilters.add(device);
1514            btn.classList.add('active');
1515        }
1516        btn.setAttribute('aria-pressed', activeDeviceFilters.has(device) ? 'true' : 'false');
1517        
1518        debouncedApplyFilters();
1519    }
1520
1521    function applyDeviceFilters() {
1522        if (!document.getElementById('popular-offers')) return;
1523        
1524        if (activeDeviceFilters.size === 0) {
1525            displayPopularOffers(originalOffersData);
1526            return;
1527        }
1528        
1529        const filteredPopularOffers = originalOffersData.filter(offer => {
1530            if (offer.devices && Array.isArray(offer.devices)) {
1531                return offer.devices.some(device => activeDeviceFilters.has(device));
1532            }
1533            else if (offer.categories && Array.isArray(offer.categories)) {
1534                const devices = [];
1535                if (offer.categories.includes('Android')) devices.push('android');
1536                if (offer.categories.includes('iPhone') || offer.categories.includes('iPad')) devices.push('ios');
1537                if (devices.length === 0) devices.push('web');
1538                
1539                return devices.some(device => activeDeviceFilters.has(device));
1540            }
1541            return false;
1542        });
1543        
1544        displayPopularOffers(filteredPopularOffers);
1545    }
1546
1547    function loadEarnOffers() {
1548        const cacheKey = 'earn_offers_cache_v3';
1549        const cacheTimeKey = 'earn_offers_cache_v3_time';
1550        const cacheTTL = 55 * 60 * 1000;
1551
1552        let shownFromCache = false;
1553        try {
1554            const cachedData = localStorage.getItem(cacheKey);
1555            const cacheTime = localStorage.getItem(cacheTimeKey);
1556            if (cachedData && cacheTime) {
1557                const data = JSON.parse(cachedData);
1558                const firstOffer = data.popular_offers?.[0];
1559                if (firstOffer && firstOffer.click_url !== undefined && !firstOffer.click_url) {
1560                    localStorage.removeItem(cacheKey);
1561                    localStorage.removeItem(cacheTimeKey);
1562                } else if (firstOffer) {
1563                    processOffersData(data);
1564                    shownFromCache = true;
1565                    const age = Date.now() - parseInt(cacheTime);
1566                    if (age < cacheTTL) return;
1567                }
1568            }
1569        } catch (e) {
1570            console.warn('Cache read error:', e);
1571        }
1572
1573        fetch('/api/secure_handler.php', {
1574            method: 'POST',
1575            headers: {'Content-Type': 'application/x-www-form-urlencoded'},
1576            body: new URLSearchParams({
1577                action: 'get_earn_offers',
1578                csrf_token: window.csrfToken
1579            })
1580        })
1581        .then(response => {
1582            if (!response.ok) throw new Error(`HTTP ${response.status}`);
1583            return response.json();
1584        })
1585        .then(data => {
1586            try {
1587                localStorage.setItem(cacheKey, JSON.stringify(data));
1588                localStorage.setItem(cacheTimeKey, Date.now().toString());
1589            } catch (e) {
1590                console.warn('Cache write error:', e);
1591            }
1592            processOffersData(data);
1593        })
1594        .catch(error => {
1595            if (!shownFromCache) {
1596                try {
1597                    const cachedData = localStorage.getItem('earn_offers_cache_v3');
1598                    if (!cachedData) showPopularComingSoon("Loading Error", "Could not load offers.");
1599                } catch (e) {
1600                    showPopularComingSoon("Loading Error", "Could not load offers.");
1601                }
1602            }
1603        });
1604    }
1605
1606    function processOffersData(data) {
1607        if (!document.getElementById('popular-offers')) return;
1608        
1609        if (data.success) {
1610            if (data.popular_offers && data.popular_offers.length > 0) {
1611                originalOffersData = data.popular_offers;
1612            } else {
1613                originalOffersData = [];
1614            }
1615            
1616            updateFilterCounts();
1617            applyDeviceFilters();
1618        } else {
1619            showPopularComingSoon("Loading Error", "Could not load offers.");
1620        }
1621    }
1622
1623    async function displayPopularOffers(offers) {
1624        const container = document.querySelector('#popular-offers .card-grid');
1625        if (!container) return;
1626
1627        if (Array.isArray(offers)) { const _seen = {}; offers = offers.filter(function(o){ if (!o || o.id == null) return true; if (_seen[o.id]) return false; _seen[o.id] = 1; return true; }); }
1628        window.popularOffersData = offers;
1629        
1630        if (!offers) {
1631            const _sk = '<div class="skeleton-card"><div class="skeleton skeleton-logo"></div><div class="skeleton-lines"><div class="skeleton skeleton-line"></div><div class="skeleton skeleton-line short"></div></div></div>';
1632            container.innerHTML = _sk.repeat(6);
1633            return;
1634        }
1635        
1636        if (offers.length === 0) {
1637            container.innerHTML = `
1638                <div class="offers-coming-soon" style="width: 100%;">
1639                    <i class="fas fa-search"></i>
1640                    <h3>No Offers Found</h3>
1641                    <p>No offers available. Try adjusting your device filters.</p>
1642                </div>`;
1643            return;
1644        }
1645        
1646        const progressMap = {};
1647        await Promise.all(offers.map(async (offer) => {
1648            try {
1649                const progress = await checkOfferProgress(offer.id, offer.provider || 'mychips');
1650                if (progress && Object.keys(progress).length > 0) {
1651                    progressMap[offer.id] = progress;
1652                }
1653            } catch (e) {}
1654        }));
1655        
1656        container.innerHTML = offers.map((offer, index) => {
1657            const defaultImage = '/assets/images/default-offer.webp';
1658            
1659            if (offer.impression_url) {
1660                setTimeout(() => fireImpressionPixel(offer.impression_url.replace('{index}', index + 1)), 1000);
1661            }
1662            
1663            const rewardText = offer.reward_display || (offer.payout ? `$${formatAmountExact(offer.payout)}` : '$0.00');
1664            const bonusPct = offer.bonus_percent || 0;
1665            const origPayout = offer.original_payout_usd || 0;
1666
1667            const deviceIcons = getDeviceIcons(offer.devices && offer.devices.length ? offer.devices : offer.categories);
1668
1669            const offerProgress = progressMap[offer.id] || {};
1670            const progressKeys = Object.keys(offerProgress);
1671            const hasProgress = progressKeys.length > 0;
1672            const completedSteps = progressKeys.filter(key => offerProgress[key] === 'completed').length;
1673            const hasCompletedSteps = completedSteps > 0;
1674
1675            const providerKey = (offer.provider || '').toLowerCase();
1676            const clickAction = 'popular';
1677
1678            const safeId = escapeHtml(String(offer.id));
1679            const safeTitle = escapeHtml(offer.title || '');
1680            const safeIconUrl = escapeHtml(offer.icon_url || defaultImage);
1681            const safeClickUrl = escapeHtml(offer.click_url || '');
1682            const safeClickAction = clickAction === 'task' ? 'task' : 'popular';
1683            const safeRewardText = escapeHtml(rewardText);
1684            const displayTitle = safeTitle.length > 60 ? safeTitle.substring(0, 57) + '...' : safeTitle;
1685
1686            const isCoin = offer.is_coin_display || false;
1687            const origDisplay = isCoin
1688                ? Math.round(origPayout).toLocaleString() + ' SC'
1689                : `$${formatAmountExact(origPayout)}`;
1690            const bonusBadgeHtml = bonusPct > 0 ? `<div class="bonus-pct-badge">+${bonusPct}%</div>` : '';
1691            const rewardHtml = bonusPct > 0 && origPayout > 0
1692                ? `${safeRewardText}<span class="payout-original">${origDisplay}</span>`
1693                : safeRewardText;
1694
1695            return `
1696                <div role="button" tabindex="0" class="popular-offer-card partner-card mychips-offer ${hasProgress ? 'has-progress' : ''}" data-offer-id="${safeId}" data-click-url="${safeClickUrl}" onclick="openOfferModal('${safeId}', '${safeClickAction}')" style="position:relative;">
1697                    ${bonusBadgeHtml}
1698                    <div class="popular-offer-image">
1699                        <img src="${safeIconUrl}" alt="${safeTitle}" class="popular-offer-img" loading="lazy" width="200" height="200" onload="if(this.naturalWidth&&this.naturalWidth<=150)this.classList.add('is-small-icon')" onerror="this.onerror=null;this.src='${defaultImage}';this.classList.add('is-fallback')">
1700                        <div class="device-indicator">${deviceIcons}</div>
1701                    </div>
1702                    <div class="popular-offer-content card-content">
1703                        <h3 class="popular-offer-title partner-name notranslate" data-title="${safeTitle}">${displayTitle}</h3>
1704                        <div class="popular-offer-reward star-rating notranslate">${rewardHtml}</div>
1705                    </div>
1706                </div>`;
1707        }).join('');
1708        
1709        requestAnimationFrame(() => {
1710            const cards = container.querySelectorAll('.popular-offer-card');
1711            const observer = new IntersectionObserver((entries) => {
1712                entries.forEach(entry => {
1713                    if (entry.isIntersecting) {
1714                        entry.target.classList.add('visible');
1715                        observer.unobserve(entry.target);
1716                    }
1717                });
1718            }, { rootMargin: '50px' });
1719            
1720            cards.forEach(card => observer.observe(card));
1721        });
1722        
1723        setTimeout(setupViewportTracking, 100);
1724    }
1725
1726    function showPopularComingSoon(title, message) {
1727        const container = document.querySelector('#popular-offers .card-grid');
1728        if (container) {
1729            container.innerHTML = `
1730                <div class="offers-coming-soon" style="width: 100%;">
1731                    <i class="fas fa-ghost"></i>
1732                    <h3>${title}</h3>
1733                    <p>${message}</p>
1734                </div>`;
1735        }
1736    }
1737
1738    function fireImpressionPixel(pixelUrl) {
1739        if (!pixelUrl) {
1740            return;
1741        }
1742        const img = new Image();
1743        img.src = pixelUrl;
1744    }
1745
1746
1747    function getDeviceIcons(deviceData) {
1748        if (!deviceData || !Array.isArray(deviceData) || deviceData.length === 0) return '<i class="fas fa-desktop"></i>';
1749        let icons = '';
1750        if (deviceData.some(d => d.toLowerCase().includes('android'))) icons += '<i class="fab fa-android"></i>';
1751        if (deviceData.some(d => d.toLowerCase().includes('ios') || d.toLowerCase().includes('iphone') || d.toLowerCase().includes('ipad'))) icons += '<i class="fab fa-apple"></i>';
1752        if (deviceData.some(d => d.toLowerCase().includes('web'))) icons += '<i class="fas fa-desktop"></i>';
1753        return icons || '<i class="fas fa-desktop"></i>';
1754    }
1755
1756    function parseRequirements(requirementsText) {
1757        if (!requirementsText || !requirementsText.trim()) {
1758            return [{ text: 'Complete the offer as instructed', payout: 0 }];
1759        }
1760        const lines = requirementsText.split('\n').filter(r => r.trim() !== '');
1761        return lines.map(req => {
1762            let r = req.replace(/^\d+\.\s*/, '').trim();
1763
1764            const arrowMatch = r.match(/\(\+\$([0-9,]+\.?[0-9]*)\s*→\s*\+\$([0-9,]+\.?[0-9]*)\)/);
1765            if (arrowMatch) {
1766                return {
1767                    text: r.replace(/\s*\(\+\$[0-9,]+\.?[0-9]*\s*→\s*\+\$[0-9,]+\.?[0-9]*\)/, '').trim(),
1768                    payout: parseFloat(arrowMatch[1].replace(/,/g, '')),
1769                    boostedPayout: parseFloat(arrowMatch[2].replace(/,/g, ''))
1770                };
1771            }
1772            const stdMatch = r.match(/\(\+\$([0-9,]+\.?[0-9]*)\)/);
1773            return {
1774                text: r.replace(/\s*\(\+\$[0-9,]+\.?[0-9]*\)/, '').trim(),
1775                payout: stdMatch ? parseFloat(stdMatch[1].replace(/,/g, '')) : 0
1776            };
1777        });
1778    }
1779    async function trackOfferClick(offerId, provider = 'mychips', offerData = null) {
1780        try {
1781            const formData = new FormData();
1782            formData.append('action', 'track_offer_click');
1783            formData.append('offer_id', offerId);
1784            formData.append('provider', provider);
1785            formData.append('csrf_token', window.csrfToken);
1786
1787            if (offerData) {
1788                formData.append('offer_title',            offerData.title || '');
1789                formData.append('offer_icon_url',         offerData.icon_url || '');
1790                const _payout = offerData.user_payout_usd || offerData.payout || parseFloat((offerData.reward_display || '').replace(/[^0-9.]/g, '')) || 0;
1791                if (_payout > 0) formData.append('offer_payout_usd', _payout);
1792                formData.append('offer_description',      offerData.full_description || offerData.description || '');
1793                formData.append('offer_requirements',     offerData.requirements || '');
1794                formData.append('offer_devices',          Array.isArray(offerData.devices) ? offerData.devices.join(',') : '');
1795                formData.append('offer_provider_display', offerData.provider || '');
1796            }
1797
1798            const response = await fetch('/api/secure_handler.php', {
1799                method: 'POST',
1800                body: formData
1801            });
1802            
1803            const data = await response.json();
1804            return data;
1805        } catch (error) {
1806            console.error('Failed to track offer click:', error);
1807        }
1808        return null;
1809    }
1810
1811
1812    async function checkOfferProgress(offerId, provider) {
1813        try {
1814            const formData = new FormData();
1815            formData.append('action', 'get_progress');
1816            formData.append('offer_id', offerId);
1817            formData.append('csrf_token', window.csrfToken);
1818
1819            const response = await fetch('/api/secure_handler.php', {
1820                method: 'POST',
1821                body: formData
1822            });
1823
1824            if (!response.ok) {
1825                return {};
1826            }
1827            
1828            const data = await response.json();
1829            
1830            if (data.success && data.progress) {
1831                const progressObject = {};
1832                data.progress.forEach((item, index) => {
1833                    progressObject[item.step_index || index] = item.status;
1834                });
1835                return progressObject;
1836            } else {
1837                return {};
1838            }
1839        } catch (error) {
1840            return {};
1841        }
1842    }
1843
1844    function switchModalTab(btn, tabId) {
1845        const modal = btn.closest('.offer-modal-base-content');
1846        modal.querySelectorAll('.modal-tab').forEach(t => t.classList.remove('active'));
1847        modal.querySelectorAll('.modal-tab-content').forEach(t => t.classList.remove('active'));
1848        btn.classList.add('active');
1849        document.getElementById(tabId).classList.add('active');
1850        if (tabId.endsWith('-holds')) {
1851            const bodyId = tabId + '-body';
1852            const body = document.getElementById(bodyId);
1853            if (body && !body.dataset.built) {
1854                body.innerHTML = buildHoldTabHtml(window.HOLD_INFO || {}, window._currentOfferMaxHold);
1855                body.dataset.built = '1';
1856            }
1857        }
1858    }
1859
1860    function _offerEstHold(amount) {
1861        const hi   = window.HOLD_INFO || {};
1862        const tier = hi.tier || 'none';
1863        const cb   = hi.hasChargeback || false;
1864
1865        const m = window.SHARK_HOLD_MATRIX;
1866        if (!m) {
1867            console.warn('SHARK_HOLD_MATRIX missing - hold estimate unavailable');
1868            return '';
1869        }
1870
1871        const rows = m[tier] || m['none'] || [];
1872        for (const [limit, ok, withCb] of rows) {
1873            if (limit === null || amount < limit) return cb ? withCb : ok;
1874        }
1875        return '';
1876    }
1877
1878    function _mkEarnHoldBadge(payout) {
1879        if (!payout) return '';
1880        const h = _offerEstHold(payout);
1881        return h === 'Instant'
1882            ? `<span class="req-hold-badge req-hold-instant"><i class="fas fa-bolt"></i><span class="rhb-tip"><strong>Instant release</strong><span>Credited to your balance immediately after completion.</span></span></span>`
1883            : `<span class="req-hold-badge req-hold-lock"><i class="fas fa-lock"></i><span class="rhb-tip"><strong>~${h} hold</strong><span>Expected hold time - released to your balance automatically.</span></span></span>`;
1884    }
1885
1886    function buildHoldTabHtml(info, offerMaxHold) {
1887        const hasChargeback = info.hasChargeback || false;
1888        const nextTier = info.nextTier || null;
1889        const nextTierName = info.nextTierName || null;
1890        const holdMax = offerMaxHold || null;
1891        const isInstant = !holdMax || holdMax === 'Instant';
1892        const cbExtra = hasChargeback ? ' Your chargeback history extends lock durations.' : '';
1893
1894        const lockBox = isInstant
1895            ? `<div class="hold-info-box hold-info-why" style="background:linear-gradient(135deg,rgba(76,175,80,.08),rgba(76,175,80,.02));border-color:rgba(76,175,80,.25)">
1896                <i class="fas fa-bolt" style="color:#4caf50"></i>
1897                <div>
1898                    <strong>All steps release instantly</strong>
1899                    <p>Every reward in this offer is credited to your balance immediately after completion - no waiting required.</p>
1900                </div>
1901               </div>`
1902            : `<div class="hold-info-box hold-info-lock">
1903                <i class="fas fa-lock"></i>
1904                <div>
1905                    <strong>Earnings may be locked for up to ${holdMax}</strong>
1906                    <p>This is the longest hold for any step in this offer based on your tier.${cbExtra} Smaller steps are released faster. Each step shows its estimated hold time.</p>
1907                </div>
1908               </div>`;
1909
1910        const whyBox = `<div class="hold-info-box hold-info-why">
1911            <i class="fas fa-question-circle"></i>
1912            <div>
1913                <strong>Why are earnings held?</strong>
1914                <p>Holds protect against fraud and ensure offer completions are genuine. Once the hold period ends, funds are automatically added to your balance - no action needed. <a href="/academy/rewards/held-offers-explanation" class="hold-ranks-link">Learn more →</a></p>
1915            </div>
1916        </div>`;
1917
1918        const upgradeHint = isInstant ? `` : (nextTier
1919            ? `<div class="hold-info-box hold-info-upgrade">
1920                <i class="fas fa-bolt"></i>
1921                <div>
1922                    <strong>Reduce your hold times!</strong>
1923                    <p>Leveling up to ${nextTierName} reduces your earning locks. <a href="/rewards" class="hold-ranks-link">View tiers</a></p>
1924                </div>
1925              </div>`
1926            : `<div class="hold-info-box hold-info-upgrade">
1927                <i class="fas fa-star"></i>
1928                <div>
1929                    <strong>Obsidian tier - minimum locks</strong>
1930                    <p>You're at the top tier. Your earnings are released as fast as possible.</p>
1931                </div>
1932              </div>`);
1933
1934        const TIER_ORDER = [
1935            ['none', 'Starter'], ['bronze', 'Bronze'], ['silver', 'Silver'],
1936            ['gold', 'Gold'], ['diamond', 'Diamond'], ['obsidian', 'Obsidian']
1937        ];
1938        const myTier = info.tier || 'none';
1939        const levelChips = TIER_ORDER.map(function (t) {
1940            return '<span class="hold-lvl' + (t[0] === myTier ? ' hold-lvl-mine' : '') + '">' + t[1] + '</span>';
1941        }).join('<i class="fas fa-chevron-right hold-lvl-sep"></i>');
1942
1943        const levelsBox = `<div class="hold-info-box hold-info-why">
1944            <i class="fas fa-layer-group"></i>
1945            <div>
1946                <strong>Your level shortens the wait</strong>
1947                <div class="hold-lvl-row">${levelChips}</div>
1948                <p>Your level rises with your total earnings. The higher it is, the sooner your rewards are released - and more of them arrive instantly.</p>
1949            </div>
1950        </div>`;
1951
1952        return `<div class="hold-tab-wrap">${lockBox}${whyBox}${levelsBox}${upgradeHint}</div>`;
1953    }
1954
1955    function closePopularOfferModal() {
1956        const modal = document.getElementById('popularOfferModal');
1957        if (modal && modal.classList.contains('show')) {
1958            modal.classList.remove('show');
1959            
1960            const iframeModal = document.getElementById('iframeModal');
1961            if (!iframeModal || !iframeModal.classList.contains('show')) {
1962                document.body.classList.remove('offer-modal-open');
1963            }
1964            
1965            currentOfferData = null;
1966            
1967            const footerInfo = document.querySelector('.offer-footer-info');
1968            if (footerInfo) footerInfo.remove();
1969            
1970            const existingBadge = document.querySelector('.high-pay-badge-modal');
1971            if (existingBadge) existingBadge.remove();
1972            
1973            const totalPayoutSection = document.querySelector('.total-payout-section');
1974            if (totalPayoutSection) totalPayoutSection.remove();
1975            consumeModalBack();
1976        }
1977    }
1978
1979    function escapeHtml(str) {
1980        if (typeof str !== 'string') return '';
1981        return str
1982            .replace(/&/g, '&amp;')
1983            .replace(/</g, '&lt;')
1984            .replace(/>/g, '&gt;')
1985            .replace(/"/g, '&quot;')
1986            .replace(/'/g, '&#039;');
1987    }
1988
1989    function formatOfferDescription(description) {
1990        if (!description || !description.trim()) return '';
1991        const escaped = escapeHtml(description);
1992        return escaped.replace(/\n/g, '<br>').trim();
1993    }
1994    function updateFilterCounts() {
1995        const counts = { web: 0, android: 0, ios: 0 };
1996        
1997        if (originalOffersData && Array.isArray(originalOffersData)) {
1998            originalOffersData.forEach(offer => {
1999                if (offer.devices && Array.isArray(offer.devices)) {
2000                    offer.devices.forEach(device => {
2001                        if (counts.hasOwnProperty(device)) {
2002                            counts[device]++;
2003                        }
2004                    });
2005                }
2006                else if (offer.categories && Array.isArray(offer.categories)) {
2007                    const devices = [];
2008                    if (offer.categories.includes('Android')) devices.push('android');
2009                    if (offer.categories.includes('iPhone') || offer.categories.includes('iPad')) devices.push('ios');
2010                    if (devices.length === 0) devices.push('web');
2011                    
2012                    devices.forEach(device => {
2013                        if (counts.hasOwnProperty(device)) {
2014                            counts[device]++;
2015                        }
2016                    });
2017                }
2018            });
2019        }
2020        
2021        Object.keys(counts).forEach(device => {
2022            const btn = document.querySelector(`.featured-grid-container [data-device="${device}"]`);
2023            if (btn) {
2024                const countElement = btn.querySelector('.filter-count');
2025                if (countElement) {
2026                    countElement.textContent = counts[device];
2027                }
2028            }
2029        });
2030    }
2031
2032
2033
2034    function setupViewportTracking() {
2035        const observer = new IntersectionObserver((entries) => {
2036            entries.forEach(entry => {
2037                if (entry.isIntersecting) {
2038                    const card = entry.target;
2039                    const offerId = card.dataset.offerId;
2040                    const offer = window.popularOffersData.find(o => o.id == offerId);
2041                    
2042                    if (offer && offer.impression_url) {
2043                        setTimeout(() => {
2044                            if (entry.isIntersecting) {
2045                                fireImpressionPixel(offer.impression_url);
2046                            }
2047                        }, 3000);
2048                    }
2049                }
2050            });
2051        }, {
2052            threshold: 0.5,
2053            rootMargin: '0px'
2054        });
2055        
2056        document.querySelectorAll('.popular-offer-card').forEach(card => {
2057            observer.observe(card);
2058        });
2059    }
2060    function getProviderLogoUrl(providerName) {
2061        const map = {
2062            'mychips': '/assets/images/partners/mychips.svg',
2063            'bitlabs': '/assets/images/partners/bitlabs.svg',
2064            'torox': '/assets/images/partners/torox.svg',
2065            'adscend': '/assets/images/partners/adscendmedia.svg',
2066            'adscendmedia': '/assets/images/partners/adscendmedia.svg',
2067            'hangmyads': '/assets/images/partners/hangmyads.webp',
2068            'mmwall': '/assets/images/partners/mmwall.svg',
2069            'cpx': '/assets/images/partners/cpxresearch.svg',
2070            'cpxresearch': '/assets/images/partners/cpxresearch.svg',
2071            'theoremreach': '/assets/images/partners/theoremreach.webp',
2072            'timewall': '/assets/images/partners/timewall.webp',
2073            'pixylabs': '/assets/images/partners/pixylabs.webp',
2074            'gemiad': '/assets/images/partners/gemi-ad-logo.webp',
2075            'primesurvey': '/assets/images/partners/prime.svg',
2076            'primeinsights': '/assets/images/partners/prime.svg',
2077            'primeearnoffers': '/assets/images/partners/primeearn.svg',
2078            'primeearn': '/assets/images/partners/primeearn.svg',
2079            'lootably': '/assets/images/partners/lootably.webp',
2080            'ayetstudios': '/assets/images/partners/gametastic.webp',
2081            'gametastic': '/assets/images/partners/gametastic.webp',
2082            'adtowall': '/assets/images/partners/adtowall.svg',
2083            'upwall': '/assets/images/partners/upwall.png',
2084            'revtoo': '/assets/images/partners/revtoo.svg',
2085            'taprain': '/assets/images/partners/taplogo.webp',
2086            'sharklio': '/assets/images/partners/sharklio.webp',
2087        };
2088        const key = (providerName || '').toLowerCase().replace(/[\s_-]+/g, '');
2089        return map[key] || '/assets/images/default-offer.webp';
2090    }
2091
2092    function openOfferModal(offerId, type) {
2093        const offer = window.popularOffersData.find(o => o.id == offerId);
2094        if (!offer) return;
2095        window.__ofrCurrentOffer = offerId;
2096        if (window.OfferReviews) OfferReviews.load(offerId, document.querySelector('#popular-reviews .ofr-mount'), document.getElementById('earnOfrStars'), document.getElementById('earnOfrHero'));
2097        window._currentOfferMaxHold = null;
2098        const _hBody = document.getElementById('popular-holds-body');
2099        if (_hBody) { _hBody.innerHTML = ''; delete _hBody.dataset.built; }
2100
2101        const modalId = 'popularOfferModal';
2102        const modal = document.getElementById(modalId);
2103        if (!modal) return;
2104
2105        const ids = {
2106            image: 'modalOfferImage',
2107            title: 'modalOfferTitle',
2108            reward: 'modalOfferReward',
2109            devices: 'modalOfferDevices',
2110            status: 'popularStatusBadge',
2111            provider: 'modalProviderImage',
2112            description: 'modalOfferDescription',
2113            requirements: 'modalOfferRequirements',
2114            playBtn: 'modalPlayBtn'
2115        };
2116
2117        if (type === 'popular' && offer.detail_impression_url) {
2118            fireImpressionPixel(offer.detail_impression_url);
2119        }
2120
2121        (function(){
2122            var _mi = document.getElementById(ids.image);
2123            _mi.classList.remove('is-small-icon');
2124            _mi.onload = function(){ if (this.naturalWidth && this.naturalWidth <= 150) this.classList.add('is-small-icon'); };
2125            _mi.src = offer.icon_url || '/assets/images/default-offer.webp';
2126        })();
2127        (function(){ var _hu=offer.icon_url||''; var _hdr=document.querySelector('#popularOfferModal .popular-offer-modal-header'); if(_hdr){ if(_hu){ _hdr.style.setProperty('--ofr-hero','url("'+_hu.replace(/["\\]/g,'')+'")'); _hdr.classList.add('ofr-has-hero'); } else { _hdr.classList.remove('ofr-has-hero'); } } })();
2128
2129        const title = offer.title.length > 60 ? offer.title.substring(0, 57) + '...' : offer.title;
2130        document.getElementById(ids.title).textContent = title;
2131        document.getElementById(ids.title).title = offer.title;
2132        
2133        document.getElementById(ids.reward).innerHTML = (type === 'popular') ? offer.reward_display : `$${formatAmountExact(offer.payout)}`;
2134        
2135        document.getElementById(ids.status).className = 'modal-status-badge status-loading';
2136        document.getElementById(ids.status).textContent = '...';
2137        const providerName = offer.provider || ((type === 'popular') ? 'MyChips' : 'BitLabs');
2138        const providerImgEl = document.getElementById(ids.provider);
2139        providerImgEl.src = getProviderLogoUrl(providerName);
2140        providerImgEl.alt = providerName;
2141        document.getElementById(ids.description).innerHTML = formatOfferDescription(offer.description || offer.full_description);
2142
2143        const devicesContainer = document.getElementById(ids.devices);
2144        devicesContainer.innerHTML = getDeviceIcons(offer.devices && offer.devices.length ? offer.devices : offer.categories);
2145
2146        const reqContainer = document.getElementById(ids.requirements);
2147        
2148        let requirementsList = [];
2149        let conditionsHTML = '';
2150        
2151        const isBitlabsOffer = (offer.provider || '').toLowerCase().includes('bitlabs');
2152        if (type === 'task' || (isBitlabsOffer && Array.isArray(offer.bitlabs_events) && offer.bitlabs_events.length > 0)) {
2153            if (offer.bitlabs_events && offer.bitlabs_events.length > 0) {
2154                requirementsList = offer.bitlabs_events.map(event => ({
2155                    text: event.name,
2156                    payout: event.payout
2157                }));
2158            }
2159            
2160            const thingsToKnow = offer.things_to_know || [];
2161            if (thingsToKnow.length > 0) {
2162                const conditionsContainer = document.getElementById('popularModalConditionsSection');
2163                const conditionsList = document.getElementById('popularModalOfferConditions');
2164                if (conditionsContainer && conditionsList) {
2165                    conditionsHTML = thingsToKnow.map(condition => `<li>${escapeHtml(String(condition))}</li>`).join('');
2166                    conditionsList.innerHTML = conditionsHTML;
2167                    conditionsContainer.style.display = 'block';
2168                }
2169            } else {
2170                const conditionsContainer = document.getElementById('popularModalConditionsSection');
2171                if (conditionsContainer) conditionsContainer.style.display = 'none';
2172            }
2173        } else {
2174            requirementsList = parseRequirements(offer.requirements);
2175        }
2176        
2177        if (requirementsList.length === 0) {
2178            requirementsList.push({ text: 'Complete the offer as instructed to earn the full reward.', payout: offer.payout || 0 });
2179        }
2180        
2181        reqContainer.innerHTML = '<li style="justify-content: center; padding: 2rem;"><div class="spinner"></div></li>';
2182
2183        (function() {
2184            const holdOrder = ['Instant','3 hours','6 hours','12 hours','1 day','2 days','3 days','5 days','7 days','10 days','12 days','14 days','20 days','30 days','45 days'];
2185            let maxIdx = 0;
2186            requirementsList.forEach(function(req) {
2187                const payout = req.boostedPayout || req.payout || 0;
2188                if (payout > 0) {
2189                    const h = _offerEstHold(payout);
2190                    const idx = holdOrder.indexOf(h);
2191                    if (idx > maxIdx) maxIdx = idx;
2192                }
2193            });
2194            window._currentOfferMaxHold = maxIdx === 0 ? 'Instant' : holdOrder[maxIdx];
2195            const _holdsTabBtn = document.querySelector('#popularOfferModal .modal-tab[onclick*="popular-holds"]');
2196            if (_holdsTabBtn) _holdsTabBtn.style.display = window._currentOfferMaxHold === 'Instant' ? 'none' : '';
2197        })();
2198
2199        checkOfferProgress(offer.id, type).then(progressData => {
2200            const progressKeys = Object.keys(progressData);
2201            const hasProgress = progressKeys.length > 0;
2202            const completedSteps = progressKeys.filter(key => progressData[key] === 'completed').length;
2203            const inProgressSteps = progressKeys.filter(key => progressData[key] === 'in-progress').length;
2204            
2205            const statusElement = document.getElementById(ids.status);
2206            if (completedSteps > 0) {
2207                if (completedSteps === requirementsList.length) {
2208                    statusElement.textContent = '✓ Completed';
2209                    statusElement.className = 'modal-status-badge status-completed';
2210                } else {
2211                    statusElement.textContent = `${completedSteps}/${requirementsList.length} Completed`;
2212                    statusElement.className = 'modal-status-badge status-completed';
2213                }
2214            } else if (inProgressSteps > 0 || hasProgress) {
2215                statusElement.textContent = 'In Progress';
2216                statusElement.className = 'modal-status-badge status-in-progress';
2217            } else {
2218                statusElement.textContent = 'Not Started';
2219                statusElement.className = 'modal-status-badge status-not-started';
2220            }
2221            
2222            reqContainer.innerHTML = requirementsList.map((req, index) => {
2223                const progressStatus = progressData[index] || 'pending';
2224                let progressIcon = '';
2225                let progressClass = '';
2226                
2227                if (progressStatus === 'completed') {
2228                    progressIcon = '<i class="fas fa-check-circle" style="color: #00ff88; margin-right: 8px;"></i>';
2229                    progressClass = 'step-completed';
2230                } else if (progressStatus === 'in-progress') {
2231                    progressIcon = '<i class="fas fa-clock" style="color: #ffd700; margin-right: 8px;"></i>';
2232                    progressClass = 'step-started';
2233                } else {
2234                    progressIcon = '<i class="far fa-circle" style="color: #666; margin-right: 8px;"></i>';
2235                }
2236                
2237                const offerBonusPct = offer.bonus_percent || 0;
2238                const boosted = req.boostedPayout || (offerBonusPct > 0 && req.payout > 0 ? req.payout * (1 + offerBonusPct/100) : 0);
2239                const displayPayout = boosted || req.payout;
2240                const stepPayoutHtml = req.payout > 0
2241                    ? (boosted > 0
2242                        ? `<div class="step-payout notranslate step-payout-bonus"><span class="step-payout-orig">
2242$${formatAmountExact(req.payout)}</span><span>$${formatAmountExact(boosted)}</span></div>`
2243                        : `<div class="step-payout notranslate">$${formatAmountExact(req.payout)}</div>`)
2244                    : '';
2245                const lockBadge = _mkEarnHoldBadge(displayPayout);
2246                return `<li class="${progressClass}">${progressIcon}<div class="step-text">${escapeHtml(req.text)}</div><div class="step-right">${stepPayoutHtml}${lockBadge}</div></li>`;
2247            }).join('');
2248        });
2249
2250        const playBtn = document.getElementById(ids.playBtn);
2251        const offerClickUrl = offer.id ? ('/offer/' + encodeURIComponent(offer.id)) : '';
2252
2253        const trackingProvider = offer.provider ? offer.provider.toLowerCase().replace(/[\s_-]+/g, '') : 'mychips';
2254
2255        const freshBtn = playBtn.cloneNode(true);
2256        playBtn.parentNode.replaceChild(freshBtn, playBtn);
2257        freshBtn.href = offerClickUrl || '#';
2258        freshBtn.target = '_blank';
2259        freshBtn.rel = 'noopener noreferrer';
2260        const earnAmount = (type === 'popular') ? offer.reward_display : `$${formatAmountExact(offer.payout)}`;
2261        const _btnBonusPct = offer.bonus_percent || 0;
2262        const _btnOrigPay  = offer.original_payout_usd || 0;
2263        const _btnIsCoin   = offer.is_coin_display || false;
2264        const _btnOrigDisp = _btnIsCoin
2265            ? Math.round(_btnOrigPay).toLocaleString() + ' SC'
2266            : `$${formatAmountExact(_btnOrigPay)}`;
2267        const earnHtml = (_btnBonusPct > 0 && _btnOrigPay > 0)
2268            ? `${earnAmount}<span style="text-decoration:line-through;opacity:.6;font-size:.88em;margin-left:3px;">${_btnOrigDisp}</span>`
2269            : earnAmount;
2270        freshBtn.innerHTML = `<i class="fas fa-play"></i> Earn ${earnHtml} Now!`;
2271
2272        if (!userId || userId === '0') {
2273            const _qrOvHPg = document.getElementById('earnQROverlayHighPay');
2274            const _qrOvPopg = document.getElementById('earnQROverlayPopular');
2275            if (_qrOvHPg) _qrOvHPg.style.display = 'none';
2276            if (_qrOvPopg) _qrOvPopg.style.display = 'none';
2277            const _offerBonusG = offer.bonus_percent || 0;
2278            reqContainer.innerHTML = requirementsList.map(req => {
2279                const _boosted = req.boostedPayout || (_offerBonusG > 0 && req.payout > 0 ? req.payout * (1 + _offerBonusG/100) : 0);
2280                const _dispPay = _boosted || req.payout;
2281                const _spHtml = req.payout > 0
2282                    ? (_boosted > 0
2283                        ? `<div class="step-payout notranslate step-payout-bonus"><span class="step-payout-orig">$${formatAmountExact(req.payout)}</span><span>$${formatAmountExact(_boosted)}</span></div>`
2284                        : `<div class="step-payout notranslate">$${formatAmountExact(req.payout)}</div>`)
2285                    : '';
2286                const _gLock = _mkEarnHoldBadge(_dispPay);
2287                return `<li><i class="far fa-circle" style="color:#666;margin-right:8px;"></i><div class="step-text">${escapeHtml(req.text)}</div><div class="step-right">${_spHtml}${_gLock}</div></li>`;
2288            }).join('');
2289            document.getElementById(ids.status).textContent = 'Sign Up to Earn';
2290            document.getElementById(ids.status).className = 'modal-status-badge status-not-started';
2291            freshBtn.removeAttribute('href');
2292            freshBtn.removeAttribute('target');
2293            freshBtn.innerHTML = '<i class="fas fa-user-plus"></i> Sign Up!';
2294            freshBtn.style.background = 'linear-gradient(135deg, #00e5ff, #0ea5e9)';
2295            freshBtn.addEventListener('click', (e) => {
2296                e.preventDefault();
2297                modal.classList.remove('show');
2298                document.body.classList.remove('offer-modal-open');
2299                if (typeof openAuthModal === 'function') openAuthModal('register');
2300            });
2301            modal.classList.add('show');
2302            document.body.classList.add('offer-modal-open');
2303            return;
2304        }
2305        const _qrOvHP = document.getElementById('earnQROverlayHighPay');
2306        const _qrOvPop = document.getElementById('earnQROverlayPopular');
2307        if (_qrOvHP) _qrOvHP.style.display = 'none';
2308        if (_qrOvPop) _qrOvPop.style.display = 'none';
2309
2310        freshBtn.addEventListener('click', (e) => {
2311            e.stopPropagation();
2312            const _earnDevs = Array.isArray(offer.devices) ? offer.devices : [];
2313            if (!offerAvailableForPlatform(_earnDevs, detectUserPlatform())) {
2314                e.preventDefault();
2315                earnShowQR(offer, type);
2316                return;
2317            }
2318            if (navigator.sendBeacon) {
2319                const fd = new FormData();
2320                fd.append('action', 'track_offer_click');
2321                fd.append('offer_id', offer.id);
2322                fd.append('provider', trackingProvider);
2323                fd.append('csrf_token', window.csrfToken);
2324                fd.append('offer_title',            offer.title || '');
2325                fd.append('offer_icon_url',         offer.icon_url || '');
2326                const _p = offer.user_payout_usd || offer.payout || parseFloat((offer.reward_display || '').replace(/[^0-9.]/g, '')) || 0;
2327                if (_p > 0) fd.append('offer_payout_usd', _p);
2328                fd.append('offer_description',      offer.full_description || offer.description || '');
2329                fd.append('offer_requirements',     offer.requirements || '');
2330                fd.append('offer_devices',          Array.isArray(offer.devices) ? offer.devices.join(',') : '');
2331                fd.append('offer_provider_display', offer.provider || '');
2332                navigator.sendBeacon('/api/secure_handler.php', fd);
2333            } else {
2334                trackOfferClick(offer.id, trackingProvider, offer).catch(() => {});
2335            }
2336            const statusEl = document.getElementById(ids.status);
2337            if (statusEl && statusEl.classList.contains('status-not-started')) {
2338                statusEl.textContent = 'In Progress';
2339                statusEl.className = 'modal-status-badge status-in-progress';
2340            }
2341        });
2342        
2343        const POPULAR_WALL_MAP = {'mychips':'mychips','bitlabs':'bitlabs-offers','torox':'torox','timewall':'timewall','cpxresearch':'cpxresearch','cpx':'cpxresearch','hangmyads':'hangmyads','mmwall':'mmwall','adscen
2343dmedia':'adscendmedia','adscend':'adscendmedia','ayetstudios':'gametastic','gametastic':'gametastic','polltastic':'polltastic','pixylabs':'pixylabs','gemiad':'gemiad','lootably':'lootably'};
2344        const activityBtnId = 'popularActivityBtn';
2345        const activityBtn = document.getElementById(activityBtnId);
2346        if (activityBtn) {
2347            const pKey = (offer.provider || '').toLowerCase().replace(/[\s_-]+/g, '');
2348            const wallProvider = POPULAR_WALL_MAP[pKey] || null;
2349            activityBtn._wallProvider = wallProvider;
2350            activityBtn.style.display = wallProvider ? 'flex' : 'none';
2351        }
2352
2353        const _provLower = (offer.provider || '').toLowerCase();
2354        const _hideCoinRate = _provLower.includes('hangmyads') || _provLower.includes('taprain');
2355        document.querySelectorAll('.earn-coin-rate-info').forEach(el => {
2356            el.style.display = _hideCoinRate ? 'none' : '';
2357        });
2358
2359        // Prime Earn: a lista-vegpontjuk nem kuld leirast es lepeseket, azok csak az ajanlat
2360        // reszletek-vegpontjan erhetok el. Ugyanaz a lekeres, mint az offers oldalon
2361        // (tabs/offers.php) - enelkul itt ures "About" es egyetlen altalanos lepes latszik.
2362        if ((offer.provider || '').toLowerCase().replace(/[\s_-]+/g, '') === 'primeearn' && offer.primeearn_hash) {
2363            const _peFd = new FormData();
2364            _peFd.append('action', 'primeearn_offer_detail');
2365            _peFd.append('hash', offer.primeearn_hash);
2366            _peFd.append('csrf_token', window.csrfToken || '');
2367            fetch('/api/secure_handler.php', { method: 'POST', credentials: 'same-origin', body: _peFd })
2368                .then(r => r.json())
2369                .then(data => {
2370                    if (!data.success) return;
2371                    if (data.description) {
2372                        const _dEl = document.getElementById(ids.description);
2373                        if (_dEl) _dEl.innerHTML = formatOfferDescription(data.description);
2374                    }
2375                    if (data.rewards && data.rewards.length > 0) {
2376                        reqContainer.innerHTML = data.rewards.map(r => {
2377                            const _pay = parseFloat(r.payout) || 0;
2378                            const _sp = _pay > 0
2379                                ? `<div class="step-payout notranslate">$${formatAmountExact(_pay)}</div>`
2380                                : '';
2381                            return `<li><i class="far fa-circle" style="color:#666;margin-right:8px;"></i><div class="step-text">${r.task}</div><div class="step-right">${_sp}${_mkEarnHoldBadge(_pay)}</div></li>`;
2382                        }).join('');
2383                    }
2384                })
2385                .catch(() => {});
2386        }
2387        modal.classList.add('show');
2388        document.body.classList.add('offer-modal-open');
2389        pushModalBack();
2390    }
2391
2392    function detectUserPlatform() {
2393        const ua = navigator.userAgent;
2394        if (/iPhone|iPad|iPod/i.test(ua)) return 'ios';
2395        if (/Android/i.test(ua)) return 'android';
2396        const isTouchCapable = (navigator.maxTouchPoints > 0) || ('ontouchstart' in window);
2397        if (isTouchCapable) {
2398            return /Mac/i.test(ua) ? 'ios' : 'android';
2399        }
2400        return 'desktop';
2401    }
2402    function offerAvailableForPlatform(devs, platform) {
2403        if (!devs || !devs.length) return true;
2404        const normalized = devs.map(d => d.toLowerCase() === 'web' ? 'desktop' : d.toLowerCase());
2405        const deduped = [...new Set(normalized)];
2406        if (deduped.includes('all')) return true;
2407        return deduped.includes(platform);
2408    }
2409    function earnShowQR(offer, type) {
2410        const overlayId = 'earnQROverlayPopular';
2411        const imgId     = (type === 'popular') ? 'earnQRImgPopular'      : 'earnQRImgHighPay';
2412        const devsId    = (type === 'popular') ? 'earnQRDevsPopular'     : 'earnQRDevsHighPay';
2413        const overlay   = document.getElementById(overlayId);
2414        const qrImg     = document.getElementById(imgId);
2415        const qrDevs    = document.getElementById(devsId);
2416        if (!overlay || !qrImg) return;
2417        if (qrDevs) {
2418            const devMap = {android:'fab fa-android', ios:'fab fa-apple'};
2419            const devs = (Array.isArray(offer.devices) ? offer.devices : []).map(d => d.toLowerCase()).filter(d => devMap[d]);
2420            qrDevs.innerHTML = [...new Set(devs)].map(d => `<i class="${devMap[d]}" style="margin:0 3px" title="${d}"></i>`).join('');
2421        }
2422        qrImg.style.opacity = '0';
2423        qrImg.src = '';
2424        overlay.style.display = 'flex';
2425        const qrUrl = offer.id ? (window.location.origin + '/offer/' + encodeURIComponent(offer.id)) : window.location.href;
2426        qrImg.onload = () => { qrImg.style.opacity = '1'; };
2427        qrImg.src = 'https://api.qrserver.com/v1/create-qr-code/?size=240x240&data=' + encodeURIComponent(qrUrl);
2428    }
2429    window.earnCloseQR = function(type) {
2430        const overlayId = 'earnQROverlayPopular';
2431        const overlay = document.getElementById(overlayId);
2432        if (overlay) overlay.style.display = 'none';
2433    };
2434
2435    function openWallForProvider(wallProvider) {
2436        const card = document.querySelector(`.partner-card[data-provider="${CSS.escape(wallProvider)}"]`);
2437        if (card && !card.classList.contains('placeholder') && !card.classList.contains('partner-card--unavailable')) {
2438            card.click();
2439        }
2440    }
2441
2442    document.addEventListener('DOMContentLoaded', function loadFeaturedSurveys() {
2443        const grid = document.getElementById('featuredSurveysGrid');
2444        if (!grid) return;
2445
2446        const LOGO_MAP = {
2447            cpx: '/assets/images/partners/cpxresearch.svg',
2448            bitlabs: '/assets/images/partners/bitlabs.svg',
2449            ayetstudios: '/assets/images/partners/polltastic.webp',
2450            primesurveys: '/assets/images/partners/prime.svg',
2451            adscendmedia: '/assets/images/partners/adscendmedia.svg',
2452            timewall: '/assets/images/partners/timewall.webp',
2453            cherries: '/assets/images/partners/cherries.webp'
2454        };
2455        const SURVEY_MAINTENANCE_PROVIDERS = [];  // add a provider key (e.g. 'bitlabs') to grey its cards out
2456        let TIMEWALL_PRESCREENER = false;
2457        const LOGO_ALT = {
2458            cpx: 'CPX Research', bitlabs: 'BitLabs', ayetstudios: 'Polltastic',
2459            primesurveys: 'Prime Surveys', adscendmedia: 'AdScend Media', timewall: 'TimeWall',
2460            cherries: 'Cherries'
2461        };
2462
2463        function buildCard(s) {
2464            const provider = s.provider || 'cpx';
2465            const payout = parseFloat(s.payout) || 0;
2466            const usd = provider === 'cpx' ? (payout / 1000).toFixed(3) : payout.toFixed(3);
2467            const link = s.href || '#';
2468            const rating = parseFloat(provider === 'cpx' ? s.statistics_rating_avg : s.rating) || 0;
2469            const loi = s.loi || 0;
2470            const bonusPct = parseFloat(s.bonus_percent) || 0;
2471            const origPayout = parseFloat(s.original_payout) || 0;
2472            const origUsd = provider === 'cpx' ? (origPayout / 1000).toFixed(3) : origPayout.toFixed(3);
2473            const tierClass = parseFloat(usd) < 0.5 ? 'yellow-tier' : parseFloat(usd) < 1.0 ? 'blue-tier' : 'green-tier';
2474            const logo = LOGO_MAP[provider] || LOGO_MAP.cpx;
2475            const alt = LOGO_ALT[provider] || 'Survey';
2476            const payoutHtml = bonusPct > 0 && origPayout > 0
2477                ? `<span class="payout-original-survey">$${origUsd}</span>$${usd}`
2478                : `$${usd}`;
2479            const badgeHtml = bonusPct > 0 ? `<div class="survey-bonus-badge">+${bonusPct}%</div>` : '';
2480            const ratingHtml = rating > 0
2481                ? `<div class="survey-rating"><i class="fas fa-star"></i> ${parseFloat(rating).toFixed(1)}</div>`
2482                : `<div class="survey-rating survey-rating--empty"><i class="fas fa-star"></i></div>`;
2483            const durHtml = loi > 0 ? `<div class="survey-duration"><i class="fas fa-clock"></i> ${loi} min</div>` : '';
2484
2485            // Same maintenance list as the surveys tab - empty means every
2486            // provider is open. (BitLabs paused 2026-08-26, reopened 2026-09-02.)
2487            const isMaintenance = SURVEY_MAINTENANCE_PROVIDERS.includes(provider);
2488            const card = document.createElement('div');
2489            card.className = `survey-card ${tierClass}${isMaintenance ? ' maintenance-survey' : ''}`;
2490            if (isMaintenance) card.style.cssText = 'opacity:.45;cursor:not-allowed;filter:grayscale(1);pointer-events:none;';
2491            const needsProfile = (provider === 'timewall') && TIMEWALL_PRESCREENER;
2492            const overlayHtml = isMaintenance
2493                ? `<div class="survey-overlay" style="opacity:1;font-size:.9rem;line-height:1.4;background:rgba(0,0,0,.85);flex-direction:column;text-align:center;padding:.5rem;"><i class="fas fa-tools" style="font-size:1.5rem;display:block;margin-bottom:.5rem"></i>Under maintenance</div>`
2494                : (needsProfile
2495                    ? `<div class="survey-overlay" style="opacity:1;font-size:.88rem;line-height:1.35;background:rgba(0,0,0,.82);flex-direction:column;text-align:center;padding:.5rem;"><i class="fas fa-user-edit" style="font-size:1.4rem;display:block;margin-bottom:.4rem"></i>Quick profile check<br><span style="font-size:.76rem;opacity:.85">one time only, to unlock this survey</span></div>`
2496                    : `<div class="survey-overlay">Start Survey</div>`);
2497            card.innerHTML = `<div class="survey-payout notranslate">${payoutHtml}</div>${badgeHtml}<div class="survey-image"><img src="${logo}" alt="${alt}" loading="lazy"></div><div class="survey-title">Premium Survey</div>${durHtml}${overlayHtml}${ratingHtml}`;
2498            card.addEventListener('click', function() {
2499                if (isMaintenance) return;
2500                if (!link || link === '#') { window.location.href = '/surveys'; return; }
2501                if (navigator.userAgent.includes('SharkEarningsApp')) {
2502                    window.location.href = link;
2503                } else {
2504                    window.open(link, '_blank', 'noopener,noreferrer');
2505                }
2506            });
2507            return card;
2508        }
2509
2510        function renderSurveys(surveys) {
2511            const sorted = surveys.slice().sort((a, b) => {
2512                const pa = parseFloat(a.payout) || 0, pb = parseFloat(b.payout) || 0;
2513                const ua = a.provider === 'cpx' ? pa / 1000 : pa;
2514                const ub = b.provider === 'cpx' ? pb / 1000 : pb;
2515                return ub - ua;
2516            });
2517            const top15 = sorted.slice(0, 15);
2518            grid.innerHTML = '';
2519            top15.forEach(s => grid.appendChild(buildCard(s)));
2520            
2521            const wrapper = grid.closest('.horizontal-scroll-wrapper');
2522            if (wrapper) {
2523                const prevBtn = wrapper.querySelector('.scroll-btn.prev');
2524                const nextBtn = wrapper.querySelector('.scroll-btn.next');
2525                const updateBtns = () => {
2526                    const max = grid.scrollWidth - grid.clientWidth;
2527                    if (prevBtn) prevBtn.classList.toggle('disabled', grid.scrollLeft <= 1);
2528                    if (nextBtn) nextBtn.classList.toggle('disabled', grid.scrollLeft >= max - 1);
2529                };
2530                grid.addEventListener('scroll', updateBtns, { passive: true });
2531                updateBtns();
2532                if (prevBtn) prevBtn.addEventListener('click', () => grid.scrollBy({ left: -(155 + 13) * 2, behavior: 'smooth' }));
2533                if (nextBtn) nextBtn.addEventListener('click', () => grid.scrollBy({ left: (155 + 13) * 2, behavior: 'smooth' }));
2534            }
2535        }
2536
2537        function tryCache() {
2538            try {
2539                const d = localStorage.getItem('surveys_cache_v7');
2540                const t = localStorage.getItem('surveys_cache_time_v7');
2541                if (d && t && (Date.now() - parseInt(t)) < 20 * 60 * 1000) {
2542                    const parsed = JSON.parse(d);
2543                    if (parsed && parsed.surveys && parsed.surveys.length) return parsed.surveys;
2544                }
2545            } catch (e) {}
2546            return null;
2547        }
2548
2549        async function withAyetSurveys(data) {
2550            const base = (data && data.surveys) ? data.surveys : [];
2551            if (!data || !data.ayetstudios_config || data.ayetstudios_config.status !== 'success') return base;
2552            if (typeof fetchAyetStudiosSurveys !== 'function') return base;
2553            try {
2554                let ayet = await fetchAyetStudiosSurveys(data.ayetstudios_config);
2555                if (!ayet || !ayet.length) return base;
2556                const bonuses = data.survey_bonuses || {};
2557                const slugMap = { ayetstudios: 'polltastic' };
2558                ayet = ayet.map(s => {
2559                    const slug = slugMap[s.provider] || s.provider;
2560                    const pct = parseFloat(bonuses[slug] || 0);
2561                    if (pct > 0) {
2562                        const orig = parseFloat(s.payout) || 0;
2563                        s.original_payout = orig;
2564                        s.payout = Math.round(orig * (1 + pct / 100) * 100) / 100;
2565                        s.bonus_percent = pct;
2566                    }
2567                    return s;
2568                });
2569                return base.concat(ayet);
2570            } catch (e) {
2571                return base;
2572            }
2573        }
2574
2575        const cached = tryCache();
2576        if (cached) {
2577            renderSurveys(cached);
2578            return;
2579        }
2580
2581        fetch('/api/get_surveys.php?sw=' + (window.screen?.width || 0) + '&sh=' + (window.screen?.height || 0))
2582            .then(r => r.json())
2583            .then(async data => {
2584                // TimeWall serves profile-completion links until the prescreener is done.
2585                TIMEWALL_PRESCREENER = !!data.timewall_prescreener;
2586                const surveys = await withAyetSurveys(data);
2587                if (surveys && surveys.length) {
2588                    try {
2589                        // Never cache a prescreener list - it goes stale the moment
2590                        // the user completes their TimeWall profile.
2591                        if (!data.timewall_prescreener && !data.no_cache) {
2592                            localStorage.setItem('surveys_cache_v7', JSON.stringify({ ...data, surveys }));
2593                            localStorage.setItem('surveys_cache_time_v7', Date.now().toString());
2594                        }
2595                    } catch (e) {}
2596                    renderSurveys(surveys);
2597                } else {
2598                    const section = document.getElementById('featured-surveys');
2599                    if (section) section.style.display = 'none';
2600                }
2601            })
2602            .catch(() => {
2603                const section = document.getElementById('featured-surveys');
2604                if (section) section.style.display = 'none';
2605            });
2606    });
2607
2608        </script>
2608
2609
2610                
2611    </head>    <body class="no-sidebar-layout sidebar-collapsed full-width-content has-live-ticker">
2612    <a class="skip-link" href="#skip-target">Skip to main content</a>
2613    
2613<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
2614(function(){try{
2615  if(sessionStorage.getItem('rwSkipLoader')!=='1')return;
2616  sessionStorage.removeItem('rwSkipLoader');
2617  var de = document.documentElement;
2618  de.classList.add('pt-skip');
2619  de.classList.add('pt-soft');
2620}catch(e){}})();
2621</script>
2621
2622<div id="pt"><div id="pt-c"><div id="pt-r1"></div><div id="pt-r2"></div><img src="/assets/images/logos/sharklogo.webp" alt="" id="pt-logo" width="120" height="115"></div></div>
2623<style nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">html,body{background:#00070f}html.pt-skip #pt{display:none}
2624html.pt-soft #pt{display:none!important}
2625html.pt-soft main{animation:pt-soft-in .32s ease both}
2626@keyframes pt-soft-in{from{opacity:0}to{opacity:1}}
2627@media (prefers-reduced-motion:reduce){html.pt-soft main{animation:none}}
2628#pt{position:fixed;inset:0;z-index:2147483647;background:#00070f;display:flex;align-items:center;justify-content:center;opacity:1;pointer-events:all}#pt-c{position:relative;width:68px;height:68px;display:flex;align-items:center;justify-content:center}#pt-logo{width:68px;height:68px;object-fit:cover;border-radius:50%;filter:drop-shadow(0 0 12px rgba(0,229,255,.45))}
2629#pt-c::after{content:"";position:absolute;inset:-14px;border-radius:50%;background:radial-gradient(circle,rgba(0,229,255,.30) 0,rgba(0,229,255,0) 70%);pointer-events:none;opacity:0;animation:pt-pulse 2s ease-in-out infinite}#pt-r1{position:absolute;inset:-10px;border-radius:50%;border:2px solid transparent;border-top-color:#00e5ff;border-right-color:rgba(0,229,255,.3);animation:pt-cw .9s linear infinite}#pt-r2{position:absolute;inset:-18px;border-radius:50%;border:1.5px solid transparent;border-bottom-color:rgba(0,229,255,.5);border-left-color:rgba(0,229,255,.15);animation:pt-ccw 1.4s linear infinite}@keyframes pt-cw{to{transform:rotate(360deg)}}@keyframes pt-ccw{to{transform:rotate(-360deg)}}@keyframes pt-pulse{0%,100%{opacity:0}50%{opacity:1}}#pt.pt-out{opacity:0;pointer-events:none;transition:opacity .45s ease}body.loaded{overflow-x:hidden;overflow-y:auto}body.pt-content-in>main{animation:pt-in .55s cubic-bezier(.22,1,.36,1) both}@keyframes pt-in{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}@media (prefers-reduced-motion:reduce){#pt.pt-out{transition:opacity .2s ease}body.pt-content-in>main{animation:none}}
2630img.skl{background:linear-gradient(100deg,rgba(148,190,233,.07) 40%,rgba(148,190,233,.16) 50%,rgba(148,190,233,.07) 60%);background-size:200% 100%;animation:skl-sh 1.1s linear infinite;border-radius:8px;min-width:32px;min-height:32px}
2631@keyframes skl-sh{to{background-position:-200% 0}}
2632@media (prefers-reduced-motion:reduce){img.skl{animation:none}}</style>
2633<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
2634(function(){var pt=document.getElementById('pt'),chat,hidden=false;document.body.classList.add('loaded');window.showSharkLoader=function(){if(!pt)return;hidden=false;pt.style.transition='';pt.classList.remove('pt-out');pt.style.opacity='1';pt.style.pointerEvents='all'};function signalWebReady(){try{if(window.flutter_inappwebview&&window.flutter_inappwebview.callHandler){window.flutter_inappwebview.callHandler('webReady')}}catch(e){}}window.hideSharkLoader=function(){if(!pt||hidden)return;hidden=true;signalWebReady();requestAnimationFrame(function(){document.body.classList.add('pt-content-in');pt.classList.add('pt-out');setTimeout(function(){if(!pt.classList.contains('pt-out'))return;chat=chat||document.getElementById('publicChatTrigger');if(chat)chat.style.cssText='display:flex;opacity:1;transform:scale(1);pointer-events:auto'},350)})};
2635var reveal=window.revealSharkLoader=function(){var t0=Date.now();(function chk(){var ps=[].filter.call(document.querySelectorAll('link[rel="preload"][as="style"]'),function(l){var h=l.getAttribute('href')||'';return h.charAt(0)==='/'||h.indexOf(location.origin)===0;});if(!ps.length||Date.now()-t0>2500){setTimeout(window.hideSharkLoader,120)}else{setTimeout(chk,50)}})()};
2636if(document.readyState!=='loading'){reveal()}else{document.addEventListener('DOMContentLoaded',reveal)}
2637window.addEventListener('load',window.hideSharkLoader);
2638setTimeout(window.hideSharkLoader,6000);})();
2639(function(){
2640function unskl(img){img.classList.remove('skl')}
2641
2642var sklIO = ('IntersectionObserver' in window) ? new IntersectionObserver(function(es){
2643  es.forEach(function(e){
2644    if(!e.isIntersecting)return;
2645    var img=e.target;
2646    sklIO.unobserve(img);
2647    if(!(img.complete&&img.naturalWidth))img.classList.add('skl');
2648    img.loading='eager';
2649    if(!img.complete){var ss=img.getAttribute('src');if(ss){img.src=ss;}}
2650  });
2651},{rootMargin:'300px'}) : null;
2652
2653function mark(img){
2654  if(img.complete&&img.naturalWidth)return;
2655  var retried=false;
2656  img.addEventListener('load',function(){unskl(img)},{once:true});
2657  img.addEventListener('error',function(){
2658    if(!retried&&img.getAttribute('src')){retried=true;var s=img.src;setTimeout(function(){img.src=s.split('#')[0]+'#r'+Date.now()},800);}
2659    else{unskl(img);}
2660  });
2661  if(img.loading==='lazy'&&sklIO){
2662    sklIO.observe(img);
2663  }else{
2664    img.classList.add('skl');
2665    if(img.loading==='lazy')img.loading='eager';
2666  }
2667}
2668function scan(root){if(root.querySelectorAll)root.querySelectorAll('img').forEach(mark)}
2669if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',function(){scan(document)})}else{scan(document)}
2670new MutationObserver(function(ms){ms.forEach(function(m){m.addedNodes.forEach(function(n){if(n.tagName==='IMG'){mark(n)}else if(n.querySelectorAll){scan(n)}})})}).observe(document.documentElement,{childList:true,subtree:true});
2671})();
2672</script>
2672    
2673
2674            
2675        
2675<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
2676function seEscHtml(s) { return String(s ?? '').replace(/[&<>"']/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c])); }
2677(function() {
2678    'use strict';
2679
2680    // A DB a magyar (Europe/Budapest) fali orat tarolja, NEM UTC-t. Ha a
2681    // "YYYY-MM-DD HH:MM:SS" stringet a bongeszo a sajat idozonajaban parszolja
2682    // (vagy 'Z'-vel UTC-nek vesszuk), a datum elcsuszik. Komponensre bontjuk es
2683    // UTC-be tesszuk, majd timeZone:'UTC'-vel formazzuk - igy minden bongeszo
2684    // pontosan a magyar ido szerinti datumot latja.
2685    function shkDate(s) {
2686        if (!s) return null;
2687        var m = String(s).match(/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})(?::(\d{2}))?/);
2688        if (!m) { var f = new Date(s); return isNaN(f.getTime()) ? null : f; }
2689        return new Date(Date.UTC(+m[1], +m[2] - 1, +m[3], +m[4], +m[5], +(m[6] || 0)));
2690    }
2691
2692    // Europe/Budapest abbreviation for a given DB timestamp. Derived from the
2693    // timestamp's own date, not from "now", so a January row is labelled CET even
2694    // when it is viewed in July. CEST runs from the last Sunday of March to the
2695    // last Sunday of October (the one-hour changeover window itself is not split
2696    // out - it would only mislabel rows inside those 60 minutes, twice a year).
2697    function shkTzLabel(s) {
2698        var m = String(s || '').match(/^(\d{4})-(\d{2})-(\d{2})/);
2699        if (!m) return 'CET';
2700        var y = +m[1], mo = +m[2], d = +m[3];
2701        if (mo > 3 && mo < 10) return 'CEST';
2702        if (mo < 3 || mo > 10) return 'CET';
2703        // last Sunday of the month: day 0 of the next month is its last day
2704        var last = new Date(Date.UTC(y, mo, 0));
2705        var lastSunday = last.getUTCDate() - last.getUTCDay();
2706        return mo === 3 ? (d >= lastSunday ? 'CEST' : 'CET')
2707                        : (d >= lastSunday ? 'CET' : 'CEST');
2708    }
2709
2710    const injectCSS = () => {
2711        const css = `.user-profile-link{color:inherit;text-decoration:none;cursor:pointer;opacity:.7;transition:opacity .2s}.user-profile-link:hover{opacity:1;text-decoration:underline}#userProfileModal{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,7,15,.85);display:flex;align-items:center;justify-content:center;z-index:30000;opacity:0;padding:15px;box-sizing:border-box;animation:.3s ease-out forwards fadeIn;-webkit-overflow-scrolling:touch}#userProfileModal .modal-content{position:relative;width:100%;max-width:750px;max-height:90vh;background:radial-gradient(circle,#041a3b 0,var(--deep-ocean-start) 80%);border:1px solid var(--panel-border);border-radius:1.5rem;overflow-y:auto;transform:scale(.9);animation:.3s ease-out forwards modalSlideIn;scrollbar-width:thin;scrollbar-color:var(--accent-primary) var(--deep-ocean-start);-webkit-overflow-scrolling:touch;touch-action:pan-y}#userProfileModal .modal-content::-webkit-scrollbar{width:8px}#userProfileModal .modal-content::-webkit-scrollbar-track{background:var(--deep-ocean-start)}#userProfileModal .modal-content::-webkit-scrollbar-thumb{background:var(--accent-primary);border-radius:4px}@keyframes fadeIn{to{opacity:1}}@keyframes modalSlideIn{to{transform:scale(1)}}#userProfileModal .modal-header{display:none}#userProfileModal .modal-title-bar{position:sticky;top:0;z-index:10;display:flex;align-items:center;justify-content:space-between;padding:1.1rem 1.4rem .9rem;border-bottom:1px solid rgba(255,255,255,.08);background:radial-gradient(circle,#041a3b 0,var(--deep-ocean-start) 80%)}#userProfileModal .modal-title{color:var(--accent-primary);margin:0;font-size:1.1rem;font-weight:600}#userProfileModal .modal-wrapper{position:relative;width:100%;max-width:750px;box-sizing:border-box}#userProfileModal .modal-close{flex-shrink:0;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.2);color:var(--text-primary);font-size:1.1rem;cursor:pointer;padding:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:8px;transition:.2s;z-index:30001;-webkit-tap-highlight-color:transparent}
2711#userProfileModal .modal-close:hover{background:rgba(255,255,255,.22);color:#fff}#userProfileModal .modal-body{padding:1.5rem;position:relative}#userProfileModal .loading-spinner,#userProfileModal .private-profile{text-align:center;padding:3rem;color:var(--text-secondary)}#userProfileModal .loading-spinner{display:flex;flex-direction:column;align-items:center;justify-content:center}#userProfileModal .loading-spinner i{color:var(--accent-primary);margin-bottom:1.2rem}#userProfileModal .loading-spinner p{margin:0}#userProfileModal .profile-header{display:flex;align-items:center;gap:1.5rem;margin-bottom:1.5rem;padding:1.2rem;background:rgba(0,0,0,.2);border-radius:1rem;border:1px solid var(--panel-border)}#userProfileModal .avatar{width:80px;height:80px;border-radius:50%;border:3px solid var(--accent-primary);background:#07244f;display:flex;align-items:center;justify-content:center;font-size:2rem;font-weight:700;overflow:hidden;flex-shrink:0}#userProfileModal .avatar img{width:100%;height:100%;object-fit:cover}#userProfileModal .profile-info{flex:1;min-width:0}#userProfileModal .profile-info h2{font-size:1.8rem;font-weight:700;color:rgba(255,255,255,.95);margin:0;display:flex;align-items:center;gap:6px;flex-wrap:wrap}#userProfileModal .profile-info h2 .username-text{word-break:break-word;min-width:0}.profile-location{display:flex;align-items:center;gap:.3rem;margin-top:.25rem}.country-flag{flex-shrink:0}.country-flag img{width:25px;height:25px;border-radius:50%;object-fit:cover;display:block;border:1px solid rgba(255,255,255,.1)}.country-name{font-size:1.2rem;color:var(--text-secondary);font-weight:500}#userProfileModal .joined-date{color:var(--text-secondary);font-size:.85rem;margin-top:.15rem}#userProfileModal .level-info{display:flex;align-items:center;gap:.8rem;margin-top:.8rem}#userProfileModal .level-badge{background:linear-gradient(90deg,#22d3ee,var(--accent-primary));color:var(--deep-ocean-start);padding:.4rem .8rem;border-radius:1.5rem;font-weight:600;display:flex;align-items:center;gap:.4rem;font-size:.9rem}#userProfileModal .stats-section{margin-bottom:1.5rem}#userProfileModal .stats-title{color:var(--accent-primary);font-size:1.1rem;font-weight:600;margin-bottom:1rem;display:flex;align-items:center;gap:.5rem}#userProfileModal .stats-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:.8rem}#userProfileModal .stat-card{background:rgba(0,0,0,.2);border:1px solid var(--panel-border);border-radius:.8rem;padding:1rem;text-align:center}#userProfileModal .stat-icon{font-size:1.2rem;margin-bottom:.4rem;color:var(--accent-primary)}#userProfileModal .stat-value{font-size:1.3rem;font-weight:700;color:var(--highlight-color);margin-bottom:.3rem}#userProfileModal .stat-label{color:var(--text-secondary);font-size:.8rem}#userProfileModal .activity-section{padding:0}#userProfileModal .activity-list{display:flex;flex-direction:column;gap:.5rem}#userProfileModal .activity-header{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;color:var(--accent-primary);font-size:1.1rem;font-weight:600}#userProfileModal .activity-item{display:grid;grid-template-columns:2.2fr 1fr .8fr;gap:.8rem;align-items:center;padding:.7rem .9rem;background:rgba(0,0,0,.2);border:1px solid var(--panel-border);border-radius:.8rem}#userProfileModal .activity-item.activity-item-header{background:none;border:none;padding:.2rem .9rem;border-bottom:2px solid var(--panel-border);border-radius:0}#userProfileModal .activity-description{color:var(--text-primary);font-size:.85rem;text-align:left;display:flex;align-items:center;gap:.7rem;min-width:0}#userProfileModal .activity-description span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}#userProfileModal .activity-icon,#userProfileModal .activity-icon-default{width:36px;height:36px;border-radius:8px;flex-shrink:0;object-fit:cover;background:#07244f}#userProfileModal .activity-icon-default{display:flex;align-items:center;justify-content:center;color:var(--accent-primary);font-size:1.1rem}#userProfileModal .activity-icon--reward{width:auto;height:34px;max-width:64px;object-fit:contain;padding:0;background:none;border-radius:0}#userProfileModal .activity-date{color:var(--text-secondary);font-size:.8rem;text-align:center}#userProfileModal .activity-amount{color:var(--success-color);font-weight:600;font-size:.9rem;text-align:right}#userProfileModal .private-icon{font-size:3rem;margin-bottom:1rem;color:var(--accent-primary)}#userProfileModal .error-message{text-align:center;padding:2rem;color:var(--error-color)}#userProfileModal .error-message i{font-size:2rem;margin-bottom:1rem}@media (max-width:1024px){#userProfileModal .modal-content{max-height:95vh}#userProfileModal .stats-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width:768px){#userProfileModal{padding:8px;align-items:center}#userProfileModal .modal-content{max-height:calc(100vh - 16px)}#userProfileModal .modal-body{padding:.55rem}#userProfileModal .profile-header{display:flex;flex-direction:row;align-items:center;gap:.7rem;padding:.55rem;position:relative!important;margin-bottom:.6rem}#userProfileModal .profile-info{text-align:left;min-width:0;max-width:100%}#userProfileModal .profile-location,#userProfileModal .level-info{justify-content:flex-start}#userProfileModal .profile-info h2{font-size:1.2rem;justify-content:flex-start;max-width:100%}#userProfileModal .avatar{width:56px;height:56px;font-size:1.4rem}#userProfileModal .joined-date{font-size:.76rem;margin-top:.1rem}#userProfileModal .stats-section{margin-bottom:.65rem}#userProfileModal .stats-title{font-size:.95rem;margin-bottom:.5rem}#userProfileModal .stats-grid{grid-template-columns:repeat(2,1fr);gap:.5rem}#userProfileModal .stat-card{padding:.55rem .3rem;border-radius:.75rem}#userProfileModal .stat-icon{font-size:.95rem;margin-bottom:.2rem}#userProfileModal .stat-value{font-size:1.1rem;margin-bottom:.2rem}#userProfileModal .stat-label{font-size:.7rem}#userProfileModal .modal-title{font-size:1rem;left:.9rem;right:3rem;max-width:calc(100% - 4rem)}#userProfileModal .activity-section{margin-bottom:.6rem;padding:0}#userProfileModal .activity-list{gap:.4rem}#userProfileModal .activity-header{font-size:.9rem;margin-bottom:.5rem}#userProfileModal .activity-item{grid-template-columns:2fr .9fr .7fr;gap:.4rem;padding:.5rem .6rem}#userProfileModal .activity-item.activity-item-header{padding:.2rem .6rem}#userProfileModal .activity-description{font-size:.76rem}#userProfileModal .activity-icon,#userProfileModal .activity-icon-default{width:28px;height:28px}#userProfileModal .activity-icon--reward{width:auto;height:26px;max-width:52px}#userProfileModal .activity-amount{font-size:.76rem}#userProfileModal .activity-date{font-size:.72rem}#userProfileModal .modal-close{width:30px;height:30px;font-size:1rem;-webkit-tap-highlight-color:rgba(0,229,255,.2)}}`;
2712        
2713        const style = document.createElement('style');
2714        style.textContent = css;
2715        document.head.appendChild(style);
2716        const style2 = document.createElement('style');
2717        style2.textContent = '.ph-country{position:absolute;top:.75rem;right:.75rem;display:flex;align-items:center;gap:.35rem;z-index:2}.ph-country .country-flag img{width:22px;height:22px;border-radius:50%;object-fit:cover;border:1px solid rgba(255,255,255,.1)}.ph-country-name{font-size:.82rem;color:var(--text-secondary);font-weight:500}.ph-xp-bar-wrap{width:100%;flex-basis:100%;margin-top:.15rem;padding-top:.3rem;border-top:1px solid rgba(255,255,255,.07)}.ph-xp-labels{display:flex;justify-content:space-between;align-items:center;font-size:.75rem;color:var(--text-secondary);margin-bottom:.4rem}.ph-xp-mid{flex:1;text-align:center;font-weight:600;color:var(--text-primary);padding:0 .4rem}.ph-xp-cur,.ph-xp-next{font-weight:600;white-space:nowrap}.ph-xp-track{height:8px;background:rgba(255,255,255,.08);border-radius:8px;overflow:hidden}.ph-xp-fill{height:100%;border-radius:8px;transition:width .4s}@media(max-width:768px){.ph-country{position:absolute;top:.55rem;right:.55rem;left:auto;z-index:2}}@media(max-width:640px){#userProfileModal{padding:0!important;align-items:flex-start!important}#userProfileModal .modal-content{max-width:100%!important;width:100%!important;min-height:100vh!important;max-height:100vh!important;border-radius:0!important;margin:0!important}#userProfileModal .loading-spinner,#userProfileModal .private-profile{height:calc(100vh - 60px);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem}#userProfileModal .profile-header{margin-top:0!important}#userProfileModal .stats-grid{grid-template-columns:repeat(2,1fr);gap:.5rem}#userProfileModal .stat-card{padding:.6rem .4rem}#userProfileModal .stat-icon{display:block;font-size:.85rem;margin-bottom:.2rem}#userProfileModal .stat-value{font-size:1.05rem;margin-bottom:.15rem}#userProfileModal .stat-label{font-size:.7rem}#userProfileModal .modal-wrapper{max-width:100%!important}#userProfileModal .modal-close{width:28px;height:28px;font-size:.95rem}}';
2718        document.head.appendChild(style2);
2719    };
2720
2721    class UserProfileModal {
2722        constructor() {
2723            // Szingleton: a modalt ket helyrol is peldanyositjak (itt DOMContentLoaded-on
2724            // es az earn.php-ban). Korabban mindegyik peldany beszurt egy sajat masolatot
2725            // a body vegere ugyanazokkal az id-kkel, igy duplikalt id-k, arvan maradt DOM
2726            // es dupla Escape-figyelo keletkezett.
2727            if (window.__userProfileModalInstance) return window.__userProfileModalInstance;
2728            window.__userProfileModalInstance = this;
2729            this.modal = null;
2730            this.isOpen = false;
2731            this._scrollY = 0;
2732            this._returnUrl = null;
2733this.countryCodes={"Afghanistan":"af","Aland Islands":"ax","Albania":"al","Algeria":"dz","American Samoa":"as","Andorra":"ad","Angola":"ao","Anguilla":"ai","Antarctica":"aq","Antigua and Barbuda":"ag","Argentina":"ar","Armenia":"am","Aruba":"aw","Australia":"au","Austria":"at","Azerbaijan":"az","Bahamas":"bs","Bahrain":"bh","Bangladesh":"bd","Barbados":"bb","Belarus":"by","Belgium":"be","Belize":"bz","Benin":"bj","Bermuda":"bm","Bhutan":"bt","Bolivia":"bo","Bolivia, Plurinational State of":"bo","Bonaire, Sint Eustatius and Saba":"bq","Bosnia and Herzegovina":"ba","Botswana":"bw","Bouvet Island":"bv","Brazil":"br","British Indian Ocean Territory":"io","Brunei Darussalam":"bn","Brunei":"bn","Bulgaria":"bg","Burkina Faso":"bf","Burma":"mm","Burundi":"bi","Cabo Verde":"cv","Cambodia":"kh","Cameroon":"cm","Canada":"ca","Cape Verde":"cv","Cayman Islands":"ky","Central African Republic":"cf","Chad":"td","Chile":"cl","China":"cn","Christmas Island":"cx","Cocos (Keeling) Islands":"cc","Colombia":"co","Comoros":"km","Congo":"cg","Congo, Democratic Republic of the":"cd","Congo (Democratic Republic of the)":"cd","Cook Islands":"ck","Costa Rica":"cr","Cote d'Ivoire":"ci","Croatia":"hr","Cuba":"cu","Curacao":"cw","Cyprus":"cy","Czech Republic":"cz","Czechia":"cz","DRC":"cd","Democratic Republic of the Congo":"cd","Denmark":"dk","Djibouti":"dj","Dominica":"dm","Dominican Republic":"do","Ecuador":"ec","Egypt":"eg","El Salvador":"sv","England":"gb","Equatorial Guinea":"gq","Eritrea":"er","Estonia":"ee","Eswatini":"sz","Ethiopia":"et","Falkland Islands":"fk","Falkland Islands (Malvinas)":"fk","Faroe Islands":"fo","Fiji":"fj","Finland":"fi","France":"fr","French Guiana":"gf","French Polynesia":"pf","French Southern Territories":"tf","Gabon":"ga","Gambia":"gm","Georgia":"ge","Germany":"de","Ghana":"gh","Gibraltar":"gi","Great Britain":"gb","Greece":"gr","Greenland":"gl","Grenada":"gd","Guadeloupe":"gp","Guam":"gu","Guatemala":"gt","Guernsey":"gg","Guinea":"gn","Guinea-Bissau":"gw","Guyana":"gy","Haiti":"ht","Heard Island and McDonald Islands":"hm","Holy See":"va","Honduras":"hn","Hong Kong":"hk","Hungary":"hu","Iceland":"is","India":"in","Indonesia":"id","Iran":"ir","Iran, Islam
2733ic Republic of":"ir","Iraq":"iq","Ireland":"ie","Isle of Man":"im","Israel":"il","Italy":"it","Ivory Coast":"ci","Jamaica":"jm","Japan":"jp","Jersey":"je","Jordan":"jo","Kazakhstan":"kz","Kenya":"ke","Kiribati":"ki","Korea, Democratic People's Republic of":"kp","Korea, Republic of":"kr","Kosovo":"xk","Kuwait":"kw","Kyrgyzstan":"kg","Lao People's Democratic Republic":"la","Laos":"la","Latvia":"lv","Lebanon":"lb","Lesotho":"ls","Liberia":"lr","Libya":"ly","Liechtenstein":"li","Lithuania":"lt","Luxembourg":"lu","Macao":"mo","Macau":"mo","Macedonia":"mk","Madagascar":"mg","Malawi":"mw","Malaysia":"my","Maldives":"mv","Mali":"ml","Malta":"mt","Marshall Islands":"mh","Martinique":"mq","Mauritania":"mr","Mauritius":"mu","Mayotte":"yt","Mexico":"mx","Micronesia":"fm","Micronesia, Federated States of":"fm","Moldova":"md","Moldova, Republic of":"md","Monaco":"mc","Mongolia":"mn","Montenegro":"me","Montserrat":"ms","Morocco":"ma","Mozambique":"mz","Myanmar":"mm","Namibia":"na","Nauru":"nr","Nepal":"np","Netherlands":"nl","The Netherlands":"nl","New Caledonia":"nc","New Zealand":"nz","Nicaragua":"ni","Niger":"ne","Nigeria":"ng","Niue":"nu","Norfolk Island":"nf","North Korea":"kp","North Macedonia":"mk","Northern Ireland":"gb","Northern Mariana Islands":"mp","Norway":"no","Oman":"om","Pakistan":"pk","Palau":"pw","Palestine":"ps","Palestine, State of":"ps","Panama":"pa","Papua New Guinea":"pg","Paraguay":"py","Peru":"pe","Philippines":"ph","Pitcairn":"pn","Poland":"pl","Portugal":"pt","Puerto Rico":"pr","Qatar":"qa","Reunion":"re","Romania":"ro","Russia":"ru","Russian Federation":"ru","Rwanda":"rw","Saint Barthelemy":"bl","Saint Helena":"sh","Saint Kitts and Nevis":"kn","Saint Lucia":"lc","Saint Martin":"mf","Saint Pierre and Miquelon":"pm","Saint Vincent and the Grenadines":"vc","Samoa":"ws","San Marino":"sm","Sao Tome and Principe":"st","Saudi Arabia":"sa","Scotland":"gb","Senegal":"sn","Serbia":"rs","Seychelles":"sc","Sierra Leone":"sl","Singapore":"sg","Sint Maarten":"sx","Slovakia":"sk","Slovenia":"si","Solomon Islands":"sb","Somalia":"so","South Africa":"za","South Georgia and the South Sandwich Islands":"gs","South Korea":"kr","South Sudan":"ss","Spain":"es","Sri Lanka":"lk","Sudan":"sd","Suriname":"sr","Svalbard and Jan Mayen":"sj","Swaziland":"sz","Sweden":"se","Switzerland":"ch","Syria":"sy","Syrian Arab Republic":"sy","Taiwan":"tw","Taiwan, Province of China":"tw","Tajikistan":"tj","Tanzania":"tz","Tanzania, United Republic of":"tz","Thailand":"th","Timor-Leste":"tl","Togo":"tg","Tokelau":"tk","Tonga":"to","Trinidad and Tobago":"tt","Tunisia":"tn","Turkey":"tr","Turkmenistan":"tm","Turks and Caicos Islands":"tc","Tuvalu":"tv","Türkiye":"tr","UAE":"ae","UK":"gb","USA":"us","Uganda":"ug","Ukraine":"ua","United Arab Emirates":"ae","United Kingdom":"gb","United States":"us","United States Minor Outlying Islands":"um","United States of America":"us","Uruguay":"uy","Uzbekistan":"uz","Vanuatu":"vu","Vatican":"va","Vatican City":"va","Venezuela":"ve","Venezuela, Bolivarian Republic of":"ve","Viet Nam":"vn","Vietnam":"vn","Virgin Islands, British":"vg","Virgin Islands, U.S.":"vi","Wales":"gb","Wallis and Futuna":"wf","Western Sahara":"eh","Yemen":"ye","Zambia":"zm","Zimbabwe":"zw","Unknown":"xx"};
2734            this.init();
2735        }
2736
2737        init() {
2738            injectCSS();
2739            this.createModal();
2740            document.addEventListener('click', this.handleProfileClick.bind(this));
2741            window.addEventListener('popstate', this.handlePopState.bind(this));
2742            this.checkUrlOnLoad();
2743        }
2744
2745        createModal() {
2746            const modalHTML = `<div id="userProfileModal" style="display: none;"><div class="modal-wrapper"><div class="modal-content"><div class="modal-title-bar"><h2 class="modal-title">Profile</h2><button class="modal-close" id="closeUserModal">×</button></div><div class="modal-body"><div class="loading-spinner"><i class="fas fa-spinner fa-spin fa-2x"></i><p>Loading profile...</p></div><div id="profileContent"></div></div></div></div></div>`;
2747            document.body.insertAdjacentHTML('beforeend', modalHTML);
2748            this.modal = document.getElementById('userProfileModal');
2749            document.getElementById('closeUserModal').addEventListener('click', () => this.closeModal());
2750            this.modal.addEventListener('click', (e) => { if (e.target === this.modal) this.closeModal(); });
2751            document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && this.isOpen) this.closeModal(); });
2752        }
2753
2754        handleProfileClick(e) {
2755            const userLink = e.target.closest('[data-username]');
2756            if (userLink) {
2757                e.preventDefault();
2758                this.openProfile(userLink.dataset.username);
2759            }
2760        }
2761
2762        checkUrlOnLoad() {
2763            const userModal = new URLSearchParams(window.location.search).get('user_modal');
2764            if (userModal && /^[a-zA-Z0-9_]{1,50}$/.test(userModal)) {
2765                history.replaceState({}, '', window.location.pathname);
2766                setTimeout(() => this.openProfile(userModal), 100);
2767                return;
2768            }
2769            const pathMatch = window.location.pathname.match(/^\/user\/([a-zA-Z0-9_]{1,50})\/?$/);
2770            if (pathMatch) {
2771                setTimeout(() => this.openProfile(pathMatch[1]), 100);
2772            }
2773        }
2774
2775        handlePopState() { if (this.isOpen) this.closeModal(); }
2776
2777        async openProfile(username) {
2778            if (this.isOpen) return;
2779            this.isOpen = true;
2780            this.modal.style.display = 'flex';
2781
2782            this._scrollY = window.scrollY;
2783            document.documentElement.style.overflow = 'hidden';
2784            document.body.style.overflow = 'hidden';
2785            
2786            // Jegyezzuk meg, melyik oldalrol nyilt a modal, hogy bezaraskor ODA terjunk vissza.
2787            // Korabban a bezaras fixen '/earn'-t irt az URL-be, igy pl. az Aff
2787iliates oldalon
2788            // egy profil megnyitasa+bezarasa utan a cimsor /earn-t mutatott, a tartalom viszont
2789            // maradt az Affiliates - ettol ugy tunt, mintha az Earn menupont nem mukodne.
2790            this._returnUrl = window.location.pathname + window.location.search;
2791            history.pushState({ userProfile: username }, '', `/user/${encodeURIComponent(username)}`);
2792            const chatTrigger = document.getElementById('publicChatTrigger');
2793            if (chatTrigger) {
2794                chatTrigger.style.display = 'none';
2795            }
2796            this.showLoading();
2797            try {
2798                const response = await fetch(`/user_profile.php?api=get_user_profile&username=${encodeURIComponent(username)}`);
2799                if (!response.ok) throw new Error('Network response was not ok.');
2800                const data = await response.json();
2801                if (data.success) {
2802                    this.renderProfile(data.user, data.stats, data.activity);
2803                } else {
2804                    if (data.is_banned) {
2805                        this.renderBannedProfile();
2806                    } else if (data.is_deleted) {
2807                        this.renderDeletedProfile();
2808                    } else {
2809                        this.renderError(data.error || 'Profile not found');
2810                    }
2811                }
2812            } catch (error) {
2813                this.renderError('Failed to load profile');
2814            }
2815        }
2816        
2817        renderDeletedProfile() {
2818            this.modal.querySelector('.loading-spinner').style.display = 'none';
2819            const content = document.getElementById('profileContent');
2820            content.innerHTML = `
2821                <div class="private-profile">
2822                    <div class="private-icon"><i class="fas fa-user-slash"></i></div>
2823                    <h3>This Account Was Deleted</h3>
2824                    <p>This user profile is no longer available.</p>
2825                </div>
2826            `;
2827        }
2828
2829        renderBannedProfile() {
2830            this.modal.querySelector('.loading-spinner').style.display = 'none';
2831            const content = document.getElementById('profileContent');
2832            content.innerHTML = `
2833                <div class="private-profile">
2834                    <div class="private-icon"><i class="fas fa-ban" style="color:var(--error-color)"></i></div>
2835                    <h3 style="color:var(--error-color)">Account Suspended</h3>
2836                    <p>This account has been suspended and is no longer active.</p>
2837                </div>
2838            `;
2839        }
2840        
2841        closeModal() {
2842            if (!this.isOpen) return;
2843            this.isOpen = false;
2844            this.modal.style.display = 'none';
2845
2846            document.documentElement.style.overflow = '';
2847            document.body.style.overflow = '';
2848            
2849            // Oda vissza, ahonnan nyitottuk. Ha valamiert nincs elmentve (pl. kozvetlenul
2850            // egy /user/xyz linkkel erkezett a latogato), akkor essunk vissza az /earn-re.
2851            const back = this._returnUrl && !/^\/user\//.test(this._returnUrl) ? this._returnUrl : '/earn';
2852            this._returnUrl = null;
2853            history.pushState({}, '', back);
2854            document.getElementById('profileContent').innerHTML = '';
2855            const chatTrigger = document.getElementById('publicChatTrigger');
2856            if (chatTrigger) {
2857                chatTrigger.style.display = 'flex';
2858            }
2859        }
2860
2861        showLoading() {
2862            document.getElementById('profileContent').innerHTML = '';
2863            this.modal.querySelector('.loading-spinner').style.display = '';
2864        }
2865
2866        renderProfile(user, stats, activity) {
2867            this.modal.querySelector('.loading-spinner').style.display = 'none';
2868            const content = document.getElementById('profileContent');
2869            
2870            if (user && user.role === 'admin') {
2871                content.innerHTML = `
2872                    <div class="private-profile">
2873                        <div class="private-icon"><i class="fas fa-shield-alt"></i></div>
2874                        <h3>Administrator Account</h3>
2875                        <p>This user is an administrator. Their profile details are not publicly displayed.</p>
2876                    </div>`;
2877                return;
2878            }
2879
2880            if (!user || !user.is_public) {
2881                content.innerHTML = `<div class="private-profile"><div class="private-icon"><i class="fas fa-lock"></i></div><h3>This Profile is Private</h3><p>The user has chosen to keep their profile private.</p></div>`;
2882                return;
2883            }
2884
2885            const countryFlagHTML = this.getCountryFlagHTML(user.country, user.username);
2886            const xpProgress = stats.tier_data.progress_percent || 0;
2887            const xpToNext = stats.tier_data.xp_to_next || 0;
2888            const nextTierName = stats.tier_data.next_tier_name;
2889            const currentTierName = stats.tier_data.current_tier_name;
2890            const tierBarColors = { bronze: 'linear-gradient(90deg,#f97316,#fb923c)', silver: 'linear-gradient(90deg,#94a3b8,#cbd5e1)', gold: 'linear-gradient(90deg,#facc15,#fde68a)', diamond: 'linear-gradient(90deg,#22d3ee,#00e5ff)', obsidian: 'linear-gradient(90deg,#8b5cf6,#a78bfa)' };
2891            const tierBarColor = tierBarColors[stats.tier_data.current_tier] || tierBarColors[stats.tier_data.next_tier] || 'linear-gradient(90deg,#6b7280,#9ca3af)';
2892            const tierTextColors = { bronze: '#fb923c', silver: '#cbd5e1', gold: '#fde68a', diamond: '#00e5ff', obsidian: '#a78bfa' };
2893            const nextTierColor = tierTextColors[stats.tier_data.next_tier] || 'var(--text-primary)';
2894            const avatarInitial = (user.username || '?').charAt(0).toUpperCase();
2895            const countryHTML = (user.country && user.country !== 'Unknown') ? `<div class="ph-country"><span class="country-flag">${countryFlagHTML}</span><span class="ph-country-name">${user.country}</span></div>` : '';
2896            
2897            content.innerHTML = `
2898                <div class="profile-header" style="position:relative;flex-wrap:wrap;">
2899                    ${countryHTML}
2900                    <div class="avatar" data-initial="${seEscHtml(avatarInitial)}">${user.avatar_url ? `<img src="${seEscHtml(user.avatar_url)}" alt="">` : seEscHtml(avatarInitial)}</div>
2901                    <div class="profile-info">
2902                        <h2>
2903                            <span class="username-text notranslate">${seEscHtml(user.username)}</span>
2904                        </h2>
2905                        <div class="joined-date">Joined ${shkDate(user.created_at).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', timeZone: 'UTC' })}</div>
2906                    </div>
2907                    <div class="ph-xp-bar-wrap">
2908                        <div class="ph-xp-labels">
2909                            <span class="ph-xp-cur">${currentTierName || ''}</span>
2910                            <span class="ph-xp-mid">${nextTierName ? xpToNext.toLocaleString() + ' XP to ' + nextTierName : (currentTierName ? '★ Max Tier' : '')}</span>
2911                            <span class="ph-xp-next" style="color:${nextTierName ? nextTierColor : 'var(--text-primary)'}">${currentTierName ? (nextTierName || '★') : (nextTierName || '')}</span>
2912                        </div>
2913                        <div class="ph-xp-track"><div class="ph-xp-fill" style="width:${xpProgress.toFixed(1)}%;background:${tierBarColor}"></div></div>
2914                    </div>
2915                </div>
2916                <div class="stats-section">
2917                    <div class="stats-title">Statistics</div>
2918                    <div class="stats-grid">
2919                        <div class="stat-card"><div class="stat-icon"><i class="fas fa-wallet"></i></div><div class="stat-value notranslate">$${parseFloat(stats.total_earnings).toFixed(3)}</div><div class="stat-label">Total Earnings</div></div>
2920                        <div class="stat-card"><div class="stat-icon"><i class="fas fa-check-circle"></i></div><div class="stat-value">${stats.total_tasks}</div><div class="stat-label">Offers Completed</div></div>
2921                        <div class="stat-card"><div class="stat-icon"><i class="fas fa-users"></i></div><div class="stat-value">${stats.total_referrals}</div><div class="stat-label">Users Referred</div></div>
2922                        <div class="stat-card"><div class="stat-icon"><i class="fas fa-clock"></i></div><div class="stat-value notranslate">$${parseFloat(stats.recent_earnings).toFixed(3)}</div><div class="stat-label">Last 30 Days</div></div>
2923                    </div>
2924                </div>
2925                ${activity && activity.length > 0 ? `
2926                    <div class="activity-section">
2927                        <div class="activity-header">Tasks</div>
2928                        <div class="activity-list">
2929                        <div class="activity-item activity-item-header" style="font-weight:600;color:var(--accent-primary);">
2930                            <div class="activity-description">Task</div>
2931                            <div class="activity-date">Date</div>
2932                            <div class="activity-amount">Reward</div>
2933                        </div>
2934                        ${activity.map(item => {
2935    let desc = item.description || item.type.replace(/_/g, ' ');
2936    desc = desc.replace(/\s*\(\d+%\)/, '');
2937    let typeIconUrl = null;
2938    if (item.type === 'reward_code_claim' || desc.toLowerCase().includes('reward code')) {
2939        desc = 'Reward Code';
2940    } else if (item.type === 'admin_credit') {
2941        desc = 'Admin Adjustment';
2942    } else if (item.type === 'wheel_win') {
2943        desc = 'Lucky Wheel';
2944        typeIconUrl = '/assets/images/rewards/menu-wheel.svg';
2945    } else if (item.type === 'daily_streak') {
2946        desc = 'Daily Streak';
2947    } else if (item.type === 'daily_challenge') {
2948        desc = 'Daily Challenge';
2949        typeIconUrl = '/assets/images/rewards/menu-challenge.svg';
2950    } else if (item.type === 'lottery_prize' || desc.toLowerCase().includes('lottery')) {
2951        desc = 'Weekly Lottery';
2952        typeIconUrl = '/assets/images/rewards/lottery_ticket.svg';
2953    } else if (item.type === 'mission_milestone') {
2954        desc = 'Mission Milestone';
2955        typeIconUrl = '/assets/images/rewards/menu-mission.svg';
2956    }
2957    const taskDate = shkDate(item.created_at).toLocaleString('en-US', {
2958        timeZone: 'UTC', month: 'numeric', day: 'numeric', year: 'numeric',
2959        hour: 'numeric', minute: '2-digit', hour12: true
2960    }) + ' ' + shkTzLabel(item.created_at);
2961    const iconUrl = item.offer_icon_url || typeIconUrl;
2962    // Partner thumbnails are square and look right cropped to fill the tile; our
2963    // own reward icons (ticket, wheel, mission, challenge) are wide, so they get
2964    // contained instead - cover was slicing the ticket down to a fragment.
2965    const iconClass = item.offer_icon_url ? 'activity-icon' : 'activity-icon activity-icon--reward';
2966    const iconHTML = iconUrl
2967        ? `<img src="${seEscHtml(iconUrl)}" class="${iconClass}" alt="">`
2968        : `<i class="fas fa-clipboard-list activity-icon-default"></i>`;
2969    return `<div class="activity-item"><div class="activity-description">${iconHTML}<span>${seEscHtml(desc)}</span></div><div class="activity-date">${taskDate}</div><div class="activity-amount notranslate">+$${parseFloat(item.amount).toFixed(3)}</div></div>`;
2970}).join('')}
2971                        </div>
2972                    </div>` : ''}
2973            `;
2974            
2975            // A dead avatar URL used to leave the browser rendering the img's alt
2976            // text inside the 80px circle at 2rem/700 - that was the name spilling
2977            // over the border, not a real picture. alt="" stops the text; this puts
2978            // the initial back so the circle still looks intentional.
2979            const avatarImg = content.querySelector('.avatar img');
2980            if (avatarImg) {
2981                const useInitial = () => {
2982                    const box = avatarImg.parentNode;
2983                    if (box) box.textContent = box.dataset.initial || '?';
2984                };
2985                avatarImg.addEventListener('error', useInitial, { once: true });
2986                // A cached failure never fires 'error' - catch that case directly.
2987                if (avatarImg.complete && avatarImg.naturalWidth === 0) useInitial();
2988            }
2989
2990            setTimeout(() => {
2991                if (window.offerModal) {
2992                    window.offerModal.reparse();
2993                }
2994            }, 100);
2995        }
2996
2997        renderError(message) {
2998            this.modal.querySelector('.loading-spinner').style.display = 'none';
2999            document.getElementById('profileContent').innerHTML = `<div class="error-message"><i class="fas fa-exclamation-triangle"></i><p>${message}</p></div>`;
3000        }
3001
3002        getCountryFlagHTML(country, username = 'user') {
3003            const countryCode = this.countryCodes[country]?.toLowerCase() || 'xx';
3004            if (countryCode === 'xx') {
3005                return '';
3006            }
3007            return `<img src="https://flagcdn.com/${countryCode}.svg" alt="">`;
3008        }
3009    }
3010
3011    window.UserProfileModal = UserProfileModal;
3012    window.createUserProfileLink = (userId, username) => `<a href="/user/${encodeURIComponent(username)}" data-username="${seEscHtml(username)}" class="user-profile-link notranslate">${seEscHtml(username)}</a>`;
3013    document.addEventListener('DOMContentLoaded', () => new UserProfileModal());
3014})();
3015</script>
3015
3016
3017
3018        
3019    <aside class="sidebar-menu sk-loading" id="sidebarMenu">
3020                <button class="floating-menu-btn" id="floatingMenuBtn" title="Open menu" aria-label="Open menu" aria-expanded="false" aria-controls="sidebarNav">
3021            <i class="fas fa-bars"></i>
3022        </button>
3023
3024        <div class="sidebar-header-strip">
3025            <a href="/home" class="sidebar-logo-link">
3026                <img src="/assets/images/logos/sharklogo_text_540.webp" alt="Shark Earnings" class="sidebar-logo-img" width="156" height="48">
3027            </a>
3028                                    <button class="sidebar-collapse-btn" id="sidebarCollapseBtn" title="Close menu" aria-label="Close menu" aria-expanded="true" aria-controls="sidebarNav"><i class="fas fa-times"></i></button>
3029            <button class="sidebar-close-btn" id="sidebarCloseBtn">×</button>
3030        </div>
3031        <nav class="sidebar-nav sk-loading" id="sidebarNav">
3032                        <a href="/home" class="sidebar-link active" aria-label="Home">
3033                <i class="fas fa-home"></i>
3034                <span>Home</span>
3035            </a>
3036                        <a href="/earn" class="sidebar-link" aria-label="Earn">
3037                <i class="fas fa-coins"></i>
3038                <span>Earn</span>
3039            </a>
3040            <a href="/offers" class="sidebar-link" aria-label="Offers">
3041                <i class="fas fa-tags"></i>
3042                <span>Offers</span>
3043            </a>
3044            <a href="/my-offers" class="sidebar-link" aria-label="My Offers">
3045                <i class="fas fa-clipboard-check"></i>
3046                <span>My Offers</span>
3047            </a>
3048            <a href="/surveys" class="sidebar-link" aria-label="Surveys">
3049                <i class="fas fa-clipboard-list"></i>
3050                <span>Surveys</span>
3051            </a>
3052
3053            <a href="/rewards" class="sidebar-link" aria-label="Rewards">
3054                <i class="fas fa-gift"></i>
3055                <span>Rewards</span>
3056                <span class="sidebar-new-badge">NEW</span>
3057            </a>
3058
3059            <a href="/affiliates" class="sidebar-link" aria-label="Affiliates">
3060                <i class="fas fa-users"></i>
3061                <span>Affiliates</span>
3062            </a>
3063
3064            <div class="sidebar-divider"></div>
3065
3066            <a href="/race/daily" class="sidebar-link sidebar-link-race" aria-label="Daily Race">
3067                <i class="fas fa-medal"></i>
3068                <span>Daily Race</span>
3069            </a>
3070
3071            <a href="/race/discord" class="sidebar-link sidebar-link-race" aria-label="Discord Race">
3072                <i class="fab fa-discord"></i>
3073                <span>Discord Race</span>
3074                <span class="sidebar-new-badge">NEW</span>
3075            </a>
3076
3077            <a href="/race/referral" class="sidebar-link sidebar-link-race" aria-label="Referral Race">
3078                <i class="fas fa-user-friends"></i>
3079                <span>Referral Race</span>
3080                <span class="sidebar-new-badge">NEW</span>
3081            </a>
3082
3083            <div class="sidebar-divider"></div>
3084
3085            <a href="/account" class="sidebar-link" aria-label="Account">
3086                <i class="fas fa-user"></i>
3087                <span>Account</span>
3088            </a>
3089            <a href="/cashout" class="sidebar-link" aria-label="Cash out">
3090                <i class="fas fa-wallet"></i>
3091                <span>Cash out</span>
3092            </a>
3093            <a href="/community-chat" class="sidebar-link" aria-label="Community Chat">
3094                <i class="fab fa-discord"></i>
3095                <span>Community Chat</span>
3096            </a>
3097            <a href="/academy" class="sidebar-link" aria-label="Academy">
3098                <i class="fas fa-graduation-cap"></i>
3099                <span>Academy</span>
3100            </a>
3101            <a href="/support" class="sidebar-link" aria-label="Support">
3102                <i class="fas fa-headset"></i>
3103                <span>Support</span>
3104            </a>
3105            
3106        </nav>
3107                
3107<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">(function(){var m=document.getElementById('sidebarMenu'),n=document.getElementById('sidebarNav');function r(){if(m)m.classList.remove('sk-loading');if(n)n.classList.remove('sk-loading');}r();if(document.fonts&&document.fonts.ready){document.fonts.ready.then(r);}}());</script>
3107
3108    </aside>
3109
3110    <header class="main-header">
3111        <div class="header-content">
3112                        <div class="header-left"></div>
3113            
3114                        <div class="header-actions">
3115                <a href="#" onclick="openAuthModal('login'); return false;" class="btn btn-secondary btn-small">Sign In</a>
3116                <a href="#" onclick="openAuthModal('register'); return false;" class="btn btn-primary btn-small">Sign Up</a>
3117            </div>
3118                    </div>
3119    </header>
3120
3121    <div class="mobile-header-bar">
3122        <a href="/earn" class="mobile-header-logo-link">
3123            <img src="/assets/images/logos/sharklogo.svg" alt="Shark Earnings" class="mobile-header-logo-img" width="45" height="45">
3124        </a>
3125                <div class="mobile-header-guest-actions" style="display:flex;gap:8px;margin-left:auto;padding:0 10px;">
3126            <a href="#" onclick="openAuthModal('login'); return false;" class="btn btn-secondary btn-small">Sign In</a>
3127            <a href="#" onclick="openAuthModal('register'); return false;" class="btn btn-primary btn-small">Sign Up</a>
3128        </div>
3129            </div>
3130
3131    
3132    <div class="mobile-sidebar-overlay" id="mobileSidebarOverlay"></div>
3133
3134            <div id="live-earnings-ticker">
3135        <div class="ticker-wrapper">
3136            <ul id="earnings-list">
3137            <li class="earning-item" data-user-id="19611" data-username="Geography" data-description="Geography earned $0.912 · UpLevel Rewards - EA Sports FC 27 $100 (TapRain)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar2.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">UpLevel Rewards - EA Sports FC 27 $100</span><span class="ei-label-alt notranslate">Geography</span></span><span class="ei-label-bot">TapRain</span></div><span class="ei-amount">$0.912</span></li><li class="earning-item" data-user-id="19611" data-username="Geography" data-description="Geography earned $2.496 · UpLevel Rewards - GTA VI $100 (TapRain)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar2.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">UpLevel Rewards - GTA VI $100</span><span class="ei-label-alt notranslate">Geography</span></span><span class="ei-label-bot">TapRain</span></div><span class="ei-amount">$2.496</span></li><li class="earning-item private-item" data-user-id="0" data-description="Shark user earned $6.636 from TapRain"><div class="ei-avatar-wrap"><div class="earning-avatar ei-avatar-private"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="8" r="4"/><path stroke-linecap="round" d="M4 20c0-4 3.6-7 8-7s8 3 8 7"/></svg></div></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top">Shark user</span><span class="ei-label-alt">Shark user</span></span><span class="ei-label-bot">TapRain</span></div><span class="ei-amount">$6.636</span></li><li class="earning-item" data-user-id="20692" data-username="simalida" data-description="simalida earned $2.34 · Survey (BitLabs)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar6.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">Survey</span><span class="ei-label-alt notranslate">simalida</span></span><span class="ei-label-bot">BitLabs</span></div><span class="ei-amount">$2.34</span></li><li class="earning-item" data-user-id="20692" data-username="simalida" data-description="simalida earned $0.01 from Daily Streak"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar6.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">simalida</span><span class="ei-label-alt notranslate">simalida</span></span><span class="ei-label-bot">Daily Streak</span></div><span class="ei-amount">$0.01</span></li><li class="earning-item" data-user-id="6532" data-username="Cosmicz221" data-description="Cosmicz221 earned $0.009 · Shark Expedition Surface chest (L3): $0.009 (Offer)"><div class="ei-avatar-wrap"><img src="https://lh3.googleusercontent.com/a/ACg8ocJCTaGpon49gDHyItxwxg8wGCuvervrCKKsaIy7LdW-Plud57UB=s32-c" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">
3137Shark Expedition Surface chest (L3): $0.009</span><span class="ei-label-alt notranslate">Cosmicz221</span></span><span class="ei-label-bot">Offer</span></div><span class="ei-amount">$0.009</span></li><li class="earning-item private-item" data-user-id="0" data-description="Shark user earned $7.938 from TapRain"><div class="ei-avatar-wrap"><div class="earning-avatar ei-avatar-private"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="8" r="4"/><path stroke-linecap="round" d="M4 20c0-4 3.6-7 8-7s8 3 8 7"/></svg></div></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top">Shark user</span><span class="ei-label-alt">Shark user</span></span><span class="ei-label-bot">TapRain</span></div><span class="ei-amount">$7.938</span></li><li class="earning-item" data-user-id="20692" data-username="simalida" data-description="simalida earned $1.482 · Task Completed (Timewall)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar6.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">Task Completed</span><span class="ei-label-alt notranslate">simalida</span></span><span class="ei-label-bot">Timewall</span></div><span class="ei-amount">$1.482</span></li><li class="earning-item" data-user-id="29940" data-username="huany649" data-description="huany649 earned $0.003 · Task Completed (Timewall)"><div class="ei-avatar-wrap"><img src="https://lh3.googleusercontent.com/a/ACg8ocIdkvtPM4juKleSanx8aNgmt82H-zNtdEJ9gcFOUC15P6ndZA=s32-c" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">Task Completed</span><span class="ei-label-alt notranslate">huany649</span></span><span class="ei-label-bot">Timewall</span></div><span class="ei-amount">$0.003</span></li><li class="earning-item" data-user-id="19611" data-username="Geography" data-description="Geography earned $4.056 · 7 Eleven Gift Card (TapRain)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar2.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">7 Eleven Gift Card</span><span class="ei-label-alt notranslate">Geography</span></span><span class="ei-label-bot">TapRain</span></div><span class="ei-amount">$4.056</span></li><li class="earning-item" data-user-id="19611" data-username="Geography" data-description="Geography earned $2.496 · UpLevel Rewards - Dollar Tree $750 (TapRain)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar2.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">UpLevel Rewards - Dollar Tree $750</span><span class="ei-label-alt notranslate">Geography</span></span><span class="ei-label-bot">TapRain</span></div><span class="ei-amount">$2.496</span></li><li class="earning-item" data-user-id="20692" data-username="simalida" data-description="simalida earned $1.30 · Survey Completion (CPX Research)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar6.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">Survey Completion</span><span class="ei-label-alt notranslate">simalida</span></span><span class="ei-label-bot">CPX Research</span></div><span class="ei-amount">$1.30</span></li><li class="earning-item" data-user-id="20692" data-username="simalida" data-description="simalida earned $0.01 · Survey Bonus (CPX Research)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar6.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">Survey Bonus</span><span class="ei-label-alt notranslate">simalida</span></span><span class="ei-label-bot">CPX Research</span></div><span class="ei-amount">$0.01</span></li><li class="earning-item" data-user-id="20692" data-username="simalida" data-description="simalida earned $0.01 · Survey (Out) (CPX Research)"><div class="ei-avatar-wrap">
3137<img src="/assets/avatars/avatar6.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">Survey (Out)</span><span class="ei-label-alt notranslate">simalida</span></span><span class="ei-label-bot">CPX Research</span></div><span class="ei-amount">$0.01</span></li><li class="earning-item" data-user-id="20692" data-username="simalida" data-description="simalida earned $0.007 · Bitlabs Surveys (PixyLabs)"><div class="ei-avatar-wrap"><img src="/assets/avatars/avatar6.webp" alt="" class="earning-avatar"></div><div class="ei-info"><span class="ei-top-stack"><span class="ei-label-top notranslate">Bitlabs Surveys</span><span class="ei-label-alt notranslate">simalida</span></span><span class="ei-label-bot">PixyLabs</span></div><span class="ei-amount">$0.007</span></li>            </ul>
3138        </div>
3139    </div>
3140    
3141    <div class="notification-dropdown" id="notificationDropdown">
3142        <div class="notification-header">
3143            <h4 id="notificationTitle">Notifications</h4>
3144            <button id="markAllRead" class="mark-all-read-btn">Mark all as read</button>
3145        </div>
3146        <div class="notification-list" id="notificationList"></div>
3147    </div>
3148
3149
3150    <div class="container">
3151
3152
3153            <main>
3154        
3155<section class="hero-section">
3156<div class="hero-main-content section-container">
3157<div class="hero-split-layout">
3158<div class="hero-left-content">
3159<h1 class="hero-headline"><span class="hl-green">Get paid</span> for games,<br>offers &amp; surveys</h1>
3160<p class="hero-subheadline"><span style="color:#fff;font-weight:700;">5,000+</span> active offers available in <span class="hero-country-name notranslate">United States</span>.</p>
3161
3162<div class="trust-badges-row">
3163    <div class="no-deposit-badge"><i class="fas fa-check-circle"></i> No deposit required</div>
3164    <div class="no-deposit-badge"><i class="fas fa-bolt"></i> Fast cashouts</div>
3165</div>
3166
3167<div class="hero-cards-row">
3168<div class="glass-task-card" onclick="openAuthModal('register')" role="button" tabindex="0" aria-label="Sign up to earn with Hero Wars: Alliance">
3169<div class="gtc-img"><img src="/assets/images/herowars.webp" alt="Earn money playing Hero Wars: Alliance" width="512" height="512" loading="eager"><span class="gtc-star-badge">★ 4.6</span></div>
3170<div class="gtc-info"><div class="c-title notranslate">Hero Wars: Alliance</div>
3171<span class="gtc-desc">Strategy RPG</span></div>
3172</div>
3173<div class="glass-task-card featured" onclick="openAuthModal('register')" role="button" tabindex="0" aria-label="Sign up to earn with Call of Dragons - Featured offer">
3174    <div class="gtc-img">
3175        <img src="/assets/images/callofdragons.webp" alt="Earn money playing Call of Dragons" width="400" height="400" fetchpriority="high">
3176        <span class="gtc-star-badge">★ 4.9</span>
3177    </div>
3178<div class="gtc-info"><div class="c-title notranslate">Call of Dragons</div><span class="gtc-desc">Strategy RPG</span>
3179    </div>
3180</div>
3181<div class="glass-task-card" onclick="openAuthModal('register')" role="button" tabindex="0" aria-label="Sign up to earn with Mochi Fall">
3182<div class="gtc-img"><img src="/assets/images/mochifall.webp" alt="Earn money playing Mochi Fall" width="300" height="300" loading="eager"><span class="gtc-star-badge">★ 4.2</span></div>
3183<div class="gtc-info"><div class="c-title notranslate">Mochi Fall</div>
3184<span class="gtc-desc">Puzzle Game</span></div>
3185</div>
3186</div>
3187
3188<a class="hero-trustpilot" href="https://www.trustpilot.com/review/sharkearnings.com" target="_blank" rel="noopener" aria-label="See our reviews on Trustpilot">
3189    <span class="tp-name"><span class="tp-star-lead">★</span> Trustpilot</span>
3190    <span class="tp-stars" aria-hidden="true">
3191        <span class="tp-box"><i class="fas fa-star"></i></span>
3192        <span class="tp-box"><i class="fas fa-star"></i></span>
3193        <span class="tp-box"><i class="fas fa-star"></i></span>
3194        <span class="tp-box"><i class="fas fa-star"></i></span>
3195        <span class="tp-box tp-half"><i class="fas fa-star"></i></span>
3196    </span>
3197</a>
3198
3199<div class="payout-bar">
3200    <div class="payout-inner">
3201        <span class="payout-label">Cash out via</span>
3202        <div class="payout-logos">
3203            <i class="fab fa-paypal" style="color:#009cde" role="img" aria-label="PayPal" title="PayPal"></i>
3204            <i class="fab fa-cc-visa" style="color:#1a4bdb" role="img" aria-label="Visa" title="Visa"></i>
3205            <i class="fab fa-amazon" role="img" aria-label="Amazon Gift Cards" title="Amazon Gift Cards"></i>
3206            <i class="fab fa-google-play" style="color:#00d15a" role="img" aria-label="Google Play" title="Google Play"></i>
3207            <i class="fas fa-litecoin-sign" style="color:#5a86c4" role="img" aria-label="Litecoin" title="Litecoin"></i>
3208            <i class="fas fa-money-bill-wave" style="color:#4caf7d" role="img" aria-label="Bank Transfer" title="Bank Transfer"></i>
3209        </div>
3210        <span class="payout-divider" aria-hidden="true"></span>
3211        <span class="payout-more">200+ ways to cash out &middot; from just $1</span>
3212    </div>
3213</div>
3214</div>
3215
3216<div class="hero-auth-side animate-on-scroll fade-in-right">
3217<div class="hero-auth-card signup-only">
3218<h2>Sign Up for Free</h2>
3219<form id="heroRegisterForm" class="hero-form active" translate="no" onsubmit="event.preventDefault(); handleHeroAuth(this, 'register');">
3220<input type="hidden" name="csrf_token" value="998e8f34e9355502848cd48edfcac4aca9c6e20a319f93593cdd2f8f0ad64f93">
3221<input type="hidden" name="action" value="register">
3222<div class="h-input-group"><label for="fld-email">Email Address</label><input id="fld-email" type="email" name="email" placeholder="[email protected]" autocomplete="email" required onfocus="expandPassword(this)"></div>
3223<div class="h-input-expandable"><div class="h-input-group"><label for="fld-password">Password</label><input id="fld-password" type="password" name="password" placeholder="Create secure password" autocomplete="new-password" minlength="8"></div></div>
3224<div role="button" tabindex="0" class="h-referral-toggle" onclick="toggleHeroReferral()"><span>I have a referral code</span> <i class="fas fa-chevron-down"></i></div>
3225<div class="h-referral-input" style="display:none;"><div class="h-input-group"><input aria-label="Enter Code" type="text" name="referral_code" placeholder="Enter Code" value=""></div></div>
3226<div class="terms-text" style="font-size:max(.8rem,12px)">By clicking &ldquo;Start Earning Now&rdquo; you agree to our <a href="/tos">Terms of Service</a>, including binding individual arbitration and a class action waiver for U.S. users, and our <a href="/privacy">Privacy Policy</a>.</div>
3227<div class="cf-turnstile" data-sitekey="0x4AAAAAABgiM3aG2fCZPEea" data-execution="execute" data-size="flexible" style="margin: 15px 0; display: none; opacity: 0; max-height: 0; overflow: hidden; transition: max-height 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), opacity 0.4s ease;"></div>
3228<div class="promo-badge promo-badge-inline"><i class="fas fa-gift"></i><span>New members get a <span style="color:var(--highlight-color);font-weight:800">FREE</span> spin - win up to <span class="highlight-green notranslate">10,000 lottery tickets</span>!</span></div>
3229<button type="submit" class="btn-hero-submit cta-green">Start Earning Now</button>
3230<div class="h-divider"><span>OR</span></div>
3231<div class="social-stack">
3232<div class="g_id_signin"
3233     data-type="standard"
3234     data-shape="rectangular"
3235     data-theme="outline"
3236     data-text="signup_with"
3237     data-size="large"
3238     data-logo_alignment="left"
3239     onclick="handleSocialLogin('google')"
3240     style="min-height:44px;height:44px;width:100%;contain:layout;">
3241</div>
3242<button type="button" class="btn-social discord" onclick="handleSocialLogin('discord')"><i class="fab fa-discord"></i> Sign up with Discord</button>
3243</div>
3244<div class="terms-text" style="font-size:max(.8rem,12px);margin:12px 0 0">By signing up with Google or Discord you agree to our <a href="/tos">Terms of Service</a>, including binding individual arbitration and a class action waiver for U.S. users, and our <a href="/privacy">Privacy Policy</a>.</div>
3245</form>
3246<div class="hero-form-message"></div>
3247<div class="hero-signups-live"><span class="hs-dot"></span><strong class="notranslate">95</strong>&nbsp;sign ups in the past 24 hours</div>
3248</div>
3249</div>
3250</div>
3251
3252<div class="hero-stats-bar">
3253<div class="h-stat-item"><i class="fas fa-coins"></i><div class="h-stat-info"><strong class="notranslate h-counter" data-end="250000" data-prefix="$" data-suffix="+" data-comma="1">$0+</strong><span>Total Paid Out</span></div></div>
3254<div class="h-stat-divider"></div>
3255<div class="h-stat-item"><i class="fas fa-stopwatch stat-pulse"></i><div class="h-stat-info"><strong class="notranslate h-counter" data-end="1709" data-format="time">0s</strong><span>Avg. time to first cashout</span></div></div>
3256<div class="h-stat-divider"></div>
3257<div class="h-stat-item"><i class="fas fa-globe"></i><div class="h-stat-info"><strong class="notranslate h-counter" data-end="160" data-suffix="+">0+</strong><span>Countries supported</span></div></div>
3258</div>
3259</div>
3260</section>
3261
3262<section id="how-it-works" class="section-container">
3263        <h2 class="section-title animate-on-scroll fade-in-up">
3264            How It Works
3265        </h2>
3266
3267        <div class="how-it-works-main">
3268<div class="mascot-side animate-on-scroll fade-in-left">
3269    <div class="mascot-thought-bubble">
3270        <p>Smell the money yet? 3 steps and you're in the water!</p>
3271        <div class="thought-pointer"></div>
3272    </div>
3273
3274    <img src="/assets/images/shark.webp"
3275         alt="The Shark Earnings shark mascot next to the three steps for earning"
3276         loading="lazy" decoding="async"
3277         width="360"
3278         height="360"
3279         style="object-fit:contain">
3280</div>
3281
3282            <div class="steps-side">
3283                <div class="how-it-works-grid">
3284                    <div class="step-card animate-on-scroll fade-in-right">
3285                        <div class="step-num-wrap"><div class="step-number">1</div></div>
3286                        <h3>Choose an Offer</h3>
3287                        <p>Browse 5,000+ live offers: games, surveys, and app trials. Filter by payout, category, or your country to find the best match for you.</p>
3288                        <div class="step-badge"><i class="fas fa-fire"></i> 5,000+ offers live</div>
3289                    </div>
3290
3291                    <div class="step-card animate-on-scroll fade-in-right">
3292                        <div class="step-num-wrap"><div class="step-number">2</div></div>
3293                        <h3>Complete the Offer</h3>
3294                        <p>Follow the simple steps: play a game, answer a survey, or try an app. Most tasks are beginner-friendly, and completion is tracked in real time.</p>
3295                        <div class="step-badge"><i class="fas fa-shield-alt"></i> Verified by real users</div>
3296                    </div>
3297
3298                    <div class="step-card animate-on-scroll fade-in-right">
3299                        <div class="step-num-wrap"><div class="step-number">3</div></div>
3300                        <h3>Get Paid</h3>
3301                        <p>Cash out via PayPal, Crypto, or Gift Cards the moment you hit $1.00. No waiting periods, no hidden fees. Your money, your choice.</p>
3302                        <div class="step-badge"><i class="fas fa-bolt"></i> Fast Payouts from $1.00</div>
3303                    </div>
3304                </div>
3305            </div>
3306        </div>
3307    </section>
3308
3309
3310<section id="best-ways" class="section-container">
3311<h2 class="section-title animate-on-scroll fade-in-up">Best Ways to Earn</h2>
3312<p class="section-subtitle animate-on-scroll fade-in-up">Choose from distinct methods to generate real cash online today.</p>
3313<div class="ways-grid">
3314<div class="way-card animate-on-scroll fade-in-up" onclick="openAuthModal('register')" role="button" tabindex="0" aria-label="Sign up to play games and earn money">
3315<div class="way-img"><img src="/assets/images/monopoly.webp" alt="Make money playing mobile games like Monopoly Go" loading="lazy" width="280" height="140"></div>
3316<div class="way-content"><h3>Play Games</h3><p class="way-desc">Gaming companies want more players, and they're willing to pay for it. Level up, hit milestones, and get rewarded just for playing.</p></div>
3317</div>
3318<div class="way-card animate-on-scroll fade-in-up" style="transition-delay: 0.12s;" onclick="openAuthModal('register')" role="button" tabindex="0" aria-label="Sign up to take surveys and earn money">
3319<div class="way-img"><img src="/assets/images/surveys.webp" alt="Get paid for your opinion with online surveys" loading="lazy" width="280" height="210"></div>
3320<div class="way-content"><h3>Take Surveys</h3><p class="way-desc">Brands need real opinions to build better products, and they pay for yours. Share what you think, get paid for it.</p></div>
3321</div>
3322<div class="way-card animate-on-scroll fade-in-up" style="transition-delay: 0.24s;" onclick="openAuthModal('register')" role="button" tabindex="0" aria-label="Sign up to complete offers and earn money">
3323<div class="way-img"><img src="/assets/images/wirexoffer.webp" alt="Earn money by testing new apps and offers" loading="lazy" width="280" height="147"></div>
3324<div class="way-content"><h3>Complete Offers</h3><p class="way-desc">Try out new apps and get to know new companies while you earn. It's time to get paid for the apps you'd be using anyway.</p></div>
3325</div>
3326</div>
3327</section>
3328
3329<section id="testimonials" class="testimonials-section section-container">
3330    <h2 class="section-title animate-on-scroll fade-in-up">
3331        Real Users, Real Success Stories
3332    </h2>
3333    <div class="testimonial-trust-bar animate-on-scroll fade-in-up">
3334        <span class="ttb-rating"><span class="ttb-stars" role="img" aria-label="4.5 out of 5 stars">★★★★<span class="ttb-half">★</span></span> <span class="ttb-score notranslate">4.5/5</span> average rating</span>
3335        <span class="ttb-sep">·</span>
3336        <span>Community-sourced reviews</span>
3337        <span class="ttb-sep">·</span>
3338        <span>Growing user base worldwide</span>
3339    </div>
3340
3341    <div class="testimonials-slider-wrapper" role="region" aria-label="User testimonials carousel">
3342        <button class="slider-btn slider-prev" onclick="slideTestimonials('prev')" aria-label="Previous testimonial" aria-controls="testimonialsSlider">
3343            <i class="fas fa-chevron-left"></i>
3344        </button>
3345
3346        <div class="testimonials-slider-container">
3347            <div class="testimonials-slider" id="testimonialsSlider" role="list" aria-live="polite" translate="no" style="touch-action:pan-y;">
3348
3349                <div class="testimonial-slide" data-date="2026-02-13" role="listitem">
3350                    <div class="testimonial-card">
3351                                                <span class="tc-source-badge tc-source-fb"><i class="fab fa-facebook-f"></i></span>
3352                        <div class="testimonial-header">
3353                            <div class="user-avatar" aria-hidden="true"><img src="https://flagcdn.com/et.svg" alt="Ethiopia" loading="lazy"></div>
3354                            <div class="user-info">
3355                                <div class="u-name-row">
3356                                    <span class="u-name notranslate" translate="no">Dawit Tadesse</span>
3357                                    <i class="fas fa-check-circle u-check" aria-hidden="true"></i>
3358                                </div>
3359                                <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div>
3360                            </div>
3361                        </div>
3362                        <blockquote class="testimonial-content">Its good patform and good opportunity for earning</blockquote>
3363                    </div>
3364                </div>
3365
3366                <div class="testimonial-slide" data-date="2026-02-12" role="listitem">
3367                    <div class="testimonial-card">
3368                                                <span class="tc-source-badge tc-source-fb"><i class="fab fa-facebook-f"></i></span>
3369                        <div class="testimonial-header">
3370                            <div class="user-avatar"><img src="https://flagcdn.com/pk.svg" alt="Pakistan" loading="lazy"></div>
3371                            <div class="user-info">
3372                                <div class="u-name-row">
3373                                    <span class="u-name notranslate" translate="no">Farhan Safdar</span>
3374                                    <i class="fas fa-check-circle u-check" aria-hidden="true"></i>
3375                                </div>
3376                                <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div>
3377                            </div>
3378                        </div>
3379                        <blockquote class="testimonial-content">It's a good platform and it's a good community</blockquote>
3380                    </div>
3381                </div>
3382
3383                <div class="testimonial-slide" data-date="2026-02-12" role="listitem">
3384                    <div class="testimonial-card">
3385                                                <span class="tc-source-badge tc-source-fb"><i class="fab fa-facebook-f"></i></span>
3386                        <div class="testimonial-header">
3387                            <div class="user-avatar"><img src="https://flagcdn.com/bd.svg" alt="Bangladesh" loading="lazy"></div>
3388                            <div class="user-info">
3389                                <div class="u-name-row">
3390                                    <span class="u-name notranslate" translate="no">Sharmeen Sultana</span>
3391                                    <i class="fas fa-check-circle u-check" aria-hidden="true"></i>
3392                                </div>
3393                                <div class="star-rating" aria-label="4 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="far fa-star"></i></div>
3394                            </div>
3395                        </div>
3396                        <blockquote class="testimonial-content">Support took a bit to respond at first, but they sorted out my issue and the platform itself has been smooth to use since.</blockquote>
3397                    </div>
3398                </div>
3399
3400                <div class="testimonial-slide" data-date="2025-12-09" role="listitem">
3401                    <div class="testimonial-card">
3402                                                <span class="tc-source-badge tc-source-fb"><i class="fab fa-facebook-f"></i></span>
3403                        <div class="testimonial-header">
3404                            <div class="user-avatar"><img src="https://flagcdn.com/pk.svg" alt="Pakistan" loading="lazy"></div>
3405                            <div class="user-info">
3406                                <div class="u-name-row">
3407                                    <span class="u-name notranslate" translate="no">Ali Jani</span>
3408                                    <i class="fas fa-check-circle u-check" aria-hidden="true"></i>
3409                                </div>
3410                                <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div>
3411                            </div>
3412                        </div>
3413                        <blockquote class="testimonial-content">
3413Shark Earnings is truly impressive! Easy to use, reliable, and offers great opportunities to earn. I highly recommend rating their Facebook page positively!</blockquote>
3414                    </div>
3415                </div>
3416
3417                <div class="testimonial-slide" data-pin="1" data-date="2025-12-09" role="listitem">
3418                    <div class="testimonial-card">
3419                                                <span class="tc-source-badge tc-source-fb"><i class="fab fa-facebook-f"></i></span>
3420                        <div class="testimonial-header">
3421                            <div class="user-avatar"><img src="https://flagcdn.com/us.svg" alt="USA" loading="lazy"></div>
3422                            <div class="user-info">
3423                                <div class="u-name-row">
3424                                    <span class="u-name notranslate" translate="no">Marcus R.</span>
3425                                    <i class="fas fa-check-circle u-check" aria-hidden="true"></i>
3426                                </div>
3427                                <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div>
3428                            </div>
3429                        </div>
3430                        <blockquote class="testimonial-content">Cashed out $47 in my first week just from game offers. The PayPal payout was in my account within hours. Wasn't expecting it to actually work this well.</blockquote>
3431                    </div>
3432                </div>
3433
3434                <div class="testimonial-slide" data-pin="3" data-date="2025-12-09" role="listitem">
3435                    <div class="testimonial-card">
3436                                                <span class="tc-source-badge tc-source-fb"><i class="fab fa-facebook-f"></i></span>
3437                        <div class="testimonial-header">
3438                            <div class="user-avatar"><img src="https://flagcdn.com/gb.svg" alt="UK" loading="lazy"></div>
3439                            <div class="user-info">
3440                                <div class="u-name-row">
3441                                    <span class="u-name notranslate" translate="no">Eva Collins</span>
3442                                    <i class="fas fa-check-circle u-check" aria-hidden="true"></i>
3443                                </div>
3444                                <div class="star-rating" aria-label="4.5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star-half-alt"></i></div>
3445                            </div>
3446                        </div>
3447                        <blockquote class="testimonial-content">Took me a couple tries to figure out which offers actually paid out fast, but once I got the hang of it the withdrawals came through without issues.</blockquote>
3448                    </div>
3449                </div>
3450
3451                <div class="testimonial-slide" data-date="2026-01-26" role="listitem">
3452                    <div class="testimonial-card">
3453                                                <span class="tc-source-badge tc-source-fb"><i class="fab fa-facebook-f"></i></span>
3454                        <div class="testimonial-header">
3455                            <div class="user-avatar"><img src="https://flagcdn.com/dz.svg" alt="Algeria" loading="lazy"></div>
3456                            <div class="user-info">
3457                                <div class="u-name-row">
3458                                    <span class="u-name notranslate" translate="no">Tewfik Oran</span>
3459                                    <i class="fas fa-check-circle u-check" aria-hidden="true"></i>
3460                                </div>
3461                                <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div>
3462                            </div>
3463                        </div>
3464                        <blockquote class="testimonial-content">Highly recommended! Simple, interactive, and rewarding.</blockquote>
3465                    </div>
3466                </div>
3467
3468                <div class="testimonial-slide" data-date="2026-07-14" role="listitem">
3469                    <div class="testimonial-card">
3470                                                <span class="tc-source-badge tc-source-tp"><i class="fas fa-star"></i></span>
3471                        <div class="testimonial-header">
3472                            <div class="user-avatar" aria-hidden="true"><img src="https://flagcdn.com/fr.svg" alt="France" loading="lazy"></div>
3473                            <div class="user-info">
3474                                <div class="u-name-row">
3475                                    <span class="u-name notranslate" translate="no">Zac</span>
3476                                    <i class="fas fa-check-circle u-check" aria-hidden="true"></i>
3477                                </div>
3478                                <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div>
3479                            </div>
3480                        </div>
3481                        <blockquote class="testimonial-content">This site is real. Trustable, the owner is honest. I recommend it</blockquote>
3482                    </div>
3483                </div>
3484
3485                <div class="testimonial-slide" data-pin="2" data-date="2026-07-11" role="listitem">
3486                    <div class="testimonial-card">
3487                                                <span class="tc-source-badge tc-source-tp"><i class="fas fa-star"></i></span>
3488                        <div class="testimonial-header">
3489                            <div class="user-avatar" aria-hidden="true"><img src="https://flagcdn.com/ng.svg" alt="Nigeria" loading="lazy"></div>
3490                            <div class="user-info">
3491                                <div class="u-name-row">
3492                                    <span class="u-name notranslate" translate="no">Blank</span>
3493                                    <i class="fas fa-check-circle u-check" aria-hidden="true"></i>
3494                                </div>
3495                                <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div>
3496                            </div>
3497                        </div>
3498                        <blockquote class="testimonial-content">One of the best site for earning online. Fast withdrawals and high quality surveys and offers</blockquote>
3499                    </div>
3500                </div>
3501
3502                <div class="testimonial-slide" data-date="2026-07-08" role="listitem">
3503                    <div class="testimonial-card">
3504                                                <span class="tc-source-badge tc-source-tp"><i class="fas fa-star"></i></span>
3505                        <div class="testimonial-header">
3506                            <div class="user-avatar" aria-hidden="true"><img src="https://flagcdn.com/hu.svg" alt="Hungary" loading="lazy"></div>
3507                            <div class="user-info">
3508                                <div class="u-name-row">
3509                                    <span class="u-name notranslate" translate="no">Norbert Kiraly</span>
3510                                    <i class="fas fa-check-circle u-check" aria-hidden="true"></i>
3511                                </div>
3512                                <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div>
3513                            </div>
3514                        </div>
3515                        <blockquote class="testimonial-content">The best, reliable, pays on time. And the games are good.</blockquote>
3516                    </div>
3517                </div>
3518
3519                <div class="testimonial-slide" data-date="2026-07-16" role="listitem">
3520                    <div class="testimonial-card">
3521                                                <span class="tc-source-badge tc-source-tp"><i class="fas fa-star"></i></span>
3522                        <div class="testimonial-header">
3523                            <div class="user-avatar" aria-hidden="true"><img src="https://flagcdn.com/us.svg" alt="USA" loading="lazy"></div>
3524                            <div class="user-info">
3525                                <div class="u-name-row">
3526                                    <span class="u-name notranslate" translate="no">Veronica Robles</span>
3527                                    <i class="fas fa-check-circle u-check" aria-hidden="true"></i>
3528                                </div>
3529                                <div class="star-rating" aria-label="5 out of 5 stars" role="img"><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i><i class="fas fa-star"></i></div>
3530                            </div>
3531                        </div>
3532                        <blockquote class="testimonial-content">Thank you so much. I received cash out on Shark Earnings. Awesome!!!</blockquote>
3533                    </div>
3534                </div>
3535
3536
3537            </div>
3538        </div>
3539
3540        <button class="slider-btn slider-next" onclick="slideTestimonials('next')" aria-label="Next testimonial" aria-controls="testimonialsSlider">
3541            <i class="fas fa-chevron-right"></i>
3542        </button>
3543    </div>
3544    <div class="testimonial-dots" id="testimonialDots" role="tablist" aria-label="Testimonial pages"></div>
3545</section>
3546
3547<section id="affiliate-promo" class="section-container">
3548    <h2 class="section-title animate-on-scroll fade-in-up">Earn From Your Friends</h2>
3549    <p class="section-subtitle animate-on-scroll fade-in-up" style="transition-delay: 0.1s;">Your network keeps paying you long after the invite.</p>
3550    <div class="affiliate-promo-card animate-on-scroll fade-in-up">
3551        <div class="affiliate-promo-icon"><span class="affiliate-promo-pct-label">Up to</span><span class="affiliate-promo-pct notranslate">30%</span><span class="affiliate-promo-pct-sub">Lifetime</span></div>
3552        <div class="affiliate-promo-text">
3553            <h3 class="affiliate-promo-title">Get Paid Every Time They Do</h3>
3554            <p class="affiliate-promo-desc">Every referral starts you at <strong>10% commission</strong> and climbs to <strong>30%</strong> as your network grows - for as long as they stay active, with no cap and no extra work.</p>
3555        </div>
3556        <a href="/affiliates" class="affiliate-promo-cta">Explore the Affiliate Program <i class="fas fa-arrow-right"></i></a>
3557    </div>
3558</section>
3559
3560<section id="faq" class="section-container">
3561    <h2 class="section-title animate-on-scroll fade-in-up">Frequently Asked Questions</h2>
3562    <p class="section-subtitle animate-on-scroll fade-in-up" style="transition-delay: 0.1s;">
3563        Here are the most common questions. For more details, check our <a href="/academy" class="section-link">Academy</a>.
3564    </p>
3565    <div class="faq-list" role="list">
3566        
3567        <div class="faq-item animate-on-scroll fade-in-up open" role="listitem">
3568            <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="true" aria-controls="faq-answer-1">How much can I earn?</button></h3>
3569            <div class="faq-answer" id="faq-answer-1" role="region">
3570                <div class="faq-answer-content">
3571                    There is no fixed or guaranteed amount - it depends on how many offers you complete, which ones are available in your country, and how active your referrals are. <strong>Every offer shows its exact reward before you start</strong>, and you can cash out from <span class="notranslate">$1.00</span>.
3572                </div>
3573            </div>
3574        </div>
3575
3576        <div class="faq-item animate-on-scroll fade-in-up" role="listitem">
3577            <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-2">How fast do I get paid?</button></h3>
3578            <div class="faq-answer" id="faq-answer-2" role="region">
3579                <div class="faq-answer-content">
3580                    We process payments daily! You can cash out via <strong>PayPal</strong> (min <span class="notranslate">$1.00</span>), <strong>Crypto</strong> (min <span class="notranslate">$2.50</span>), or Gift Cards (min <span class="notranslate">$1.00</span>). Most users receive their money within a few hours.
3581                </div>
3582            </div>
3583        </div>
3584
3585        <div class="faq-item animate-on-scroll fade-in-up" role="listitem">
3586            <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-3">How does the referral program work?</button></h3>
3587            <div class="faq-answer" id="faq-answer-3" role="region">
3588                <div class="faq-answer-content">
3589                    Invite friends and earn up to <strong>30% commission</strong> on their earnings for life. It's a great way to build passive income. <a href="/affiliates" class="section-link" title="Affiliate Program Details">View Affiliate Program details</a>.
3590                </div>
3591            </div>
3592        </div>
3593
3594        <div class="faq-item animate-on-scroll fade-in-up" role="listitem">
3595            <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-4">Is Shark Earnings free and safe?</button></h3>
3596            <div class="faq-answer" id="faq-answer-4" role="region">
3597                <div class="faq-answer-content">
3598                    Yes! Registration is 100% free - we will never ask you for money. Your data is protected by SSL encryption and we are fully GDPR compliant.
3599                </div>
3600            </div>
3601        </div>
3602
3603        <div class="faq-item animate-on-scroll fade-in-up" role="listitem">
3604            <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-5">Do I need to invest money to start earning?</button></h3>
3605            <div class="faq-answer" id="faq-answer-5" role="region">
3606                <div class="faq-answer-content">
3607                    No! Shark Earnings is <strong>100% free to join and use</strong>. You can start earning immediately after registration without any upfront costs or hidden fees.
3608                </div>
3609            </div>
3610        </div>
3611
3612        <div class="faq-item animate-on-scroll fade-in-up" role="listitem">
3613            <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-6">What payment methods do you support?</button></h3>
3614            <div class="faq-answer" id="faq-answer-6" role="region">
3615                <div class="faq-answer-content">
3616                    We offer <strong>PayPal</strong>, <strong>Cryptocurrency</strong> (Litecoin), and popular <strong>Gift Cards</strong> (Amazon, Google Play, Steam, etc.). Minimum cashout starts at <span class="notranslate">$1.00</span> (Crypto min <span class="notranslate">$2.50</span>).
3617                </div>
3618            </div>
3619        </div>
3620
3621        <div class="faq-item animate-on-scroll fade-in-up" role="listitem">
3622            <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-7">Can I use Shark Earnings on mobile?</button></h3>
3623            <div class="faq-answer" id="faq-answer-7" role="region">
3624                <div class="faq-answer-content">
3625                    Absolutely! Our platform is fully responsive and works on all devices. Many game offers are specifically designed for mobile devices (Android/iOS).
3626                </div>
3627            </div>
3628        </div>
3629
3630        <div class="faq-item animate-on-scroll fade-in-up" role="listitem">
3631            <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-8">How do I track my earnings?</button></h3>
3632            <div class="faq-answer" id="faq-answer-8" role="region">
3633                <div class="faq-answer-content">
3634                    Your earnings are tracked in real-time on your <strong>Dashboard</strong>. You can see pending offers, completed tasks, referral earnings, and withdrawal history all in one place.
3635                </div>
3636            </div>
3637        </div>
3638
3639        <div class="faq-item animate-on-scroll fade-in-up" role="listitem">
3640            <h3 class="faq-q-heading"><button class="faq-question" aria-expanded="false" aria-controls="faq-answer-9">Does Shark Earnings work in my country?</button></h3>
3641            <div class="faq-answer" id="faq-answer-9" role="region">
3642                <div class="faq-answer-content">
3643                    <p>Yes! Shark Earnings is available in <strong>160+ countries</strong>. Offer availability depends on your region, but every country has access to at least some earning methods.</p>
3644                    <div class="faq-region-list">
3645                        <div class="faq-region-item">
3646                            <span class="faq-region-name"><img class="faq-region-flag" src="https://flagcdn.com/us.svg" alt="USA" width="20" height="20" loading="lazy"> Tier 1</span>
3647                            <span class="faq-region-countries">USA, UK, Canada, Australia</span>
3648                            <span class="faq-region-stars">★★★★★</span>
3649                        </div>
3650                        <div class="faq-region-item">
3651                            <span class="faq-region-name"><img class="faq-region-flag" src="https://flagcdn.com/eu.svg" alt="EU" width="20" height="20" loading="lazy"> Europe</span>
3652                            <span class="faq-region-countries">Germany, France, Netherlands, Nordics</span>
3653                            <span class="faq-region-stars">★★★★<span style="opacity:.25">★</span></span>
3654                        </div>
3655                        <div class="faq-region-item">
3656                            <span class="faq-region-name"><img class="faq-region-flag" src="https://flagcdn.com/in.svg" alt="Asia" width="20" height="20" loading="lazy"> Asia</span>
3657                            <span class="faq-region-countries">India, Philippines, Indonesia</span>
3658                            <span class="faq-region-stars">★★★<span style="opacity:.25">★★</span></span>
3659                        </div>
3660                        <div class="faq-region-item">
3661                            <span class="faq-region-name"><img class="faq-region-flag" src="https://flagcdn.com/br.svg" alt="LatAm" width="20" height="20" loading="lazy"> Latin America</span>
3662                            <span class="faq-region-countries">Brazil, Mexico, Argentina</span>
3663                            <span class="faq-region-stars">★★★<span style="opacity:.25">★★</span></span>
3664                        </div>
3665                    </div>
3666                    <p>The <strong>referral program</strong> has no country restrictions at all. For a full regional breakdown visit our <a href="/academy/insider/best-offers-by-region-guide" class="section-link">Best Offers by Region</a> guide in the Academy.</p>
3667                </div>
3668            </div>
3669        </div>
3670
3671    </div>
3672
3673</section>
3674
3675<section id="start-earning" class="section-container">
3676    <div class="final-cta animate-on-scroll fade-in-up">
3677        <h2 class="final-cta-title">Start Earning With Shark Earnings Today</h2>
3678        <p class="final-cta-sub">Turn your spare time into real cash with <a href="/offers">game and app offers</a>, <a href="/surveys">paid online surveys</a>, and daily <a href="/rewards">rewards</a>. Joining is free, takes under a minute, and you can <a href="/cashout">cash out from just <span class="notranslate">$1.00</span></a> via PayPal, crypto, or gift cards in 160+ countries.</p>
3679        <button type="button" class="final-cta-btn" onclick="openAuthModal('register')"><i class="fas fa-bolt"></i> Create Your Free Account</button>
3680        <p class="final-cta-links">New to earning online? Start with the <a href="/academy">Shark Earnings Academy</a> for offer strategies and payout guides, or see how the <a href="/affiliates">affiliate program</a> pays up to 30% commission for life.</p>
3681    </div>
3682</section>
3683
3684<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
3685(function(){
3686    if('IntersectionObserver' in window){
3687        var skObs = new IntersectionObserver(function(entries){
3688            entries.forEach(function(e){
3689                if(e.isIntersecting){
3690                    setTimeout(function(){
3691                        e.target.classList.remove('sk-loading');
3692                    }, 300);
3693                    skObs.unobserve(e.target);
3694                }
3695            });
3696        },{threshold:0.2});
3697        document.querySelectorAll('.step-card.sk-loading').forEach(function(el){
3698            skObs.observe(el);
3699        });
3700    } else {
3701        document.querySelectorAll('.sk-loading').forEach(function(el){ el.classList.remove('sk-loading'); });
3702    }
3703})();
3704</script>
3704
3705        </main>
3706            </div>
3707
3708        <style>
3709.shark-cookie-banner,.shark-cookie-modal,#cookie-mobile-trigger{--panel-bg:rgba(3,12,26,.96);--panel-border:rgba(0,229,255,.25);--text-primary:#E0F7FA;--text-secondary:#B2EBF2;--accent-primary:#00E5FF;--accent-secondary:#00B8D4;--success-color:#00C853;--error-color:#FF5252;--input-bg:rgba(0,0,0,.3);--deep-ocean-start:#00070f;--shadow-color-strong:rgba(0,229,255,.25);--shadow-color-light:rgba(0,229,255,.15)}.shark-cookie-modal *,.shark-cookie-modal *::before,.shark-cookie-modal *::after{box-sizing:border-box}:root{--shark-bottom-nav-space:0px}@media (max-width:768px){:root{--shark-bottom-nav-space:var(--mobile-bottom-nav-height,60px)}}.shark-cookie-banner{bottom:calc(var(--shark-bottom-nav-space) + 16px)}body.has-cookie-banner{padding-bottom:calc(var(--shark-bottom-nav-space) + var(--cookie-banner-h,170px) + 80px)}body.has-cookie-banner #support-fab-btn{bottom:calc(var(--shark-bottom-nav-space) + var(--cookie-banner-h,170px) + 16px)}@media (min-width:769px){body.has-cookie-banner .sidebar-menu{height:calc(100vh - var(--cookie-banner-h,170px))!important;height:calc(100dvh - var(--cookie-banner-h,170px))!important}}@media (max-width:600px){body.has-cookie-banner{padding-bottom:0}}.shark-cookie-banner{display:none;position:fixed;left:16px;right:16px;margin:0 auto;max-width:860px;bottom:calc(var(--shark-bottom-nav-space) + 16px);z-index:9999;background:var(--panel-bg);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-radius:16px;box-shadow:0 10px 36px rgba(0,0,0,.5);border:1.5px solid var(--panel-border);font-family:var(--font-main);animation:sharkFadeIn .5s;color:var(--text-primary);padding:.6rem .75rem .6rem 1rem;display:flex;align-items:center;justify-content:space-between;flex-wrap:nowrap;gap:1rem}.shark-cookie-text{margin:0;font-size:.85em;line-height:1.45;color:var(--text-secondary)}.shark-cookie-text a,.shark-cookie-link{color:var(--accent-primary);white-space:nowrap;text-decoration:underline;text-underline-offset:2px;font:inherit;font-weight:600;background:none;border:0;padding:0;cursor:pointer}.shark-cookie-text a:hover,.shark-cookie-link:hover{color:#fff}.shark-cookie-content-wrapper{display:flex;align-items:center;gap:15px;flex:1 1 auto;min-width:0}.shark-cookie-row{display:flex;gap:15px;align-items:center}.shark-cookie-logo{width:28px;height:auto;flex-shrink:0}.shark-cookie-actions{display:flex;gap:.5em;flex-shrink:0}.shark-cookie-actions .shark-cookie-btn{padding:.5em 1em;font-size:.88em}.shark-cookie-btn{border:none;border-radius:10px;padding:.6em 1.2em;font-size:.95em;font-weight:700;cursor:pointer;transition:all .2s ease-in-out;white-space:nowrap}.shark-cookie-btn.primary{background:linear-gradient(135deg,var(--accent-secondary),var(--accent-primary));color:var(--deep-ocean-start);box-shadow:0 4px 15px var(--shadow-color-light)}.shark-cookie-btn.secondary{background:var(--input-bg);color:var(--accent-primary);border:2px solid var(--panel-border)}.shark-cookie-btn.danger{background:transparent;color:var(--error-color);border:2px solid var(--error-color)}.shark-cookie-btn:hover{transform:translateY(-2px);filter:brightness(1.1);box-shadow:0 6px 20px var(--shadow-color-strong)}.shark-cookie-modal{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,7,15,.85);z-index:10000;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);animation:sharkFadeIn .3s;align-items:center;justify-content:center;padding:1rem;overflow:hidden}.shark-cookie-modal-content{background:var(--panel-bg);border-radius:18px;max-width:520px;width:100%;box-shadow:0 8px 40px var(--shadow-color-strong);overflow:hidden;border:1px solid var(--panel-border);color:var(--text-primary);display:flex;flex-direction:column;max-height:90vh;transition:max-width .3s ease}.shark-cookie-modal-content.wide{max-width:800px}.shark-cookie-modal-header{display:flex;align-items:center;justify-content:space-between;padding:1.2rem 1.5rem;border-bottom:1px solid var(--panel-border);flex-shrink:0}.shark-cookie-modal-header h3{margin:0;font-size:1.2em;font-weight:700;color:var(--accent-primary);display:flex;align-items:center;gap:.7em}.close-modal{background:none;border:none;font-size:1.8em;color:var(--text-secondary);cursor:pointer;transition:color .2s;padding:0;line-height:1}.close-modal:hover{color:var(--accent-primary)}.shark-cookie-modal-tabs{display:flex;border-bottom:1px solid var(--panel-border);padding:.5rem;background-color:rgba(0,0,0,.2);flex-shrink:0;gap:.5rem}.tab-btn{flex:1;padding:.8em;background:none;border:none;font-weight:600;font-size:.95em;color:var(--text-secondary);cursor:pointer;border-radius:8px;transition:background .2s,color .2s}.tab-btn.active{background:linear-gradient(135deg,var(--accent-secondary),var(--accent-primary));color:var(--deep-ocean-start);box-shadow:0 2px 12px var(--shadow-color-light)}.tab-btn:not(.active):hover{background:rgba(0,229,255,.1);color:var(--accent-primary)}.tab-simple-desc{color:var(--text-secondary);font-size:.9em;padding:.8rem 1.5rem .5rem;opacity:.9;text-align:center;flex-shrink:0}.shark-cookie-modal-body{overflow-y:auto;padding:0;flex-grow:1}.tab-content{display:none;padding:1rem}.tab-content.active{display:block;animation:sharkFadeIn .5s}.cookie-category{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-radius:12px;background:var(--input-bg);margin-bottom:.8rem;border:1px solid var(--panel-border);gap:1rem}.cookie-category div{flex-grow:1}.cookie-category h4{margin:0 0 .2em 0;font-size:1.05em;color:var(--text-primary);font-weight:600}.cookie-category-desc{font-size:.85em;color:var(--text-secondary);line-height:1.4}.switch{position:relative;display:inline-block;width:52px;height:28px;flex-shrink:0}.switch input{opacity:0;width:100%;height:100%;cursor:pointer}.slider{position:absolute;inset:0;background-color:var(--input-bg);border-radius:28px;transition:background-color .3s;border:1.5px solid var(--panel-border)}.slider:before{position:absolute;content:"";height:20px;width:20px;left:3px;top:50%;transform:translateY(-50%);background-color:var(--text-secondary);border-radius:50%;transition:all .3s ease-in-out}input:checked+.slider{background-color:var(--accent-secondary)}input:checked+.slider:before{transform:translateX(24px) translateY(-50%);background-color:white}input:disabled+.slider{background-color:rgba(0,0,0,.2);cursor:not-allowed;opacity:.6}.shark-cookie-table-container{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;margin-bottom:1.5rem}.shark-cookie-table{width:100%;border-collapse:collapse;margin:0;font-size:.85em;color:var(--text-secondary);min-width:100%}.shark-cookie-table caption{font-size:1.1em;font-weight:700;padding:.5rem 0;text-align:left;color:var(--text-primary);position:sticky;left:0}.shark-cookie-table th,.shark-cookie-table td{padding:.8em;border-bottom:1px solid var(--panel-border);text-align:left;vertical-align:top}.shark-cookie-table th{color:var(--accent-primary);background:rgba(0,0,0,.25);font-weight:600;white-space:nowrap}.shark-cookie-modal-footer{display:flex;gap:1em;padding:1.2rem;border-top:1px solid var(--panel-border);justify-content:center;background:rgba(0,0,0,.2);flex-shrink:0;flex-wrap:wrap}#cookie-mobile-trigger{display:none;position:fixed;left:16px;bottom:95px;z-index:9998;font-size:1.6em;cursor:pointer;background:var(--panel-bg);color:var(--accent-primary);width:50px;height:50px;border-radius:50%;align-items:center;justify-content:center;box-shadow:0 4px 16px var(--shadow-color-strong);border:1.5px solid var(--panel-border);transition:transform .2s ease-in-out,box-shadow .2s}#cookie-mobile-trigger:hover{transform:scale(1.1);box-shadow:0 6px 20px var(--shadow-color-strong)}@keyframes sharkFadeIn{from{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}@media (max-width:768px){.shark-cookie-banner{padding:.6rem .7rem}.shark-cookie-actions{flex-direction:column}}@media (max-width:600px){.shark-cookie-banner{display:none!important}.shark-cookie-modal{padding:10px!important;align-items:center}.shark-cookie-modal-content,.shark-cookie-modal-content.wide{max-width:100%!important;width:100%!important;max-height:85vh;margin:0 auto}.shark-cookie-modal-header{padding:1rem}.shark-cookie-modal-header h3{font-size:1.1em}.shark-cookie-modal-body{padding:0}.tab-content{padding:.8rem}.shark-cookie-modal-footer{flex-direction:column;gap:.8rem!important;padding:1rem}.shark-cookie-btn{width:100%;padding:.8em}.tab-btn{font-size:.85em;padding:.6em}.shark-cookie-table thead{display:none}.shark-cookie-table,.shark-cookie-table tbody,.shark-cookie-table tr,.shark-cookie-table td{display:block;width:100%}.shark-cookie-table tr{margin-bottom:1.2rem;border:1px solid var(--panel-border);border-radius:12px;padding:1rem;background:rgba(255,255,255,.02);box-shadow:0 4px 10px rgba(0,0,0,.2)}.shark-cookie-table caption{text-align:left;padding:10px;margin-bottom:8px;font-weight:700;font-size:1em;color:var(--accent-primary);background:rgba(0,229,255,.05);border-radius:8px;border:1px solid var(--panel-border);line-height:1.4;display:block}.shark-cookie-table td{padding:.5rem 0;text-align:left;position:relative;border:none;border-bottom:1px solid rgba(255,255,255,.05);display:flex;align-items:flex-start;gap:15px}.shark-cookie-table td:last-child{border-bottom:none}.shark-cookie-table td::before{content:attr(data-label);font-weight:600;color:var(--accent-primary);min-width:80px;flex-shrink:0;font-size:.9em;opacity:.9}.shark-cookie-table td.text-row{display:block;padding:0;line-height:1.5}.shark-cookie-table td.text-row::before{display:none}}
3710</style>
3711
3712<div id="cookie-banner" class="shark-cookie-banner" style="display: none;">
3713    <div class="shark-cookie-content-wrapper">
3714        <div class="shark-cookie-row">
3715            <img src="https://sharkearnings.com/assets/images/logos/sharklogo.webp" alt="" class="shark-cookie-logo" width="28" height="27" onerror="this.style.display='none'">
3716            <p class="shark-cookie-text">We use cookies to run the site and, with your consent, for analytics and marketing (Google Analytics, Meta Pixel). <a href="/cookie">Cookie Policy</a><span aria-hidden="true"> · </span><button type="button" class="shark-cookie-link" onclick="sharkShowCookieSettings()">Customize</button></p>
3717        </div>
3718    </div>
3719    <div class="shark-cookie-actions">
3720        <button type="button" onclick="sharkAcceptNecessaryCookie
3720s()" class="shark-cookie-btn secondary">Necessary Only</button>
3721        <button type="button" onclick="sharkAcceptAllCookies()" class="shark-cookie-btn secondary">Accept All</button>
3722    </div>
3723</div>
3724
3725<div id="cookie-modal" class="shark-cookie-modal">
3726    <div class="shark-cookie-modal-content" id="cookieModalContent">
3727        <div class="shark-cookie-modal-header">
3728            <h3><i class="fas fa-cookie-bite"></i> Cookie Preferences</h3>
3729            <button class="close-modal" onclick="sharkCloseCookieModal()">×</button>
3730        </div>
3731        <div class="shark-cookie-modal-tabs">
3732            <button class="tab-btn active" onclick="sharkOpenTab('categories', this)">Categories</button>
3733            <button class="tab-btn" onclick="sharkOpenTab('declaration', this)">Cookie Declaration</button>
3734        </div>
3735        <div class="tab-simple-desc" id="desc-categories">
3736            You can change or withdraw your consent here at any time.
3737        </div>
3738        <div class="tab-simple-desc" id="desc-declaration" style="display:none;">
3739            Cookies are grouped by category. You can allow or deny them below.
3740        </div>
3741        <div class="shark-cookie-modal-body">
3742            <div class="tab-content active" id="categories">
3743                <div class="cookie-category">
3744                    <div>
3745                        <h4>Necessary Cookies</h4>
3746                        <div class="cookie-category-desc">
3747                            These cookies are essential for the website to function, including login sessions, security (CSRF protection, CAPTCHA), fraud prevention, identity verification (Face Match), and cannot be disabled.
3748                        </div>
3749                    </div>
3750                    <label class="switch">
3751                        <input type="checkbox" checked disabled>
3752                        <span class="slider"></span>
3753                    </label>
3754                </div>
3755                <div class="cookie-category">
3756                    <div>
3757                        <h4>Analytics &amp; Advertising Cookies</h4>
3758                        <div class="cookie-category-desc">
3759                            Google Analytics and the Meta Pixel help us understand how the site is used and whether our advertising works. They are only set if you allow them.
3760                        </div>
3761                    </div>
3762                    <label class="switch">
3763                        <input type="checkbox" id="analyticsCookies">
3764                        <span class="slider"></span>
3765                    </label>
3766                </div>
3767                <div class="cookie-category">
3768                    <div>
3769                        <h4>Advertiser & Offer Cookies</h4>
3770                        <div class="cookie-category-desc">
3771                           To track offer completions and credit your earnings, our partners place cookies when you visit their sites. These are essential for using our service and cannot be disabled here.
3772                        </div>
3773                    </div>
3774                </div>
3775            </div>
3776            <div class="tab-content" id="declaration">
3777               <div class="shark-cookie-table-container">
3778                   <table class="shark-cookie-table">
3779                       <caption>Necessary (Essential for site function and security)</caption>
3780                       <thead>
3781                           <tr><th>Name</th><th>Provider</th><th>Purpose</th><th>Expiry</th></tr>
3782                       </thead>
3783                       <tbody>
3784                           <tr><td data-label="Name">PHPSESSID</td><td data-label="Provider">sharkearnings.com</td><td data-label="Purpose">Manages user login session and CSRF protection.</td><td data-label="Expiry">Session</td></tr>
3785                           <tr><td data-label="Name">_cf*</td><td data-label="Provider">Cloudflare</td><td data-label="Purpose">Used by Cloudflare Turnstile for CAPTCHA security on forms.</td><td data-label="Expiry">Varies</td></tr>
3786                           <tr><td data-label="Name">Verisoul Session & Device Data</td><td data-label="Provider">verisoul.ai / sharkearnings.com</td><td data-label="Purpose">Identity verification through facial recognition (Face Match), device fingerprinting, fraud detection, bot prevention, and account security to protect against fraudulent activities and ensure user authenticity.</td><td data-label="Expiry">Session / Persistent</td></tr>
3787                           <tr><td data-label="Name">localStorage: shark_cookie_prefs</td><td data-label="Provider">sharkearnings.com</td><td data-label="Purpose">Stores your cookie consent preferences.</td><td data-label="Expiry">Persistent</td></tr>
3788                           <tr><td data-label="Name">G_AUTHUSER, G_ENABLED_IDPS</td><td data-label="Provider">accounts.google.com</td><td data-label="Purpose">Enables "Sign in with Google" functionality.</td><td data-label="Expiry">Varies</td></tr>
3789                           <tr><td data-label="Name">referrer_code</td><td data-label="Provider">sharkearnings.com</td><td data-label="Purpose">Ensures your referrer gets credited correctly if you sign up later.</td><td data-label="Expiry">30 days</td></tr>
3790                       </tbody>
3791                   </table>
3792               </div>
3793               <div class="shark-cookie-table-container">
3794                   <table class="shark-cookie-table">
3795                       <caption>Analytics &amp;
3795 Advertising (only with your consent)</caption>
3796                       <thead>
3797                            <tr><th>Name</th><th>Provider</th><th>Purpose</th><th>Expiry</th></tr>
3798                       </thead>
3799                       <tbody>
3800                           <tr><td data-label="Name">_ga, _ga_*</td><td data-label="Provider">Google Analytics</td><td data-label="Purpose">Distinguishes visitors and sessions to produce usage statistics.</td><td data-label="Expiry">Up to 2 years</td></tr>
3801                           <tr><td data-label="Name">_fbp</td><td data-label="Provider">Meta Platforms (Meta Pixel)</td><td data-label="Purpose">Identifies your browser to measure whether our Facebook and Instagram ads lead to visits and registrations.</td><td data-label="Expiry">3 months</td></tr>
3802                           <tr><td data-label="Name">Cloudflare Insights ID</td><td data-label="Provider">cloudflareinsights.com</td><td data-label="Purpose">Collects anonymous performance and usage analytics.</td><td data-label="Expiry">Varies</td></tr>
3803                       </tbody>
3804                   </table>
3805               </div>
3806               <div class="shark-cookie-table-container">
3807                   <table class="shark-cookie-table">
3808                       <caption>Third-Party Offer & Advertiser Cookies (Essential for Earning)</caption>
3809                       <tbody>
3810                            <tr>
3811                                <td colspan="4" class="text-row">
3812                                    When you click a link to complete an offer (e.g., on an offerwall), you are redirected to a partner's website. These third-party sites use their own cookies to track the offer's completion. We do not control these cookies, and your interaction is governed by their respective privacy policies. Enabling cookies in your browser is essential for your earnings to be tracked correctly.
3813                                </td>
3814                            </tr>
3815                       </tbody>
3816                   </table>
3817               </div>
3818            </div>
3819        </div>
3820        <div class="shark-cookie-modal-footer">
3821            <button onclick="sharkSaveCookieSettings()" class="shark-cookie-btn primary">Save Preferences</button>
3822            <button onclick="sharkAcceptAllCookies()" class="shark-cookie-btn secondary">Accept All</button>
3823            <button onclick="sharkAcceptNecessaryCookies()" class="shark-cookie-btn secondary">Necessary Only</button>
3824        </div>
3825    </div>
3826</div>
3827
3828<div id="cookie-mobile-trigger" role="button" aria-label="Cookie Settings" onclick="sharkShowCookieSettings()">
3829    <i class="fas fa-cookie-bite"></i>
3830</div>
3831
3832<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">!function(){"use strict";let e="shark_cookie_prefs",t=document.getElementById("cookie-banner"),a=document.getElementById("cookie-modal"),n=document.getElementById("cookie-mobile-trigger"),s=document.getElementById("analyticsCookies"),i=document.getElementById("cookieModalContent");function o(){t&&(t.style.display="none"),a&&(a.style.display="none"),n&&(n.style.display="none")}function d(){let a=localStorage.getItem(e);if(a){o();return}let s=window.innerWidth<=600;s?(n&&(n.style.display="flex"),t&&(t.style.display="none")):(t&&(t.style.display="flex"),n&&(n.style.display="none"))}function l(t){localStorage.setItem(e,JSON.stringify({necessary:!0,analytics:t,date:new Date().toISOString()})),"function"==typeof gtag&&(t?gtag("consent","update",{analytics_storage:"granted",ad_storage:"granted",ad_user_data:"granted",ad_personalization:"granted"}):gtag("consent","update",{analytics_storage:"denied",ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"})),o()}function r(){!function t(){let a=document.createElement("script");function n(){dataLayer.push(arguments)}a.async=!0,a.src="https://www.googletagmanager.com/gtag/js?id=G-MRRRNEZD2W",document.head.appendChild(a),window.dataLayer=window.dataLayer||[],window.gtag=n,n("js",new Date);let s=localStorage.getItem(e),i=s?JSON.parse(s):{analytics:!1};i.analytics?(n("consent","update",{analytics_storage:"granted",ad_storage:"granted",ad_user_data:"granted",ad_personalization:"granted"}),n("config","G-MRRRNEZD2W",{anonymize_ip:!1})):(n("consent","default",{analytics_storage:"denied",ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}),n("config","G-MRRRNEZD2W",{anonymize_ip:!0,client_storage:"none"}))}(),d(),window.addEventListener("resize",d)}window.sharkAcceptAllCookies=function(){l(!0)}
3832,window.sharkAcceptNecessaryCookies=function(){l(!1)},window.sharkSaveCookieSettings=function(){s&&l(s.checked),a&&(a.style.display="none")},window.sharkShowCookieSettings=function(){if(!a)return;let i=localStorage.getItem(e),o=!!i&&!!JSON.parse(i).analytics;s&&(s.checked=o),a.style.display="flex",t&&(t.style.display="none"),n&&(n.style.display="none");let d=document.querySelector(".shark-cookie-modal-tabs .tab-btn");d&&window.sharkOpenTab("categories",d)},window.sharkCloseCookieModal=function(){a&&(a.style.display="none"),d()},window.sharkOpenTab=function(e,t){if(!document.getElementById(e)||!t)return;document.querySelectorAll(".tab-content").forEach(e=>e.classList.remove("active")),document.querySelectorAll(".tab-btn").forEach(e=>e.classList.remove("active")),document.getElementById(e).classList.add("active"),t.classList.add("active");let a=document.getElementById("desc-categories"),n=document.getElementById("desc-declaration");a&&(a.style.display="categories"===e?"block":"none"),n&&(n.style.display="declaration"===e?"block":"none"),i&&i.classList.toggle("wide","declaration"===e)},"loading"===document.readyState?document.addEventListener("DOMContentLoaded",r):r()}();
3833
3834</script>
vendor: 1 bytes, line 3834
3834
3835<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">!function(){function g(){try{var p=JSON.parse(localStorage.getItem("shark_cookie_prefs")||"null");return!!(p&&p.analytics)}catch(e){return!1}}function w(){["_fbp","_fbc"].concat(document.cookie.split(";").map(function(c){return c.split("=")[0].trim()}).filter(function(n){return/^_ga(_|$)/.test(n)})).forEach(function(n){var h=location.hostname.replace(/^www\./,"");["","; domain="+h,"; domain=."+h].forEach(function(d){document.cookie=n+"=; Max-Age=0; path=/"+d})})}["sharkAcceptAllCookies","sharkAcceptNecessaryCookies","sharkSaveCookieSettings"].forEach(function(k){var f=window[k];if("function"!=typeof f)return;window[k]=function(){var r=f.apply(this,arguments);g()?"function"==typeof window.sharkOnAnalyticsConsent&&window.sharkOnAnalyticsConsent():w();return r}})}();</script>
vendor: 1 bytes, line 3835
3835
3836<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
3837/* A banner fixen all a lap aljan (z-index 9999), ezert eltakarja a lablec also
3838   sorat - a szabalyzat-linkeket es a nyelvvalasztot. Amig latszik, a body also
3839   paddingja tartja fenn a helyet, hogy a tartalom folebe tudjon gorogni. */
3840(function () {
3841    var el = document.getElementById('cookie-banner');
3842    if (!el) return;
3843    function sync() {
3844        var visible = getComputedStyle(el).display !== 'none';
3845        document.body.classList.toggle('has-cookie-banner', visible);
3846        document.documentElement.style.setProperty(
3847            '--cookie-banner-h', visible ? el.offsetHeight + 'px' : '0px');
3848    }
3849    sync();
3850    try {
3851        new MutationObserver(sync).observe(el, { attributes: true, attributeFilter: ['style', 'class'] });
3852        new ResizeObserver(sync).observe(el);
3853    } catch (e) {}
3854    window.addEventListener('resize', sync, { passive: true });
3855})();
3856</script>
3856
3857    <nav class="mobile-bottom-nav mobile-only" id="mobile-bottom-nav">
3858        <a href="/earn" class="">
3859            <i class="fas fa-coins"></i>
3860            <span>Earn</span>
3861        </a>
3862        <a href="/offers" class="">
3863            <i class="fas fa-tags"></i>
3864            <span>Offers</span>
3865        </a>
3866        <a href="/surveys" class="">
3867            <i class="fas fa-poll"></i>
3868            <span>Surveys</span>
3869        </a>
3870        <a href="/rewards" class="">
3871            <i class="fas fa-gift"></i>
3872            <span>Rewards</span>
3873        </a>
3874        <a href="/cashout" class="">
3875            <i class="fas fa-wallet"></i>
3876            <span>Cashout</span>
3877        </a>
3878        <button class="mobile-menu-toggle" id="mobileMenuToggle">
3879            <i class="fas fa-bars"></i>
3880            <span>Menu</span>
3881        </button>
3882    </nav>
3883        <div id="android-app-banner" class="android-app-banner" role="region" aria-label="Get the Android app" hidden>
3884        <img src="/assets/images/logos/sharklogo.webp" alt="" class="aab-icon" width="120" height="115">
3885        <div class="aab-text">
3886            <strong>Shark Earnings is now on Android</strong>
3887            <span>Faster earning, right from your phone.</span>
3888        </div>
3889        <a class="aab-btn" href="https://play.google.com/store/apps/details?id=com.sharkearnings.app" target="_blank" rel="noopener noreferrer">Get the App</a>
3890        <button type="button" class="aab-close" id="aabClose" aria-label="Dismiss">&times;</button>
3891    </div>
3892    
3892<script type="text/javascript" nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
3893    (function(){
3894        var banner=document.getElementById('android-app-banner');
3895        if(!banner)return;
3896        var ua=navigator.userAgent||'';
3897        var isAndroid=/Android/i.test(ua);
3898        var inApp=ua.indexOf('SharkEarningsApp')!==-1||document.body.classList.contains('is-mobile-app')||/wv\)/i.test(ua);
3899        var dismissed=false;
3900        try{dismissed=localStorage.getItem('aab_dismissed')==='1';}catch(e){}
3901        if(isAndroid&&!inApp&&!dismissed){
3902            requestAnimationFrame(function(){banner.hidden=false;requestAnimationFrame(function(){banner.classList.add('aab-show');document.body.classList.add('has-app-banner');});});
3903        }
3904        var close=document.getElementById('aabClose');
3905        if(close){close.addEventListener('click',function(){
3906            banner.classList.remove('aab-show');
3907            document.body.classList.remove('has-app-banner');
3908            try{localStorage.setItem('aab_dismissed','1');}catch(e){}
3909            setTimeout(function(){banner.hidden=true;},300);
3910        });}
3911    })();
3912    </script>
3912
3913        
3913<script type="text/javascript" nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
3914    (function(){
3915        var nav=document.getElementById('mobile-bottom-nav');
3916        if(!nav)return;
3917        var reduce=window.matchMedia&&window.matchMedia('(prefers-reduced-motion:reduce)').matches;
3918        function haptic(){
3919            try{
3920                if(window.flutter_inappwebview&&window.flutter_inappwebview.callHandler){window.flutter_inappwebview.callHandler('haptic','selection');return;}
3921                if(navigator.vibrate){navigator.vibrate(8);}
3922            }catch(e){}
3923        }
3924        nav.querySelectorAll('a,button').forEach(function(el){
3925            el.addEventListener('pointerdown',function(){
3926                haptic();
3927                if(reduce||el.classList.contains('active'))return;
3928                el.classList.add('tap-press');
3929            },{passive:true});
3930            ['pointerup','pointerleave','pointercancel'].forEach(function(ev){
3931                el.addEventListener(ev,function(){el.classList.remove('tap-press');},{passive:true});
3932            });
3933        });
3934    })();
3935    </script>
3935
3936        <footer class="gf-footer">
3937    <div class="gf-main">
3938        <div class="gf-brand">
3939            <img src="/assets/images/logos/sharklogo_text_540.webp" alt="Shark Earnings" loading="lazy" decoding="async" width="180" height="48" style="height:48px;width:auto;">
3940            <p class="gf-desc">Earn real money playing games, completing offers &amp; surveys. Fast payouts via PayPal, Crypto &amp; Gift Cards.</p>
3941            <a class="gf-gplay" href="https://play.google.com/store/apps/details?id=com.sharkearnings.app" target="_blank" rel="noopener noreferrer" aria-label="Get it on Google Play - Shark Earnings for Android">
3942                <img src="/assets/images/get_it_on_googleplay.webp" alt="Get it on Google Play" loading="lazy" decoding="async" width="160" height="48">
3943            </a>
3944        </div>
3945        <div class="gf-links">
3946            <div class="gf-col gf-ai-col">
3947                <div class="gf-col-title">Ask AI</div>
3948                                <a href="https://chat.openai.com/?q=I%27m%20researching%20get-paid-to%20%28GPT%29%20reward%20platforms%20where%20you%20can%20earn%20real%20money%20playing%20games%2C%20testing%20apps%2C%20and%20completing%20surveys.%20What%20is%20Shark%20Earnings%20%28sharkearnings.com%29%3F%20What%20does%20it%20offer%2C%20and%20what%20are%20its%20best%20features%20compared%20to%20other%20GPT%20and%20rewards%20platforms%3F%20How%20is%20it%20different%20from%20traditional%20survey%20sites%20and%20cashback%20apps%3F%20Please%20explain%20its%20key%20strengths%20in%20payout%20speed%2C%20minimum%20cashout%20amount%2C%20payment%20method%20variety%20%28PayPal%2C%20crypto%2C%20gift%20cards%29%2C%20offer%20variety%2C%20and%20mobile%20experience.%20Focus%20on%20why%20these%20features%20matter%20for%20someone%20who%20wants%20to%20start%20earning%20quickly%20with%20a%20low%20barrier%20to%20entry." target="_blank" rel="noopener noreferrer nofollow"><span class="ask-ai-ico" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"/></svg></span>ChatGPT</a>
3949                                <a href="https://claude.ai/new?q=I%27m%20researching%20get-paid-to%20%28GPT%29%20reward%20platforms%20where%20you%20can%20earn%20real%20money%20playing%20games%2C%20testing%20apps%2C%20and%20completing%20surveys.%20What%20is%20Shark%20Earnings%20%28sharkearnings.com%29%3F%20What%20does%20it%20offer%2C%20and%20what%20are%20its%20best%20features%20compared%20to%20other%20GPT%20and%20rewards%20platforms%3F%20How%20is%20it%20different%20from%20traditional%20survey%20sites%20and%20cashback%20apps%3F%20Please%20explain%20its%20key%20strengths%20in%20payout%20speed%2C%20minimum%20cashout%20amount%2C%20payment%20method%20variety%20%28PayPal%2C%20crypto%2C%20gift%20cards%29%2C%20offer%20variety%2C%20and%20mobile%20experience.%20Focus%20on%20why%20these%20features%20matter%20for%20someone%20who%20wants%20to%20start%20earning%20quickly%20with%20a%20low%20barrier%20to%20entry." target="_blank" rel="noopener noreferrer nofollow"><span class="ask-ai-ico" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 
39491.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.
39490182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z"/></svg></span>Claude</a>
3950                                <a href="https://www.google.com/search?udm=50&amp;aep=11&amp;q=I%27m%20researching%20get-paid-to%20%28GPT%29%20reward%20platforms%20where%20you%20can%20earn%20real%20money%20playing%20games%2C%20testing%20apps%2C%20and%20completing%20surveys.%20What%20is%20Shark%20Earnings%20%28sharkearnings.com%29%3F%20What%20does%20it%20offer%2C%20and%20what%20are%20its%20best%20features%20compared%20to%20other%20GPT%20and%20rewards%20platforms%3F%20How%20is%20it%20different%20from%20traditional%20survey%20sites%20and%20cashback%20apps%3F%20Please%20explain%20its%20key%20strengths%20in%20payout%20speed%2C%20minimum%20cashout%20amount%2C%20payment%20method%20variety%20%28PayPal%2C%20crypto%2C%20gift%20cards%29%2C%20offer%20variety%2C%20and%20mobile%20experience.%20Focus%20on%20why%20these%20features%20matter%20for%20someone%20who%20wants%20to%20start%20earning%20quickly%20with%20a%20low%20barrier%20to%20entry." target="_blank" rel="noopener noreferrer nofollow"><span class="ask-ai-ico" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M11.04 19.32Q12 21.51 12 24q0-2.49.93-4.68.96-2.19 2.58-3.81t3.81-2.55Q21.51 12 24 12q-2.49 0-4.68-.93a12.3 12.3 0 0 1-3.81-2.58 12.3 12.3 0 0 1-2.58-3.81Q12 2.49 12 0q0 2.49-.96 4.68-.93 2.19-2.55 3.81a12.3 12.3 0 0 1-3.81 2.58Q2.49 12 0 12q2.49 0 4.68.96 2.19.93 3.81 2.55t2.55 3.81"/></svg></span>Gemini</a>
3951                                <a href="https://grok.com/?q=I%27m%20researching%20get-paid-to%20%28GPT%29%20reward%20platforms%20where%20you%20can%20earn%20real%20money%20playing%20games%2C%20testing%20apps%2C%20and%20completing%20surveys.%20What%20is%20Shark%20Earnings%20%28sharkearnings.com%29%3F%20What%20does%20it%20offer%2C%20and%20what%20are%20its%20best%20features%20compared%20to%20other%20GPT%20and%20rewards%20platforms%3F%20How%20is%20it%20different%20from%20traditional%20survey%20sites%20and%20cashback%20apps%3F%20Please%20explain%20its%20key%20strengths%20in%20payout%20speed%2C%20minimum%20cashout%20amount%2C%20payment%20method%20variety%20%28PayPal%2C%20crypto%2C%20gift%20cards%29%2C%20offer%20variety%2C%20and%20mobile%20experience.%20Focus%20on%20why%20these%20features%20matter%20for%20someone%20who%20wants%20to%20start%20earning%20quickly%20with%20a%20low%20barrier%20to%20entry." target="_blank" rel="noopener noreferrer nofollow"><span class="ask-ai-ico" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="10.5" fill="none" stroke="currentColor" stroke-width="1.6"/><text x="12" y="16.5" text-anchor="middle" font-size="11" font-weight="700" fill="currentColor" font-family="Arial,sans-serif">G</text></svg></span>Grok</a>
3952                                <a href="https://www.perplexity.ai/search?q=I%27m%20researching%20get-paid-to%20%28GPT%29%20reward%20platforms%20where%20you%20can%20earn%20real%20money%20playing%20games%2C%20testing%20apps%2C%20and%20completing%20surveys.%20What%20is%20Shark%20Earnings%20%28sharkearnings.com%29%3F%20What%20does%20it%20offer%2C%20and%20what%20are%20its%20best%20features%20compared%20to%20other%20GPT%20and%20rewards%20platforms%3F%20How%20is%20it%20different%20from%20traditional%20survey%20sites%20and%20cashback%20apps%3F%20Please%20explain%20its%20key%20strengths%20in%20payout%20speed%2C%20minimum%20cashout%20amount%2C%20payment%20method%20variety%20%28PayPal%2C%20crypto%2C%20gift%20cards%29%2C%20offer%20variety%2C%20and%20mobile%20experience.%20Focus%20on%20why%20these%20features%20matter%20for%20someone%20who%20wants%20to%20start%20earning%20quickly%20with%20a%20low%20barrier%20to%20entry." target="_blank" rel="noopener noreferrer nofollow"><span class="ask-ai-ico" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M22.3977 7.0896h-2.3106V.0676l-7.5094 6.3542V.1577h-1.1554v6.1966L4.4904 0v7.0896H1.6023v10.3976h2.8882V24l6.932-6.3591v6.2005h1.1554v-6.0469l6.9318 6.1807v-6.4879h2.8882V7.0896zm-3.4657-4.531v4.531h-5.355l5.355-4.531zm-13.2862.0676 4.8691 4.4634H5.6458V2.6262zM2.7576 16.332V8.245h7.8476l-6.1149 6.1147v1.9723H2.7576zm2.8882 5.0404v-3.8852h.0001v-2.6488l5.7763-5.7764v7.0111l-5.7764 5.2993zm12.7086.0248-5.7766-5.1509V9.0618l5.7766 5.7766v6.5588zm2.8882-5.0652h-1.733v-1.9723L13.3948 8.245h7.8478v8.087z"/></svg></span>Perplexity</a>
3953                            </div>
3954            <div class="gf-col">
3955                <div class="gf-col-title">Platform</div>
3956                                <a href="/earn">Earn</a>
3957                <a href="/surveys">Surveys</a>
3958                <a href="/offers">Offers</a>
3959                                <a href="/rewards">Rewards</a>
3960                                <a href="/cashout">Cash out</a>
3961                <a href="/account">Account</a>
3962                <a href="/affiliates">Affiliates</a>
3963                                <a href="/race">Races</a>
3964                                            </div>
3965            <div class="gf-col">
3966                                <div class="gf-col-title">Shark Earnings</div>
3967                <a href="/support">Contact Us</a>
3968                <a href="/academy/guides/how-to-start-earning">How to start?</a>
3969                <a href="https://sharklio.com/">Advertise with us</a>
3970                <a href="/academy">Academy</a>
3971                <a href="/academy/general/tracking-troubleshooting">Tracking Issues</a>
3972                <a href="/academy/rewards/missing-reward-help">Missing Reward</a>
3973                <a href="/academy/account/withdrawal-rejected">Withdrawal Rejected</a>
3974                <a href="/academy/general/how-long-does-withdrawal-take">How Long Withdrawals Take</a>
3975                            </div>
3976            <div class="gf-col">
3977                <div class="gf-col-title">Ways to Make Money</div>
3978                <a href="/academy/guides/how-to-make-money-playing-games-on-phone-2026">Earn Playing Games</a>
3979                <a href="/academy/guides/complete-survey-masterclass">Earn Answering Surveys</a>
3980                <a href="/academy/guides/profit-from-purchase-offers">Earn Testing Products</a>
3981                <a href="/academy/guides/passive-video-earning-guide">Earn Watching Videos</a>
3982                <a href="/academy/guides/watching-ads-earn-money-guide">Earn Watching Ads</a>
3983                <a href="/academy/guides/downloading-apps-earn-money-guide">Earn Downloading Apps</a>
3984                <a href="/academy/guides/free-trials-earn-money-guide">Earn Free Trials</a>
3985                <a href="/academy/guides/simple-tasks-earn-money-guide">
3985Earn Simple Tasks</a>
3986            </div>
3987        </div>
3988    </div>
3989    <div class="gf-bottom">
3990        <span class="gf-copy">&copy; 2026 Shark Earnings.</span>
3991        <div class="gf-legal">
3992            <a href="/tos">Terms of Service</a>
3993            <span class="gf-sep">&bull;</span>
3994            <a href="/privacy">Privacy Policy</a>
3995            <span class="gf-sep">&bull;</span>
3996            <a href="/cookie">Cookie Policy</a>
3997            <span class="gf-sep">&bull;</span>
3998            <a href="#" onclick="if(typeof sharkShowCookieSettings==='function')sharkShowCookieSettings();return false;">Cookie Settings</a>
3999            <span class="gf-sep">&bull;</span>
4000            <a href="/affiliate">Affiliate Policy</a>
4001            <span class="gf-sep">&bull;</span>
4002            <a href="/aml">AML &amp; KYC Policy</a>
4003            <span class="gf-sep">&bull;</span>
4004            <a href="/api/activity">Activity API</a>
4005        </div>
4006        <div class="gf-lang"><div class="gtranslate_wrapper"></div></div>
4007        <div class="gf-social">
4008            <a href="https://www.facebook.com/officialsharknetwork" target="_blank" rel="noopener noreferrer" aria-label="Facebook"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"/></svg></a>
4009            <a href="https://x.com/ofcsharknetwork" target="_blank" rel="noopener noreferrer" aria-label="X / Twitter"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.746l7.73-8.835L1.254 2.25H8.08l4.253 5.622zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg></a>
4010            <a href="https://www.instagram.com/officialsharknetwork/" target="_blank" rel="noopener noreferrer" aria-label="Instagram"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><rect x="2" y="2" width="20" height="20" rx="5" ry="5"/><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z" fill="var(--bg,#00070f)"/><line x1="17.5" y1="6.5" x2="17.51" y2="6.5" stroke="var(--bg,#00070f)" stroke-width="2" stroke-linecap="round"/></svg></a>
4011            <a href="https://discord.gg/shark-earnings-earn-cash-rewards-897403167820636190" target="_blank" rel="noopener noreferrer" aria-label="Discord"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057c.002.022.015.043.03.056a19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"/></svg></a>
4012            <a href="https://www.linkedin.com/company/sharknetwork" target="_blank" rel="noopener noreferrer" aria-label="LinkedIn"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6zM2 9h4v12H2z"/><circle cx="4" cy="4" r="2"/></svg></a>
4013        </div>
4014    </div>
4015</footer>
4016<style>main.earn-page{padding-bottom:1rem!important}.gf-footer{transition:width .3s,margin-left .3s;background:linear-gradient(180deg,rgba(3,10,22,.98) 0%,var(--deep-ocean-start,#00070f) 100%);border-top:1px solid rgba(0,229,255,.2);margin-bottom:0;padding-bottom:0;backdrop-filter:blur(10px)}.gf-main{display:flex;align-items:flex-start;flex-wrap:wrap;gap:2.5rem;padding:2.5rem 3rem 1rem;width:100%;box-sizing:border-box}.gf-brand{display:flex;flex-direction:column;align-items:flex-start;gap:.75rem;max-width:280px;flex-shrink:0}.gf-desc{color:var(--muted,#b2ebf2);font-size:.9em;line-height:1.6;margin:0}.gf-links{display:flex;flex-wrap:wrap;gap:2.5rem;flex:1 1 auto;justify-content:space-between}.gf-col{display:flex;flex-direction:column;gap:.45em;min-width:130px}.gf-col a{color:var(--text,#e0f7fa);text-decoration:none;font-weight:500;font-size:.9em;transition:color .2s,transform .2s;position:relative;display:inline-flex;align-items:center;min-height:24px;padding-bottom:2px;align-self:flex-start;width:fit-content}.gf-col a:hover{color:var(--primary,#00e5ff);text-decoration:none;transform:translateX(3px)}.gf-col a::after{content:"";position:absolute;bottom:0;left:0;width:0;height:1.5px;background:linear-gradient(90deg,var(--accent-primary),var(--accent-glow));transition:width .25s cubic-bezier(.4,0,.2,1);border-radius:1px}.gf-col a:hover::after{width:100%}.gf-col-title{font-weight:600;color:var(--accent,#18ffff);margin-bottom:.45em;font-size:1.04em}.gf-bottom{display:flex;align-items:center;flex-wrap:wrap;gap:.4rem 1.2rem;padding:.6rem 3rem .8rem;border-top:1px solid var(--border,rgba(0,229,255,.25));width:100%;box-sizing:border-box}.gf-copy{color:var(--muted,#b2ebf2);font-size:.82rem;white-space:nowrap}.gf-legal{display:flex;align-items:center;flex-wrap:wrap;gap:.3rem .5rem;font-size:.82rem}.gf-legal a{color:var(--text-secondary,#b2ebf2);text-decoration:none;transition:color .2s;
4016display:inline-flex;align-items:center;min-height:24px;padding:2px 0}.gf-ai-col a{display:inline-flex;align-items:center;min-height:24px}.gf-legal a:hover{color:var(--accent-primary,#00e5ff);text-decoration:underline}.gf-sep{color:var(--muted,#b2ebf2);opacity:.5}.gf-lang{display:flex;align-items:center;margin:0 auto}.gf-social{display:flex;align-items:center;gap:.5rem}.gf-social a{color:var(--text-secondary,#b2ebf2);opacity:.85;transition:opacity .2s,background .2s;display:flex;padding:5px;border-radius:6px;background:rgba(255,255,255,.06)}.gf-social a:hover{opacity:1;background:rgba(0,229,255,.15)}
4017.gf-stats-mini span{font-size:.78rem;color:var(--muted,rgba(197,240,247,.6));white-space:nowrap}
4018.gf-stats-mini strong{color:var(--accent-primary,#00e5ff);font-weight:700}
4019.gf-desc{color:var(--muted,#b2ebf2);font-size:.88em;line-height:1.55;margin:0;max-width:220px}
4020.gf-social a{color:var(--text-secondary,#b2ebf2);opacity:.85;transition:all .2s;display:flex;padding:7px;border-radius:8px;background:rgba(0,229,255,.05);border:1px solid rgba(0,229,255,.12);font-size:1rem}
4021.gf-social a:hover{opacity:1;background:rgba(0,229,255,.15);border-color:rgba(0,229,255,.4);transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,229,255,.2)}
4022.gf-gplay{display:inline-flex;align-items:center;transition:transform .2s,filter .2s;flex-shrink:0;margin-top:.35rem}
4023.gf-gplay img{height:44px;width:auto;display:block;border-radius:8px}
4024.gf-gplay:hover{transform:translateY(-2px);filter:brightness(1.08)}
4025.gf-col-title{font-weight:700;color:var(--accent-primary,#00e5ff);margin-bottom:.5em;font-size:.88rem;text-transform:uppercase;letter-spacing:.6px}.gf-ai-col a{display:inline-flex;align-items:center;gap:.5em}.ask-ai-ico{display:inline-flex;width:14px;height:14px;flex-shrink:0;color:var(--text-secondary,#b2ebf2);opacity:.85;transition:color .2s,opacity .2s}.ask-ai-ico svg{width:100%;height:100%;fill:currentColor}.gf-ai-col a:hover .ask-ai-ico{color:var(--primary,#00e5ff);opacity:1}@media(max-width:900px){.gf-main{flex-direction:column}.gf-brand{max-width:100%}}@media(max-width:768px){.gf-col{gap:.35rem}.gf-col a{min-height:28px;display:flex;align-items:center;padding:3px 0}.gf-ai-col a,.gf-legal a{min-height:28px;display:inline-flex;align-items:center;gap:6px;padding:3px 2px}.gf-social a{min-width:32px;min-height:32px;align-items:center;justify-content:center}}@media(max-width:600px){.gf-footer{padding-bottom:env(safe-area-inset-bottom,0)}.gf-main{padding:1.5rem 1rem .75rem;gap:1.5rem}.gf-brand{max-width:100%}.gf-links{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem 1rem;width:100%;align-items:start}.gf-col{min-width:0;width:100%;align-items:flex-start}.gf-bottom{flex-direction:column;align-items:center;gap:.75rem;padding:.75rem 1rem calc(var(--mobile-bottom-nav-height,60px) + 1.25rem)}.gf-legal{justify-content:center}.gf-lang{margin:0}.gf-social{justify-content:center;display:flex!important;order:10;width:100%;}.gf-copy{order:1}.gf-legal{order:2}.gf-lang{order:3}}</style>
4026<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">window.gtranslateSettings={"default_language":"en","detect_browser_language":false,"languages":["en","hu","de","es","pt","fr","ru"],"wrapper_selector":".gtranslate_wrapper"}</script>
vendor: 1 bytes, line 4026
4026
4027<script src="https://cdn.gtranslate.net/widgets/latest/dropdown.js" defer nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"></script>
4027
4028    
4028<script type="text/javascript" nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
4029        window.addEventListener('load', function() {
4030            updateLayout();
4031        });
4032    </script>
4032
4033    
4034<div id="tutorial-overlay" class="hidden">
4035    <div class="tutorial-card">
4036        <div class="tutorial-header">
4037            <div class="tutorial-logo">
4038                <img src="/assets/images/logos/sharklogo.webp" alt="Shark Earnings" width="32" height="32" loading="lazy">
4039                <span>Shark Earnings</span>
4040            </div>
4041            <div class="tutorial-actions">
4042                <div class="lang-selector">
4043                    <button class="lang-btn"><img src="https://flagcdn.com/w40/us.png" id="curr-lang-flag" alt="EN" width="32" height="17" loading="lazy"></button>
4044                    <div class="lang-dropdown">
4045                        <div class="lang-opt" data-l="en" data-f="us"><img src="https://flagcdn.com/w40/us.png" alt="EN" width="20" height="11" loading="lazy"> English</div>
4046                        <div class="lang-opt" data-l="hu" data-f="hu"><img src="https://flagcdn.com/w40/hu.png" alt="HU" width="20" height="11" loading="lazy"> Magyar</div>
4047                        <div class="lang-opt" data-l="de" data-f="de"><img src="https://flagcdn.com/w40/de.png" alt="DE" width="20" height="11" loading="lazy"> Deutsch</div>
4048                        <div class="lang-opt" data-l="es" data-f="es"><img src="https://flagcdn.com/w40/es.png" alt="ES" width="20" height="11" loading="lazy"> Español</div>
4049                        <div class="lang-opt" data-l="pt" data-f="pt"><img src="https://flagcdn.com/w40/pt.png" alt="PT" width="20" height="11" loading="lazy"> Português</div>
4050                        <div class="lang-opt" data-l="fr" data-f="fr"><img src="https://flagcdn.com/w40/fr.png" alt="FR" width="20" height="11" loading="lazy"> Français</div>
4051                        <div class="lang-opt" data-l="ru" data-f="ru"><img src="https://flagcdn.com/w40/ru.png" alt="RU" width="20" height="11" loading="lazy"> Русский</div>
4052                    </div>
4053                </div>
4054                <button id="tutorial-close-btn" class="tutorial-close" title="Close"><i class="fas fa-times"></i></button>
4055            </div>
4056        </div>
4057
4058        <div class="tutorial-slider-wrap">
4059            <div class="tutorial-slider" id="tutorial-slider">
4060                <div class="tutorial-slide">
4061                    <h2 class="slide-title">Welcome to <span class="text-highlight">Shark Earnings!</span></h2>
4062                    <p class="slide-subtitle">Complete offers and surveys to earn real money. Cash out via PayPal, Crypto, Gift Cards, and more!</p>
4063                    <div class="earn-methods-grid">
4064                        <div class="earn-method">
4065                            <div class="em-icon"><i class="fas fa-gamepad"></i></div>
4066                            <div class="em-text"><strong>Games</strong><span>Play & earn</span></div>
4067                        </div>
4068                        <div class="earn-method">
4069                            <div class="em-icon"><i class="fas fa-mobile-alt"></i></div>
4070                            <div class="em-text"><strong>Apps</strong><span>Try new apps</span></div>
4071                        </div>
4072                        <div class="earn-method">
4073                            <div class="em-icon"><i class="fas fa-clipboard-list"></i></div>
4074                            <div class="em-text"><strong>Surveys</strong><span>Quick & easy</span></div>
4075                        </div>
4076                        <div class="earn-method">
4077                            <div class="em-icon"><i class="fas fa-play-circle"></i></div>
4078                            <div class="em-text"><strong>Videos</strong><span>Watch & earn</span></div>
4079                        </div>
4080                    </div>
4081                    <div class="slide-footer-info">
4082                        <p class="time-stat"><i class="fas fa-bolt"></i> Most people finish their first offer in under 10 minutes!</p>
4083                    </div>
4084                </div>
4085
4086                <div class="tutorial-slide">
4087                    <h2 class="slide-title">Join the <span class="text-highlight">Community</span></h2>
4088                    <p class="slide-subtitle">Chat with other earners, get tips, and stay in the loop!</p>
4089                    <div class="community-list">
4090                        <div class="comm-item">
4091                            <div class="comm-icon"><i class="fas fa-comments"></i></div>
4092                            <div class="comm-text"><strong>Get help fast</strong><span>Ask questions and get answers from the community</span></div>
4093                        </div>
4094                        <div class="comm-item">
4095                            <div class="comm-icon"><i class="fas fa-bullhorn"></i></div>
4096                            <div class="comm-text"><strong>Stay updated</strong><span>New offers, events, and platform updates</span></div>
4097                        </div>
4098                        <div class="comm-item">
4099                            <div class="comm-icon"><i class="fas fa-trophy"></i></div>
4100                            <div class="comm-text"><strong>See what others earn</strong><span>Real earnings shared by real members</span></div>
4101                        </div>
4102                    </div>
4103                    <a href="https://discord.gg/shark-earnings-earn-cash-rewards-897403167820636190" target="_blank" rel="noopener noreferrer" class="discord-btn">
4104                        <i class="fab fa-discord"></i> Join our Discord Server
4105                    </a>
4106                </div>
4107
4108                <div class="tutorial-slide">
4109                    <h2 class="slide-title">Maximize with <span class="text-highlight">
4109Rewards</span></h2>
4110                    <p class="slide-subtitle">Claim free bonuses every single day to boost your balance!</p>
4111                    <div class="rewards-list">
4112                        <div class="rew-item">
4113                            <div class="rew-icon-fa"><img src="/assets/images/rewards/menu-wheel.svg" alt="" style="width:62%;height:auto;object-fit:contain"></div>
4114                            <span><strong>The Shark's Wheel:</strong> One free spin - win up to 10,000 lottery tickets for the $100 Weekly Lottery!</span>
4115                        </div>
4116                        <div class="rew-item">
4117                            <div class="rew-icon-fa"><img src="/assets/images/rewards/lottery_ticket.svg" alt="" style="width:96%;height:auto;object-fit:contain"></div>
4118                            <span><strong>Weekly Lottery:</strong> Collect free tickets and win from a 100,000 coin pool every Sunday.</span>
4119                        </div>
4120                        <div class="rew-item">
4121                            <div class="rew-icon-fa"><img src="/assets/images/rewards/menu-code.svg" alt="" style="width:70%;height:auto;object-fit:contain"></div>
4122                            <span><strong>Promo Codes:</strong> Find hidden codes on our socials.</span>
4123                        </div>
4124                        <div class="rew-item">
4125                            <div class="rew-icon-fa"><img src="/assets/images/rewards/menu-mission.svg" alt="" style="width:62%;height:auto;object-fit:contain"></div>
4126                            <span><strong>Missions:</strong> Complete tiered tasks to unlock Milestone Wheels and win up to $5,000!</span>
4127                        </div>
4128                    </div>
4129                                        <a href="https://sharkearnings.com/rewards" class="spin-wheel-btn">
4130                        <i class="fas fa-dharmachakra"></i> Spin the Wheel Now
4131                    </a>
4132                                    </div>
4133            </div>
4134        </div>
4135
4136        <div class="tutorial-footer">
4137            <button id="tutorial-skip-btn" class="tut-nav-btn skip">Skip</button>
4138            <div class="tutorial-dots" id="tutorial-dots">
4139                <span class="dot active"></span><span class="dot"></span><span class="dot"></span>
4140            </div>
4141            <button id="tutorial-next-btn" class="tut-nav-btn next">Next <i class="fas fa-arrow-right"></i></button>
4142        </div>
4143    </div>
4144</div>
4145
4146<style nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
4147#tutorial-overlay.hidden{display:none!important}#tutorial-overlay{position:fixed;inset:0;background:rgba(4,20,45,.85);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:200000;display:flex;justify-content:center;align-items:center;opacity:0;visibility:hidden;transition:opacity .4s ease,visibility .4s ease;padding:15px}#tutorial-overlay.visible{opacity:1;visibility:visible}.tutorial-card{background:linear-gradient(160deg,rgba(3,12,26,.98) 0,#00070f 100%);border:1px solid rgba(0,229,255,.2);border-radius:24px;width:100%;max-width:650px;box-shadow:0 30px 60px -12px rgba(0,0,0,.8),0 0 30px rgba(0,229,255,.1);transform:translateY(20px) scale(.95);transition:transform .4s cubic-bezier(.34,1.56,.64,1);display:flex;flex-direction:column;overflow:hidden;max-height:95vh}#tutorial-overlay.visible .tutorial-card{transform:translateY(0) scale(1)}.tutorial-header{display:flex;justify-content:space-between;align-items:center;padding:20px 25px;border-bottom:1px solid rgba(255,255,255,.05)}.tutorial-logo{display:flex;align-items:center;gap:6px;font-weight:800;font-size:1.15rem;color:#fff}.tutorial-logo img{width:32px;height:auto;filter:drop-shadow(0 0 8px rgba(0,229,255,.4))}.tutorial-actions{display:flex;align-items:center;gap:15px}.lang-selector{position:relative;z-index:50}.lang-btn{background:0 0;border:none;cursor:pointer;padding:0;display:flex;align-items:center}.lang-btn img{width:32px;border-radius:4px;box-shadow:0 2px 5px rgba(0,0,0,.3);transition:.2s}.lang-btn:hover img{transform:scale(1.1)}.lang-dropdown{position:absolute;top:120%;right:0;background:#051e3c;border:1px solid rgba(0,229,255,.2);border-radius:8px;padding:5px;display:none;min-width:140px;box-shadow:0 5px 15px rgba(0,0,0,.5)}.lang-selector:hover .lang-dropdown{display:block}.lang-opt{padding:8px 12px;color:#b2ebf2;cursor:pointer;display:flex;align-items:center;gap:10px;font-size:.9rem;border-radius:4px}.lang-opt:hover{background:rgba(0,229,255,.1);color:#fff}.lang-opt img{width:20px}.tutorial-close{background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.1);color:#94a3b8;border-radius:50%;width:32px;height:32px;display:flex;justify-content:center;align-items:center;cursor:pointer;transition:.2s;font-size:1.1rem}
4147.tutorial-close:hover{background:rgba(239,68,68,.15);color:#ef4444;border-color:rgba(239,68,68,.3);transform:rotate(90deg)}.tutorial-slider-wrap{width:100%;flex:1;overflow:hidden;position:relative}.tutorial-slider{display:flex;width:100%;height:100%;transition:transform .5s cubic-bezier(.25,1,.5,1)}.tutorial-slide{min-width:100%;padding:30px 40px;box-sizing:border-box;display:flex;flex-direction:column;align-items:center;text-align:center;overflow-y:auto}.slide-title{font-size:1.8rem;font-weight:800;color:#fff;margin:0 0 10px;line-height:1.2}.slide-subtitle{font-size:1rem;color:#94a3b8;margin:0 0 25px;line-height:1.4}.text-highlight{color:#00e5ff;text-shadow:0 0 10px rgba(0,229,255,.3)}.earn-methods-grid{display:grid;grid-template-columns:1fr 1fr;gap:15px;width:100%;margin-bottom:25px}.earn-method{background:rgba(0,229,255,.04);border:1px solid rgba(0,229,255,.15);border-radius:16px;padding:15px;display:flex;align-items:center;gap:15px;text-align:left;transition:transform .2s,background .2s;text-decoration:none}.earn-method:hover{background:rgba(0,229,255,.08);transform:translateY(-3px)}.em-new{display:inline-block;background:linear-gradient(135deg,#ffd84d,#f0b400);color:#1a1200!important;font-size:.58rem;font-weight:900;padding:.12rem .45rem;border-radius:6px;margin-left:.4rem;vertical-align:middle;letter-spacing:.05em;box-shadow:0 1px 4px rgba(240,180,0,.35);line-height:1.4}.em-icon{width:45px;height:45px;border-radius:12px;background:linear-gradient(135deg,rgba(0,229,255,.2),rgba(0,184,212,.1));color:#00e5ff;display:flex;justify-content:center;align-items:center;font-size:1.4rem}.em-text{display:flex;flex-direction:column}.em-text strong{color:#e2e8f0;font-size:1.05rem}.em-text span{color:#94a3b8;font-size:.85rem}.slide-footer-info{display:flex;flex-direction:column;align-items:center;gap:10px}.time-stat{margin:0;color:#fbbf24;background:rgba(251,191,36,.1);padding:8px 16px;border-radius:20px;font-size:.9rem;font-weight:600;border:1px solid rgba(251,191,36,.2)}.community-list{display:flex;flex-direction:column;gap:15px;width:100%;text-align:left;margin-bottom:30px}.comm-item{display:flex;align-items:center;gap:15px;padding:10px}.comm-icon{width:45px;height:45px;border-radius:50%;background:rgba(88,101,242,.15);color:#5865F2;display:flex;justify-content:center;align-items:center;font-size:1.3rem;flex-shrink:0}.comm-text{display:flex;flex-direction:column}.comm-text strong{color:#e2e8f0;font-size:1.05rem;margin-bottom:2px}.comm-text span{color:#94a3b8;font-size:.9rem;line-height:1.3}.discord-btn{background:#5865F2;color:#fff;text-decoration:none;padding:14px 28px;border-radius:12px;font-weight:700;font-size:1.05rem;display:inline-flex;align-items:center;gap:10px;transition:.3s;box-shadow:0 6px 20px rgba(88,101,242,.4)}.discord-btn:hover{background:#4752C4;transform:translateY(-3px);box-shadow:0 10px 25px rgba(88,101,242,.5)}.rewards-list{display:flex;flex-direction:column;gap:15px;width:100%;text-align:left;background:rgba(255,255,255,.02);border:1px solid rgba(255,255,255,.05);padding:20px;border-radius:16px;margin-bottom:25px}.rew-item{display:flex;align-items:center;gap:15px}.rew-icon-fa{width:34px;height:30px;display:flex;align-items:center;justify-content:center;font-size:1.4rem;flex-shrink:0}.rew-item span{color:#cbd5e1;font-size:.95rem;line-height:1.4}.rew-item strong{color:#fff}.spin-wheel-btn{background:linear-gradient(135deg,#00e5ff,#00b8d4);color:#00070f;text-decoration:none;padding:14px 28px;border-radius:12px;font-weight:800;font-size:1.05rem;display:inline-flex;align-items:center;gap:10px;transition:.3s;box-shadow:0 6px 20px rgba(0,229,255,.3)}.spin-wheel-btn:hover{transform:translateY(-3px);box-shadow:0 10px 25px rgba(0,229,255,.5)}.tutorial-footer{display:flex;justify-content:space-between;align-items:center;padding:20px 30px;background:rgba(0,0,0,.2);border-top:1px solid rgba(255,255,255,.05)}.tut-nav-btn{background:none;border:none;cursor:pointer;font-size:1rem;font-weight:600;transition:.2s;padding:8px 15px;border-radius:8px}.tut-nav-btn.skip{color:#64748b}.tut-nav-btn.skip:hover{color:#cbd5e1;background:rgba(255,255,255,.05)}.tut-nav-btn.next{color:#00e5ff;display:flex;align-items:center;gap:6px}.tut-nav-btn.next:hover{background:rgba(0,229,255,.1);transform:translateX(3px)}.tutorial-dots{display:flex;gap:8px}.tutorial-dots .dot{width:8px;height:8px;border-radius:50%;background:#334155;transition:.3s;
4147cursor:pointer}.tutorial-dots .dot.active{width:24px;background:#00e5ff;box-shadow:0 0 8px rgba(0,229,255,.5)}@media(max-width:600px){#tutorial-overlay{padding:0}.tutorial-card{height:100vh;max-height:100vh;border-radius:0;border:none}.tutorial-slide{padding:20px 15px;justify-content:center}.earn-methods-grid{grid-template-columns:1fr 1fr;gap:10px;margin-bottom:15px}.earn-method{flex-direction:column;text-align:center;padding:12px 8px;gap:8px}.em-icon{width:40px;height:40px;font-size:1.2rem}.em-text strong{font-size:.9rem}.em-text span{font-size:.75rem}.slide-title{font-size:1.4rem;margin-bottom:8px}.slide-subtitle{font-size:.85rem;margin-bottom:15px}.discord-btn,.spin-wheel-btn{width:100%;justify-content:center}.tutorial-footer{padding:15px 20px}}body.tutorial-open{overflow:hidden!important}
4148</style>
4149
4150<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
4151(function(){
4152    const overlay=document.getElementById('tutorial-overlay'),slider=document.getElementById('tutorial-slider'),dots=document.querySelectorAll('#tutorial-dots .dot'),nextBtn=document.getElementById('tutorial-next-btn'),skipBtn=document.getElementById('tutorial-skip-btn'),closeBtn=document.getElementById('tutorial-close-btn');
4153    let currentSlide=0;const totalSlides=3;
4154    function markTutorialCompleted(){
4155        localStorage.setItem("tutorialCompleted","true");
4156        const fd=new FormData();fd.append("action","complete_tutorial");
4157        if(window.csrfToken)fd.append("csrf_token",window.csrfToken);
4158        return fetch("/earn",{method:"POST",body:fd,credentials:"same-origin"})
4159            .then(function(r){return r.ok;})
4160            .catch(function(e){console.error(e);return false;});
4161    }
4162    function closeTutorial(){
4163        overlay.classList.remove('visible');document.body.classList.remove("tutorial-open");
4164        setTimeout(()=>overlay.classList.add('hidden'),400);markTutorialCompleted();
4165    }
4166    function openTutorial(){
4167        overlay.classList.remove('hidden');document.body.classList.add("tutorial-open");
4168        void overlay.offsetWidth;overlay.classList.add('visible');updateSlider();
4169    }
4170    function updateSlider(){
4171        slider.style.transform=`translateX(-${currentSlide*100}%)`;
4172        dots.forEach((dot,index)=>dot.classList.toggle('active',index===currentSlide));
4173        nextBtn.style.visibility=(currentSlide===totalSlides-1)?'hidden':'visible';
4174    }
4175    nextBtn.addEventListener('click',()=>{if(currentSlide<totalSlides-1){currentSlide++;updateSlider();}});
4176    skipBtn.addEventListener('click',closeTutorial);
4177    closeBtn.addEventListener('click',closeTutorial);
4178    dots.forEach((dot,index)=>{dot.addEventListener('click',()=>{currentSlide=index;updateSlider();});});
4179    document.querySelectorAll('#tutorial').forEach(btn=>{btn.addEventListener('click',e=>{e.preventDefault();currentSlide=0;openTutorial();});});    document.querySelectorAll('.spin-wheel-btn').forEach(btn=>{btn.addEventListener('click',function(e){e.preventDefault();const href=this.href;markTutorialCompleted().then(()=>{window.location.href=href;});});});
4180    document.querySelectorAll(".lang-opt").forEach(e=>{e.addEventListener("click",function(){
4181        const lang=this.getAttribute("data-l"),flag=document.getElementById("curr-lang-flag");
4182        if(flag)flag.src="https://flagcdn.com/w40/"+("en"===lang?"us":lang)+".png";
4183        if(typeof doGTranslate==="function")doGTranslate("en|"+lang);
4184        else{const sel=document.querySelector(".gt_selector,.gtranslate_wrapper_earn select");if(sel){sel.value="en"===lang?"":lang;sel.dispatchEvent(new Event("change"));}}
4185    });});
4186    function init(){
4187        const isNewUser=false,hasStart=new URLSearchParams(window.location.search).has("start_tutorial");
4188        const alreadySeen=localStorage.getItem("tutorialCompleted")==="true";
4189        if(isNewUser&&!alreadySeen){
4190            setTimeout(openTutorial,500);
4191        } else if(isNewUser&&alreadySeen){
4192            markTutorialCompleted();
4193        }
4194        if(hasStart){
4195            localStorage.removeItem("tutorialCompleted");
4196            setTimeout(openTutorial,500);
4197            window.history.replaceState({},document.title,window.location.pathname);
4198        }
4199    }
4200    if("loading"===document.readyState)document.addEventListener("DOMContentLoaded",init);else init();
4201})();
4202</script>
4202        
4203
4204
4205    
4205<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
4206        const userId = '';
4207        
4208        if (userId) {
4209                        const theoremReachScript = document.createElement('script');
4210            theoremReachScript.src = "https://s3.amazonaws.com/cdn.theoremreach/v3/theorem_reach.min.js";
4211            theoremReachScript.onload = () => {
4212                if (typeof TheoremReach !== 'undefined') {
4213                    window.TR = new TheoremReach({
4214                        apiKey: "guest",
4215                        userId: "b5dcdeab-df24-45d5-a5ae-4319e700fa16",
4216                        onSurveyNotAvailable: function () {
4217                            alert('Sorry, no surveys are available for you at this moment. Please check back later!');
4218                        }
4219                    });
4220                }
4221            };
4222            document.body.appendChild(theoremReachScript);
4223                    }
4224    </script>
4224
4225
4226    
4226<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
4227    (function(){
4228        window.__sharkBalance = 0.000;
4229        window.__animateBalance = function(from, to){
4230            const pills = document.querySelectorAll('.balance-pill');
4231            if(pills.length === 0){ window.__sharkBalance = to; return; }
4232            const isIncrease = to > from;
4233            const start = performance.now();
4234            const DUR = 2000;
4235            pills.forEach(pill => pill.classList.add('animating', isIncrease ? 'increase' : 'decrease'));
4236            function update(now){
4237                const progress = Math.min((now - start) / DUR, 1);
4238                const eased = 1 - Math.pow(1 - progress, 3);
4239                const current = from + (to - from) * eased;
4240                pills.forEach(pill => {
4241                    const span = pill.querySelector('span');
4242                    if(span){
4243                        span.textContent = current < 0 ? '-$' + formatAmountExact(Math.abs(current)) : '$' + formatAmountExact(current);
4244                        span.classList.toggle('balance-negative', current < 0);
4245                    }
4246                });
4247                if(progress < 1){ requestAnimationFrame(update); }
4248                else { window.__sharkBalance = to; setTimeout(() => { pills.forEach(pill => pill.classList.remove('animating', 'increase', 'decrease')); }, 1200); }
4249            }
4250            requestAnimationFrame(update);
4251        };
4252    })();
4253    </script>
4253
4254        
4254<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
4255    window.addEventListener('load', function(){
4256        if (window.hideSharkLoader) {
4257            window.hideSharkLoader();
4258        }
4259        
4260            });
4261    </script>
4261
4262    
4263    <div id="verification-modal" class="verification-modal">
4264        <div class="verification-modal-content">
4265            <div class="verification-header">
4266                <div class="verification-icon">
4267                    <svg width="48" height="48" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
4268                        <path d="M12 2L3 7V11C3 16.55 6.84 21.74 12 23C17.16 21.74 21 16.55 21 11V7L12 2Z" fill="url(#shield-gradient)" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
4269                        <path d="M9 12L11 14L15 10" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
4270                        <defs>
4271                            <linearGradient id="shield-gradient" x1="3" y1="2" x2="21" y2="23" gradientUnits="userSpaceOnUse">
4272                                <stop offset="0%" stop-color="#10B981"/>
4273                                <stop offset="100%" stop-color="#059669"/>
4274                            </linearGradient>
4275                        </defs>
4276                    </svg>
4277                </div>
4278                <h2>Account Verification Required</h2>
4279                <p class="verification-subtitle">Secure your account with quick face verification</p>
4280                <button class="verification-close" onclick="closeVerificationModal()">&times;</button>
4281            </div>
4282            <div class="verification-body">
4283                <div class="verification-info">
4284                    <div class="info-item">
4285                        <span class="info-icon"><i class="fas fa-lock"></i></span>
4286                        <span class="info-text">Secure face scan technology</span>
4287                    </div>
4288                    <div class="info-item">
4289                        <span class="info-icon"><i class="fas fa-bolt"></i></span>
4290                        <span class="info-text">Complete in under 60 seconds</span>
4291                    </div>
4292                    <div class="info-item">
4293                        <span class="info-icon"><i class="fas fa-globe"></i></span>
4294                        <span class="info-text">No ID required</span>
4295                    </div>
4296                </div>
4297                <div class="verification-content">
4298                    <div class="verification-steps">
4299                        <div class="step active" id="step-1">
4300                            <div class="step-icon analyzing">
4301                                <div class="pulse-ring"></div>
4302                                <i class="fas fa-shield-alt"></i>
4303                            </div>
4304                            <h3>Security Analysis</h3>
4305                            <p>Analyzing your session with advanced fraud detection</p>
4306                            <div class="loading-spinner">
4307                                <div class="spinner"></div>
4308                            </div>
4309                        </div>
4310                        
4311                        <div class="step" id="step-2" style="display: none;">
4312                            <div class="step-icon success">
4313                                <i class="fas fa-check-circle"></i>
4314                            </div>
4315                            <h3>Verification Complete</h3>
4316                            <p>Your account is now verified and secure!</p>
4317                            <div class="success-confetti">🎉</div>
4318                        </div>
4319                        
4320                        <div class="step" id="step-3" style="display: none;">
4321                            <div class="step-icon error">
4322                                <i class="fas fa-exclamation-triangle"></i>
4323                            </div>
4324                            <h3>Verification Failed</h3>
4325                            <p>Unable to verify your identity. Please contact our support team for assistance.</p>
4326                        </div>
4327                    </div>
4328                    
4329                    <div class="verification-actions">
4330                        <button id="verify-btn" class="verification-btn primary" onclick="startVerification()">
4331                            <span class="btn-text">Start Verification</span>
4332                            <span class="btn-loader" style="display: none;">
4333                                <i class="fas fa-spinner fa-spin"></i> Processing...
4334                            </span>
4335                        </button>
4336                        <p class="verification-disclaimer">Your privacy is protected. We never share your verification data.</p>
4337                    </div>
4338                </div>
4339            </div>
4340        </div>
4341    </div>
4342
4343
4344
4345            
4346    
4346<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
4347    let verificationInProgress = false;
4348
4349    function showVerificationModal() {
4350        const modal = document.getElementById('verification-modal');
4351        if (modal) {
4352            modal.style.display = 'flex';
4353            document.body.style.overflow = 'hidden';
4354            
4355            resetVerificationSteps();
4356        }
4357    }
4358
4359    function closeVerificationModal() {
4360        const modal = document.getElementById('verification-modal');
4361        if (modal) {
4362            modal.style.display = 'none';
4363            document.body.style.overflow = 'auto';
4364            
4365            verificationInProgress = false;
4366            resetVerificationSteps();
4367        }
4368    }
4369
4370    function resetVerificationSteps() {
4371        const step1 = document.getElementById('step-1');
4372        const step2 = document.getElementById('step-2');
4373        const step3 = document.getElementById('step-3');
4374        if (step1) step1.style.display = 'block';
4375        if (step2) step2.style.display = 'none';
4376        if (step3) step3.style.display = 'none';
4377
4378        const btn = document.getElementById('verify-btn');
4379        if (!btn) return;
4380        btn.disabled = false;
4381        const btnText = btn.querySelector('.btn-text');
4382        const btnLoader = btn.querySelector('.btn-loader');
4383        if (btnText) btnText.style.display = 'inline';
4384        if (btnLoader) btnLoader.style.display = 'none';
4385    }
4386
4387    function showStep(stepNumber) {
4388        ['step-1', 'step-2', 'step-3'].forEach(id => {
4389            const el = document.getElementById(id);
4390            if (el) el.style.display = 'none';
4391        });
4392
4393        const targetStep = document.getElementById('step-' + stepNumber);
4394        if (!targetStep) return;
4395        targetStep.style.display = 'block';
4396        targetStep.style.opacity = '0';
4397        targetStep.style.transform = 'translateY(20px)';
4398
4399        setTimeout(() => {
4400            targetStep.style.transition = 'all 0.4s ease-out';
4401            targetStep.style.opacity = '1';
4402            targetStep.style.transform = 'translateY(0)';
4403        }, 50);
4404    }
4405
4406    async function startVerification() {
4407        if (verificationInProgress) return;
4408
4409        verificationInProgress = true;
4410        const btn = document.getElementById('verify-btn');
4411        const btnText = btn?.querySelector('.btn-text');
4412        const btnLoader = btn?.querySelector('.btn-loader');
4413
4414        if (btn) btn.disabled = true;
4415        if (btnText) btnText.style.display = 'none';
4416        if (btnLoader) btnLoader.style.display = 'inline';
4417        
4418        try {
4419            showStep(1);
4420            await new Promise(resolve => setTimeout(resolve, 1000));
4421            
4422            if (!window.Verisoul) {
4423                throw new Error('Verisoul SDK not loaded');
4424            }
4425            
4426            const session = await window.Verisoul.session();
4427            const sessionId = session.session_id;
4428            
4429            const response = await fetch('/api/secure_handler.php', {
4430                method: 'POST',
4431                headers: {
4432                    'Content-Type': 'application/x-www-form-urlencoded',
4433                },
4434                body: new URLSearchParams({
4435                    action: 'verisoul_verification',
4436                    session_id: sessionId,
4437                    csrf_token: "998e8f34e9355502848cd48edfcac4aca9c6e20a319f93593cdd2f8f0ad64f93"                })
4438            });
4439            
4440            if (!response.ok) {
4441                throw new Error('Network response was not ok');
4442            }
4443            
4444            const result = await response.json();
4445            
4446            if (result.success && result.facematch_session_id) {
4447                const redirectUrl = encodeURIComponent(window.location.origin + '/verification-complete');
4448                const facematchUrl = `https://app.prod.verisoul.ai/?session_id=${result.facematch_session_id}&redirect_url=${redirectUrl}`;
4449                
4450                window.location.href = facematchUrl;
4451            } else {
4452                throw new Error(result.error || 'Failed to initialize Face Match');
4453            }
4454            
4455        } catch (error) {
4456            console.error('Verification error:', error);
4457            showStep(3);
4458        } finally {
4459            verificationInProgress = false;
4460            if (btn) btn.disabled = false;
4461            if (btnText) btnText.style.display = 'inline';
4462            if (btnLoader) btnLoader.style.display = 'none';
4463        }
4464    }
4465
4466    document.addEventListener('DOMContentLoaded', function() {
4467            });
4468
4469    document.addEventListener('keydown', function(e) {
4470        if (e.key === 'Escape') {
4471            closeVerificationModal();
4472        }
4473    });
4474
4475    document.getElementById('verification-modal')?.addEventListener('click', function(e) {
4476        if (e.target === this) {
4477            closeVerificationModal();
4478        }
4479    });
4480
4481    window.openVerificationModal = showVerificationModal;
4482    window.closeVerificationModal = closeVerificationModal;
4483
4484    const sidebarMenu = document.getElementById('sidebarMenu');
4485    const floatingMenuBtn = document.getElementById('floatingMenuBtn');
4486
4487    const _layoutContainer = document.querySelector('.container');
4488    const _layoutHeader = document.querySelector('.main-header');
4489    const _layoutTicker = document.getElementById('live-earnings-ticker');
4490    const _layoutBanner = document.querySelector('.maintenance-banner');
4491    const _layoutFooter = document.querySelector('.shark-footer, .gf-footer');
4492    if (_layoutFooter) _layoutFooter.style.transition = 'width .3s, margin-left .3s';
4493
4494    function updateLayout() {
4495        // A viewport-szelesseget EGYSZER olvassuk ki, a stilusirasok ELOTT.
4496        // Korabban ket kulon window.innerWidth olvasas volt, kozottuk irasokkal:
4497        // ilyenkor a bongeszo kenytelen szinkron ujraszamolni az elrendezest,
4498        // hogy friss erteket adjon vissza. A PageSpeed-jelentes (2026-08-31) ezt
4499        // 97 + 129 ms kenyszeritett ujraszamitaskent nevesitette ezen a ket soron.
4500        const vw = window.innerWidth;
4501        const isCollapsed = document.body.classList.contains('sidebar-collapsed');
4502        const sidebarWidth = isCollapsed ? 70 : 240;
4503
4504        if (vw >= 1200) {
4505            [_layoutHeader, _layoutTicker, _layoutBanner, _layoutFooter].forEach(function(el) {
4506                if (!el) return;
4507                el.style.removeProperty('width');
4508                el.style.removeProperty('left');
4509                el.style.removeProperty('margin-left');
4510            });
4511            if (_layoutContainer) {
4512                _layoutContainer.style.marginLeft = sidebarWidth + 'px';
4513                _layoutContainer.style.width = `calc(100% - ${sidebarWidth}px)`;
4514            }
4515            return;
4516        }
4517
4518        if (vw > 768) {
4519            if (_layoutHeader) {
4520                _layoutHeader.style.marginLeft = '0';
4521                _layoutHeader.style.setProperty('width', '100%', 'important');
4522                _layoutHeader.style.setProperty('left', '0', 'important');
4523            }
4524            if (_layoutContainer) {
4525                _layoutContainer.style.marginLeft = sidebarWidth + 'px';
4526                _layoutContainer.style.width = `calc(100% - ${sidebarWidth}px)`;
4527            }
4528            if (_layoutTicker) {
4529                _layoutTicker.style.left = sidebarWidth + 'px';
4530                _layoutTicker.style.width = `calc(100% - ${sidebarWidth}px)`;
4531            }
4532            if (_layoutBanner) {
4533                _layoutBanner.style.left = sidebarWidth + 'px';
4534                _layoutBanner.style.width = `calc(100% - ${sidebarWidth}px)`;
4535            }
4536            if (_layoutFooter) {
4537                _layoutFooter.style.marginLeft = sidebarWidth + 'px';
4538                _layoutFooter.style.width = `calc(100% - ${sidebarWidth}px)`;
4539            }
4540        } else {
4541            if (_layoutHeader) { _layoutHeader.style.marginLeft = '0'; _layoutHeader.style.setProperty('width', '100%', 'important'); _layoutHeader.style.setProperty('left', '0', 'important'); }
4542            if (_layoutContainer) { _layoutContainer.style.marginLeft = '0'; _layoutContainer.style.width = '100%'; }
4543            if (_layoutTicker) { _layoutTicker.style.left = '0'; _layoutTicker.style.width = '100%'; }
4544            if (_layoutBanner) { _layoutBanner.style.left = '0'; _layoutBanner.style.width = '100%'; }
4545            if (_layoutFooter) { _layoutFooter.style.marginLeft = '0'; _layoutFooter.style.width = '100%'; }
4546        }
4547    }
4548
4549    function toggleSidebarCollapse() {
4550        document.body.classList.toggle('sidebar-collapsed');
4551        // A classList.toggle ervenyteleniti a stilusokat; ha rogton utana olvasnank
4552        // a viewport-szelesseget, a bongeszo szinkron ujraszamolna az elrendezest.
4553        // Kovetkezo kepkockara halasztva ez a kenyszeritett ujraszamitas elmarad,
4554        // es a felhasznalo ugyanugy azonnalinak latja (egy frame = ~16 ms).
4555        requestAnimationFrame(updateLayout);
4556
4557        (function(){
4558            var open = !document.body.classList.contains('sidebar-collapsed');
4559            var cb = document.getElementById('sidebarCollapseBtn');
4560            if (cb) cb.setAttribute('aria-expanded', open ? 'true' : 'false');
4561            if (floatingMenuBtn) floatingMenuBtn.setAttribute('aria-expanded', open ? 'true' : 'false');
4562        })();
4563
4564        if (floatingMenuBtn) {
4565            const icon = floatingMenuBtn.querySelector('i');
4566            if (icon) {
4567                if (document.body.classList.contains('sidebar-collapsed')) {
4568                    icon.classList.remove('fa-times');
4569                    icon.classList.add('fa-bars');
4570                    localStorage.setItem('sidebarState', 'collapsed');
4571                } else {
4572                    icon.classList.remove('fa-bars');
4573                    icon.classList.add('fa-times');
4574                    localStorage.setItem('sidebarState', 'open');
4575                }
4576            }
4577        }
4578        
4579        const sidebarCloseBtn = document.getElementById('sidebarCloseBtn');
4580        if (sidebarCloseBtn && window.innerWidth > 768) {
4581            if (document.body.classList.contains('sidebar-collapsed')) {
4582                sidebarCloseBtn.style.display = 'none';
4583            } else {
4584                sidebarCloseBtn.style.display = 'flex';
4585            }
4586        }
4587    }
4588
4589    floatingMenuBtn?.addEventListener('click', toggleSidebarCollapse);
4590    document.getElementById('sidebarCollapseBtn')?.addEventListener('click', toggleSidebarCollapse);
4591
4592    const savedSidebarState = localStorage.getItem('sidebarState');
4593    const isInitiallyCollapsed = savedSidebarState === 'collapsed' || (savedSidebarState === null && document.body.classList.contains('sidebar-collapsed'));
4594    if (isInitiallyCollapsed) {
4595        document.body.classList.add('sidebar-collapsed');
4596        if (floatingMenuBtn) {
4597            const icon = floatingMenuBtn.querySelector('i');
4598            if (icon) {
4599                icon.classList.remove('fa-times');
4600                icon.classList.add('fa-bars');
4601            }
4602        }
4603    } else {
4604        document.body.classList.remove('sidebar-collapsed');
4605        if (floatingMenuBtn) {
4606            const icon = floatingMenuBtn.querySelector('i');
4607            if (icon) {
4608                icon.classList.remove('fa-bars');
4609                icon.classList.add('fa-times');
4610            }
4611        }
4612    }
4613
4614    updateLayout();
4615
4616    setTimeout(updateLayout, 0);
4617
4618    const throttledUpdateLayout = throttle(updateLayout, 150);
4619    window.addEventListener('resize', throttledUpdateLayout);
4620
4621    document.addEventListener('visibilitychange', function() {
4622        if (!document.hidden) {
4623            updateLayout();
4624            if (typeof loadNotifications === 'function') loadNotifications();
4625            if (typeof fetchAndRenderEarnings === 'function') fetchAndRenderEarnings();
4626        }
4627    });
4628
4629    window.addEventListener('pageshow', function(e) {
4630        if (e.persisted) {
4631            const savedState = localStorage.getItem('sidebarState');
4632            if (savedState === 'collapsed') {
4633                document.body.classList.add('sidebar-collapsed');
4634                const icon = floatingMenuBtn?.querySelector('i');
4635                if (icon) { icon.classList.remove('fa-times'); icon.classList.add('fa-bars'); }
4636            } else {
4637                document.body.classList.remove('sidebar-collapsed');
4638                const icon = floatingMenuBtn?.querySelector('i');
4639                if (icon) { icon.classList.remove('fa-bars'); icon.classList.add('fa-times'); }
4640            }
4641            if (sidebarMenu) sidebarMenu.classList.remove('mobile-open');
4642            if (mobileSidebarOverlay) mobileSidebarOverlay.classList.remove('active');
4643            document.body.style.overflow = '';
4644            updateLayout();
4645        }
4646    });
4647
4648    const mobileMenuToggle = document.getElementById('mobileMenuToggle');
4649    const mobileSidebarOverlay = document.getElementById('mobileSidebarOverlay');
4650
4651    function openMobileSidebar() {
4652        sidebarMenu?.classList.add('mobile-open');
4653        mobileSidebarOverlay?.classList.add('active');
4654        document.body.style.overflow = 'hidden';
4655    }
4656
4657    function closeMobileSidebar() {
4658        sidebarMenu?.classList.remove('mobile-open');
4659        mobileSidebarOverlay?.classList.remove('active');
4660        document.body.style.overflow = '';
4661    }
4662
4663    mobileMenuToggle?.addEventListener('click', function() {
4664        if (sidebarMenu?.classList.contains('mobile-open')) {
4665            closeMobileSidebar();
4666        } else {
4667            openMobileSidebar();
4668        }
4669    });
4670
4671    mobileSidebarOverlay?.addEventListener('click', closeMobileSidebar);
4672
4673    const sidebarCloseBtn = document.getElementById('sidebarCloseBtn');
4674    sidebarCloseBtn?.addEventListener('click', function() {
4675        if (window.innerWidth <= 768) {
4676            closeMobileSidebar();
4677        } else {
4678            toggleSidebarCollapse();
4679        }
4680    });
4681
4682    document.addEventListener('keydown', function(e) {
4683        if (e.key === 'Escape' && sidebarMenu.classList.contains('mobile-open')) {
4684            closeMobileSidebar();
4685        }
4686    });
4687
4688    function updateServerTime() {
4689        if (document.hidden) return;
4690        const now = new Date();
4691        
4692        const timeString = now.toLocaleTimeString('hu-HU', {
4693            timeZone: 'Europe/Budapest',
4694            hour12: false,
4695            hour: '2-digit',
4696            minute: '2-digit',
4697            second: '2-digit'
4698        });
4699        
4700        const serverTimeDisplay = document.getElementById('serverTimeDisplay');
4701        if (serverTimeDisplay) {
4702            serverTimeDisplay.textContent = timeString;
4703        }
4704        
4705        const streakTimers = document.querySelectorAll('.streak-timer');
4706        if (streakTimers.length > 0) {
4707            const midnight = new Date();
4708            midnight.setHours(24, 0, 0, 0);
4709            
4710            const diff = midnight - now;
4711            
4712            if (diff > 0) {
4713                const hours = Math.floor(diff / (1000 * 60 * 60));
4714                const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
4715                const seconds = Math.floor((diff % (1000 * 60)) / 1000);
4716                
4717                const timeString = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
4718                streakTimers.forEach(timer => timer.textContent = timeString);
4719            } else {
4720                streakTimers.forEach(timer => timer.textContent = '00:00:00');
4721            }
4722        }
4723    }
4724
4725    if (document.readyState === 'loading') {
4726        document.addEventListener('DOMContentLoaded', function() {
4727            updateServerTime();
4728            setInterval(updateServerTime, 1000);
4729        });
4730    } else {
4731        updateServerTime();
4732        setInterval(updateServerTime, 1000);
4733    }
4734
4735    document.addEventListener('DOMContentLoaded', function() {
4736        const sidebarLinks = document.querySelectorAll('.sidebar-link:not([onclick])');
4737        sidebarLinks.forEach(link => {
4738            link.addEventListener('click', function(e) {
4739                const targetHref = this.getAttribute('href');
4740                if (!targetHref || targetHref === '#' || targetHref.startsWith('#')) return;
4741                const currentPath = window.location.pathname + window.location.search;
4742                const targetPath = targetHref.startsWith('/') ? targetHref : '/' + targetHref;
4743                if (currentPath === targetPath) {
4744                    closeMobileSidebar();
4745                    window.scrollTo({ top: 0, behavior: 'smooth' });
4746                    e.preventDefault();
4747                    return;
4748                }
4749                closeMobileSidebar();
4750            });
4751        });
4752    });
4753
4754    (function() {
4755        const walletBtn = document.getElementById('mobileWalletBtn');
4756        const walletPanel = document.getElementById('mobileWalletPanel');
4757        const walletChevron = document.getElementById('mobileWalletChevron');
4758        if (!walletBtn || !walletPanel) return;
4759
4760        function openWalletPanel(e) {
4761            e.preventDefault();
4762            const isOpen = walletPanel.classList.contains('active');
4763            walletPanel.classList.toggle('active', !isOpen);
4764            if (walletChevron) walletChevron.style.transform = isOpen ? '' : 'rotate(180deg)';
4765        }
4766
4767        walletBtn.addEventListener('click', openWalletPanel);
4768
4769        document.addEventListener('click', function(e) {
4770            if (!walletBtn.contains(e.target) && !walletPanel.contains(e.target)) {
4771                walletPanel.classList.remove('active');
4772                if (walletChevron) walletChevron.style.transform = '';
4773            }
4774        });
4775    })();
4776
4777    function handleLogout(event) {
4778        event.preventDefault();
4779        
4780        const isMobileApp = navigator.userAgent.includes('SharkEarningsApp');
4781        
4782        if (isMobileApp) {
4783            const appToken = sessionStorage.getItem('app_token') || localStorage.getItem('app_token');
4784            
4785            const formData = new FormData();
4786            formData.append('action', 'logout');
4787            if (appToken) {
4788                formData.append('app_token', appToken);
4789            }
4790            
4791            fetch('/app/auth.php', {
4792                method: 'POST',
4793                body: formData
4794            }).then(response => response.json())
4795            .then(data => {
4796                sessionStorage.removeItem('app_token');
4797                localStorage.removeItem('app_token');
4798                
4799                if (window.flutter_inappwebview && window.flutter_inappwebview.callHandler) {
4800                    window.flutter_inappwebview.callHandler('nativeLogout');
4801                } else {
4802                    window.location.href = '/';
4803                }
4804            }).catch(() => {
4805                window.location.href = '/';
4806            });
4807        } else {
4808            window.location.href = '/auth/logout';
4809        }
4810    }
4811    </script>
4811
4812
4813
4814
4815        <div role="dialog" aria-modal="true" id="authModal" class="auth-modal">
4816        <div class="auth-modal-content">
4817            <div class="auth-modal-left">
4818                <div class="bonus-badge-top" id="authModalBadge"><i class="fas fa-gift"></i><span>Win up to <span class="notranslate">10,000</span> Free Lottery Tickets</span></div>
4819                <h2 id="authModalTitle">Get Paid To Play!</h2>
4820                <h3 id="authModalSubtitle">Fast Cashouts</h3>
4821                <div class="modal-benefits">
4822                    <div class="benefit-item"><i class="fas fa-th-large"></i><span><strong>5,000+</strong> offers to choose from</span></div>
4823                    <div class="benefit-item"><i class="fas fa-bolt"></i><span>Fast Cashouts (PayPal, Crypto &amp; more)</span></div>
4824                    <div class="benefit-item"><i class="fas fa-users"></i><span>Start at <strong>10%</strong> Commission &amp; Level Up Fast</span></div>
4825                    <div class="benefit-item"><i class="fas fa-star"></i><span>Rated <strong>Excellent</strong> by our users</span></div>
4826                </div>
4827                <div class="trust-logos">
4828                    <i class="fab fa-paypal"></i>
4829                    <i class="fas fa-litecoin-sign"></i>
4830                    <i class="fab fa-amazon"></i>
4831                    <i class="fab fa-google-play"></i>
4832                    <i class="fab fa-cc-visa"></i>
4833                </div>
4834                <div class="mascot-bottom"><img width="400" height="400" src="/assets/images/sharkwel.webp" alt="Shark Mascot" loading="lazy"></div>
4835            </div>
4836            <div class="auth-modal-right">
4837                <span role="button" tabindex="0" class="auth-modal-close" onclick="closeAuthModal()">&times;</span>
4838                <div id="authModalExitBanner" class="exit-intent-banner" style="display:none"><i class="fas fa-gift"></i> Don't leave without your gift! Sign up, spin the wheel and win up to 10,000 lottery tickets - join Sunday's $100 cash draw!</div>
4839                <div class="form-tabs">
4840                    <button class="tab-btn active" onclick="switchForm('login')">Sign In</button>
4841                    <button class="tab-btn" onclick="switchForm('register')">Sign Up</button>
4842                </div>
4843                <div class="form-slider"><div class="form-slider-inner">
4844                    <form id="loginForm" class="auth-form active" autocomplete="on" translate="no">
4845                        <div class="form-messages"><div class="error"></div><div class="success"></div></div>
4846                        <input type="hidden" name="csrf_token" value="998e8f34e9355502848cd48edfcac4aca9c6e20a319f93593cdd2f8f0ad64f93">
4847                        <input type="hidden" name="action" value="login">
4848                        <div id="g_id_onload"
4849                             data-client_id="209163424327-1ejuooahnimq3korsk6g6dn3qnuq00bo.apps.googleusercontent.com"
4850                             data-context="signin" data-ux_mode="redirect"
4851                             data-login_uri="https://sharkearnings.com/social/google-api-php-client/google-callback.php"
4852                             data-nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"
4853                             data-state='%7B%22referrer%22%3A%22%22%2C%22visitorId%22%3A%22%22%7D'>
4854                        </div>
4855                        <div class="g_id_signin_lazy" data-type="standard" data-shape="rectangular" data-theme="outline" data-text="continue_with" data-size="large" data-logo_alignment="left" onclick="handleSocialLogin('google')"></div>
4856                        <button type="button" class="discord_button" onclick="handleSocialLogin('discord')">Continue with Discord</button>
4857                        <div class="or-divider"><span>OR</span></div>
4858                        <div class="input-wrapper">
4859                            <div class="input-icon-group">
4860                                <input aria-label="Username or Email" type="text" name="login" placeholder="Username or Email" required>
4861                                <i class="fas fa-user"></i>
4862                            </div>
4863                        </div>
4864                        <div class="input-wrapper">
4865                            <div class="input-icon-group">
4866                                <input aria-label="Password" type="password" name="password" placeholder="Password" required autocomplete="current-password">
4867                                <i class="fas fa-lock"></i>
4868                                <span role="button" tabindex="0" class="toggle-password" onclick="togglePassword('login-password', this)"><i class="fas fa-eye"></i></span>
4869                            </div>
4870                        </div>
4871                        <div class="cf-turnstile" data-sitekey="0x4AAAAAABgiM3aG2fCZPEea" data-execution="execute" data-size="flexible"></div>
4872                        <button type="submit" class="btn" style="width:100%;">Sign In</button>
4873                        <div class="form-desc" style="margin-top:15px;text-align:right;"><a href="/auth/forgot_password">Forgot Password?</a></div>
4874                        <div class="form-desc" style="margin-top:10px;">By signing in, you agree to the <a href="/privacy" target="_blank" rel="noopener">Privacy Policy</a> and <a href="/tos" target="_blank" rel="noopener">Terms of Service</a>.</div>
4875                    </form>
4876                    <form id="registerForm" class="auth-form" autocomplete="on" translate="no">
4877                        <div class="form-messages"><div class="error"></div><div class="success"></div></div>
4878                        <input type="hidden" name="csrf_token" value="998e8f34e9355502848cd48edfcac4aca9c6e20a319f93593cdd2f8f0ad64f93">
4879                        <input type="hidden" name="action" value="register">
4880                        <input type="hidden" name="fingerprint_visitor_id" id="fingerprint_visitor_id">
4881                        <div class="g_id_signin_lazy" data-type="standard" data-shape="rectangular" data-theme="outline" data-text="signup_with" data-size="large" data-logo_alignment="left" onclick="handleSocialLogin('google')"></div>
4882                        <button type="button" class="discord_button" onclick="handleSocialLogin('discord')">Sign up with Discord</button>
4883                        <div class="or-divider"><span>OR</span></div>
4884                        <div class="input-wrapper">
4885                            <div class="input-icon-group">
4886                                <input aria-label="Enter your email address" type="email" name="email" placeholder="Enter your email address" autocomplete="email" required>
4887                                <i class="fas fa-envelope"></i>
4888                            </div>
4889                        </div>
4890                        <div class="input-wrapper">
4891                            <div class="input-icon-group">
4892                                <input aria-label="Create a strong password" type="password" name="password" id="register-password" placeholder="Create a strong password" required autocomplete="new-password">
4893                                <i class="fas fa-lock"></i>
4894                                <span role="button" tabindex="0" class="toggle-password" onclick="togglePassword('register-password', this)"><i class="fas fa-eye"></i></span>
4895                            </div>
4896                            <div class="password-rules" id="register-password-rules">
4897                                <strong>Password Requirements:</strong>
4898                                <ul>
4899                                    <li id="reg-rule-length"><i class="fas fa-times"></i><i class="fas fa-check"></i>At least 8 characters long</li>
4900                                    <li id="reg-rule-uppercase"><i class="fas fa-times"></i><i class="fas fa-check"></i>One uppercase letter (A-Z)</li>
4901                                    <li id="reg-rule-lowercase"><i class="fas fa-times"></i><i class="fas fa-check"></i>One lowercase letter (a-z)</li>
4902                                    <li id="reg-rule-number"><i class="fas fa-times"></i><i class="fas fa-check"></i>One number (0-9)</li>
4903                                </ul>
4904                            </div>
4905                        </div>
4906                        <div class="input-wrapper referral-input-wrapper" style="display:none;">
4907                            <div class="input-icon-group">
4908                                <input aria-label="Referral code" type="text" name="referral_code" id="referral-code-input" placeholder="Referral code" autocomplete="off">
4909                                <i class="fas fa-users"></i>
4910                            </div>
4911                        </div>
4912                        <div class="referral-toggle-section">
4913                            <button type="button" class="referral-toggle-btn" onclick="toggleReferralInput()"><i class="fas fa-gift"></i> Have a referral code?</button>
4914                        </div>
4915                        <div class="cf-turnstile" data-sitekey="0x4AAAAAABgiM3aG2fCZPEea" data-execution="execute" data-size="flexible"></div>
4916                        <button type="submit" class="btn cta-mobile-optimized" style="width:100%;">Create Account &amp; Start Earning</button>
4917                        <div class="form-desc">By signing up, you agree to the <a href="/privacy" target="_blank" rel="noopener">Privacy Policy</a> and <a href="/tos" target="_blank" rel="noopener">Terms of Service</a>.</div>
4918                    </form>
4919                </div></div>
4920            </div>
4921        </div>
4922    </div>
4923    
4923<script src="/assets/js/main.js?v=1788969767" defer nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz"></script>
4923
4924    
4924<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
4925    // The Google Sign-In library auto-renders every .g_id_signin it finds, which cost
4926    // one button iframe per element even while the modal was closed. The two modal
4927    // buttons are marked .g_id_signin_lazy and rendered on first open instead.
4928    (function(){
4929        var modal = document.getElementById('authModal');
4930        if (!modal) return;
4931        var done = false, tries = 0;
4932
4933        function renderLazyButtons() {
4934            if (done) return;
4935            var els = document.querySelectorAll('.g_id_signin_lazy');
4936            if (!els.length) { done = true; return; }
4937            if (!(window.google && window.google.accounts && window.google.accounts.id)) {
4938                if (tries++ < 25) setTimeout(renderLazyButtons, 200);
4939                return;
4940            }
4941            done = true;
4942            els.forEach(function(el){
4943                el.classList.remove('g_id_signin_lazy');
4944                el.classList.add('g_id_signin');
4945                try {
4946                    window.google.accounts.id.renderButton(el, {
4947                        type: el.dataset.type || 'standard',
4948                        shape: el.dataset.shape || 'rectangular',
4949                        theme: el.dataset.theme || 'outline',
4950                        text: el.dataset.text || 'continue_with',
4951                        size: el.dataset.size || 'large',
4952                        logo_alignment: el.dataset.logo_alignment || 'left'
4953                    });
4954                } catch (err) {}
4955            });
4956        }
4957
4958        new MutationObserver(function(){
4959            if (modal.classList.contains('show')) renderLazyButtons();
4960        }).observe(modal, { attributes: true, attributeFilter: ['class'] });
4961    })();
4962    </script>
4962
4963    
4963<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
4964    (function(){
4965        if (sessionStorage.getItem('exitIntentShown')) return;
4966        if (window.matchMedia && window.matchMedia('(hover:none)').matches) return;
4967
4968        function showExitIntent(e) {
4969            if (e.clientY > 0) return;
4970            var modal = document.getElementById('authModal');
4971            if (!modal || modal.classList.contains('show')) return;
4972
4973            sessionStorage.setItem('exitIntentShown', '1');
4974            document.removeEventListener('mouseleave', showExitIntent);
4975
4976            var badge = document.getElementById('authModalBadge');
4977            var title = document.getElementById('authModalTitle');
4978            var subtitle = document.getElementById('authModalSubtitle');
4979            var banner = document.getElementById('authModalExitBanner');
4980            if (badge) badge.innerHTML = '<i class="fas fa-gift"></i> Wait! Your gift is here!';
4981            if (title) title.textContent = 'Sign Up & Spin to Win!';
4982            if (subtitle) subtitle.textContent = 'Spin for tickets - join Sunday\'s $100 cash draw';
4983            if (banner && window.getComputedStyle(document.querySelector('.auth-modal-left')).display === 'none') {
4984                banner.style.display = 'flex';
4985            }
4986
4987            if (typeof window.openAuthModal === 'function') window.openAuthModal('register');
4988        }
4989
4990        setTimeout(function(){
4991            document.addEventListener('mouseleave', showExitIntent);
4992        }, 3000);
4993    })();
4994    </script>
4994
4995    
4996    
4996<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
4997    (function(){
4998        document.addEventListener('click', function(e){
4999            var t = e.target.closest('[data-auth-open]');
5000            if (!t) return;
5001            if (typeof window.openAuthModal === 'function') {
5002                e.preventDefault();
5003                window.openAuthModal(t.getAttribute('data-auth-open'));
5004            }
5005        });
5006    })();
5007    </script>
5007
5008
5009    
5009<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
5010    (function(){
5011        var PING_URL = '/api/ping_session.php';
5012        var INTERVAL = 30000;
5013        var IDLE_AFTER = 120000;
5014        var lastActive = Date.now();
5015        var pingTimer;
5016
5017        function getPage() {
5018            return window.location.pathname + window.location.search;
5019        }
5020        function getReferrer() {
5021            return document.referrer || '';
5022        }
5023        function isActive() {
5024            return (Date.now() - lastActive) < IDLE_AFTER;
5025        }
5026        function sendPing() {
5027            var fd = new FormData();
5028            fd.append('page', getPage());
5029            fd.append('referrer', getReferrer());
5030            fd.append('is_active', isActive() ? '1' : '0');
5031            fetch(PING_URL, {method:'POST', body:fd, credentials:'same-origin'})
5032                .then(function(r){ return r.json(); })
5033                .then(function(d){
5034                    if (d && d.maintenance === true && !window.isAdmin) {
5035                        window.location.href = '/maintenance';
5036                    }
5037                })
5038                .catch(function(){});
5039        }
5040
5041        ['mousemove','click','keydown','scroll','touchstart'].forEach(function(ev){
5042            document.addEventListener(ev, function(){ lastActive = Date.now(); }, {passive:true});
5043        });
5044
5045        function startPinging(){
5046            sendPing();
5047            pingTimer = setInterval(sendPing, INTERVAL);
5048        }
5049        if (window.requestIdleCallback) {
5050            requestIdleCallback(startPinging, { timeout: 5000 });
5051        } else {
5052            setTimeout(startPinging, 2000);
5053        }
5054
5055        document.addEventListener('visibilitychange', function(){
5056            if (document.visibilityState === 'hidden') {
5057                navigator.sendBeacon && navigator.sendBeacon(PING_URL, new URLSearchParams({
5058                    page: getPage(), referrer: getReferrer(), is_active: '0'
5059                }));
5060                clearInterval(pingTimer);
5061            } else {
5062                lastActive = Date.now();
5063                sendPing();
5064                pingTimer = setInterval(sendPing, INTERVAL);
5065            }
5066        });
5067    })();
5068    </script>
5068
5069
5070
5071    
5072    
5072<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
5073    </script>
5073
5074
5075    
5075<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
5076    window.OfferReviews = (function(){
5077        const DIMS = [['ease','Ease'],['speed','Speed'],['earnings','Earnings'],['tracking','Tracking'],['enjoyment','Enjoyment']];
5078        const DESC = {ease:'How easy was it to complete?',speed:'How fast was the completion speed?',earnings:'How fair was the amount earned?',tracking:'How well did it track?',enjoyment:'How fun or interesting was it?'};
5079        function esc(t){ const d=document.createElement('div'); d.textContent=(t==null?'':String(t)); return d.innerHTML; }
5080        function tipEl(){ let t=document.getElementById('ofrTip'); if(!t){ t=document.createElement('div'); t.id='ofrTip'; t.className='ofr-tip'; document.body.appendChild(t); } return t; }
5081        function showTip(el,e){ const t=tipEl(); t.textContent=el.getAttribute('data-ofr-tip')||''; t.classList.add('show'); const r=el.getBoundingClientRect(); const x=(e&&e.clientX!=null)?e.clientX:(r.left+r.width/2); const y=(e&&e.clientY!=null)?e.clientY:r.top; let L=x+14; if(L+250>window.innerWidth) L=window.innerWidth-258; t.style.left=Math.max(8,L)+'px'; t.style.top=(y+16)+'px'; }
5082        function bindTips(root){ if(!root) return; const els=[]; if(root.getAttribute&&root.getAttribute('data-ofr-tip')) els.push(root); if(root.querySelectorAll) root.querySelectorAll('[data-ofr-tip]').forEach(function(e){ els.push(e); });
5082 els.forEach(function(el){ if(el.__ofrTip) return; el.__ofrTip=1; el.addEventListener('mouseenter',function(e){ showTip(el,e); }); el.addEventListener('mousemove',function(e){ showTip(el,e); }); el.addEventListener('mouseleave',function(){ tipEl().classList.remove('show'); }); el.addEventListener('click',function(e){ showTip(el,e); clearTimeout(el.__ofrTipT); el.__ofrTipT=setTimeout(function(){ tipEl().classList.remove('show'); },2600); }); }); }
5083        function ago(ts){ if(!ts) return ''; const d=Math.floor(Date.now()/1000)-ts; if(d<60)return 'just now'; if(d<3600)return Math.floor(d/60)+'m ago'; if(d<86400)return Math.floor(d/3600)+'h ago'; if(d<2592000)return Math.floor(d/86400)+'d ago'; return Math.floor(d/2592000)+'mo ago'; }
5084        function stars(val){ val=Math.max(0,Math.min(5,val||0)); let h=''; for(let i=1;i<=5;i++){ if(val>=i) h+='<i class="fas fa-star"></i>'; else if(val>=i-0.5) h+='<i class="fas fa-star-half-alt"></i>'; else h+='<i class="far fa-star"></i>'; } return '<span class="ofr-stars">'+h+'</span>'; }
5085        function radarSVG(dims){
5086            const L=[['ease','Ease'],['speed','Speed'],['earnings','Earnings'],['tracking','Tracking'],['enjoyment','Enjoyment']];
5087            const N=5, cx=165, cy=110, R=68;
5088            const ang=i=>(-Math.PI/2)+i*(2*Math.PI/N);
5089            const pt=(i,r)=>[cx+r*Math.cos(ang(i)), cy+r*Math.sin(ang(i))];
5090            let grid='';
5091            [0.25,0.5,0.75,1].forEach(f=>{ let p=''; for(let i=0;i<N;i++){const a=pt(i,R*f);p+=(i?'L':'M')+a[0].toFixed(1)+' '+a[1].toFixed(1);} grid+='<path d="'+p+'Z" class="ofr-r-grid"/>'; });
5092            let axes=''; for(let i=0;i<N;i++){const a=pt(i,R);axes+='<line x1="'+cx+'" y1="'+cy+'" x2="'+a[0].toFixed(1)+'" y2="'+a[1].toFixed(1)+'" class="ofr-r-axis"/>';}
5093            let poly='',dots=''; for(let i=0;i<N;i++){const v=Math.max(0,Math.min(5,dims[L[i][0]]||0));const a=pt(i,R*(v/5));poly+=(i?'L':'M')+a[0].toFixed(1)+' '+a[1].toFixed(1);dots+='<circle cx="'+a[0].toFixed(1)+'" cy="'+a[1].toFixed(1)+'" r="3.2" class="ofr-r-dot" data-ofr-tip="'+L[i][1]+': '+(Math.round(v*10)/10)+' / 5"/>';}
5094            let lb=''; for(let i=0;i<N;i++){const a=pt(i,R+20);const x=a[0];const anch=x<cx-6?'end':(x>cx+6?'start':'middle');lb+='<text x="'+x.toFixed(1)+'" y="'+a[1].toFixed(1)+'" class="ofr-r-lbl" text-anchor="'+anch+'" dominant-baseline="middle" data-ofr-tip="'+DESC[L[i][0]]+'">'+L[i][1]+'</text>';}
5095            return '<svg viewBox="0 0 330 216" class="ofr-radar" aria-hidden="true">'+grid+axes+'<path d="'+poly+'Z" class="ofr-r-area"/>'+dots+lb+'</svg>';
5096        }
5097        function paint(area,k,v){ area.querySelectorAll('.ofr-in-star[data-k="'+k+'"]').forEach(function(st){ const i=+st.dataset.v; st.className='ofr-in-star '+(v>=i?'fas fa-star':(v>=i-0.5?'fas fa-star-half-alt':'far fa-star')); }); }
5098        function starVal(st,ev){ const r=st.getBoundingClientRect(); const i=+st.dataset.v; const cx=(ev.clientX!=null?ev.clientX:(ev.touches&&ev.touches[0]?ev.touches[0].clientX:r.right)); return (cx-r.left)<r.width/2 ? i-0.5 : i; }
5099        function showForm(area, my, offerId, container){
5100            my = my||{};
5101            let rows='';
5102            DIMS.forEach(function(d){ const k=d[0],label=d[1]; const cur=my[k]||0; let st=''; for(let i=1;i<=5;i++){ st+='<i class="ofr-in-star '+(cur>=i?'fas fa-star':(cur>=i-0.5?'fas fa-star-half-alt':'far fa-star'))+'" data-k="'+k+'" data-v="'+i+'"></i>'; } rows+='<div class="ofr-form-row"><span class="ofr-form-lbl">'+label+'</span><span class="ofr-form-stars" data-k="'+k+'">'+st+'</span></div>'; });
5103            area.innerHTML='<div class="ofr-form"><div class="ofr-form-title">Rate this offer</div>'+rows+'<div class="ofr-form-hint">Tap the left half of a star for a half rating.</div><div class="ofr-form-actions"><button type="button" class="ofr-submit">Submit</button><button type="button" class="ofr-cancel">Cancel</button></div><div class="ofr-form-msg"></div></div>';
5104            const vals=Object.assign({},my);
5105            area.querySelectorAll('.ofr-in-star').forEach(function(st){
5106                st.addEventListener('mousemove',function(e){ paint(area,st.dataset.k,starVal(st,e)); });
5107                st.addEventListener('click',function(e){ const k=st.dataset.k,v=starVal(st,e); vals[k]=v; paint(area,k,v); });
5108            });
5109            area.querySelectorAll('.ofr-form-stars').forEach(function(g){ g.addEventListener('mouseleave',function(){ paint(area,g.dataset.k,vals[g.dataset.k]||0); }); });
5110            area.querySelector('.ofr-cancel').addEventListener('click',function(){ renderRateArea(area,(_ctx&&_ctx.data)?_ctx.data:{review_count:0,can_review:true,my_review:(Object.keys(my).length?my:null)},offerId,container); });
5111            area.querySelector('.ofr-submit').addEventListener('click',function(){ submit(area,vals,offerId,container); });
5112        }
5113        function submit(area, vals, offerId, container){
5114            const msg=area.querySelector('.ofr-form-msg');
5115            for(let i=0;i<DIMS.length;
5115i++){ if(!vals[DIMS[i][0]]){ msg.textContent='Please rate all 5 categories.'; msg.className='ofr-form-msg err'; return; } }
5116            const btn=area.querySelector('.ofr-submit'); btn.disabled=true; btn.textContent='Saving...';
5117            const fd=new FormData(); fd.append('action','submit_offer_review'); fd.append('offer_id',offerId); fd.append('csrf_token',window.csrfToken||'');
5118            DIMS.forEach(function(d){ fd.append(d[0],vals[d[0]]); });
5119            fetch('/api/secure_handler.php',{method:'POST',body:fd}).then(function(r){return r.json();}).then(function(d){
5120                if(d.success){ refresh(); } else { msg.textContent=d.message||'Failed to submit.'; msg.className='ofr-form-msg err'; btn.disabled=false; btn.textContent='Submit'; }
5121            }).catch(function(){ msg.textContent='Network error.'; msg.className='ofr-form-msg err'; btn.disabled=false; btn.textContent='Submit'; });
5122        }
5123        function renderRateArea(area, data, offerId, container){
5124            if(!data.can_review){ area.innerHTML='<div class="ofr-note">Complete at least one step of this offer to leave a rating.</div>'; return; }
5125            const my=data.my_review;
5126            area.innerHTML='<button type="button" class="ofr-rate-btn">'+(my?'Edit your rating':'Rate this offer')+'</button>';
5127            area.querySelector('.ofr-rate-btn').addEventListener('click',function(){ showForm(area,my,offerId,container); });
5128        }
5129        function render(container, data, offerId){
5130            const rc=data.review_count||0;
5131            let h='<div class="ofr-wrap">';
5132            if(data.dims){ h+='<div class="ofr-radar-wrap">'+radarSVG(data.dims)+'</div>'; }
5133            h+='<div class="ofr-score" data-ofr-tip="Average of user ratings. Starts at 3 stars by default."><span class="ofr-score-num notranslate">'+Number(data.overall).toFixed(1)+'</span><span class="ofr-score-sub">/ 5'+(rc>0?(' · '+rc+' rating'+(rc===1?'':'s')):'')+'</span></div>';
5134            h+='<div class="ofr-rate-area"></div>';
5135            h+='</div>';
5136            container.innerHTML=h;
5137            renderRateArea(container.querySelector('.ofr-rate-area'), data, offerId, container);
5138            bindTips(container);
5139        }
5140        function renderTopStars(el, d){
5141            if(!el) return;
5142            const rc=d.review_count||0;
5143            el.style.display='';
5144            el.innerHTML='<span class="ofr-top-lbl">Rating</span>'+stars(d.overall)+'<span class="ofr-top-num notranslate">'+Number(d.overall).toFixed(1)+'</span>';
5145            el.setAttribute('data-ofr-tip', 'Average of user ratings'+(rc>0?(' ('+rc+' rating'+(rc===1?'':'s')+')'):'')+'. Starts at 3 stars by default.');
5146            bindTips(el);
5147        }
5148        function renderHeroStats(el, d){
5149            if(!el) return;
5150            const c=d.completions||0;
5151            if(c<=0){ el.style.display='none'; el.innerHTML=''; return; }
5152            let h='<span class="ofr-hs-c"><i class="fas fa-users"></i> '+c.toLocaleString()+' completes</span>';
5153            if(d.completion_rate!=null){ h+='<span class="ofr-hs-r"><i class="fas fa-chart-line"></i> '+d.completion_rate+'% completion rate</span>'; }
5154            el.innerHTML=h; el.style.display='';
5155        }
5156        var _ctx=null;
5157        function load(offerId, reviewsEl, starsEl, heroEl){
5158            _ctx={offerId:offerId, reviewsEl:reviewsEl, starsEl:starsEl, heroEl:heroEl, data:null};
5159            if(!offerId){ if(reviewsEl) reviewsEl.innerHTML='<div class="ofr-note">Offer not available.</div>'; return; }
5160            if(reviewsEl) reviewsEl.innerHTML='<div class="ofr-loading"><i class="fas fa-spinner fa-spin"></i></div>';
5161            const fd=new FormData(); fd.append('action','get_offer_reviews'); fd.append('offer_id',offerId); fd.append('csrf_token',window.csrfToken||'');
5162            fetch('/api/secure_handler.php',{method:'POST',body:fd}).then(function(r){return r.json();}).then(function(d){
5163                if(!d.success){ if(reviewsEl) reviewsEl.innerHTML='<div class="ofr-note">Could not load reviews.</div>'; return; }
5164                if(_ctx) _ctx.data=d;
5165                if(reviewsEl) render(reviewsEl, d, offerId);
5166                if(starsEl) renderTopStars(starsEl, d);
5167                if(heroEl) renderHeroStats(heroEl, d);
5168            }).catch(function(){ if(reviewsEl) reviewsEl.innerHTML='<div class="ofr-note">Could not load reviews.</div>'; });
5169        }
5170        function refresh(){ if(_ctx) load(_ctx.offerId, _ctx.reviewsEl, _ctx.starsEl, _ctx.heroEl); }
5171        return { load: load, refresh: refresh, mount: function(offerId, el){ load(offerId, el, null, null); } };
5172    })();
5173    </script>
5173
5174
5175    
5175<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
5176    (function(){
5177        function toast(msg, ok){
5178            var t=document.getElementById('ofrShareToast');
5179            if(!t){ t=document.createElement('div'); t.id='ofrShareToast'; t.className='ofr-toast'; t.setAttribute('aria-live','polite'); t.setAttribute('aria-atomic','true'); document.body.appendChild(t); }
5180            t.textContent=msg; t.className='ofr-toast '+(ok===false?'err':'ok')+' show';
5181            clearTimeout(t.__h); t.__h=setTimeout(function(){ t.classList.remove('show'); }, 2800);
5182        }
5183        function ofrDeepModal(title, msg){
5184            var ov=document.getElementById('ofrDeepModal');
5185            if(!ov){
5186                ov=document.createElement('div'); ov.id='ofrDeepModal'; ov.className='ofr-deep-overlay';
5187                ov.innerHTML='<div class="ofr-deep-box"><button class="ofr-deep-close" type="button" aria-label="Close">&times;</button><div class="ofr-deep-ic"><svg viewBox="0 0 24 24" width="40" height="40" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg></div><div class="ofr-deep-t"></div><div class="ofr-deep-s"></div><button class="ofr-deep-ok" type="button">OK</button></div>';
5188                document.body.appendChild(ov);
5189                var close=function(){ ov.classList.remove('show'); };
5190                ov.addEventListener('click',function(e){ if(e.target===ov) close(); });
5191                ov.querySelector('.ofr-deep-close').addEventListener('click',close);
5192                ov.querySelector('.ofr-deep-ok').addEventListener('click',close);
5193            }
5194            ov.querySelector('.ofr-deep-t').textContent=title;
5195            ov.querySelector('.ofr-deep-s').textContent=msg;
5196            ov.classList.add('show');
5197        }
5198        window.ofrShare = function(){
5199            var id = window.__ofrCurrentOffer; if(!id) return;
5200            var url = location.origin + '/earn?offer=' + encodeURIComponent(id);
5201            if(navigator.clipboard && navigator.clipboard.writeText){
5202                navigator.clipboard.writeText(url).then(function(){ toast('Share link copied!', true); }, function(){ window.prompt('Copy this link:', url); });
5203            } else { window.prompt('Copy this link:', url); }
5204        };
5205        var ofrLoggedIn = false;
5206        var p=new URLSearchParams(location.search); var oid=p.get('offer');
5207        // A partnerek id-je nem csak betu/szam: a Lootably pl. a hirdeto nevet is
5208        // beleteszi ("lootably_91-1|Varock.gg"), es van benne pont es szokoz is.
5209        // A korabbi [a-zA-Z0-9_-] szures ezeket eldobta, igy a helyes link sem
5210        // nyitotta meg az ajanlatot. Csak azt tiltjuk, ami tenyleg veszelyes vagy
5211        // ertelmetlen itt: vezerlokarakterek es a jelolest toro < > " ' ` jelek.
5212        if(oid && oid.length<=100 && !/[\u0000-\u001f<>"'`]/.test(oid)){
5213            var run=function(){
5214                if(!ofrLoggedIn){
5215                    (function tryAuth(n){
5216                        if(typeof window.openAuthModal==='function'){ window.openAuthModal('login'); }
5217                        else if(n<24){ setTimeout(function(){ tryAuth(n+1); }, 250); }
5218                        else { ofrDeepModal('Log in required', 'Please log in to view this offer.'); }
5219                    })(0);
5220                    return;
5221                }
5222                if(!window.csrfToken){ setTimeout(run,300); return; }
5223                var fd=new FormData(); fd.append('action','get_offer_by_id'); fd.append('offer_id',oid); fd.append('csrf_token',window.csrfToken);
5224                fetch('/api/secure_handler.php',{method:'POST',body:fd}).then(function(r){return r.json();}).then(function(d){
5225                    if(d && d.success && d.offer && typeof openOfferModal==='function'){
5226                        var o=d.offer;
5227                        o.payout = (o.payout!=null? o.payout : (o.user_payout_usd||0));
5228                        o.reward_display = o.reward_display || ('$'+formatAmou
5228ntExact(Number(o.user_payout_usd||o.payout||0)));
5229                        window.popularOffersData = window.popularOffersData || [];
5230                        if(!window.popularOffersData.some(function(x){return String(x.id)===String(o.id);})) window.popularOffersData.push(o);
5231                        try { openOfferModal(o.id, 'popular'); } catch(e){ try{ openOfferModal(o.id, 'task'); }catch(e2){ toast('Could not open this offer.', false); } }
5232                    } else if(d && (d.requires_login || (d.error && /log(ged)?\s*in/i.test(d.error)))){
5233                        if(typeof window.openAuthModal==='function') window.openAuthModal('login');
5234                        else ofrDeepModal('Log in required', 'Please log in to view this offer.');
5235                    } else if(d && d.availability_status==='country'){
5236                        ofrDeepModal('Not available in your region', (d && d.error) ? d.error : "This offer isn't available in your country right now.");
5237                    } else {
5238                        ofrDeepModal('Offer no longer available', (d && d.error) ? d.error : 'This offer has ended or is no longer available.');
5239                    }
5240                }).catch(function(){ toast('This offer is no longer available or not available in your region.', false); });
5241            };
5242            if(document.readyState==='loading'){ document.addEventListener('DOMContentLoaded', function(){ setTimeout(run,700); }); }
5243            else { setTimeout(run,700); }
5244        }
5245    })();
5246    </script>
5246
5247
5248
5249    
5249<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
5250    /* Billentyuzetes aktivalas a role="button"-kent viselkedo div/span elemeken.
5251       A natív <button> ezt magatol tudja, az ARIA-val ellatott elemek nem. */
5252    (function () {
5253        document.addEventListener('keydown', function (e) {
5254            if (e.key !== 'Enter' && e.key !== ' ' && e.key !== 'Spacebar') return;
5255            var el = e.target;
5256            if (!el || !el.closest) return;
5257            var btn = el.closest('[role="button"][tabindex]');
5258            if (!btn || btn.getAttribute('aria-disabled') === 'true') return;
5259            var tag = el.tagName;
5260            if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || el.isContentEditable) return;
5261            e.preventDefault();
5262            btn.click();
5263        });
5264    })();
5265    </script>
5265
5266
5267    
5267<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
5268    /* Kozponti modal-kezeles: Escape-pel zaras, gorgetes-zar a hatter mogott,
5269       es fokusz athelyezese a megnyilo dialogusba. Minden modal a sajat zaro
5270       gombjat kapja meg (btn.click()), igy a takarito logikajuk lefut. */
5271    (function () {
5272        var MODAL_SEL = '[role="dialog"][aria-modal="true"]';
5273        var CLOSE_SEL = '.tks-modal-cl,.modal-close,.offer-modal-close,.popular-offer-modal-close,' +
5274                        '.ds-modal-close,.code-modal-close,.auth-modal-close,.settings-modal-close,' +
5275                        '[data-modal-close],[aria-label="Close"],[aria-label="Close window"]';
5276        var timer = null, lastOpen = null, prevFocus = null;
5277
5278        function isVisible(el) {
5279            if (!el || !el.isConnected) return false;
5280            var cs = window.getComputedStyle(el);
5281            if (cs.display === 'none' || cs.visibility === 'hidden') return false;
5282            if (parseFloat(cs.opacity) < 0.02) return false;
5283            return el.getClientRects().length > 0;
5284        }
5285        function openModals() {
5286            var all = document.querySelectorAll(MODAL_SEL), out = [];
5287            for (var i = 0; i < all.length; i++) { if (isVisible(all[i])) out.push(all[i]); }
5288            return out;
5289        }
5290        function sync() {
5291            timer = null;
5292            var open = openModals();
5293            var top = open.length ? open[open.length - 1] : null;
5294            document.body.classList.toggle('has-open-modal', !!top);
5295            if (top && top !== lastOpen) {
5296                prevFocus = document.activeElement;
5297                if (!top.contains(document.activeElement)) {
5298                    if (!top.hasAttribute('tabindex')) top.setAttribute('tabindex', '-1');
5299                    try { top.focus({ preventScroll: true }); } catch (e) {}
5300                }
5301            } else if (!top && lastOpen) {
5302                if (prevFocus && prevFocus.isConnected && typeof prevFocus.focus === 'function') {
5303                    try { prevFocus.focus({ preventScroll: true }); } catch (e) {}
5304                }
5305                prevFocus = null;
5306            }
5307            lastOpen = top;
5308        }
5309        function schedule() { if (timer === null) timer = setTimeout(sync, 60); }
5310
5311        try {
5312            new MutationObserver(function (muts) {
5313                for (var i = 0; i < muts.length; i++) {
5314                    var t = muts[i].target;
5315                    if (t.nodeType !== 1) continue;
5316                    if (t.matches && (t.matches(MODAL_SEL) || t.querySelector(MODAL_SEL) || t.closest(MODAL_SEL))) {
5317                        schedule(); return;
5318                    }
5319                }
5320            }).observe(document.documentElement, {
5321                subtree: true, childList: true, attributes: true,
5322                attributeFilter: ['style', 'class', 'hidden']
5323            });
5324        } catch (e) {}
5325
5326        document.addEventListener('keydown', function (e) {
5327            if (e.key !== 'Escape' && e.key !== 'Esc') return;
5328            var open = openModals();
5329            if (!open.length) return;
5330            var top = open[open.length - 1];
5331            var btn = top.querySelector(CLOSE_SEL);
5332            e.preventDefault();
5333            if (btn) { btn.click(); } else { top.click(); }
5334            schedule();
5335        });
5336    })();
5337    </script>
5337
5338    
5338<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">
5339    (function () {
5340        if (navigator.userAgent.indexOf('SharkEarningsApp') === -1) return;
5341        document.addEventListener('click', function (e) {
5342            if (e.defaultPrevented || e.button !== 0) return;
5343            var a = e.target.closest ? e.target.closest('a[href^="/offer/"]') : null;
5344            if (!a) return;
5345            e.preventDefault();
5346            var href = a.getAttribute('href').split('?')[0];
5347            fetch(href + '?json=1', { credentials: 'same-origin', cache: 'no-store' })
5348                .then(function (r) { return r.json(); })
5349                .then(function (d) {
5350                    if (d && d.success && d.url) { window.open(d.url, '_blank'); }
5351                    else if (d && d.login) { window.location.href = '/'; }
5352                    else { window.location.href = href; }
5353                })
5354                .catch(function () { window.location.href = href; });
5355        });
5356    })();
5357    </script>
5357
5358    
5358<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz" data-cf-beacon='{"version":"2024.11.0","token":"eb94d24335e646d39fb294310cd9605d","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 5358
5358
5359<script nonce="P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz">(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.nonce='P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz';d.innerHTML="window.__CF$cv$params={r:'a43f9c9ef8af0009',t:'MTc5MDkwMTE2NQ=='};var a=document.createElement('script');a.nonce='P5kPrwvqsjdu2W2sJSllPxrLZ017wKNz';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
5359</body>
5360    </html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.