(function () {
// 1) Basic bot filter (extend if you like)
function isBot() {
return /(bot|crawl|spider|google|bing|slurp|yandex|facebook|linkedin|pinterest|preview|whatsapp|discord|telegram|headless|puppeteer)/i
.test(navigator.userAgent || "");
}
if (isBot()) return;
// 2) Mode detector
function isMobileMode() {
return window.matchMedia("(max-width: 767px)").matches ||
/Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent || "");
}
// 3) Your ad configs (swap keys/sizes to match your network units)
const AD = {
mobile: { key: "aa6d52a6037d0558c2a19dc52b6aa824", width: 320, height: 50 }, // 320x50
desktop: { key: "a49752dcde88f4fde5987d25efbb7168", width: 468, height: 60 } // 468x60
};
// 4) Create container if it doesn't exist
function ensureContainer() {
let container = document.getElementById("ad-container");
if (!container) {
container = document.createElement("div");
container.id = "ad-container";
container.style.display = "none";
document.body.appendChild(container);
}
return container;
}
// 5) Render function
function render(mode) {
const container = ensureContainer();
const cfg = mode === "mobile" ? AD.mobile : AD.desktop;
// Set global atOptions for ad network
window.atOptions = {
key: cfg.key,
format: "iframe",
height: cfg.height,
width: cfg.width,
params: {}
};
// Clear previous ad/script then inject
container.innerHTML = "";
container.style.display = "block";
const s = document.createElement("script");
s.src = `//selfportraitproved.com/${cfg.key}/invoke.js`;
s.async = true;
container.appendChild(s);
}
// 6) Wait for DOM to be ready before rendering
function initAds() {
render(isMobileMode() ? "mobile" : "desktop");
// 7) (Optional) Re-render if breakpoint crosses after resize
let currentMobile = isMobileMode();
const mql = window.matchMedia("(max-width: 767px)");
if (mql.addEventListener) {
mql.addEventListener("change", (e) => {
const nowMobile = e.matches;
if (nowMobile !== currentMobile) {
currentMobile = nowMobile;
render(currentMobile ? "mobile" : "desktop");
}
});
} else if (mql.addListener) { // older browsers
mql.addListener((e) => {
const nowMobile = e.matches;
if (nowMobile !== currentMobile) {
currentMobile = nowMobile;
render(currentMobile ? "mobile" : "desktop");
}
});
}
}
// 8) Execute when DOM is ready
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", initAds);
} else {
initAds();
}
})();
Luminosity Gaming has added Will “dazzLe” Loafman and Joseph “ban” Seungmin Oh to its VALORANT roster to fill the void created by the departure of Brendan “Stellar” McGrath and Brady “Thief” Dever in late May, the organization announced today.
Additionally, Luminosity’s VALORANT lineup will temporarily field Tanner “TiGG” Spanu for the next couple of tournaments while Kaleb “moose” Jayne recovers from a broken wrist.
Stellar and Thief had been a part of Luminosity since the organization entered the professional VALORANT scene in August 2020. The pair most notably helped the team win the Nerd Street Gamers Winter Championship over Sentinels in January. But Luminosity missed out on qualifying for VCT Masters Two Reykjavík, which led to their benching.
DazzLe, a former CS:GO pro mostly known for his time with eUnited, had been playing for Ghost Gaming since January and was bought out of his contract. Ban, on the other hand, was last seen playing for Team Serenity, but he was waiting in free agency since April. While dazzLe is a Sova main, ban mostly uses either Jett or Sage.
👉 For more insights, check out this resource.
As for TiGG, he was a part of the beastcoast squad from August 2020 to April and had been waiting for opportunities since then. Although Luminosity may not have a spot for him in the lineup after moose recovers, this is a great opportunity for him to show off his skills.
Luminosity will use these three new players plus Alex “aproto” Protopapas and Diondre “YaBoiDre” in the upcoming NA VCT Stage Three: Challengers One open qualifier, where they’ll play their first game against Windstorm today at 4pm CT.
👉 Discover more in this in-depth guide.
Make sure to follow us on YouTube for more esports news and analysis.