{"id":33867,"date":"2026-06-07T06:27:47","date_gmt":"2026-06-07T03:27:47","guid":{"rendered":"https:\/\/vglesports.com\/?page_id=33867"},"modified":"2026-07-20T01:42:05","modified_gmt":"2026-07-19T22:42:05","slug":"test-page","status":"publish","type":"page","link":"https:\/\/vglesports.com\/el\/test-page\/","title":{"rendered":"test page"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"33867\" class=\"elementor elementor-33867\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-22fda79 elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"22fda79\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-db72e0a\" data-id=\"db72e0a\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d80fa61 elementor-widget elementor-widget-html\" data-id=\"d80fa61\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Barlow:wght@400;600;700&family=Barlow+Condensed:wght@600;700;800&family=Bebas+Neue&display=swap\" rel=\"stylesheet\">\r\n\r\n<style>\r\n*{box-sizing:border-box;margin:0;padding:0;}\r\na{text-decoration:none;color:inherit;}\r\n\r\n.vgl-home-wrap{background:#121925;font-family:'Barlow',sans-serif;position:relative;}\r\n.vgl-home-wrap::before{content:'';position:absolute;inset:0;pointer-events:none;z-index:0;background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='120' height='120'%3E%3Cdefs%3E%3Cpattern id='h' x='0' y='0' width='120' height='104' patternUnits='userSpaceOnUse'%3E%3Cpolygon points='60,2 112,32 112,72 60,102 8,72 8,32' fill='none' stroke='rgba(255,255,255,0.03)' stroke-width='1'\/%3E%3C\/pattern%3E%3C\/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23h)'\/%3E%3C\/svg%3E\");}\r\n.vgl-home-wrap > *{position:relative;z-index:1;}\r\n\r\n\/* HERO *\/\r\n.hero{position:relative;overflow:hidden;min-height:calc(740px + 56px);display:flex;align-items:flex-end;background:#0e1520;z-index:1;padding-top:56px;}\r\n.hero-img{position:absolute!important;top:0!important;left:0!important;right:0!important;bottom:0!important;width:100%!important;height:100%!important;object-fit:cover!important;object-position:center top!important;opacity:0.35!important;animation:heroZoom 12s ease-in-out infinite alternate!important;transform-origin:center center!important;display:block!important;max-width:none!important;max-height:none!important;}\r\n@keyframes heroZoom{0%{transform:scale(1) translateX(0);}50%{transform:scale(1.06) translateX(-1%);}100%{transform:scale(1.04) translateX(1%);}}\r\n.hero-fade-l{position:absolute;inset:0;background:linear-gradient(to right,rgba(14,21,32,0.99) 25%,rgba(14,21,32,0.55) 60%,rgba(14,21,32,0.05) 100%);}\r\n.hero-fade-b{position:absolute;bottom:0;left:0;right:0;height:180px;background:linear-gradient(to top,#121925,transparent);}\r\n.hero-content{position:relative;z-index:1;padding:90px clamp(16px,5vw,80px) 90px;width:100%;}\r\n.hero-eyebrow{display:inline-flex;align-items:center;gap:10px;font-family:'Barlow Condensed',sans-serif;font-size:11px;font-weight:700;letter-spacing:3px;text-transform:uppercase;color:#00c8ff;margin-bottom:22px;}\r\n.hero-eyebrow::before{content:'';width:28px;height:1px;background:#00c8ff;opacity:0.6;}\r\n.hero h1{font-family:'Bebas Neue',sans-serif;font-size:clamp(52px,10vw,80px);letter-spacing:3px;line-height:0.92;color:#fff;margin-bottom:22px;}\r\n.hero h1 em{font-style:normal;color:#00c8ff;}\r\n.hero-sub{font-size:15px;line-height:1.8;color:rgba(255,255,255,0.75);max-width:420px;margin-bottom:36px;}\r\n.hero-btns{display:flex;gap:10px;flex-wrap:wrap;}\r\n.btn-cyan{display:inline-flex;align-items:center;gap:8px;font-family:'Barlow Condensed',sans-serif;font-size:12px;font-weight:700;letter-spacing:2px;text-transform:uppercase;padding:14px 28px;border-radius:2px;background:#00c8ff;color:#000;border:none;cursor:pointer;transition:color .2s ease;}\r\n.btn-cyan:hover{color:#fff;}\r\n.btn-outline{display:inline-flex;align-items:center;gap:8px;font-family:'Barlow Condensed',sans-serif;font-size:12px;font-weight:700;letter-spacing:2px;text-transform:uppercase;padding:14px 28px;border-radius:2px;background:transparent;color:rgba(255,255,255,0.6);border:0.5px solid rgba(255,255,255,0.2);cursor:pointer;}\r\n.btn-outline:hover{border-color:rgba(255,255,255,0.5);color:#fff;}\r\n@media(max-width:768px){.btn-cyan{display:none!important;}.hero{align-items:center!important;min-height:auto!important;}.hero-content{padding-top:155px!important;padding-bottom:50px!important;}}\r\n@media(max-width:768px){.hero-content{padding-top:54px;padding-bottom:60px;}}\r\n\r\n\/* === MODERN FX === *\/\r\n.hero-glow{position:absolute;width:620px;height:620px;border-radius:50%;top:-160px;right:-120px;background:radial-gradient(circle,rgba(0,200,255,.16),transparent 65%);filter:blur(40px);pointer-events:none;animation:glowPulse 7s ease-in-out infinite alternate;}\r\n@keyframes glowPulse{0%{opacity:.5;transform:scale(1)}100%{opacity:1;transform:scale(1.12)}}\r\n.hero-scanline{position:absolute;left:0;right:0;top:0;height:140px;pointer-events:none;background:linear-gradient(to bottom,transparent,rgba(0,200,255,.05) 50%,transparent);animation:scan 8s linear infinite;}\r\n@keyframes scan{0%{transform:translateY(-160px)}100%{transform:translateY(900px)}}\r\n.hero-particles{position:absolute;inset:0;pointer-events:none;overflow:hidden;}\r\n@keyframes pFloat{to{transform:translate(22px,-70px);opacity:.05}}\r\n\r\n\/* H1 reveal + gradient glow *\/\r\n.hl{display:inline-block;opacity:0;transform:translateY(34px);animation:rise .7s cubic-bezier(.2,.7,.2,1) forwards;}\r\n.hl:nth-child(1){animation-delay:.1s}.hl:nth-child(3){animation-delay:.28s}.hl:nth-child(5){animation-delay:.46s}\r\n@keyframes rise{to{opacity:1;transform:translateY(0)}}\r\n.hero h1 em{background:linear-gradient(90deg,#00c8ff,#9ff3ff,#00c8ff);background-size:200% auto;-webkit-background-clip:text;background-clip:text;color:transparent;animation:shine 4s linear infinite;filter:drop-shadow(0 0 18px rgba(0,200,255,.45));}\r\n@keyframes shine{to{background-position:200% center}}\r\n.hero-sub{opacity:0;animation:fadeIn .8s ease .7s forwards;}\r\n.hero-btns{opacity:0;animation:fadeIn .8s ease .9s forwards;}\r\n.hero-eyebrow{opacity:0;animation:fadeIn .6s ease 0s forwards;}\r\n@keyframes fadeIn{to{opacity:1}}\r\n\r\n\/* Buttons: glow + sheen sweep *\/\r\n.btn-cyan{position:relative;overflow:hidden;box-shadow:0 0 22px rgba(0,200,255,.35);}\r\n.btn-cyan::after{content:'';position:absolute;top:0;left:-70%;width:40%;height:100%;background:linear-gradient(100deg,transparent,rgba(255,255,255,.55),transparent);transform:skewX(-20deg);animation:sheen 3.4s ease infinite;}\r\n@keyframes sheen{0%,60%{left:-70%}100%{left:130%}}\r\n.btn-outline{backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);transition:all .25s;}\r\n.btn-outline:hover{box-shadow:0 0 18px rgba(0,200,255,.2);border-color:rgba(0,200,255,.5);}\r\n\r\n\/* Vertical side label *\/\r\n.hero-side{position:absolute;right:30px;bottom:130px;z-index:1;writing-mode:vertical-rl;font-family:'Barlow Condensed',sans-serif;font-size:10px;font-weight:700;letter-spacing:4px;text-transform:uppercase;color:rgba(255,255,255,.28);display:flex;align-items:center;gap:14px;pointer-events:none;}\r\n.hero-side::before{content:'';width:1px;height:64px;background:linear-gradient(to bottom,transparent,#00c8ff);}\r\n@media(max-width:768px){.hero-glow,.hero-scanline,.hero-particles,.hero-side{display:none!important;}}\r\n\r\n\/* TICKER WRAP *\/\r\n.ticker-wrap{position:absolute;top:56px;left:0;right:0;z-index:10;background:transparent;}\r\n.ticker-inner{display:flex;align-items:stretch;max-width:none;margin:0;min-height:58px;}\r\n\r\n\/* TABS *\/\r\n.ticker-label{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;padding:0 16px 0 16px;gap:5px;border-right:1px solid rgba(255,255,255,0.08);flex-shrink:0;background:linear-gradient(to bottom right,rgba(6,10,20,0.05) 0%,rgba(6,10,20,0.35) 50%,transparent 100%);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);}\r\n.ticker-tabs{display:flex;flex-direction:column;gap:4px;}\r\n.t-tab{font-family:'Bebas Neue',sans-serif;font-size:9px;letter-spacing:1.5px;padding:4px 12px;border-radius:4px;cursor:pointer;transition:all 0.15s;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);}\r\n.t-tab.active{background:rgba(0,200,255,0.15);color:#00c8ff;border:1px solid rgba(0,200,255,0.3);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);}\r\n.t-tab:not(.active){background:rgba(255,255,255,0.06);color:rgba(255,255,255,0.4);border:1px solid rgba(255,255,255,0.1);}\r\n.t-tab:not(.active):hover{background:rgba(255,255,255,0.12);color:rgba(255,255,255,0.75);}\r\n\r\n\/* SCROLL *\/\r\n.ticker-scroll{flex:1;display:flex;align-items:center;gap:5px;overflow-x:auto;padding:8px 12px;scrollbar-width:none;}\r\n.ticker-scroll::-webkit-scrollbar{display:none;}\r\n\r\n\/* CARD *\/\r\n.mc{flex-shrink:0;width:188px;background:rgba(255,255,255,0.04);border:1px solid rgba(255,255,255,0.09);border-radius:6px;overflow:hidden;transition:border-color .2s,background .2s;}\r\n.mc:hover{background:rgba(255,255,255,0.07);border-color:rgba(255,255,255,0.18);}\r\n.mc.is-live{border-color:rgba(255,60,60,0.25);background:rgba(255,20,20,0.06);}\r\n.mc.is-live:hover{border-color:rgba(255,60,60,0.45);}\r\n.mc-top-bar{height:2px;width:100%;}\r\n.bar-live{background:#ff3c3c;}\r\n.bar-soon{background:#f0c040;}\r\n.bar-done{background:rgba(255,255,255,0.12);}\r\n.mc-body{padding:9px 11px 9px;}\r\n.mc-meta-row{display:flex;align-items:center;justify-content:space-between;gap:6px;margin-bottom:7px;}\r\n.mc-comp{font-family:'Barlow Condensed',sans-serif;font-size:11px;font-weight:700;letter-spacing:0.5px;color:rgba(255,255,255,0.5);text-transform:uppercase;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}\r\n.mc-badge{font-family:'Bebas Neue',sans-serif;font-size:9px;letter-spacing:1px;padding:2px 7px;border-radius:3px;flex-shrink:0;display:inline-flex;align-items:center;gap:3px;}\r\n.b-live{background:rgba(255,60,60,0.15);color:#ff5555;border:1px solid rgba(255,60,60,0.25);}\r\n.b-soon{background:rgba(240,192,64,0.1);color:#f0c040;border:1px solid rgba(240,192,64,0.22);}\r\n.b-done{background:rgba(255,255,255,0.04);color:rgba(255,255,255,0.3);border:1px solid rgba(255,255,255,0.07);}\r\n.live-dot{display:inline-block;width:4px;height:4px;border-radius:50%;background:#ff3c3c;animation:blink 1.4s infinite;}\r\n@keyframes blink{0%,100%{opacity:1}50%{opacity:0.2}}\r\n.mc-divider{height:1px;background:rgba(255,255,255,0.06);margin:0 0 8px;}\r\n.mc-team-row{display:flex;align-items:center;justify-content:space-between;gap:4px;padding:2px 0;}\r\n.mc-team{font-family:'Barlow',sans-serif;font-size:12px;font-weight:600;color:rgba(255,255,255,0.88);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;}\r\n.mc-team.lose{color:rgba(255,255,255,0.28);}\r\n.mc-score{font-family:'Bebas Neue',sans-serif;font-size:15px;flex-shrink:0;min-width:12px;text-align:center;}\r\n.s-win{color:#fff;}\r\n.s-lose{color:rgba(255,255,255,0.25);}\r\n.s-draw{color:rgba(255,255,255,0.6);}\r\n.mc-teams-h{display:flex;align-items:center;gap:5px;padding:5px 0;}\r\n.mc-team-h{flex:1;font-family:'Barlow',sans-serif;font-size:12px;font-weight:600;color:rgba(255,255,255,0.88);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}\r\n.mc-team-h.right{text-align:right;}\r\n.mc-vs-lbl{font-family:'Bebas Neue',sans-serif;font-size:10px;letter-spacing:1px;color:rgba(255,255,255,0.18);flex-shrink:0;}\r\n.mc-footer{display:flex;align-items:center;justify-content:space-between;margin-top:8px;padding-top:7px;border-top:1px solid rgba(255,255,255,0.05);}\r\n.mc-game{font-family:'Barlow Condensed',sans-serif;font-size:10px;font-weight:700;letter-spacing:0.5px;color:#00c8ff;opacity:0.85;}\r\n.mc-time{font-family:'Barlow',sans-serif;font-size:10px;color:rgba(255,255,255,0.28);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:90px;text-align:right;}\r\n.loading{display:flex;align-items:center;gap:5px;padding:0 8px;}\r\n.ld{width:5px;height:5px;background:#00c8ff;border-radius:50%;animation:bounce 1.2s infinite;}\r\n.ld:nth-child(2){animation-delay:.2s}.ld:nth-child(3){animation-delay:.4s}\r\n@keyframes bounce{0%,100%{transform:translateY(0);opacity:.3}50%{transform:translateY(-4px);opacity:1}}\r\n.no-data{font-family:'Bebas Neue',sans-serif;font-size:11px;letter-spacing:1px;color:rgba(255,255,255,0.18);padding:0 8px;}\r\n@media(max-width:600px){.ticker-label{padding-right:10px;}.t-tab{font-size:8px;letter-spacing:0.8px;padding:3px 8px;}.mc{width:170px;}}\r\n\r\n\/* AWARD STRIP *\/\r\n.award-strip{background:#0e1520;border-top:0.5px solid rgba(0,200,255,0.2)!important;border-bottom:0.5px solid rgba(0,200,255,0.2)!important;padding:16px clamp(16px,5vw,80px)!important;display:flex!important;align-items:center!important;justify-content:center!important;flex-wrap:nowrap!important;overflow-x:auto;width:100%;}\r\n.award-item{display:flex!important;align-items:center!important;gap:10px!important;padding:0 clamp(10px,3vw,32px)!important;position:relative!important;flex-shrink:0;}\r\n.award-item+.award-item::before{content:''!important;position:absolute!important;left:0!important;top:10%!important;height:80%!important;width:0.5px!important;background:rgba(0,200,255,0.2)!important;}\r\n.award-year{font-family:'Bebas Neue',sans-serif!important;font-size:30px!important;color:#f0c040!important;letter-spacing:2px!important;line-height:1!important;}\r\n.award-text{display:flex!important;flex-direction:column!important;gap:0!important;margin:0!important;padding:0!important;}\r\n.award-label{font-family:'Barlow Condensed',sans-serif!important;font-size:9px!important;font-weight:700!important;letter-spacing:2px!important;text-transform:uppercase!important;color:#f0c040!important;margin:0!important;padding:0!important;line-height:1.2!important;}\r\n.award-name{font-family:'Barlow Condensed',sans-serif!important;font-size:13px!important;font-weight:700!important;letter-spacing:1px!important;text-transform:uppercase!important;color:#fff!important;margin:0!important;padding:0!important;line-height:1.2!important;white-space:nowrap;}\r\n@media(max-width:600px){.award-strip{padding:12px 8px!important;}.award-item{padding:0 10px!important;gap:6px!important;flex-direction:column!important;align-items:center!important;text-align:center!important;}.award-year{font-size:20px!important;}.award-name{font-size:9px!important;white-space:normal!important;}.award-label{font-size:7px!important;}}\r\n<\/style>\r\n\r\n<div class=\"vgl-home-wrap\" translate=\"no\">\r\n\r\n<section class=\"hero\">\r\n  <img decoding=\"async\" class=\"hero-img\" src=\"https:\/\/vglesports.com\/wp-content\/uploads\/2026\/05\/roc-hero-bg-scaled.webp\" alt=\"VGL Esports Hero\" onerror=\"this.style.display='none'\">\r\n  <div class=\"hero-glow\"><\/div>\r\n  <div class=\"hero-particles\" id=\"hero-particles\"><\/div>\r\n  <div class=\"hero-scanline\"><\/div>\r\n  <div class=\"hero-fade-l\"><\/div>\r\n  <div class=\"hero-fade-b\"><\/div>\r\n\r\n  <div class=\"ticker-wrap\" translate=\"no\">\r\n    <div class=\"ticker-inner\">\r\n      <div class=\"ticker-label\">\r\n        <div class=\"ticker-tabs\">\r\n          <button class=\"t-tab active\" id=\"vgl-tab-up\" onclick=\"window.__vglHeroTicker.tab('upcoming')\">&#77;&#97;&#116;&#99;&#104;&#101;&#115;<\/button>\r\n          <button class=\"t-tab\"        id=\"vgl-tab-res\" onclick=\"window.__vglHeroTicker.tab('results')\">&#82;&#101;&#115;&#117;&#108;&#116;&#115;<\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"ticker-scroll\" id=\"vgl-tk-area\" translate=\"no\">\r\n        <div class=\"loading\"><span class=\"ld\"><\/span><span class=\"ld\"><\/span><span class=\"ld\"><\/span><\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"hero-side\" translate=\"no\">Est. 2015 \u2014 Athens, Greece<\/div>\r\n\r\n  <div class=\"hero-content\">\r\n    <div class=\"hero-eyebrow\" translate=\"no\">Greece's Official Esports Ecosystem<\/div>\r\n    <h1 translate=\"no\"><span class=\"hl\">Compete.<\/span><br><span class=\"hl\"><em>Win.<\/em><\/span><br><span class=\"hl\">Represent.<\/span><\/h1>\r\n    <p class=\"hero-sub\" id=\"vgl-hero-sub\"><\/p>\r\n    <div class=\"hero-btns\">\r\n      <a href=\"https:\/\/vglesports.com\/el\/greece-esports-tournaments\/\" class=\"btn-cyan\" translate=\"no\">Join a Tournament \u2192<\/a>\r\n      <a href=\"https:\/\/vglesports.com\/el\/about-vgl-esports\/\" class=\"btn-outline\" translate=\"no\">Learn More<\/a>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<div class=\"award-strip\" translate=\"no\">\r\n  <div class=\"award-item\"><div class=\"award-year\">2024<\/div><div class=\"award-text\"><span class=\"award-label\">Winner<\/span><span class=\"award-name\">Sports Marketing Award<\/span><\/div><\/div>\r\n  <div class=\"award-item\"><div class=\"award-year\">2025<\/div><div class=\"award-text\"><span class=\"award-label\">Winner<\/span><span class=\"award-name\">Sports Marketing Award<\/span><\/div><\/div>\r\n  <div class=\"award-item\"><div class=\"award-year\">2026<\/div><div class=\"award-text\"><span class=\"award-label\">Winner<\/span><span class=\"award-name\">Sports Marketing Award<\/span><\/div><\/div>\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<script>\r\n(function () {\r\n  'use strict';\r\n\r\n  \/* \u2500\u2500 Private state \u2500\u2500 *\/\r\n  var COMPETITION   = \"FIFAe 26'\";\r\n  var _tab          = 'upcoming';\r\n  var _rows         = [];\r\n  var _cache        = { upcoming: null, results: null };\r\n  var _intervalSet  = false;\r\n\r\n  var MONTHS = {jan:0,feb:1,mar:2,apr:3,may:4,jun:5,jul:6,aug:7,sep:8,oct:9,nov:10,dec:11};\r\n\r\n  \/* \u2500\u2500 Helpers \u2500\u2500 *\/\r\n  function pad(n){ return String(n).padStart(2,'0'); }\r\n\r\n  function parseDate(d,t){\r\n    if(!d||!t)return null;\r\n    var p=d.trim().split(' ');if(p.length<2)return null;\r\n    var mon=MONTHS[p[0].toLowerCase().slice(0,3)],day=parseInt(p[1]);\r\n    var ts=(t||'').split(':').map(Number);\r\n    if(isNaN(mon)||isNaN(day)||isNaN(ts[0])||isNaN(ts[1]))return null;\r\n    var yr=new Date().getFullYear();\r\n    return new Date(yr+'-'+pad(mon+1)+'-'+pad(day)+'T'+pad(ts[0])+':'+pad(ts[1])+':00+03:00');\r\n  }\r\n\r\n  function get(row,key){\r\n    if(row[key]!==undefined)return row[key];\r\n    var lk=key.toLowerCase();\r\n    for(var k in row){if(k.toLowerCase()===lk)return row[k];}\r\n    return '';\r\n  }\r\n\r\n  function fixName(s){\r\n    return(s||'').replace(\/efootball\/gi,'eFOOTBALL').replace(\/fifae\/gi,'FIFAe');\r\n  }\r\n\r\n  function gameColor(g){\r\n    var s=(g||'').toLowerCase();\r\n    if(s.indexOf('ea fc')!==-1||s.indexOf('fifae')!==-1)return'#3db87a';\r\n    if(s.indexOf('efootball')!==-1)return'#00c8ff';\r\n    if(s.indexOf('rocket')!==-1)return'#f97316';\r\n    if(s.indexOf('nba')!==-1||s.indexOf('2k')!==-1)return'#c084fc';\r\n    if(s.indexOf('formula')!==-1||s.indexOf('f1')!==-1)return'#e63c3c';\r\n    return'rgba(255,255,255,0.3)';\r\n  }\r\n\r\n  function parseScore(r){\r\n    var m=(r||'').match(\/(\\d+)\\s*[-\u2013]\\s*(\\d+)\/);\r\n    return m?[parseInt(m[1]),parseInt(m[2])]:null;\r\n  }\r\n\r\n  function isLive(row){\r\n    var d=parseDate(get(row,'Date'),get(row,'Match Time'));\r\n    if(!d)return false;\r\n    var now=Date.now();\r\n    return now>=d.getTime()-1800000&&now<d.getTime()+7200000;\r\n  }\r\n\r\n  \/* \u2500\u2500 Build HTML \u2500\u2500 *\/\r\n  function buildHTML(tab){\r\n    var now=Date.now(),rows;\r\n\r\n    if(tab==='upcoming'){\r\n      rows=_rows.filter(function(r){\r\n        if((get(r,'Status')||'').toLowerCase().trim()==='played')return false;\r\n        var d=parseDate(get(r,'Date'),get(r,'Match Time'));\r\n        if(d&&d.getTime()+7200000<=now)return false;\r\n        return true;\r\n      });\r\n      rows.sort(function(a,b){\r\n        var da=parseDate(get(a,'Date'),get(a,'Match Time'));\r\n        var db=parseDate(get(b,'Date'),get(b,'Match Time'));\r\n        if(da&&db)return da-db;\r\n        return da?-1:db?1:0;\r\n      });\r\n      rows=rows.slice(0,6);\r\n    } else {\r\n      rows=_rows.filter(function(r){\r\n        return(get(r,'Status')||'').toLowerCase().trim()==='played';\r\n      });\r\n      rows.sort(function(a,b){\r\n        var da=parseDate(get(a,'Date'),get(a,'Match Time'));\r\n        var db=parseDate(get(b,'Date'),get(b,'Match Time'));\r\n        if(da&&db)return db-da;\r\n        return da?1:db?-1:0;\r\n      });\r\n      rows=rows.slice(0,6);\r\n    }\r\n\r\n    if(!rows.length)return '<div class=\"no-data\">\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03bd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1<\/div>';\r\n\r\n    return rows.map(function(r){\r\n      var status  =(get(r,'Status')||'').toLowerCase().trim();\r\n      var isPlayed=status==='played';\r\n      var live    =!isPlayed&&isLive(r);\r\n      var team1   =(get(r,'Home')||'TBD').trim();\r\n      var team2   =(get(r,'Away')||'TBD').trim();\r\n      var dateStr =(get(r,'Date')||'').trim();\r\n      var timeStr =(get(r,'Match Time')||'').trim();\r\n      var comp    =fixName((get(r,'Event')||get(r,'Competition')||'').trim());\r\n      var phase   =fixName((get(r,'Phase')||'').trim());\r\n      var game    =fixName((get(r,'Game')||'').trim());\r\n      var gColor  =gameColor(game);\r\n      var barOp   =isPlayed?'0.3':'1';\r\n\r\n      var badge=isPlayed\r\n        ?'<span class=\"mc-badge b-done\">'+dateStr+'<\/span>'\r\n        :live\r\n          ?'<span class=\"mc-badge b-live\"><span class=\"live-dot\"><\/span>LIVE<\/span>'\r\n          :'<span class=\"mc-badge b-soon\">'+dateStr+(timeStr?' \u00b7 '+timeStr:'')+'<\/span>';\r\n\r\n      var teamsHtml='';\r\n      if(isPlayed){\r\n        var sc=parseScore(get(r,'Result'));\r\n        var s1=sc?sc[0]:null,s2=sc?sc[1]:null;\r\n        var c1=s1!==null?(s1>s2?'s-win':s1<s2?'s-lose':'s-draw'):'';\r\n        var c2=s2!==null?(s2>s1?'s-win':s2<s1?'s-lose':'s-draw'):'';\r\n        var l1=(s1!==null&&s1<s2)?' lose':'';\r\n        var l2=(s2!==null&&s2<s1)?' lose':'';\r\n        teamsHtml=\r\n          '<div class=\"mc-team-row\"><span class=\"mc-team'+l1+'\">'+team1+'<\/span>'+(s1!==null?'<span class=\"mc-score '+c1+'\">'+s1+'<\/span>':'')+'<\/div>'+\r\n          '<div class=\"mc-team-row\"><span class=\"mc-team'+l2+'\">'+team2+'<\/span>'+(s2!==null?'<span class=\"mc-score '+c2+'\">'+s2+'<\/span>':'')+'<\/div>';\r\n      } else {\r\n        teamsHtml=\r\n          '<div class=\"mc-teams-h\">'+\r\n          '<span class=\"mc-team-h\">'+team1+'<\/span>'+\r\n          '<span class=\"mc-vs-lbl\">VS<\/span>'+\r\n          '<span class=\"mc-team-h right\">'+team2+'<\/span>'+\r\n          '<\/div>';\r\n      }\r\n\r\n      return '<div class=\"mc'+(live?' is-live':'')+'\">' +\r\n        '<div class=\"mc-top-bar\" style=\"background:'+gColor+';opacity:'+barOp+'\"><\/div>' +\r\n        '<div class=\"mc-body\">' +\r\n          '<div class=\"mc-meta-row\"><span class=\"mc-comp\">'+comp+'<\/span>'+badge+'<\/div>' +\r\n          '<div class=\"mc-divider\"><\/div>' +\r\n          teamsHtml +\r\n          '<div class=\"mc-footer\"><span class=\"mc-game\" style=\"color:'+gColor+'\">'+game+'<\/span><span class=\"mc-time\">'+(isPlayed?phase:'')+'<\/span><\/div>' +\r\n        '<\/div>' +\r\n      '<\/div>';\r\n    }).join('');\r\n  }\r\n\r\n  \/* \u2500\u2500 Render \u2500\u2500 *\/\r\n  function preloadAll(){\r\n    _cache.upcoming=buildHTML('upcoming');\r\n    _cache.results =buildHTML('results');\r\n    var area=document.getElementById('vgl-tk-area');\r\n    if(area) area.innerHTML=_cache[_tab];\r\n  }\r\n\r\n  \/* \u2500\u2500 Public API (scoped to window.__vglHeroTicker) \u2500\u2500 *\/\r\n  window.__vglHeroTicker={\r\n    tab:function(tab){\r\n      _tab=tab;\r\n      var btnUp =document.getElementById('vgl-tab-up');\r\n      var btnRes=document.getElementById('vgl-tab-res');\r\n      if(btnUp)  btnUp.classList.toggle('active', tab==='upcoming');\r\n      if(btnRes) btnRes.classList.toggle('active', tab==='results');\r\n      var area=document.getElementById('vgl-tk-area');\r\n      if(area) area.innerHTML=_cache[tab]||buildHTML(tab);\r\n    }\r\n  };\r\n\r\n  \/* \u2500\u2500 Hero sub-text \u2500\u2500 *\/\r\n  (function(){\r\n    var isGR=window.location.pathname.indexOf('\/el\/')!==-1;\r\n    var el=document.getElementById('vgl-hero-sub');\r\n    if(el) el.textContent=isGR\r\n      ?'\u03a3\u03c5\u03bc\u03bc\u03b5\u03c4\u03ad\u03c7\u03b5\u03c4\u03b5 \u03c3\u03b5 \u03b5\u03c0\u03af\u03c3\u03b7\u03bc\u03b1 \u03c4\u03bf\u03c5\u03c1\u03bd\u03bf\u03c5\u03ac esports, \u03b1\u03b3\u03c9\u03bd\u03b9\u03c3\u03c4\u03b5\u03af\u03c4\u03b5 \u03b3\u03b9\u03b1 \u03c4\u03b7 \u03c7\u03ce\u03c1\u03b1 \u03c3\u03b1\u03c2 \u03ba\u03b1\u03b9 \u03b1\u03c6\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf \u03b1\u03c0\u03bf\u03c4\u03cd\u03c0\u03c9\u03bc\u03ac \u03c3\u03b1\u03c2 \u03c3\u03c4\u03b7\u03bd \u03b5\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ae \u03b1\u03bb\u03bb\u03ac \u03ba\u03b1\u03b9 \u03c0\u03b1\u03b3\u03ba\u03cc\u03c3\u03bc\u03b9\u03b1 esports \u03c3\u03ba\u03b7\u03bd\u03ae.'\r\n      :'Compete in official esports tournaments, fight for your country and leave your mark on the Greek and global esports scene.';\r\n  })();\r\n\r\n  \/* \u2500\u2500 Wait for FifaeData (shared global loader \u2014 untouched) \u2500\u2500 *\/\r\n  (function wait(){\r\n    if(typeof FifaeData!=='undefined'){\r\n      FifaeData.ready(function(rows){\r\n        _rows=rows;        \/\/ local copy \u2014 \u03b4\u03b5\u03bd \u03bc\u03bf\u03b9\u03c1\u03ac\u03b6\u03b5\u03c4\u03b1\u03b9 \u03bc\u03b5 \u03ac\u03bb\u03bb\u03b1 widgets\r\n        preloadAll();\r\n        if(!_intervalSet){\r\n          _intervalSet=true;\r\n          setInterval(preloadAll,30000);\r\n        }\r\n      },{competition:COMPETITION,live:true});\r\n    } else {\r\n      setTimeout(wait,100);\r\n    }\r\n  })();\r\n\r\n  \/* \u2500\u2500 Particles + mouse parallax (desktop only) \u2500\u2500 *\/\r\n  if(window.innerWidth>=768){\r\n    var c=document.getElementById('hero-particles');\r\n    if(c){\r\n      for(var i=0;i<26;i++){\r\n        var sp=document.createElement('span');\r\n        var sz=Math.random()*2.5+1;\r\n        sp.style.cssText=\r\n          'position:absolute;border-radius:50%;'+\r\n          'background:rgba(0,200,255,'+(Math.random()*.45+.15)+');'+\r\n          'width:'+sz+'px;height:'+sz+'px;'+\r\n          'left:'+Math.random()*100+'%;'+\r\n          'top:'+(Math.random()*90+5)+'%;'+\r\n          'animation:pFloat '+(Math.random()*9+8)+'s ease-in-out '+(Math.random()*8)+'s infinite alternate;';\r\n        c.appendChild(sp);\r\n      }\r\n    }\r\n    var glow  =document.querySelector('.hero-glow');\r\n    var heroEl=document.querySelector('.hero');\r\n    if(heroEl){\r\n      heroEl.addEventListener('mousemove',function(e){\r\n        var x=e.clientX\/window.innerWidth-.5;\r\n        var y=e.clientY\/window.innerHeight-.5;\r\n        if(glow) glow.style.translate=(x*-30)+'px '+(y*-20)+'px';\r\n        if(c)    c.style.translate   =(x*-14)+'px '+(y*-10)+'px';\r\n      });\r\n    }\r\n  }\r\n\r\n})();\r\n<\/script>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-e06aeb1 elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"e06aeb1\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-36a7b6f\" data-id=\"36a7b6f\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b48daab elementor-widget elementor-widget-html\" data-id=\"b48daab\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<!DOCTYPE html>\r\n<html lang=\"el\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Barlow:wght@400;600;700&family=Bebas+Neue&display=swap\" rel=\"stylesheet\">\r\n<style>\r\n#vgl-finals-widget {\r\n  --fn-bg-card: #121925;\r\n  --fn-border: rgba(255,255,255,0.06);\r\n  --fn-border-soft: rgba(255,255,255,0.04);\r\n  --fn-gold: #f0c040;\r\n  --fn-ea: #4ade80;\r\n  --fn-rl: #ff6b35;\r\n  --fn-ef: #00d4ff;\r\n  --fn-text: rgba(255,255,255,0.85);\r\n  --fn-muted: rgba(255,255,255,0.28);\r\n  font-family: 'Barlow', sans-serif;\r\n  color: var(--fn-text);\r\n  max-width: 1200px;\r\n  margin: 0 auto;\r\n  padding: 30px 24px 60px;\r\n}\r\n#vgl-finals-widget * { box-sizing: border-box; margin: 0; padding: 0; }\r\n\r\n#vgl-finals-widget .fn-header { text-align: center; margin-bottom: 32px; }\r\n#vgl-finals-widget .fn-header h1 {\r\n  font-family: 'Bebas Neue', sans-serif;\r\n  font-size: 2.2rem; font-weight: 400; letter-spacing: 3px;\r\n  text-transform: uppercase; color: var(--fn-text);\r\n}\r\n#vgl-finals-widget .fn-header h1 span { color: var(--fn-gold); }\r\n#vgl-finals-widget .fn-header p {\r\n  color: var(--fn-muted); font-size: 0.75rem; letter-spacing: 2px;\r\n  text-transform: uppercase; margin-top: 6px; font-weight: 600;\r\n}\r\n\r\n#vgl-finals-widget .fn-tabs {\r\n  display: flex; gap: 5px; margin-bottom: 24px;\r\n  justify-content: center; flex-wrap: nowrap;\r\n}\r\n#vgl-finals-widget .fn-tab {\r\n  font-family: 'Barlow', sans-serif; font-size: 11px; font-weight: 700;\r\n  letter-spacing: 1px; text-transform: uppercase;\r\n  color: rgba(255,255,255,0.45); background: rgba(255,255,255,0.04);\r\n  border: 0.5px solid rgba(255,255,255,0.10); padding: 8px 18px;\r\n  border-radius: 20px; cursor: pointer; transition: all 0.18s;\r\n  display: flex; align-items: center; gap: 6px;\r\n  white-space: nowrap; flex-shrink: 0;\r\n}\r\n#vgl-finals-widget .fn-tab:hover { color: rgba(255,255,255,0.75); background: rgba(255,255,255,0.08); border-color: rgba(255,255,255,0.2); }\r\n#vgl-finals-widget .fn-tab.act-eafc { background: rgba(74,222,128,0.08); border-color: rgba(74,222,128,0.4); color: var(--fn-ea); }\r\n#vgl-finals-widget .fn-tab.act-rl   { background: rgba(255,107,53,0.08);  border-color: rgba(255,107,53,0.4);  color: var(--fn-rl); }\r\n#vgl-finals-widget .fn-tab.act-ef   { background: rgba(0,212,255,0.08);   border-color: rgba(0,212,255,0.4);   color: var(--fn-ef); }\r\n#vgl-finals-widget .fn-tab-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }\r\n#vgl-finals-widget .fn-tab[data-g=\"eafc\"] .fn-tab-dot { background: var(--fn-ea); }\r\n#vgl-finals-widget .fn-tab[data-g=\"rl\"]   .fn-tab-dot { background: var(--fn-rl); }\r\n#vgl-finals-widget .fn-tab[data-g=\"ef\"]   .fn-tab-dot { background: var(--fn-ef); }\r\n\r\n#vgl-finals-widget .fn-panel { display: none; }\r\n#vgl-finals-widget .fn-panel.show { display: block; animation: fnFade .25s ease; }\r\n@keyframes fnFade { from { opacity:0; transform:translateY(6px); } to { opacity:1; transform:translateY(0); } }\r\n\r\n#vgl-finals-widget .fn-card {\r\n  background: var(--fn-bg-card);\r\n  border: 0.5px solid var(--fn-border);\r\n  border-radius: 4px; overflow: hidden;\r\n  background-image:\r\n    linear-gradient(rgba(96,165,250,0.025) 1px, transparent 1px),\r\n    linear-gradient(90deg, rgba(96,165,250,0.025) 1px, transparent 1px);\r\n  background-size: 40px 40px;\r\n  margin-bottom: 20px;\r\n}\r\n#vgl-finals-widget .fn-card-hdr {\r\n  padding: 14px 24px 12px; border-bottom: 0.5px solid var(--fn-border);\r\n  display: flex; align-items: center; gap: 12px;\r\n  background: rgba(0,0,0,0.15);\r\n}\r\n#vgl-finals-widget .fn-card-hdr h2 {\r\n  font-family: 'Bebas Neue', sans-serif; font-size: 1.2rem;\r\n  font-weight: 400; letter-spacing: 2px; text-transform: uppercase;\r\n  color: var(--fn-gold);\r\n}\r\n\r\n\/* \u2500\u2500 Podium (Champion \/ 2nd \/ 3rd) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n#vgl-finals-widget .fn-podium-grid {\r\n  display: grid; grid-template-columns: repeat(3, 1fr);\r\n  padding: 18px 20px;\r\n}\r\n#vgl-finals-widget .fn-podium-col {\r\n  text-align: center; padding: 6px 12px;\r\n  border-right: 0.5px solid var(--fn-border);\r\n}\r\n#vgl-finals-widget .fn-podium-col:last-child { border-right: none; }\r\n#vgl-finals-widget .fn-podium-label {\r\n  font-size: 0.62rem; font-weight: 700; text-transform: uppercase;\r\n  letter-spacing: 2px; color: var(--fn-muted); margin-bottom: 8px;\r\n}\r\n#vgl-finals-widget .fn-podium-col.p1 .fn-podium-label { color: var(--fn-gold); }\r\n#vgl-finals-widget .fn-podium-col.p2 .fn-podium-label { color: rgba(192,207,224,0.7); }\r\n#vgl-finals-widget .fn-podium-col.p3 .fn-podium-label { color: rgba(205,127,50,0.85); }\r\n#vgl-finals-widget .fn-podium-name {\r\n  font-family: 'Bebas Neue', sans-serif; letter-spacing: 1px;\r\n  font-size: 1.25rem; color: #fff;\r\n  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\r\n}\r\n#vgl-finals-widget .fn-podium-col.p1 .fn-podium-name { color: var(--fn-gold); font-size: 1.4rem; }\r\n#vgl-finals-widget .fn-podium-players {\r\n  font-family: 'Barlow', sans-serif;\r\n  font-size: 0.68rem; color: rgba(255,255,255,0.35); font-style: italic;\r\n  margin-top: 4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\r\n}\r\n\r\n#vgl-finals-widget .fn-gs-layout { display: block; }\r\n#vgl-finals-widget .fn-gs-left,\r\n#vgl-finals-widget .fn-gs-right { display: block; }\r\n\r\n#vgl-finals-widget .fn-groups-wrap {\r\n  display: grid; grid-template-columns: repeat(auto-fit, minmax(260px,1fr));\r\n}\r\n#vgl-finals-widget .fn-group-block {\r\n  padding: 16px 24px;\r\n  border-right: 0.5px solid var(--fn-border);\r\n}\r\n#vgl-finals-widget .fn-group-block:last-child { border-right: none; }\r\n#vgl-finals-widget .fn-group-label {\r\n  font-family: 'Bebas Neue', sans-serif;\r\n  font-size: 0.95rem; font-weight: 400; letter-spacing: 3px;\r\n  text-transform: uppercase; color: var(--fn-gold);\r\n  padding-bottom: 8px; margin-bottom: 4px;\r\n  border-bottom: 0.5px solid rgba(240,192,64,0.2);\r\n}\r\n#vgl-finals-widget .fn-phase-label {\r\n  font-family: 'Bebas Neue', sans-serif;\r\n  font-size: 0.95rem; font-weight: 400; letter-spacing: 3px;\r\n  text-transform: uppercase; color: var(--fn-gold);\r\n  padding: 0 20px 8px; margin: 4px 0;\r\n  border-bottom: 0.5px solid rgba(240,192,64,0.2);\r\n}\r\n#vgl-finals-widget .fn-phase-block { padding-top: 16px; }\r\n#vgl-finals-widget .fn-phase-block:first-child { padding-top: 0; }\r\n#vgl-finals-widget .fn-phase-block .fn-matches-grid { padding: 0 20px 4px; }\r\n\r\n#vgl-finals-widget .fn-tbl { width: 100%; border-collapse: collapse; }\r\n#vgl-finals-widget .fn-tbl th {\r\n  padding: 7px 12px; font-size: 0.6rem; font-weight: 700;\r\n  letter-spacing: 1.5px; text-transform: uppercase; color: var(--fn-muted);\r\n  text-align: center; border-bottom: 0.5px solid var(--fn-border-soft);\r\n  background: rgba(0,0,0,0.15);\r\n}\r\n#vgl-finals-widget .fn-tbl th:nth-child(2) { text-align: left; padding-left: 4px; }\r\n#vgl-finals-widget .fn-tbl td {\r\n  padding: 9px 12px; font-size: 0.82rem; font-weight: 600;\r\n  text-align: center; border-bottom: 0.5px solid var(--fn-border-soft);\r\n  color: var(--fn-muted);\r\n}\r\n#vgl-finals-widget .fn-tbl td:nth-child(1) { width: 28px; }\r\n#vgl-finals-widget .fn-tbl td:nth-child(2) { text-align: left; color: var(--fn-text); font-size: 0.88rem; padding-left: 4px; }\r\n#vgl-finals-widget .fn-tbl td:nth-child(2) .fn-team-name {\r\n  display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 160px;\r\n}\r\n#vgl-finals-widget .fn-team-players {\r\n  display: block; font-size: 0.62rem; color: rgba(255,255,255,0.3); font-style: italic;\r\n  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 160px; margin-top: 2px;\r\n}\r\n#vgl-finals-widget .fn-seed { font-size: 0.6rem; color: rgba(255,255,255,0.28); margin-left: 4px; vertical-align: middle; font-weight: 400; }\r\n#vgl-finals-widget .fn-tbl td:last-child { padding-right: 0; }\r\n#vgl-finals-widget .fn-tbl tr:last-child td { border-bottom: none; }\r\n#vgl-finals-widget .fn-tbl tr.q1 td:nth-child(2) .fn-team-name { color: #fff; font-weight: 700; }\r\n#vgl-finals-widget .fn-tbl .fn-pts { color: var(--fn-gold) !important; font-family: 'Bebas Neue', sans-serif; font-size: 1rem; letter-spacing: 1px; }\r\n#vgl-finals-widget .fn-tbl .pos-1 { font-family: 'Bebas Neue', sans-serif; color: var(--fn-gold) !important; font-size: 1rem; }\r\n#vgl-finals-widget .fn-tbl .pos-2 { color: rgba(192,207,224,0.7) !important; }\r\n#vgl-finals-widget .fn-qual-dot {\r\n  display: inline-block; width: 5px; height: 5px; border-radius: 50%;\r\n  margin-right: 7px; vertical-align: middle; position: relative; top: -1px;\r\n}\r\n#vgl-finals-widget .fn-qual-dot.d1 { background: var(--fn-gold); }\r\n#vgl-finals-widget .fn-qual-dot.d2 { background: rgba(192,207,224,0.5); }\r\n\r\n#vgl-finals-widget .fn-matches-wrap { padding: 20px; }\r\n#vgl-finals-widget .fn-matches-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; }\r\n#vgl-finals-widget .fn-match {\r\n  background: rgba(255,255,255,0.02); border: 0.5px solid var(--fn-border);\r\n  border-radius: 4px; padding: 10px 16px; transition: background .15s;\r\n}\r\n#vgl-finals-widget .fn-match:hover { background: rgba(255,255,255,0.04); }\r\n#vgl-finals-widget .fn-match-grp {\r\n  font-size: 0.6rem; color: var(--fn-muted); font-weight: 700;\r\n  letter-spacing: 1.5px; text-transform: uppercase; text-align: center; margin-bottom: 8px;\r\n}\r\n#vgl-finals-widget .fn-match-row { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 8px; }\r\n#vgl-finals-widget .fn-match-team {\r\n  font-size: 0.92rem; font-weight: 700; color: var(--fn-text);\r\n  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\r\n}\r\n#vgl-finals-widget .fn-match-team.h { text-align: right; }\r\n#vgl-finals-widget .fn-match-team.a { text-align: left; }\r\n#vgl-finals-widget .fn-match-player {\r\n  font-size: 0.68rem; color: rgba(255,255,255,0.22); font-weight: 600;\r\n  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\r\n  font-style: italic; display: block; margin-top: 2px;\r\n}\r\n#vgl-finals-widget .fn-match-player.h { text-align: right; }\r\n#vgl-finals-widget .fn-match-player.a { text-align: left; }\r\n#vgl-finals-widget .fn-score {\r\n  font-family: 'Bebas Neue', sans-serif; font-size: 1.05rem; letter-spacing: 1px;\r\n  color: var(--fn-gold); text-align: center; white-space: nowrap;\r\n  padding: 4px 10px; background: rgba(240,192,64,0.08);\r\n  border: 0.5px solid rgba(240,192,64,0.25); border-radius: 3px; min-width: 52px;\r\n}\r\n#vgl-finals-widget .fn-time {\r\n  font-family: 'Bebas Neue', sans-serif; font-size: 0.95rem; letter-spacing: 1px;\r\n  color: rgba(255,255,255,0.25); text-align: center;\r\n  padding: 4px 10px; background: rgba(255,255,255,0.04);\r\n  border: 0.5px solid var(--fn-border); border-radius: 3px; white-space: nowrap;\r\n}\r\n\r\n#vgl-finals-widget .fn-pager {\r\n  display: flex; align-items: center; justify-content: center; gap: 6px;\r\n  padding: 14px 24px; border-top: 0.5px solid var(--fn-border);\r\n  background: var(--fn-bg-card); border-radius: 0 0 4px 4px;\r\n}\r\n#vgl-finals-widget .fn-pg-btn {\r\n  font-family: 'Barlow', sans-serif; font-size: 11px; font-weight: 700;\r\n  letter-spacing: 0.5px; min-width: 34px; height: 34px; padding: 0 10px;\r\n  border-radius: 8px; border: 0.5px solid rgba(255,255,255,0.10);\r\n  background: rgba(255,255,255,0.04); color: rgba(255,255,255,0.45);\r\n  cursor: pointer; transition: all 0.18s; display: inline-flex; align-items: center; justify-content: center;\r\n}\r\n#vgl-finals-widget .fn-pg-btn:hover:not(:disabled) { background: rgba(255,255,255,0.08); border-color: rgba(255,255,255,0.2); color: rgba(255,255,255,0.8); }\r\n#vgl-finals-widget .fn-pg-btn.active { background: rgba(240,192,64,0.12); border-color: rgba(240,192,64,0.4); color: var(--fn-gold); }\r\n#vgl-finals-widget .fn-pg-btn:disabled { opacity: 0.2; cursor: default; }\r\n\r\n#vgl-finals-widget .fn-qual-grid { display: grid; grid-template-columns: repeat(auto-fill,minmax(200px,1fr)); gap: 8px; padding: 20px; }\r\n#vgl-finals-widget .fn-qual-card {\r\n  background: rgba(0,255,255,0.04); border: 0.5px solid rgba(0,255,255,0.15);\r\n  border-radius: 4px; padding: 12px 16px; display: flex; align-items: center; gap: 10px;\r\n}\r\n#vgl-finals-widget .fn-qual-medal { font-size: 1.1rem; }\r\n#vgl-finals-widget .fn-qual-name { font-size: 0.88rem; font-weight: 700; color: #fff; }\r\n#vgl-finals-widget .fn-qual-grp { font-size: 0.62rem; color: var(--fn-muted); font-weight: 700; letter-spacing: 1px; text-transform: uppercase; margin-top: 2px; }\r\n\r\n#vgl-finals-widget .fn-ko-grid { display: grid; grid-template-columns: repeat(auto-fill,minmax(320px,1fr)); gap: 10px; padding: 20px; }\r\n#vgl-finals-widget .fn-ko-card {\r\n  background: rgba(240,192,64,0.04); border: 0.5px solid rgba(240,192,64,0.2);\r\n  border-radius: 4px; padding: 14px 20px;\r\n}\r\n#vgl-finals-widget .fn-ko-label {\r\n  font-size: 0.62rem; font-weight: 700; text-transform: uppercase;\r\n  letter-spacing: 2px; color: var(--fn-gold); margin-bottom: 12px;\r\n  font-family: 'Barlow', sans-serif;\r\n}\r\n#vgl-finals-widget .fn-ko-matchup { display: flex; align-items: center; gap: 10px; }\r\n#vgl-finals-widget .fn-ko-team {\r\n  flex: 1; font-size: 0.9rem; font-weight: 700; color: var(--fn-text);\r\n  text-align: center; word-break: break-word; line-height: 1.3;\r\n}\r\n#vgl-finals-widget .fn-ko-score {\r\n  font-family: 'Bebas Neue', sans-serif; font-size: 1.1rem; letter-spacing: 1px;\r\n  color: var(--fn-gold); padding: 6px 12px;\r\n  background: rgba(240,192,64,0.1); border: 0.5px solid rgba(240,192,64,0.25);\r\n  border-radius: 3px; text-align: center; min-width: 52px;\r\n}\r\n#vgl-finals-widget .fn-ko-vs {\r\n  font-family: 'Bebas Neue', sans-serif; font-size: 0.9rem; letter-spacing: 1px;\r\n  color: rgba(255,255,255,0.2); padding: 6px 12px;\r\n  background: rgba(255,255,255,0.04); border: 0.5px solid var(--fn-border);\r\n  border-radius: 3px; text-align: center; min-width: 52px;\r\n}\r\n#vgl-finals-widget .fn-ko-time {\r\n  font-family: 'Bebas Neue', sans-serif; font-size: 0.95rem; letter-spacing: 1px;\r\n  color: rgba(255,255,255,0.3); padding: 6px 12px;\r\n  background: rgba(255,255,255,0.04); border: 0.5px solid var(--fn-border);\r\n  border-radius: 3px; text-align: center; min-width: 52px;\r\n}\r\n\r\n#vgl-finals-widget .fn-loading {\r\n  text-align: center; padding: 48px;\r\n  color: var(--fn-muted); font-size: 0.8rem; letter-spacing: 2px; text-transform: uppercase;\r\n}\r\n#vgl-finals-widget .fn-spin {\r\n  display: inline-block; width: 14px; height: 14px;\r\n  border: 1.5px solid rgba(240,192,64,0.15); border-top-color: var(--fn-gold);\r\n  border-radius: 50%; animation: fn-spin .8s linear infinite;\r\n  vertical-align: middle; margin-right: 8px;\r\n}\r\n@keyframes fn-spin { to { transform: rotate(360deg); } }\r\n#vgl-finals-widget .fn-soon {\r\n  text-align: center; padding: 60px 20px;\r\n  font-family: 'Bebas Neue', sans-serif; font-size: 1.1rem;\r\n  letter-spacing: 3px; color: rgba(255,255,255,0.15);\r\n}\r\n#vgl-finals-widget .fn-updated {\r\n  text-align: right; font-size: 0.66rem; color: rgba(255,255,255,0.15);\r\n  font-style: italic; margin-top: 16px; letter-spacing: 0.5px;\r\n}\r\n\r\n@media (max-width: 600px) {\r\n  #vgl-finals-widget { padding: 20px 10px 40px; }\r\n  #vgl-finals-widget .fn-header h1 { font-size: 1.6rem; }\r\n  #vgl-finals-widget .fn-header p  { font-size: 0.68rem; }\r\n  #vgl-finals-widget .fn-tab { padding: 7px 12px; font-size: 10px; gap: 5px; }\r\n  #vgl-finals-widget .fn-gs-layout { grid-template-columns: 1fr !important; gap: 12px !important; }\r\n  #vgl-finals-widget .fn-card-hdr { padding: 10px 14px; }\r\n  #vgl-finals-widget .fn-card-hdr h2 { font-size: 1rem; letter-spacing: 1.5px; }\r\n  #vgl-finals-widget .fn-podium-grid { padding: 12px 8px; }\r\n  #vgl-finals-widget .fn-podium-label { font-size: 0.55rem; letter-spacing: 1px; }\r\n  #vgl-finals-widget .fn-podium-name { font-size: 0.95rem; }\r\n  #vgl-finals-widget .fn-podium-col.p1 .fn-podium-name { font-size: 1.05rem; }\r\n  #vgl-finals-widget .fn-podium-players { font-size: 0.58rem; }\r\n  #vgl-finals-widget .fn-group-block { padding: 12px 12px; border-right: none !important; border-bottom: 1px solid rgba(255,255,255,0.05); }\r\n  #vgl-finals-widget .fn-group-block:last-child { border-bottom: none; }\r\n  #vgl-finals-widget .fn-tbl th { padding: 5px 5px; font-size: 0.55rem; letter-spacing: 0.8px; }\r\n  #vgl-finals-widget .fn-tbl td { padding: 7px 5px; font-size: 0.75rem; }\r\n  #vgl-finals-widget .fn-tbl td:nth-child(2) .fn-team-name { font-size: 0.78rem; max-width: 90px; }\r\n  #vgl-finals-widget .fn-team-players { max-width: 90px; }\r\n  #vgl-finals-widget .fn-tbl th:nth-child(7),\r\n  #vgl-finals-widget .fn-tbl td:nth-child(7),\r\n  #vgl-finals-widget .fn-tbl th:nth-child(8),\r\n  #vgl-finals-widget .fn-tbl td:nth-child(8) { display: none; }\r\n  #vgl-finals-widget .fn-groups-wrap,\r\n  #vgl-finals-widget [style*=\"grid-template-columns\"] { grid-template-columns: 1fr !important; }\r\n  #vgl-finals-widget .fn-tbl td,\r\n  #vgl-finals-widget .fn-tbl th,\r\n  #vgl-finals-widget .fn-tbl tr td,\r\n  #vgl-finals-widget .fn-tbl tr th,\r\n  #vgl-finals-widget table td,\r\n  #vgl-finals-widget table th { border: none !important; border-bottom: 1px solid rgba(255,255,255,0.04) !important; outline: none !important; box-shadow: none !important; }\r\n  #vgl-finals-widget .fn-tbl tr:last-child td { border-bottom: none !important; }\r\n  #vgl-finals-widget .fn-matches-wrap { padding: 10px; }\r\n  #vgl-finals-widget .fn-matches-grid { grid-template-columns: 1fr !important; gap: 8px !important; }\r\n  #vgl-finals-widget .fn-score, #vgl-finals-widget .fn-time { font-size: 0.92rem; padding: 3px 8px; min-width: 44px; }\r\n  #vgl-finals-widget .fn-match-team { font-size: 0.82rem; }\r\n  #vgl-finals-widget .fn-ko-grid { grid-template-columns: 1fr !important; padding: 10px !important; }\r\n  #vgl-finals-widget .fn-qual-grid { grid-template-columns: 1fr 1fr !important; padding: 10px !important; gap: 6px !important; }\r\n  #vgl-finals-widget .fn-qual-card { padding: 10px 12px; }\r\n  #vgl-finals-widget .fn-qual-name { font-size: 0.8rem; }\r\n  #vgl-finals-widget .fn-pg-btn { min-width: 30px; height: 30px; font-size: 10px; padding: 0 8px; }\r\n}\r\n<\/style>\r\n<\/head>\r\n<body data-rsssl=1 style=\"background:#0d1520\">\r\n\r\n<div id=\"vgl-finals-widget\" translate=\"no\" class=\"notranslate\">\r\n\r\n  <div class=\"fn-header\">\r\n    <h1>Final <span>Stage<\/span><\/h1>\r\n    <p>Season 1 &mdash; Final Stage<\/p>\r\n  <\/div>\r\n\r\n  <div class=\"fn-tabs\">\r\n    <button class=\"fn-tab\" data-g=\"eafc\" onclick=\"fnSwitch('eafc')\"><span class=\"fn-tab-dot\"><\/span>EA FC 26<\/button>\r\n    <button class=\"fn-tab\" data-g=\"rl\"   onclick=\"fnSwitch('rl')\"><span class=\"fn-tab-dot\"><\/span>Rocket League<\/button>\r\n    <button class=\"fn-tab\" data-g=\"ef\"   onclick=\"fnSwitch('ef')\"><span class=\"fn-tab-dot\"><\/span>eFootball<\/button>\r\n  <\/div>\r\n\r\n  <div class=\"fn-panel\" id=\"fn-eafc\">\r\n    <div class=\"fn-loading\" id=\"fn-eafc-load\"><span class=\"fn-spin\"><\/span>Loading data\u2026<\/div>\r\n    <div id=\"fn-eafc-body\"><\/div>\r\n  <\/div>\r\n  <div class=\"fn-panel\" id=\"fn-rl\">\r\n    <div class=\"fn-loading\" id=\"fn-rl-load\"><span class=\"fn-spin\"><\/span>Loading data\u2026<\/div>\r\n    <div id=\"fn-rl-body\"><\/div>\r\n  <\/div>\r\n  <div class=\"fn-panel\" id=\"fn-ef\">\r\n    <div class=\"fn-loading\" id=\"fn-ef-load\"><span class=\"fn-spin\"><\/span>Loading data\u2026<\/div>\r\n    <div id=\"fn-ef-body\"><\/div>\r\n  <\/div>\r\n\r\n  <div class=\"fn-updated\" id=\"fn-ts\"><\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n  const root = document.getElementById('vgl-finals-widget');\r\n  if (!root) return;\r\n\r\n  function lockNode(n) {\r\n    if (n.nodeType !== 1) return;\r\n    n.setAttribute('translate', 'no');\r\n    n.classList.add('notranslate');\r\n    \/\/ TranslatePress-specific: mark as excluded\r\n    n.setAttribute('data-no-translation', '');\r\n    n.setAttribute('data-trp-no-translate', '');\r\n  }\r\n\r\n  function lockTree(el) {\r\n    lockNode(el);\r\n    el.querySelectorAll('*').forEach(lockNode);\r\n  }\r\n\r\n  lockTree(root);\r\n\r\n  \/\/ Watch for any new nodes injected by TP or dynamic rendering\r\n  new MutationObserver(muts => muts.forEach(m => {\r\n    m.addedNodes.forEach(n => { if (n.nodeType === 1) lockTree(n); });\r\n    \/\/ Also re-lock if TP modifies text nodes inside the widget\r\n    if (m.type === 'characterData' && root.contains(m.target)) {\r\n      if (m.target.parentElement) lockNode(m.target.parentElement);\r\n    }\r\n  })).observe(root, {childList: true, subtree: true, characterData: true});\r\n\r\n  \/\/ Belt-and-suspenders: re-lock every 800ms for the first 5s (covers TP late init)\r\n  let ticks = 0;\r\n  const iv = setInterval(() => {\r\n    lockTree(root);\r\n    if (++ticks >= 6) clearInterval(iv);\r\n  }, 800);\r\n})();\r\n\r\nconst FN_SHEET = {\r\n  rl:   'https:\/\/docs.google.com\/spreadsheets\/d\/e\/2PACX-1vQ7XPmTERn8ypG2cKhJPybs2ztp8zh5PDqS1EmIl-XnroKRjn_sScbb7ke79QcHkn6Txmn9pS7bBgT6\/pub?gid=1286950606&single=true&output=csv',\r\n  eafc: 'https:\/\/docs.google.com\/spreadsheets\/d\/e\/2PACX-1vQ7XPmTERn8ypG2cKhJPybs2ztp8zh5PDqS1EmIl-XnroKRjn_sScbb7ke79QcHkn6Txmn9pS7bBgT6\/pub?gid=1193440293&single=true&output=csv',\r\n  ef:   'https:\/\/docs.google.com\/spreadsheets\/d\/e\/2PACX-1vQ7XPmTERn8ypG2cKhJPybs2ztp8zh5PDqS1EmIl-XnroKRjn_sScbb7ke79QcHkn6Txmn9pS7bBgT6\/pub?gid=1849168027&single=true&output=csv'\r\n};\r\nconst FN_LOADED = {};\r\nconst FN_PAGES  = {};\r\nconst PER_PAGE  = 4;\r\n\r\n\/*\r\n  NEW SOURCE (2026-07-11): Quarterfinal \/ Semifinal matches don't live in\r\n  the per-game \"RoC 26' \u2014 Group Standings\" sheet's Knockout section \u2014 they\r\n  get entered in the shared VGL WEBSITE DATABASE \u2192 MATCHES tab instead,\r\n  one flat table with a proper header row (Event, Game, Week, Date, Phase,\r\n  Home, Away, Result, Match Time, Status, H-Player 1-3, A-Player 1-3,\r\n  Stream) covering every event\/game. We fetch it once, filter it down to\r\n  RoC 26' + the current game + any Phase that isn't a Group Stage row, and\r\n  use that as the Knockout Stage data for each tab.\r\n*\/\r\nconst FN_MATCHES_CSV = 'https:\/\/docs.google.com\/spreadsheets\/d\/e\/2PACX-1vRwYEJQQvu8A5aCzPtb_vlK-bUTSpKHNq1pGQo_IrScbTshZayVbwL1S6AMODASFA\/pub?gid=2085879533&single=true&output=csv';\r\nconst FN_GAME_MATCH = {\r\n  eafc: g => \/eafc\/i.test(g),\r\n  rl:   g => \/rocket\\s*league\/i.test(g),\r\n  ef:   g => \/efootball\/i.test(g)\r\n};\r\nconst fnIsRoC26 = e => \/roc\\s*26\/i.test(e || '');\r\nconst fnIsKnockoutPhase = p => !!(p && !\/^group\/i.test(p.trim()));\r\nlet FN_MATCHES_DB = null;\r\n\r\nfunction fnParseMatchesDB(txt) {\r\n  const rows = txt.split('\\n').map(l=>l.replace(\/\\r$\/,'')).map(fnCSVLine);\r\n  const out = [];\r\n  let headerIdx = -1;\r\n  for (let i=0;i<rows.length;i++) {\r\n    const r = rows[i];\r\n    if (r[0] && r[0].trim().toLowerCase()==='event' && r.some(c=>c && c.trim().toLowerCase()==='phase')) { headerIdx=i; break; }\r\n  }\r\n  if (headerIdx===-1) return out;\r\n  const hdr = rows[headerIdx].map(c=>(c||'').trim().toLowerCase());\r\n  const idx = name => hdr.indexOf(name);\r\n  const iEvent=idx('event'), iGame=idx('game'), iDate=idx('date'), iPhase=idx('phase'),\r\n        iHome=idx('home'), iAway=idx('away'), iResult=idx('result'), iTime=idx('match time'),\r\n        iH1=idx('h-player 1'), iH2=idx('h-player 2'), iH3=idx('h-player 3'),\r\n        iA1=idx('a-player 1'), iA2=idx('a-player 2'), iA3=idx('a-player 3');\r\n\r\n  for (let i=headerIdx+1;i<rows.length;i++) {\r\n    const r = rows[i];\r\n    if (!r || r.every(c=>!c)) continue;\r\n    const event=(r[iEvent]||'').trim();\r\n    if (!event) continue;\r\n    out.push({\r\n      event, game:(r[iGame]||'').trim(), date:(r[iDate]||'').trim(),\r\n      phase:(r[iPhase]||'').trim(), home:(r[iHome]||'').trim(), away:(r[iAway]||'').trim(),\r\n      result:(r[iResult]||'').trim(), time:(r[iTime]||'').trim(),\r\n      hp:[r[iH1],r[iH2],r[iH3]].filter(Boolean).map(s=>s.trim()).join(' \u00b7 '),\r\n      ap:[r[iA1],r[iA2],r[iA3]].filter(Boolean).map(s=>s.trim()).join(' \u00b7 ')\r\n    });\r\n  }\r\n  return out;\r\n}\r\n\r\nasync function fnFetchMatchesDB() {\r\n  if (FN_MATCHES_DB) return FN_MATCHES_DB;\r\n  try {\r\n    const r = await fetch(FN_MATCHES_CSV + '&_=' + Date.now());\r\n    if (!r.ok) throw 0;\r\n    FN_MATCHES_DB = fnParseMatchesDB(await r.text());\r\n  } catch { FN_MATCHES_DB = []; }\r\n  return FN_MATCHES_DB;\r\n}\r\n\r\nfunction fnSwitch(g) {\r\n  document.querySelectorAll('#vgl-finals-widget .fn-tab').forEach(b => {\r\n    b.className = 'fn-tab notranslate';\r\n    if (b.dataset.g === g) b.classList.add('act-' + g);\r\n  });\r\n  document.querySelectorAll('#vgl-finals-widget .fn-panel').forEach(p => p.classList.remove('show'));\r\n  document.getElementById('fn-'+g).classList.add('show');\r\n  if (FN_SHEET[g] && !FN_LOADED[g]) fnFetch(g);\r\n}\r\n\r\nasync function fnFetch(g) {\r\n  try {\r\n    const r = await fetch(FN_SHEET[g] + '&_=' + Date.now());\r\n    if (!r.ok) throw 0;\r\n    const d = fnParse(await r.text());\r\n\r\n    const dbRows = await fnFetchMatchesDB();\r\n    d.knockout = dbRows\r\n      .filter(m => fnIsRoC26(m.event) && FN_GAME_MATCH[g] && FN_GAME_MATCH[g](m.game) && fnIsKnockoutPhase(m.phase))\r\n      .map(m => ({\r\n        date: m.date, phase: m.phase, home: m.home, away: m.away,\r\n        score: m.result || m.time || '', hp: m.hp, ap: m.ap\r\n      }));\r\n\r\n    FN_LOADED[g] = d;\r\n    fnRender(g, d);\r\n  } catch {\r\n    const el = document.getElementById('fn-'+g+'-load');\r\n    if (el) el.innerHTML = '\u26a0\ufe0f Failed to load data.';\r\n  }\r\n}\r\n\r\nfunction fnCSVLine(line) {\r\n  const res=[]; let cur='', q=false;\r\n  for (let i=0; i<line.length; i++) {\r\n    const c=line[i];\r\n    if (c==='\"' && !q){q=true;continue}\r\n    if (c==='\"' && q){q=false;continue}\r\n    if (c===',' && !q){res.push(cur.trim());cur='';continue}\r\n    cur+=c;\r\n  }\r\n  res.push(cur.trim()); return res;\r\n}\r\n\r\n\/*\r\n  DATE HANDLING: the sheet's Date column now uses D\/M\/YY (e.g. 19\/7\/26).\r\n  This is only ever displayed as plain text in this widget (never passed\r\n  to `new Date(...)`), so the format change doesn't break the display.\r\n  For sorting matches *within* a knockout phase chronologically (in case\r\n  a phase has more than one match on the sheet in non-date order), we\r\n  parse it explicitly here instead of relying on new Date(string), which\r\n  would misread \"19\/7\/26\" as an invalid MM\/DD\/YY date.\r\n*\/\r\nfunction fnParseVGLDate(dateStr) {\r\n  if (!dateStr) return 0;\r\n  const parts = dateStr.trim().split('\/');\r\n  if (parts.length < 3) return 0;\r\n  let d = parseInt(parts[0], 10), m = parseInt(parts[1], 10), y = parseInt(parts[2], 10);\r\n  if (isNaN(d) || isNaN(m) || isNaN(y)) return 0;\r\n  if (y < 100) y += 2000;\r\n  return new Date(y, m - 1, d).getTime();\r\n}\r\n\r\nfunction fnParseScore(s) {\r\n  const m = (s || '').match(\/(\\d+)\\s*[-\u2013]\\s*(\\d+)\/);\r\n  if (!m) return null;\r\n  return { h: parseInt(m[1], 10), a: parseInt(m[2], 10) };\r\n}\r\n\r\nfunction fnFindPhase(knockout, names) {\r\n  const lnames = names.map(n => n.toLowerCase());\r\n  return knockout.find(m => lnames.includes((m.phase || '').trim().toLowerCase()));\r\n}\r\n\r\n\/*\r\n  PLAYER MAP: builds team-name \u2192 \"player \u00b7 player \u00b7 player\" lookup by\r\n  scanning every match (Group Stage + Knockout) for H\/A player names.\r\n  Used as a fallback wherever a specific match row doesn't carry its own\r\n  player list, so that a team's roster still shows up in the Standings\r\n  table and the Podium as long as it appeared with players in ANY match.\r\n*\/\r\nfunction fnBuildPlayerMap(d) {\r\n  const map = {};\r\n  const add = (team, players) => { if (team && players && !map[team]) map[team] = players; };\r\n  (d.groupMatches || []).forEach(m => { add(m.home, m.hp); add(m.away, m.ap); });\r\n  (d.knockout || []).forEach(m => { add(m.home, m.hp); add(m.away, m.ap); });\r\n  return map;\r\n}\r\n\r\n\/\/ Champion \/ 2nd \/ 3rd derived from the Final and Third Place matches,\r\n\/\/ including each team's players (from that match, falling back to the\r\n\/\/ global player map if the specific match row has no player names).\r\nfunction fnComputePodium(knockout, playerMap) {\r\n  const podium = { champion:'', championPlayers:'', second:'', secondPlayers:'', third:'', thirdPlayers:'' };\r\n  if (!knockout || !knockout.length) return podium;\r\n\r\n  const finalM = fnFindPhase(knockout, ['final']);\r\n  if (finalM) {\r\n    const sc = fnParseScore(finalM.score);\r\n    if (sc && sc.h !== sc.a) {\r\n      if (sc.h > sc.a) {\r\n        podium.champion = finalM.home; podium.championPlayers = finalM.hp || playerMap[finalM.home] || '';\r\n        podium.second   = finalM.away; podium.secondPlayers   = finalM.ap || playerMap[finalM.away] || '';\r\n      } else {\r\n        podium.champion = finalM.away; podium.championPlayers = finalM.ap || playerMap[finalM.away] || '';\r\n        podium.second   = finalM.home; podium.secondPlayers   = finalM.hp || playerMap[finalM.home] || '';\r\n      }\r\n    }\r\n  }\r\n\r\n  const thirdM = fnFindPhase(knockout, ['third place', '3rd place']);\r\n  if (thirdM) {\r\n    const sc = fnParseScore(thirdM.score);\r\n    if (sc && sc.h !== sc.a) {\r\n      if (sc.h > sc.a) { podium.third = thirdM.home; podium.thirdPlayers = thirdM.hp || playerMap[thirdM.home] || ''; }\r\n      else             { podium.third = thirdM.away; podium.thirdPlayers = thirdM.ap || playerMap[thirdM.away] || ''; }\r\n    }\r\n  }\r\n\r\n  return podium;\r\n}\r\n\r\nfunction fnRenderPodium(p) {\r\n  if (!p.champion && !p.second && !p.third) return '';\r\n  const col = (label, cls, name, players) => `\r\n      <div class=\"fn-podium-col ${cls} notranslate\">\r\n        <div class=\"fn-podium-label notranslate\">${label}<\/div>\r\n        <div class=\"fn-podium-name notranslate\">${name || 'TBD'}<\/div>\r\n        ${players ? `<div class=\"fn-podium-players notranslate\">${players}<\/div>` : ''}\r\n      <\/div>`;\r\n  return `<div class=\"fn-card notranslate\" style=\"margin-bottom:20px\">\r\n    <div class=\"fn-card-hdr\"><h2>\ud83c\udfc6 Podium<\/h2><\/div>\r\n    <div class=\"fn-podium-grid notranslate\">\r\n      ${col('Champion', 'p1', p.champion, p.championPlayers)}\r\n      ${col('2nd Place', 'p2', p.second, p.secondPlayers)}\r\n      ${col('3rd Place', 'p3', p.third, p.thirdPlayers)}\r\n    <\/div>\r\n  <\/div>`;\r\n}\r\n\r\n\/*\r\n  FIX (2026-07-11): Knockout matches were not being read from the sheet.\r\n  Two bugs fixed here:\r\n  1. The \"Knockout\" header row was only detected in column 0 or column 1\r\n     (f.includes('Knockout Stage') \/ c[1].includes(...)). If the label sat\r\n     in a different cell, or used slightly different wording, the parser\r\n     never switched into knockout mode. Now it checks the whole row,\r\n     case-insensitively, for \"knockout\" (and a Greek \"\u03c0\u03c1\u03bf\u03ba\u03c1\u03b9\u03b8\" variant for\r\n     the Qualified header too).\r\n  2. Once in knockout mode, home\/away were read from c[2]\/c[5], which is a\r\n     DIFFERENT column layout than the Group Stage matches (which use\r\n     c[4]\/c[6]). If your Knockout tab uses the same column layout as the\r\n     Group Stage tab (very likely, since it's usually copy-pasted from the\r\n     same template), the old code was reading empty\/wrong cells and\r\n     silently pushing nothing. The parser now tries the Group-Stage-style\r\n     layout first (c[4]\/c[6]) and falls back to the old compact layout\r\n     (c[2]\/c[5]) if that's empty \u2014 so it works with either sheet structure.\r\n*\/\r\nfunction fnParse(txt) {\r\n  const lines = txt.split('\\n').map(l=>l.replace(\/\\r$\/,''));\r\n  const d = {updatedAt:'', groups:{}, groupMatches:[], qualified:[], knockout:[]};\r\n  let sec=null, grp=null;\r\n  for (const line of lines) {\r\n    const c=fnCSVLine(line), f=c[0]||'';\r\n    const rowText = c.join(' ').toLowerCase();\r\n    if (f.startsWith('Updated:')) { d.updatedAt=f.replace('Updated:','').trim(); continue; }\r\n    if (c.every(x=>!x)) continue;\r\n    if (['#','Pos','\u0397\u03bc\/\u03bd\u03af\u03b1'].some(h=>f.startsWith(h))) continue;\r\n    if (rowText.includes('knockout')) { sec='knockout'; continue; }\r\n    if (rowText.includes('qualified') || rowText.includes('\u03c0\u03c1\u03bf\u03ba\u03c1\u03b9\u03b8')) { sec='qualified'; continue; }\r\n    if (f.startsWith('\ud83d\udcc5')||f.includes('\u0391\u03b3\u03ce\u03bd\u03b5\u03c2')||f.includes('Group Stage')) { sec='matches'; grp=null; continue; }\r\n    const gm=f.match(\/^Group\\s+([A-Z])$\/i);\r\n    if (gm) { grp='Group '+gm[1].toUpperCase(); if(!d.groups[grp]) d.groups[grp]=[]; sec='standings'; continue; }\r\n    if (sec==='standings' && grp) {\r\n      const pos=parseInt(f);\r\n      if (!isNaN(pos) && c[1])\r\n        d.groups[grp].push({pos,team:c[1],p:c[2]||'',w:c[3]||'',d_:c[4]||'',l:c[5]||'',gf:c[6]||'',ga:c[7]||'',gd:c[8]||'',pts:c[9]||'0'});\r\n    }\r\n    if (sec==='matches') {\r\n      if (f && c[4] && c[6]) d.groupMatches.push({date:f,group:c[2]||'',home:c[4],away:c[6],score:c[8]||'',hp:'',ap:''});\r\n      else if (!f && c[4] && d.groupMatches.length) { const l=d.groupMatches[d.groupMatches.length-1]; l.hp=c[4]; l.ap=c[6]||''; }\r\n    }\r\n    if (sec==='qualified' && c[1] && c[2] && f!=='Pos') d.qualified.push({pos:f,group:c[1],team:c[2]});\r\n    if (sec==='knockout') {\r\n      if (f && c[4] && c[6]) {\r\n        \/\/ Same layout as the Group Stage matches table, but column 2 now\r\n        \/\/ holds the \"Phase\" value (e.g. Quarterfinal \/ Semifinal) instead\r\n        \/\/ of a group letter: date, Phase, home, blank, away, blank, score.\r\n        d.knockout.push({date:f, phase:c[2]||'Knockout', home:c[4], away:c[6], score:c[8]||'', hp:'', ap:''});\r\n      } else if (!f && c[4] && d.knockout.length) {\r\n        \/\/ Player-name sub-row under the match above (same pattern used\r\n        \/\/ for Group Stage matches).\r\n        const l=d.knockout[d.knockout.length-1]; l.hp=c[4]; l.ap=c[6]||'';\r\n      } else if (f && c[2] && c[5]) {\r\n        \/\/ Fallback: old compact layout with no Phase column at all.\r\n        d.knockout.push({date:f, phase:'Knockout', home:c[2], away:c[5], score:c[8]||'', hp:'', ap:''});\r\n      }\r\n    }\r\n  }\r\n  return d;\r\n}\r\n\r\nfunction fnRender(g, d) {\r\n  const load = document.getElementById('fn-'+g+'-load');\r\n  const body = document.getElementById('fn-'+g+'-body');\r\n  if (load) load.style.display='none';\r\n  if (!body) return;\r\n\r\n  const playerMap = fnBuildPlayerMap(d);\r\n  d.playerMap = playerMap; \/\/ reused by fnMatchPage for the paged Group Stage matches\r\n\r\n  let h = '';\r\n  const hasGroups  = Object.keys(d.groups).length > 0;\r\n  const hasMatches = d.groupMatches.length > 0;\r\n\r\n  \/\/ Podium goes above the Group Stage \u2014 Standings card.\r\n  h += fnRenderPodium(fnComputePodium(d.knockout, playerMap));\r\n\r\n  if (hasGroups || hasMatches) {\r\n    h += `<div class=\"fn-gs-layout notranslate\">`;\r\n\r\n    if (hasGroups) {\r\n      h += `<div class=\"fn-gs-left notranslate\">\r\n        <div class=\"fn-card notranslate\">\r\n          <div class=\"fn-card-hdr\"><h2>\ud83d\udcca Group Stage \u2014 Standings<\/h2><\/div>`;\r\n      const groupKeys = Object.keys(d.groups);\r\n      const gridCols = groupKeys.length > 2 ? 'repeat(2,1fr)' : 'repeat(auto-fit,minmax(260px,1fr))';\r\n      h += `<div style=\"display:grid;grid-template-columns:${gridCols}\">`;\r\n      groupKeys.forEach(gk => {\r\n        h += `<div class=\"fn-group-block notranslate\">\r\n          <div class=\"fn-group-label\">\u2605 &nbsp;${gk}<\/div>\r\n          <table class=\"fn-tbl\"><thead><tr>\r\n            <th>#<\/th><th>Team<\/th><th>P<\/th><th>W<\/th><th>D<\/th><th>L<\/th><th>GF<\/th><th>GA<\/th><th>GD<\/th><th>Pts<\/th>\r\n          <\/tr><\/thead><tbody>`;\r\n        d.groups[gk].forEach((t,i) => {\r\n          const rc=i===0?'q1':'', pc=i===0?'pos-1':i===1?'pos-2':'';\r\n          const dot=i<2?`<span class=\"fn-qual-dot ${i===0?'d1':'d2'}\"><\/span>`:'';\r\n          const tp=t.team.match(\/^(.*?)\\s*(\\(\\s*\\d+\\s*\\))$\/);\r\n          const tName=tp?tp[1]:t.team;\r\n          const tSeedNum=tp?tp[2].replace(\/\\s\/g,''):'';\r\n          const tSeed=tSeedNum?`<span class=\"fn-seed\">${tSeedNum}<\/span>`:'';\r\n          const tPlayers = playerMap[tName] || playerMap[t.team] || '';\r\n          const playersHtml = tPlayers ? `<span class=\"fn-team-players notranslate\">${tPlayers}<\/span>` : '';\r\n          h+=`<tr class=\"${rc} notranslate\"><td class=\"${pc}\">${t.pos}<\/td><td><span class=\"fn-team-name notranslate\">${dot}${tName}${tSeed}<\/span>${playersHtml}<\/td><td>${t.p}<\/td><td>${t.w}<\/td><td>${t.d_}<\/td><td>${t.l}<\/td><td>${t.gf}<\/td><td>${t.ga}<\/td><td>${t.gd}<\/td><td class=\"fn-pts\">${t.pts}<\/td><\/tr>`;\r\n        });\r\n        h += `<\/tbody><\/table><\/div>`;\r\n      });\r\n      h += `<\/div><\/div><\/div>`;\r\n    }\r\n\r\n    if (hasMatches) {\r\n      h += `<div class=\"fn-gs-right notranslate\">\r\n        <div class=\"fn-card notranslate\">\r\n          <div class=\"fn-card-hdr\"><h2>\ud83c\udfae Group Stage \u2014 Matches<\/h2><\/div>\r\n          <div class=\"fn-matches-wrap notranslate\">\r\n            <div id=\"fn-${g}-mgrid\" class=\"fn-matches-grid notranslate\"><\/div>\r\n          <\/div>\r\n          <div class=\"fn-pager notranslate\" id=\"fn-${g}-mpager\"><\/div>\r\n        <\/div>\r\n      <\/div>`;\r\n    }\r\n\r\n    h += `<\/div>`;\r\n  }\r\n\r\n  \/\/ Quarterfinals \/ Semifinals \/ Third Place \/ Final \u2014 grouped by the\r\n  \/\/ \"Phase\" value written next to each match on the sheet. Falls back to\r\n  \/\/ a generic \"Knockout\" bucket if a match has no Phase filled in yet.\r\n  if (d.knockout.length) {\r\n    \/\/ Display order: Final \u2192 Third Place \u2192 Semifinal \u2192 Quarterfinal.\r\n    \/\/ Matched by exact phase name (case-insensitive) \u2014 anything not in\r\n    \/\/ this list keeps its original first-seen order and is appended last.\r\n    const PHASE_ORDER = ['final','third place','3rd place','semifinal','quarterfinal'];\r\n    const phaseOrder = [];\r\n    const byPhase = {};\r\n    d.knockout.forEach(m => {\r\n      const p = (m.phase || 'Knockout').trim() || 'Knockout';\r\n      if (!byPhase[p]) { byPhase[p] = []; phaseOrder.push(p); }\r\n      byPhase[p].push(m);\r\n    });\r\n    phaseOrder.sort((a,b) => {\r\n      const ai = PHASE_ORDER.indexOf(a.toLowerCase());\r\n      const bi = PHASE_ORDER.indexOf(b.toLowerCase());\r\n      if (ai===-1 && bi===-1) return 0;\r\n      if (ai===-1) return 1;\r\n      if (bi===-1) return -1;\r\n      return ai-bi;\r\n    });\r\n    \/\/ Sort matches within each phase chronologically (D\/M\/YY-safe).\r\n    phaseOrder.forEach(p => byPhase[p].sort((a,b) => fnParseVGLDate(a.date) - fnParseVGLDate(b.date)));\r\n\r\n    h += `<div class=\"fn-card notranslate\" style=\"margin-bottom:20px\">\r\n      <div class=\"fn-card-hdr\"><h2>\u26a1 Knockout Stage<\/h2><\/div>\r\n      <div class=\"fn-matches-wrap notranslate\">`;\r\n    phaseOrder.forEach(p => {\r\n      h += `<div class=\"fn-phase-block notranslate\">\r\n        <div class=\"fn-phase-label notranslate\">${p}<\/div>\r\n        <div class=\"fn-matches-grid notranslate\">`;\r\n      byPhase[p].forEach(m => {\r\n        const sc=m.score||'\u2014', isScore=\/\\d+[-\u2013]\\d+\/.test(sc);\r\n        const hpText = m.hp || playerMap[m.home] || '';\r\n        const apText = m.ap || playerMap[m.away] || '';\r\n        const hp=hpText?`<span class=\"fn-match-player h notranslate\">${hpText}<\/span>`:'';\r\n        const ap=apText?`<span class=\"fn-match-player a notranslate\">${apText}<\/span>`:'';\r\n        h+=`<div class=\"fn-match notranslate\">\r\n          <div class=\"fn-match-grp notranslate\">${m.date}<\/div>\r\n          <div class=\"fn-match-row notranslate\">\r\n            <div><div class=\"fn-match-team h notranslate\">${m.home}<\/div>${hp}<\/div>\r\n            <div class=\"${isScore?'fn-score':'fn-time'} notranslate\">${sc}<\/div>\r\n            <div><div class=\"fn-match-team a notranslate\">${m.away}<\/div>${ap}<\/div>\r\n          <\/div>\r\n        <\/div>`;\r\n      });\r\n      h += `<\/div><\/div>`;\r\n    });\r\n    h += `<\/div><\/div>`;\r\n  }\r\n\r\n  if (!h) h='<div class=\"fn-card\"><div class=\"fn-soon\">No data found.<\/div><\/div>';\r\n  body.innerHTML = h;\r\n  if (d.updatedAt) document.getElementById('fn-ts').textContent = 'Last updated: ' + d.updatedAt;\r\n\r\n  if (d.groupMatches.length) {\r\n    FN_PAGES[g] = 1;\r\n    fnMatchPage(g, d.groupMatches, 1);\r\n  }\r\n}\r\n\r\nfunction fnMatchPage(g, matches, pg) {\r\n  FN_PAGES[g] = pg;\r\n  const total = matches.length, pages = Math.ceil(total\/PER_PAGE);\r\n  const slice = matches.slice((pg-1)*PER_PAGE, pg*PER_PAGE);\r\n  const grid  = document.getElementById('fn-'+g+'-mgrid');\r\n  const pager = document.getElementById('fn-'+g+'-mpager');\r\n  if (!grid) return;\r\n\r\n  const playerMap = (FN_LOADED[g] && FN_LOADED[g].playerMap) || {};\r\n\r\n  let gHTML = '';\r\n  slice.forEach(m => {\r\n    const sc=m.score||'\u2014', isScore=\/\\d+[-\u2013]\\d+\/.test(sc);\r\n    const hpText = m.hp || playerMap[m.home] || '';\r\n    const apText = m.ap || playerMap[m.away] || '';\r\n    const hp=hpText?`<span class=\"fn-match-player h notranslate\">${hpText}<\/span>`:'';\r\n    const ap=apText?`<span class=\"fn-match-player a notranslate\">${apText}<\/span>`:'';\r\n    gHTML+=`<div class=\"fn-match notranslate\">\r\n      <div class=\"fn-match-grp notranslate\">${m.group}<\/div>\r\n      <div class=\"fn-match-row notranslate\">\r\n        <div><div class=\"fn-match-team h notranslate\">${m.home}<\/div>${hp}<\/div>\r\n        <div class=\"${isScore?'fn-score':'fn-time'} notranslate\">${sc}<\/div>\r\n        <div><div class=\"fn-match-team a notranslate\">${m.away}<\/div>${ap}<\/div>\r\n      <\/div>\r\n    <\/div>`;\r\n  });\r\n  grid.innerHTML = gHTML;\r\n\r\n  if (!pager) return;\r\n  if (pages <= 1) { pager.style.display='none'; return; }\r\n  pager.style.display = 'flex';\r\n  let pH = `<button class=\"fn-pg-btn notranslate\" ${pg===1?'disabled':''} onclick=\"fnMatchPage('${g}',FN_LOADED['${g}'].groupMatches,${pg-1})\">\u2039<\/button>`;\r\n  for (let i=1;i<=pages;i++)\r\n    pH+=`<button class=\"fn-pg-btn notranslate ${i===pg?'active':''}\" onclick=\"fnMatchPage('${g}',FN_LOADED['${g}'].groupMatches,${i})\">${i}<\/button>`;\r\n  pH+=`<button class=\"fn-pg-btn notranslate\" ${pg===pages?'disabled':''} onclick=\"fnMatchPage('${g}',FN_LOADED['${g}'].groupMatches,${pg+1})\">\u203a<\/button>`;\r\n  pager.innerHTML = pH;\r\n}\r\n\r\nfnSwitch('eafc');\r\n\r\nfunction fnFixBorders() {\r\n  document.querySelectorAll('#vgl-finals-widget .fn-tbl td, #vgl-finals-widget .fn-tbl th').forEach(el => {\r\n    el.style.setProperty('border', 'none', 'important');\r\n    el.style.setProperty('border-bottom', '1px solid rgba(255,255,255,0.04)', 'important');\r\n    el.style.setProperty('box-shadow', 'none', 'important');\r\n    el.style.setProperty('outline', 'none', 'important');\r\n  });\r\n  document.querySelectorAll('#vgl-finals-widget .fn-tbl tr:last-child td').forEach(el => {\r\n    el.style.setProperty('border-bottom', 'none', 'important');\r\n  });\r\n}\r\nconst _origRender = fnRender;\r\nfnRender = function(g, d) { _origRender(g, d); setTimeout(fnFixBorders, 50); };\r\nsetTimeout(fnFixBorders, 500);\r\n\r\nsetInterval(() => {\r\n  FN_MATCHES_DB = null;\r\n  Object.keys(FN_LOADED).forEach(g => { if (FN_SHEET[g]) { FN_LOADED[g]=null; fnFetch(g); } });\r\n}, 2*60*1000);\r\n<\/script>\r\n<\/body>\r\n<\/html>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>&#77;&#97;&#116;&#99;&#104;&#101;&#115; &#82;&#101;&#115;&#117;&#108;&#116;&#115; Est. 2015 \u2014 Athens, Greece Greece&#8217;s Official Esports Ecosystem Compete.Win.Represent. Join a Tournament \u2192 Learn More 2024WinnerSports Marketing Award 2025WinnerSports Marketing Award 2026WinnerSports Marketing Award Final Stage Season 1 &mdash; Final Stage EA FC 26 Rocket League eFootball Loading data\u2026 Loading data\u2026 Loading data\u2026<\/p>","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_mi_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"_links":{"self":[{"href":"https:\/\/vglesports.com\/el\/wp-json\/wp\/v2\/pages\/33867"}],"collection":[{"href":"https:\/\/vglesports.com\/el\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/vglesports.com\/el\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/vglesports.com\/el\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/vglesports.com\/el\/wp-json\/wp\/v2\/comments?post=33867"}],"version-history":[{"count":0,"href":"https:\/\/vglesports.com\/el\/wp-json\/wp\/v2\/pages\/33867\/revisions"}],"wp:attachment":[{"href":"https:\/\/vglesports.com\/el\/wp-json\/wp\/v2\/media?parent=33867"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}