Skip to content
View zendulu's full-sized avatar

Block or report zendulu

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Maximum 250 characters. Please don't include any personal information such as legal names or email addresses. Markdown supported. This note will be visible to only you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse

Pinned Loading

  1. zendrive zendrive Public

    Custom pacenote and co-driver plugin for EA Sports WRC

    Python 2

  2. EA Sports WRC Club script. You can u... EA Sports WRC Club script. You can use this script to help navigate EA Sports WRC Racenet clubs. Join Barrel rollers discord: https://discord.gg/barrelrollers and See: https://discord.com/channels/612903610061422592/1153198692401164349/1339769793481408592 for instructions on how to use. minified version of https://gist.github.com/zendulu/568d342c1d7d398e7e52d72ae70b5860
    1
    function getOptions(e=!1){const n={headers:{accept:"application/json, text/plain, */*","accept-language":"en-US,en;q=0.6","content-type":"application/json"},referrer:"https://racenet.com/",referrerPolicy:"strict-origin-when-cross-origin",method:"GET",credentials:"include"};return!1!==e&&(n.headers.authorization=`Bearer ${e}`),n}function strings(e){switch(e){case"STAGE_INFO_SHOW":return"Show Stages";case"STAGE_INFO_HIDE":return"Hide Stages";default:return"Unhandled"}}function consts(e){switch(e){case"SECONDS_IN_DAY":return 86400;case"SECONDS_IN_HOUR":return 3600;case"SECONDS_IN_MINUTE":return 60}}async function getBearer(){const e=getOptions();e.method="POST",e.body='{"clientId":"RACENET_1_JS_WEB_APP","grantType":"refresh_token","refreshToken":"","redirectUri":"https://racenet.com/oauthCallback","authCode":"","codeVerifier":""}';const n=await fetch("https://web-api.racenet.com/api/identity/refresh-auth",e);return(await n.json()).access_token}async function getClubInfo(e,n){const t=getOptions(e),a=`https://web-api.racenet.com/api/wrc2023clubs/${n.clubID}?includeChampionship=true`,r=await fetch(a,t);return await r.json()}function isEventOpen(e){const n=new Date;if(void 0!==e.absoluteOpenDate&&void 0!==e.absoluteCloseDate){const t=new Date(e.absoluteOpenDate),a=new Date(e.absoluteCloseDate);return t<n&&n<a}return!1}function leaderBoardStatus(e){if(void 0===e.leaderboard)return"NA";if(e.leaderboard.entries.find(e=>!0===e.playerEntry))return"🟒";for(const n of e.stages){if(n.leaderboard.entries.find(e=>!0===e.playerEntry))return"🟑"}return"πŸ”΄"}function isClubOpen(e){return!!e.currentChampionship&&isEventOpen(e.currentChampionship)}function findCurrentEvent(e){if(isClubOpen(e))return e.currentChampionship.events.find(e=>isEventOpen(e))}function staticGetGameData(){return{orderedLocations:[{id:5,value:"RALLY MEDITERRANEO"},{id:6,value:"VODAFONE RALLY DE PORTUGAL"},{id:7,value:"RALLY ITALIA SARDEGNA"},{id:8,value:"RALLY ESTONIA"},{id:9,value:"RALLY SCANDIA"},{id:12,value:"GUANAJUATO RALLY MΓ‰XICO"},{id:13,value:"RALLY CHILE BIO BÍO"},{id:14,value:"AGON BY AOC RALLY PACIFICO"},{id:15,value:"SECTO RALLY FINLAND"},{id:16,value:"CROATIA RALLY"},{id:17,value:"RALLYE MONTE-CARLO"},{id:18,value:"RALLY SWEDEN"},{id:24,value:"EKO ACROPOLIS RALLY GREECE"},{id:25,value:"FORUM8 RALLY JAPAN"},{id:26,value:"SAFARI RALLY KENYA"},{id:27,value:"FANATEC RALLY OCEANIA"},{id:28,value:"RALLY IBERIA"},{id:29,value:"CENTRAL EUROPE RALLY"},{id:30,value:"TET RALLY LATVIA"},{id:31,value:"ORLEN 80TH RALLY POLAND"}],orderedVehicleClasses:[{id:1,value:"H1 (FWD)"},{id:2,value:"H2 (FWD)"},{id:3,value:"H2 (RWD)"},{id:4,value:"H3 (RWD)"},{id:5,value:"Group B (RWD)"},{id:6,value:"Group B (4WD)"},{id:7,value:"NR4/R4"},{id:8,value:"Rally4"},{id:9,value:"S1600"},{id:10,value:"S2000"},{id:11,value:"F2 Kit Car"},{id:12,value:"Group A"},{id:13,value:"World Rally Car 1997 - 2011"},{id:14,value:"Rally2"},{id:17,value:"World Rally Car 2017 - 2021"},{id:19,value:"WRC"},{id:20,value:"JWRC"},{id:21,value:"WRC2"},{id:23,value:"World Rally Car 2012 - 2016"}]}}async function getGameData(e){const n=getOptions(e),t=await fetch("https://web-api.racenet.com/api/wrc2023Stats/values",n);if(200===t.status){return await t.json()}}async function getEventLeaderboard(e,n,t,a=!0){const r=getOptions(e);let i=`https://web-api.racenet.com/api/wrc2023clubs/${n}/leaderboard/${t}?SortCumulative=true&ResultCount=20`;a||(i=`https://web-api.racenet.com/api/wrc2023clubs/${n}/leaderboard/${t}?SortCumulative=false&MaxResultCount=20&FocusOnMe=false&Platform=0`);const l=await fetch(i,r);if(200===l.status){return await l.json()}}function progressBar(e,n,t,a){const r=document.createElement("label");r.innerText=`${n} (${t}/${a}) `,r.setAttribute("for","club-download-progress");const i=document.createElement("progress");i.setAttribute("id","club-download-progress"),i.value=t,i.max=a,e.innerHTML="",e.style.width="75%",i.style.width="100%",e.style.width="100%",e.appendChild(r),e.appendChild(document.createElement("br")),e.appendChild(i)}function addCssToDocument(e){var n=document.createElement("style");n.setAttribute("type","text/css"),n.innerText=e,document.head.appendChild(n)}function getPlace(e){const n=e.entries.find(e=>!0===e.playerEntry);return n?`${n.rank}/${e.totalEntrantCount} (${(100*n.rank/e.totalEntrantCount).toFixed(0)}%)`:`-/${e.totalEntrantCount}`}function getTime(e){const n=e.entries.find(e=>!0===e.playerEntry);if(!n)return"-";let t=`<br/>+(${trimFourZeros(n.differenceToFirst)})`;return 1===n.rank&&(t="🏁"),`${trimFourZeros(n.timeAccumulated)}${t}`}function getSelfInfo(e){const n=e.entries.find(e=>!0===e.playerEntry);if(!n)return"";let t=`<p>${db(n.vehicle)}<b</p>\n    <p>${trimFourZeros(n.timeAccumulated)}</p>\n    <p>+(${trimFourZeros(n.differenceToFirst)})</p>`;return 1===n.rank&&(t="<p>🏁</p>"),`\n      <div class="placement-tag">\n        ME\n      </div>\n      <div class="placement-details smoked">\n        ${t}\n      </div>`}function getLeaderInfo(e){return void 0===e||void 0===e.entries||e.entries.length<1?'<div class="placement-tag">P1</div><div class="placement-details smoked">-</div>':`\n      <div class="placement-tag">\n          P1\n      </div>\n      <div class="placement-details smoked">\n        <p>${db(e.entries[0].displayName)}</p>\n        <p>${db(e.entries[0].vehicle)}<b</p>\n        <p>${trimFourZeros(e.entries[0].timeAccumulated)}</p>\n      </div>\n    `}function currentClubClickHandler(e){return()=>{const n=document.getElementById("overlay");n.style.display="flex",n.innerHTML=`\n        <div class="current-club current-club-card" style="background-image: url(${getClubImage(e)});">\n          <div class="smoked bubbled centered">\n              <p class="larger">Current Club</p>\n          </div>\n          <div class="smoked bubbled centered">\n              <p class="larger">${db(e.clubName)}<span class="club-number">(${e.clubID})</span></p>\n              <p class="smaller">${db(e.ownerDisplayName)}</p>\n          </div>\n        </div>\n        <div class="current-club current-club-card" style="background-image: url(${getClubImage(e)});">\n          <div class="smoked bubbled centered">\n              <p class="larger">Current Club</p>\n          </div>\n          <div class="smoked bubbled centered">\n              <p class="larger">${db(e.clubName)}</p>\n              <p class="smaller">${db(e.ownerDisplayName)}</p>\n          </div>\n        </div>\n        <div class="current-club fixed-single-line mark-boundary centered">\n          ${db(e.clubName)}<span class="club-number">(${e.clubID})</span> – ${db(e.ownerDisplayName)}\n        </div>\n        <div class="current-club fixed-single-line mark-boundary centered">\n          ${db(e.clubName)} – ${db(e.ownerDisplayName)}\n        </div>\n        <div class="current-club fixed-single-line mark-boundary">\n          Current Club: ${db(e.clubName)}<span class="club-number">(${e.clubID})</span> – ${db(e.ownerDisplayName)}\n        </div>\n        <div class="current-club fixed-single-line mark-boundary">\n          Current Club: ${db(e.clubName)} – ${db(e.ownerDisplayName)}\n        </div>\n        <div class="current-club stacked mark-boundary">\n            <div class="mark-boundary">\n              <div class="centered">${db(e.clubName)}<span class="club-number">(${e.clubID})</span></div>\n              <div class="centered">${db(e.ownerDisplayName)}</div>\n            </div>\n        </div>\n        <div class="current-club stacked mark-boundary">\n            <div class="mark-boundary">\n              <div class="centered">${db(e.clubName)}</div>\n              <div class="centered">${db(e.ownerDisplayName)}</div>\n            </div>\n        </div>\n        <div class="current-club stacked mark-boundary">\n            <div class="mark-boundary">\n              <div class="centered">Current Club</div>\n              <div class="centered">${db(e.clubName)}<span class="club-number">(${e.clubID})</span></div>\n              <div class="centered">${db(e.ownerDisplayName)}</div>\n            </div>\n        </div>\n        <div class="current-club stacked mark-boundary">\n            <div class="mark-boundary">\n              <div class="centered">Current Club</div>\n              <div class="centered">${db(e.clubName)}</div>\n              <div class="centered">${db(e.ownerDisplayName)}</div>\n            </div>\n        </div>\n        <div class="current-club single-line mark-boundary">\n          <div class="marquee marquee--reverse">\n            <ul class="marquee__content">\n              <li>Current Club:&nbsp;${db(e.clubName)} – ${db(e.ownerDisplayName)}</li>\n              <li>Current Club:&nbsp;${db(e.clubName)} – ${db(e.ownerDisplayName)}</li>\n            </ul>\n\n            <ul aria-hidden="true" class="marquee__content">\n              <li>Current Club:&nbsp;${db(e.clubName)} – ${db(e.ownerDisplayName)}</li>\n              <li>Current Club:&nbsp;${db(e.clubName)} – ${db(e.ownerDisplayName)}</li>\n            </ul>\n          </div>\n        </div>\n\n        <div class="current-club single-line mark-boundary">\n          <div class="marquee marquee--reverse">\n            <ul class="marquee__content">\n              <li>Current Club:&nbsp;${db(e.clubName)}<span class="club-number">(${e.clubID})</span> – ${db(e.ownerDisplayName)}</li>\n              <li>Current Club:&nbsp;${db(e.clubName)}<span class="club-number">(${e.clubID})</span> – ${db(e.ownerDisplayName)}</li>\n            </ul>\n\n            <ul aria-hidden="true" class="marquee__content">\n              <li>Current Club:&nbsp;${db(e.clubName)}<span class="club-number">(${e.clubID})</span> – ${db(e.ownerDisplayName)}</li>\n              <li>Current Club:&nbsp;${db(e.clubName)}<span class="club-number">(${e.clubID})</span> – ${db(e.ownerDisplayName)}</li>\n            </ul>\n          </div>\n        </div>\n          `}}function stageInfoClickHandler(e){return()=>{const n=document.getElementById(`btn-stage-info-${e}`),t=document.getElementById(`stage-info-${e}`);n.innerHTML===strings("STAGE_INFO_SHOW")?(n.innerHTML=strings("STAGE_INFO_HIDE"),t.style.display="block"):(n.innerHTML=strings("STAGE_INFO_SHOW"),t.style.display="none")}}function trimFourZeros(e){return e.replace(/0{4}$/,"")}function getStageInfo(e){const n=document.createElement("table");n.setAttribute("class","solid strip"),n.setAttribute("id",`stage-info-table-${e.id}`);const t=n.createTHead().insertRow(0);return["Stage","Distance","Route","Time of Day","Weather/Surface","Service","Place","Time"].forEach((e,n)=>{t.insertCell(n).innerHTML=e}),e.stages.forEach((e,t)=>{const a=e.stageSettings,r=n.insertRow(t+1);[t+1,a.distance,a.route,a.timeOfDay,a.weatherAndSurface,a.serviceArea,getPlace(e.leaderboard),getTime(e.leaderboard)].forEach((e,n)=>{r.insertCell(n).innerHTML=e})}),n.outerHTML}function getStageSummary(e,n=!1){let t="Stage(s): ";n&&(t="");let a=0;return e.stages.forEach(e=>{const n=e.stageSettings;a+=n.distance}),`${t}${e.stages.length} (${a.toFixed(1)}km)`}function dayString(e){return e>=1?`${e}&nbsp;d&nbsp;`:""}function pad(e){return e.toString().padStart(2,"0")}function clumsyTimeFromNow(e){const n=new Date,t=new Date(e),a=Math.abs(n-t)/1e3;var r=Math.floor(a/consts("SECONDS_IN_DAY")),i=Math.floor(a%consts("SECONDS_IN_DAY")/consts("SECONDS_IN_HOUR")),l=Math.floor(a%consts("SECONDS_IN_HOUR")/consts("SECONDS_IN_MINUTE"));return`${dayString(r)}${pad(i)}:${pad(l)}h`}async function getClubs(e,n){const t=getOptions(e);let a=1,r=[];for(let e=0;e<a;e++){const i=`https://web-api.racenet.com/api/wrc2023clubs/memberships/active?take=20&skip=${20*e}&includeChampionship=true`,l=await fetch(i,t),s=await l.json();1===a&&(a=Math.ceil(s.totalActiveMemberships/20)),progressBar(n,"Getting club overview data",e,a),r=[...r,...s.activeMemberships]}const i=new Date;r=r.filter(e=>{if(!e.currentChampionshipSummary)return!1;return!(new Date(e.currentChampionshipSummary.absoluteEndDate)<i)});const l=[];let s=0;return r.forEach(t=>{l.push(new Promise(a=>{getClubInfo(e,t).then(e=>{t.info=e,t.event=findCurrentEvent(e)}).then(async()=>{if(void 0!==t.event){t.event.leaderboard=await getEventLeaderboard(e,t.clubID,t.event.leaderboardID);for(const[n,a]of t.event.stages.entries())t.event.stages[n].leaderboard=await getEventLeaderboard(e,t.clubID,a.leaderboardID,!1)}s+=1,progressBar(n,`Got active club info ${t.clubName}`,s,r.length),a()})}))}),await Promise.allSettled(l),r.sort((e,n)=>(aTime=new Date(e.currentChampionshipSummary.absoluteEndDate),bTime=new Date(n.currentChampionshipSummary.absoluteEndDate),aTime-bTime)),r.forEach((e,n)=>{e.clubPosition=[n+1]}),r.sort((e,n)=>void 0!==e.event&&void 0===n.event?-1:void 0===e.event&&void 0!==n.event?1:void 0===e.event&&void 0===n.event?0:new Date(e.event.absoluteCloseDate).getTime()-new Date(n.event.absoluteCloseDate).getTime()),r}function getClubImage(e,n="Landscape"){return`https://ecdn.codemasters.com/ecdn/Racenet/PROD/WRC2023/clubs/cover_images/T_ClubsPanelBg${e.imageCatalogueID.padStart(2,"0")}_Image_${n}.jpg`}function getDegradation(e,n=!1){let t="Degradation: ";switch(n&&(t=""),e.info.currentChampionship.settings.trackDegradation){case 0:return`${t}None`;case 1:return`${t}Light`;case 2:return`${t}Moderate`;case 3:return`${t}Heavy`;case 4:return`${t}Maximum`;default:return`${t}Unknown`}}function currentClubButton(e,n=!1){let t="";return n&&(t="row-"),`<div id="current-club-btn-${t}${e.clubID}" class="btn">\n      ${n?"Show":"Current Club"}\n    </div>`}function stageInfoButton(e){const n=document.createElement("div");return n.setAttribute("id",`btn-stage-info-${e.event.id}`),n.setAttribute("role","button"),n.setAttribute("tabindex","0"),n.setAttribute("class","btn"),n.innerText=strings("STAGE_INFO_SHOW"),n.outerHTML}function getTopCard(e){const n=document.createElement("div");return n.setAttribute("class","top-card"),n.innerHTML=`\n      <div class="main-card" style="background-image: url(${getClubImage(e)});">\n        <div class="card-header">\n            <div class="bubbled fifty">\n                <span class="shadowed">${leaderBoardStatus(e.event)}</span>\n                <span class="smoked bubbled tiny">${clumsyTimeFromNow(e.event.absoluteCloseDate)}</span>\n            </div>\n            <div class="smoked bubbled">\n              ${e.clubPosition}\n            </div>\n            <div class="bubbled fifty right">\n                <span class="smoked bubbled tiny">${getPlace(e.event.leaderboard)}</span>\n            </div>\n        </div>\n        <div class="card-overview hondo">\n            <a target="blank" href="https://racenet.com/ea_sports_wrc/clubs/${e.clubID}">\n                <div class="smoked bubbled centered">\n                    <p class="larger">${db(e.clubName)} <span class="club-number">(${e.clubID})</span></p>\n                    <p class="smaller">${db(e.ownerDisplayName)}</p>\n                </div>\n            </a>\n        </div>\n        <div class="card-details hondo">\n            <div class="card-details hondo">\n                <div class="info-box smoked bubbled centered fifty">\n                    <p>${db(e.event.eventSettings.location)}</p>\n                    <p>${db(e.event.eventSettings.weatherSeason)}</p>\n                    <p>${db(e.event.eventSettings.vehicleClass)}</p>\n                </div>\n                <div class="info-box smoked bubbled fifty centered ">\n                  <p>${getDegradation(e)}</p>\n                  <p>${e.info.currentChampionship.settings.isHardcoreDamageEnabled?"Damage: Hardcore":"Damage: Normal"}</p>\n                  <p>${getStageSummary(e.event)}</p>\n                </div>\n            </div>\n        </div>\n      </div>\n      <div class="side-card">\n        <div class="side-info">\n            ${getLeaderInfo(e.event.leaderboard)}\n        </div>\n        <div class="side-info">\n            ${getSelfInfo(e.event.leaderboard)}\n        </div>\n        <div class="btn-bar">\n            ${currentClubButton(e)}\n            ${stageInfoButton(e)}\n          </div>\n        </div>\n      </div>`,n}function getBottomCard(e,n=!1){let t="";n&&(t="row-");const a=document.createElement("div");a.setAttribute("class","bottom-card");const r=getStageInfo(e.event);return a.innerHTML=`\n      <div id=stage-info-${t}${e.event.id} class="stage-info">\n        ${r}\n      </div>`,a}function getClubCard(e){const n=document.createElement("div"),t=document.createElement("div");return n.setAttribute("class",`clubCard vehicle-${e.event.eventSettings.vehicleClassID} location-${e.event.eventSettings.locationID}`),t.setAttribute("class","bottom-card"),n.appendChild(getTopCard(e)),n.appendChild(getBottomCard(e)),n}function addClubRow(e,n){const t=document.createElement("tr");t.setAttribute("class",`clubRow vehicle-${n.event.eventSettings.vehicleClassID} location-${n.event.eventSettings.locationID}`);[`${leaderBoardStatus(n.event)}&nbsp;${getPlace(n.event.leaderboard)}`,clumsyTimeFromNow(n.event.absoluteCloseDate),currentClubButton(n,!0),`<a target="blank" href="https://racenet.com/ea_sports_wrc/clubs/${n.clubID}">${n.clubName}</a>`,n.ownerDisplayName,db(n.event.eventSettings.location),db(n.event.eventSettings.weatherSeason),db(n.event.eventSettings.vehicleClass),getDegradation(n,!0),n.info.currentChampionship.settings.isHardcoreDamageEnabled?"Hardcore":"Normal",getStageSummary(n.event,!0)].forEach((e,n)=>{const a=document.createElement("td");a.innerHTML=e,t.appendChild(a)}),e.appendChild(t)}function addClickHandlers(e){const n=document.getElementById(`btn-stage-info-${e.event.id}`);n.onclick=stageInfoClickHandler(e.event.id),n.onkeydown=stageInfoClickHandler(e.event.id);const t=document.getElementById(`current-club-btn-${e.clubID}`);t.onclick=currentClubClickHandler(e),t.onkeydown=currentClubClickHandler(e);const a=document.getElementById(`current-club-btn-row-${e.clubID}`);a.onclick=currentClubClickHandler(e),a.onkeydown=currentClubClickHandler(e)}function db(e){return e.replaceAll("AGON by AOC ","").replaceAll("ORLEN 80th ","").replaceAll("Guanajuato ","").replaceAll("FANATEC ","").replaceAll("EKO Acropolis ","").replaceAll("World Rally Car","WRC").replaceAll("McRae Motorsport","McRae").replaceAll("Vodafone ","").replaceAll("FORUM8 ","").replaceAll("Tet ","").replaceAll("Safari ","").replaceAll("Secto ","").replaceAll("Toyota GR ","").replaceAll(" ","&nbsp;").replaceAll("-","&#8209;")}function showClub(e,n,t){return"all"===t||!!e.contains(`${n}${t}`)}function adjustDisplaySetting(){const e=document.getElementById("displaySetting").value;[{key:"table",class:"table-container",display:"block"},{key:"card",class:"card-container",display:"flex"}].forEach(n=>{const t=document.getElementsByClassName(n.class);for(let a of t)e==n.key?a.style.display=n.display:a.style.display="none"}),adjustClubVisibility()}function adjustClubVisibility(){const e=document.getElementById("filterLocation").value,n=document.getElementById("filterVehicle").value,t=document.getElementsByClassName("clubCard");for(let a of t)showClub(a.classList,"location-",e)&&showClub(a.classList,"vehicle-",n)?a.style.display="block":a.style.display="none";const a=document.getElementsByClassName("clubRow");for(let t of a)showClub(t.classList,"location-",e)&&showClub(t.classList,"vehicle-",n)?t.style.display="table-row":t.style.display="none"}addCssToDocument("\n#clubInfo {\n  background-color: #333333;\n  color: white;\n  margin-left: auto;\n  margin-right: auto;\n  display: flex;\n  flex-wrap: wrap;\n}\n\n.card-container {\n  display: flex;\n  flex-wrap: wrap;\n}\n\n#controls {\n  width: 100%;\n  text-align: center;\n\n  select {\n    padding: 0.5em;\n    margin: 1em;\n  }\n}\n\n#overlay {\n  position: fixed;\n  display: none;\n  flex-wrap: wrap;\n  height: 100%;\n  padding: 0;\n  margin: 0;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n  height: 100%;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background-color: #000;\n  z-index: 2;\n  cursor: pointer;\n}\n\na {\n  color: white;\n  text-decoration: none;\n}\n\nprogress {\n  height: 3em;\n  min-width: 400px;\n  width: 100%\n  background-color: #eee;\n  border-radius: 2px;\n  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25) inset;\n}\n\ntable {\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.btn {\n  background-color: #FF4747;\n  backdrop-filter: blur(5px);\n  cursor: pointer;\n  border: 0.0625em solid white;\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n  height: 1.5em;\n  padding: .125em .25em .25em .25em;\n  width: fit-content;\n  text-align: center;\n  border-radius: 10px;\n  font-size: medium;\n  margin: .25em;\n}\n\n\n.btn:hover {\n  background-color: #CC1414;\n}\n\n.btn-bar {\n  display: flex;\n}\n\n.bubbled {\n  border-radius: 5px;\n  padding: 0.25em;\n  margin: 0.125em;\n  width: fit-content;\n}\n\n.card-details {\n  display: flex;\n  width: 100%;\n  font-size: xx-small;\n}\n\n.card-header {\n  display: flex;\n  width: 100%;\n  justify-content: flex-start;\n}\n\n.card-overview {\n  display: grid;\n  text-align: center;\n  justify-self: center;\n  justify-content: center;\n  width: 100%;\n}\n\n.centered {\n  text-align: center;\n  justify-self: center;\n  justify-content: center;\n\n}\n\n.club-number {\n  font-size: x-small;\n  vertical-align: middle;\n}\n\n.current-club-card {\n  display: flex;\n  width: 230px;\n  flex-direction: column;\n  background-size: cover;\n  background-repeat: no-repeat;\n  background-position: center;\n  color: white;\n  padding: 0.125em;\n  border-radius: 5px;\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n  font-family: Arial, sans-serif;\n  margin: 1em;\n  align-items: center;\n  justify-content: center;\n}\n.current-club-card p {\n  margin: 0px;\n}\n\n.current-club-card .bubbled {\n  margin: 0px;\n}\n\n.current-club {\n  margin: 2em;\n  color: white;\n}\n\n.fixed-single-line {\n  white-space: nowrap;\n  width: 440px;\n}\n\n.single-line {\n  height: 2em;\n  width: 200px;\n}\n\n.stacked {\n  width: 200px;\n}\n\n.fifty {\n  flex-basis: 50%;\n}\n\n.hondo {\n  flex-basis: 100%;\n}\n\n.info-box {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.larger {\n  font-size: larger;\n}\n\n.main-card {\n  display: flex;\n  width: 270px;\n  flex-direction: column;\n  background-size: cover;\n  background-repeat: no-repeat;\n  background-position: center;\n  color: white;\n  padding: 0.125em;\n  border-radius: 5px;\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n  font-family: Arial, sans-serif;\n  margin: 0.5em 1em 0.5em 0.5em;\n}\n\n.mark-boundary {\n  border: thin solid grey;\n}\n\n.placement-details {\n  flex-basis: 90%;\n  padding: 0.125em;\n  display: table-cell;\n  vertical-align: middle;\n  text-align: left;\n  border-left: thin solid #ddd;\n  background-color\n}\n\n.placement-tag {\n  flex-basis: 10%;\n  display: table-cell;\n  vertical-align: middle;\n  text-align: center;\n  padding: 0.125em;\n}\n\n.right {\n  text-align: right;\n}\n\n.shadowed {\n  text-shadow: 0 2px 4px #3B3B3B;\n}\n\n.side-card {\n  background-color: #444444;\n  background-size: cover;\n  background-repeat: no-repeat;\n  background-position: center;\n  color: white;\n  width: 224px;\n  padding: 0.125em;\n  border-radius: 5px;\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n  font-family: Arial, sans-serif;\n  margin: 1em 1em 1em -1.5em;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: left;\n  font-size: xx-small;\n}\n\n.side-info {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  vertical-align: middle;\n  text-align: left;\n  background-color: rgba(0, 0, 0, 0.4);\n  backdrop-filter: blur(5px);\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n  margin-top: 1em;\n}\n\n.smaller {\n  font-size: smaller;\n}\n\n.smoked {\n  background-color: rgba(0, 0, 0, 0.4);\n  backdrop-filter: blur(5px);\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n}\n\n.stage-info {\n  background-color: black;\n  color: white;\n  font-size: small;\n  margin: -0.5em 1em 0.5em 0.5em;\n  max-width: 500px;\n  min-width: 280px;\n  flex-direction: column;\n  display:none;\n  width: 100%;\n  animation: slideInOut 0.5s ease-in-out;\n  padding: 0.125em;\n  border-radius: 5px;\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n}\n\n.double-stripe tr:nth-child(4n-2), .double-stripe tr:nth-child(4n-1) {\n  background-color: #444;\n}\n\n.tiny {\n  font-size: x-small;\n}\n\n.top-card {\n  display: flex;\n  flex-direction: row;\n  min-width: 280px;\n}\n\n.top-card p {\n  margin: 0px;\n}\n\n@media (width <=536px) {\n    .side-card {\n        display: none;\n    }\n    .bottom-card {\n        display: none;\n    }\n}\n\n@keyframes slideInOut {\n    0% {\n        opacity: 0;\n        visibility: hidden;\n        height: 0;\n    }\n\n    50% {\n        opacity: 0.5;\n        visibility: visible;\n        height: 50%;\n    }\n\n    100% {\n        opacity: 1;\n        visibility: visible;\n        height: 100%;\n    }\n}\n\n/* Marquee styles */\n.marquee {\n  --gap: 1rem;\n  position: relative;\n  display: flex;\n  overflow: hidden;\n  user-select: none;\n  gap: var(--gap);\n}\n\n.marquee__content {\n  flex-shrink: 0;\n  display: flex;\n  justify-content: space-around;\n  gap: var(--gap);\n  min-width: 100%;\n  margin: 0.375em;\n}\n\n@keyframes scroll {\n  from {\n    transform: translateX(0);\n  }\n  to {\n    transform: translateX(calc(-100% - var(--gap)));\n  }\n}\n\n/* Pause animation when reduced-motion is set */\n@media (prefers-reduced-motion: reduce) {\n  .marquee__content {\n    animation-play-state: paused !important;\n  }\n}\n\n/* Reverse animation */\n.marquee--reverse .marquee__content {\n  animation-direction: reverse;\n}\n\n/* Other page demo styles */\n.marquee__content > * {\n  flex: 0 0 auto;\n  text-align: center;\n  list-style: none;\n  animation: scroll 10s linear infinite;\n}\n\n.table-container {\n  display: none;\n}\n"),(async()=>{try{const e=document.createElement("div");e.setAttribute("id","clubInfo"),e.innerText="Getting clubs info";const n=document.getElementById("root");n.replaceChildren(e);const t=document.createElement("div");t.setAttribute("id","overlay"),t.onclick=()=>document.getElementById("overlay").style.display="none",t.onkeydown=()=>document.getElementById("overlay").style.display="none",n.appendChild(t);const a=await getBearer(),r=staticGetGameData(),i=document.createElement("div");e.appendChild(i);const l=await getClubs(a,i);e.style.width="100%",e.innerText="";const s=document.createElement("div");e.appendChild(s),s.setAttribute("id","controls");const d=document.createElement("select");d.id="displaySetting",d.onchange=adjustDisplaySetting,s.appendChild(d);const o=document.createElement("option");o.value="card",o.text="Display Cards",d.appendChild(o);const c=document.createElement("option");c.value="table",c.text="Display Table",d.appendChild(c),d.defaultValue="card";const u=document.createElement("select");u.id="filterVehicle",u.onchange=adjustClubVisibility,s.appendChild(u);const b=document.createElement("option");b.value="all",b.text="All Vehicle Classes",u.appendChild(b),r.orderedVehicleClasses.forEach(e=>{const n=document.createElement("option");n.value=e.id,n.text=e.value,u.appendChild(n)});const p=document.createElement("select");p.id="filterLocation",p.onchange=adjustClubVisibility,s.appendChild(p);const m=document.createElement("option");m.value="all",m.text="All Locations",p.appendChild(m),r.orderedLocations.forEach(e=>{const n=document.createElement("option");n.value=e.id,n.text=e.value,p.appendChild(n)});const v=document.createElement("div");v.setAttribute("class","card-container"),e.appendChild(v);const g=document.createElement("div");g.setAttribute("class","table-container"),e.appendChild(g);const f=document.createElement("table");f.setAttribute("class","double-stripe"),g.appendChild(f);const h=f.createTHead(),y=document.createElement("tr");["Status","Event End","Current Club","Club Name","Club Owner","Location","Season","Vehicle Class","Degradation","Damage","Stages"].forEach((e,n)=>{const t=document.createElement("th");t.innerHTML=e,y.appendChild(t)}),h.append(y);const C=f.createTBody();l.forEach(e=>{if(e.event){const n=getClubCard(e);v.appendChild(n),addClubRow(C,e),addClickHandlers(e)}})}catch(e){console.log("Some error happened."),console.error(e)}})();