1!function(global){"use strict";function escapeHtml(text){return String(text).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function resolveHref(rawUrl){const url=rawUrl.trim();return/^https?:\/\//i.test(url)?url:/^www\./i.test(url)?"https://"+url:"https://"+url.replace(/^\/+/,"")}const URL_REGEX=/(?:https?:\/\/[^\s<]+[^\s<.,;:!?)}\]"']|www\.[^\s<]+[^\s<.,;:!?)}\]"']|(?:\b[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z]{2,}(?::\d+)?(?:\/[^\s<.,;:!?)}\]"']*)?)/gi;function linkifyText(text,linkClass,rel){const linkRel=rel||"nofollow noopener noreferrer",normalized=function normalizeAnnouncementText(text){return String(text).replace(/httpsï¼\/\//gi,"https://").replace(/httpï¼\/\//gi,"http://")}(text);let match,result="",lastIndex=0;for(URL_REGEX.lastIndex=0;null!==(match=URL_REGEX.exec(normalized));){const raw=match[0],start=match.index;start>lastIndex&&(result+=escapeHtml(normalized.slice(lastIndex,start)));const resolved=resolveHref(raw);if(/^https?:\/\//i.test(resolved)){result+=`<a class="${linkClass}" href="${escapeHtml(resolved)}" target="_blank" rel="${linkRel}">${escapeHtml(raw)}</a>`}else result+=escapeHtml(raw);lastIndex=start+raw.length}return lastIndex<normalized.length&&(result+=escapeHtml(normalized.slice(lastIndex))),result}function linkifyAnnouncementText(text){return linkifyText(text,"chat-announcement-link","nofollow noopener noreferrer sponsored").replace(/\n/g,"<br>")}function parseChatMessageContent(content){return linkifyText(content,"chat-message-link").replace(/@@(\S+)/g,'<span class="mention-tag">@@$1</span>')}function clampRotateSeconds(value){const seconds=Number(value);return Number.isFinite(seconds)?Math.min(30,Math.max(1,Math.round(seconds))):5}function getActiveAnnouncementTexts(settings){const texts=(Array.isArray(settings?.announcements)?settings.announcements:[]).slice().sort((a,b)=>(Number(a?.sortOrder)||0)-(Number(b?.sortOrder)||0)).map(item=>String(item?.content||"").trim()).filter(Boolean);if(texts.length)return texts;const legacy=String(settings?.announcementContent||"").trim();return legacy?[legacy]:[]}function parseSessionIdFromRoomId(roomId){if(!roomId)return null;const text=String(roomId);if(text.startsWith("standalone-")){const id=parseInt(text.slice(11),10);return Number.isFinite(id)&&id>0?id:null}const idx=text.lastIndexOf("_");if(idx>0&&idx<text.length-1){const id=parseInt(text.slice(idx+1),10);return Number.isFinite(id)&&id>0?id:null}return null}function stopAnnouncementCarousel(bar){bar&&bar._announcementCarousel?.timer&&(clearInterval(bar._announcementCarousel.timer),bar._announcementCarousel.timer=null)}function syncAnnouncementCloseVisibility(bar,texts){if(!bar)return;ensureAnnouncementCloseButton(bar);const requiresFullCycle=texts.length>1,cycleComplete=!0===bar._announcementCarousel?.cycleComplete;!function setAnnouncementCloseVisible(bar,visible){const btn=bar?.querySelector(".chat-announcement-close");btn&&(btn.classList.toggle("chat-announcement-close--pending",!visible),btn.tabIndex=visible?0:-1,btn.setAttribute("aria-hidden",visible?"false":"true"))}(bar,!requiresFullCycle||cycleComplete)}function renderAnnouncementSlide(textEl,text,animate){if(textEl){if(!animate)return textEl.classList.remove("chat-announcement--fading"),void(textEl.innerHTML=linkifyAnnouncementText(text));textEl.classList.add("chat-announcement--fading"),window.setTimeout(()=>{textEl.innerHTML=linkifyAnnouncementText(text),textEl.classList.remove("chat-announcement--fading")},180)}}function getCloseLabel(){return window.L&&"function"==typeof window.L.T&&window.L.T("match.chat.closeAnnouncement")||"Close announcement"}function ensureAnnouncementCloseButton(bar){if(!bar||bar.querySelector(".chat-announcement-close"))return bar.querySelector(".chat-announcement-close");const btn=document.createElement("button");return btn.type="button",btn.className="chat-announcement-close",btn.setAttribute("aria-label",getCloseLabel()),btn.innerHTML="×",bar.insertBefore(btn,bar.firstChild),btn}function bindAnnouncementDismiss(bar,dismissState){if(!bar||!dismissState)return;const closeBtn=ensureAnnouncementCloseButton(bar);closeBtn&&"1"!==closeBtn.dataset.bound&&(closeBtn.dataset.bound="1",closeBtn.setAttribute("aria-label",getCloseLabel()),closeBtn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation(),stopAnnouncementCarousel(bar),dismissState.dismiss(),bar.classList.add("d-none"),bar.classList.remove("chat-announcement--flash")}))}global.linkifyAnnouncementText=linkifyAnnouncementText,global.parseChatMessageContent=parseChatMessageContent,global.ChatAnnouncementUtil={linkifyAnnouncementText:linkifyAnnouncementText,linkifyText:linkifyText,parseChatMessageContent:parseChatMessageContent,applyAnnouncementPayload:function applyAnnouncementPayload(target,data){return target&&data?(target.announcementEnabled=!0===data.announcementEnabled,target.announcementRotateSeconds=clampRotateSeconds(data.announcementRotateSeconds),target.announcements=Array.isArray(data.announcements)?data.announcements:[],target.announcementContent=data.announcementContent||"",target.isRoomOverride=!0===data.isRoomOverride,target.isStreamerOverride=!0===data.isStreamerOverride,target.streamSessionId=data.streamSessionId||null,target.streamerId=data.streamerId||null,target):target},parseSessionIdFromRoomId:parseSessionIdFromRoomId,buildSettingsUrl:function buildSettingsUrl(roomId){const base="/api/chat/settings";return roomId?`${base}?roomId=${encodeURIComponent(roomId)}`:base},shouldApplyAnnouncementUpdate:function shouldApplyAnnouncementUpdate(data,currentRoomId,currentSettings){if(!data)return!1;
1const currentSessionId=parseSessionIdFromRoomId(currentRoomId),payloadSessionId=null!=data.streamSessionId?Number(data.streamSessionId):null;if(!0===data.isRoomOverride||payloadSessionId)return null!=currentSessionId&&payloadSessionId===currentSessionId;if(!0===data.isStreamerOverride||null!=data.streamerId){if(!0===currentSettings?.isRoomOverride)return!1;const payloadStreamerId=null!=data.streamerId?Number(data.streamerId):null,roomStreamerId=null!=currentSettings?.roomStreamerId?Number(currentSettings.roomStreamerId):null;return null!=roomStreamerId&&payloadStreamerId===roomStreamerId}return!(currentSettings&&(!0===currentSettings.isRoomOverride||!0===currentSettings.isStreamerOverride))},getActiveAnnouncementTexts:getActiveAnnouncementTexts,renderAnnouncementContent:function renderAnnouncementContent(element,text){element&&(element.innerHTML=linkifyAnnouncementText(text))},createDismissState:function createDismissState(){return{dismissed:!1,reset(){this.dismissed=!1},dismiss(){this.dismissed=!0}}},bindAnnouncementDismiss:bindAnnouncementDismiss,renderAnnouncementBar:function renderAnnouncementBar(options){const{bar:bar,textEl:textEl,settings:settings={},dismissState:dismissState,action:action}=options||{};if(!bar||!textEl)return;bindAnnouncementDismiss(bar,dismissState),stopAnnouncementCarousel(bar);const enabled=!0===settings.announcementEnabled,texts=getActiveAnnouncementTexts(settings),rotateSeconds=clampRotateSeconds(settings.announcementRotateSeconds);if(enabled&&texts.length&&(!dismissState||!dismissState.dismissed))return renderAnnouncementSlide(textEl,texts[0],!1),bar.classList.remove("d-none"),bar.dataset.announcementCount=String(texts.length),function startAnnouncementCarousel(bar,textEl,texts,rotateSeconds){stopAnnouncementCarousel(bar);const state={index:0,texts:texts,timer:null,cycleComplete:texts.length<=1};bar._announcementCarousel=state,syncAnnouncementCloseVisibility(bar,texts),texts.length<=1||(state.timer=window.setInterval(()=>{bar.isConnected&&!bar.classList.contains("d-none")&&(state.index=(state.index+1)%state.texts.length,0===state.index&&(state.cycleComplete=!0,syncAnnouncementCloseVisibility(bar,texts)),renderAnnouncementSlide(textEl,state.texts[state.index],!0))},1e3*clampRotateSeconds(rotateSeconds)))}(bar,textEl,texts,rotateSeconds),void("create"!==action&&"update"!==action||(dismissState&&dismissState.reset(),bar.classList.remove("chat-announcement--flash"),bar.offsetWidth,bar.classList.add("chat-announcement--flash")));textEl.innerHTML="",bar.classList.add("d-none"),bar.classList.remove("chat-announcement--flash"),delete bar.dataset.announcementCount},stopAnnouncementCarousel:stopAnnouncementCarousel}}(window);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.