import"./engine-DDeQk6Ow.js";import{c as ye}from"./presentations-LiSGdpkY.js";import{_ as ke}from"./DeckViewer.vue_vue_type_style_index_0_lang-Bu7ple0U.js";import{A as X,d as be,o as Ee,aH as Se,aN as ie,c as F,s as Me,f as ne,b as J,F as _e,r as Z,aO as se,n as L,aM as Re,aP as Ce,Z as Te}from"./index-BXb0-9-4.js";import{C as re,f as ue,a as Ae,c as Le,r as Ne,b as Pe}from"./log-Xlt5jeld.js";import{b as De,R as Ie}from"./remote-aOKX75Mt.js";const Fe=/^U\+(0-FF|100-2BA)\b/i;function Oe(e){return e.status==="unloaded"&&Fe.test(e.unicodeRange.trim())}async function je(e){const r=[...e].filter(Oe);return await Promise.allSettled(r.map(n=>n.load())),r.length}async function Be(e,r){const n=e.filter(f=>f.classList.contains("on"));try{for(const f of e){for(const c of e)c.classList.toggle("on",c===f);f.offsetHeight,await r()}}finally{for(const f of e)f.classList.toggle("on",n.includes(f))}return e.length}async function We(e,r,n=50){const f=Date.now()+r;for(;;){if(e())return!0;if(Date.now()>=f)return!1;await new Promise(c=>setTimeout(c,n))}}function fe(){return{raf:e=>requestAnimationFrame(()=>e()),cancelRaf:e=>cancelAnimationFrame(e),setTimeout:(e,r)=>window.setTimeout(e,r),clearTimeout:e=>window.clearTimeout(e),now:()=>performance.now()}}async function ze(e,r=fe()){return(await de(Number.POSITIVE_INFINITY,e,r)).frames}function de(e,r,n=fe()){return new Promise(f=>{const c=n.now();let y=0,s=0,p=0,v=!1;const d=l=>{v||(v=!0,n.cancelRaf(s),n.clearTimeout(p),f({frames:y,ms:Math.round(n.now()-c),ok:l}))},k=()=>{v||(y++,y>=e?d(!0):s=n.raf(k))};p=n.setTimeout(()=>d(!1),r),s=n.raf(k)})}const Ue="https://www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js",ce="bm-caf",me=["READY","SENDER_CONNECTED","SENDER_DISCONNECTED","SHUTDOWN","VISIBILITY_CHANGED","STANDBY_CHANGED","ERROR"],$e=540*1e3,Ge="/icons/icon-96.png";function O(){const r=globalThis.cast?.framework;return r&&typeof r.CastReceiverContext?.getInstance=="function"?r:null}function qe(){return O()!==null}function He(e=1e4){return O()?Promise.resolve(!0):new Promise(r=>{let n=document.getElementById(ce);n||(n=document.createElement("script"),n.id=ce,n.src=Ue,document.head.appendChild(n));const f=n;let c=!1;const y=k=>{c||(c=!0,window.clearInterval(v),window.clearTimeout(d),f.removeEventListener("load",s),f.removeEventListener("error",p),r(k))},s=()=>y(O()!==null),p=()=>y(!1);f.addEventListener("load",s),f.addEventListener("error",p);const v=window.setInterval(()=>{O()&&y(!0)},50),d=window.setTimeout(()=>y(O()!==null),e)})}function Ve(e,r,n){const f=e.messages,c=r.getPlayerManager?.();if(!f||!c){n("keep-awake-failed",{error:"no player manager"});return}const y=document.createElement("cast-media-player");y.style.display="none",document.body.append(y);const s=()=>{for(const d of document.body.querySelectorAll("touch-controls"))d.style.display!=="none"&&(d.style.display="none")};new MutationObserver(s).observe(document.body,{childList:!0,subtree:!0});let p=0;const v=()=>{try{const d=new f.LoadRequestData;d.autoplay=!0;const k=new f.MediaInformation;k.contentId=new URL(Ge,location.origin).href,k.contentType="image/png",k.streamType=f.StreamType.NONE;const l=new f.GenericMediaMetadata;l.title="BM · prezentacja",k.metadata=l,d.media=k,d.requestId=0,p++,Promise.resolve(c.load(d)).then(()=>n("keep-awake",{count:p}),b=>{const E=b;n("keep-awake-failed",{count:p,error:String(E?.type??b),reason:E?.reason??null,detailedErrorCode:E?.detailedErrorCode??null})})}catch(d){n("keep-awake-failed",{count:p,error:d instanceof Error?d.message:String(d)})}};v(),window.setInterval(v,$e)}function Ke(e){const r=O();if(!r)throw new Error("cast: the receiver SDK is not loaded");const n=r.CastReceiverContext.getInstance(),f=()=>{try{return n.getSenders().length}catch{return 0}},c=new r.CastReceiverOptions;c.customNamespaces={[re]:r.system.MessageType.JSON},c.disableIdleTimeout=!0,c.maxInactivity=3600,c.statusText=e.statusText;for(const s of me){const p=r.system.EventType[s];p!==void 0&&n.addEventListener(p,v=>{e.onEvent(s,{reason:v?.reason,senderId:v?.senderId,isVisible:v?.isVisible,isStandby:v?.isStandby,senders:f()})})}n.addCustomMessageListener(re,s=>e.onMessage(s?.data,s?.senderId));const y=r.system.EventType.READY;if(y!==void 0){let s=!1;n.addEventListener(y,()=>{s||(s=!0,Ve(r,n,e.onEvent))})}return n.start(c),{send(s,p){if(!ue(s))return e.onEvent("send-dropped",{type:s.type}),!1;try{return n.sendCustomMessage(re,p,s),!0}catch(v){return e.onEvent("send-failed",{type:s.type,error:v instanceof Error?v.message:String(v)}),!1}},senders:f,setStatusText(s){try{n.setApplicationState(s)}catch{}},deviceCapabilities(){try{return n.getDeviceCapabilities?.()??null}catch{return null}}}}const xe=2e3,Ye=5e3,Je=/data-deck-image="([^"]+)"/g;function Ze(e){const r=new Set,n=c=>{if(c)for(const y of c.matchAll(Je))r.add(y[1])},f=c=>{n(c.body_html),n(c.comment_html),n(c.sources_html),c.special&&f(c.special)};for(const c of e.slides??[])f(c);return[...r]}function q(e){return e instanceof X?e.status:0}function Q(e){return e instanceof X?`${e.status} ${e.message}`:e instanceof Error?e.message:String(e)}function Qe(e){const r=e.now??(()=>Date.now());let n=null,f=null,c=null,y=null,s="waiting",p="off",v="",d=0,k=-1/0,l=!1,b,E=-1/0,h=null,j=!1,C=[],B="",W=0,z=0,H=0;function T(){const t=e.view.current();return{type:"status",phase:s,ws:p,number:t?.number??0,special:t?.special??!1,title:v}}function U(){const t=T();e.onStatus?.(t),e.send(t)}function N(t){s!==t&&(s=t,e.log("phase",t),U())}function P(t){if(p===t)return;const o=p;o==="connected"&&t==="connecting"&&H++,p=t,e.log("ws",`${o} -> ${t}`),U()}function D(t){const o=r();o-k(await $("connection")).token,subscription:async t=>{const o=await $("subscription");if(o.channel!==t)throw e.log("token","subscription channel mismatch"),new X(403,"cast: channel mismatch");return o.channel_token}})}function K(t=C){for(const o of t)e.revokeURL(o);t===C&&(C=[])}async function x(t,o,a){const m={};return await Promise.all(Ze(t).map(async g=>{try{const A=await I("image",M=>e.api.image(M,g),o);if(a!==d||l)return;const R=e.objectURL(A);C.push(R),m[g]=R}catch(A){e.log("image","image skipped",{name:g,status:q(A)})}})),m}function G(){y?.close(),y=null}function i(t){const o=()=>t===d&&!l;return{onPublication(a){if(!o())return;const m=De(a);if(!m||m.event!==Ie)return;const g=m.payload;if(g.tab!==f){z++,e.log("foreign","state from another tab",{tab:g.tab});return}W++,e.view.show(g.number,g.special,g.panel==="notes"||g.panel==="srcs"?g.panel:null),e.log("state","applied",{number:g.number,special:g.special})},onSubscribed(){o()&&(e.log("ws","subscribed"),s==="ready"&&U())},onConnection(a){o()&&P(a)},onDenied(a){o()&&(e.log("ws","subscription denied",{code:a}),a===401&&D("subscription denied"))},onUnavailable(){o()&&(P("off"),D("realtime unavailable"))}}}async function u(t,o){const a=await e.realtime.openChannel(o,i(t));if(t!==d||l){a.close();return}y=a}async function w(t,o){const a=++d,m=n,g=r();G(),e.realtime.disconnect(),c=null,B="",N("loading");const A=C;C=[];let R;try{if(R=o??await I("deck",e.api.deck,m),a!==d||l)return;v=R.title??"";const M=r(),oe=await x(R,m??"",a);if(a!==d||l)return;const ae=r();if(await e.view.load(R,oe),a!==d||l)return;B=JSON.stringify(R),e.log("perf","deck up",{fetchMs:Math.round(M-g),imagesMs:Math.round(ae-M),images:Object.keys(oe).length,loadMs:Math.round(r()-ae),totalMs:Math.round(r()-g),slides:R.slides?.length??0})}catch(M){if(a!==d||l)return;e.log("error","deck load failed",{error:Q(M)}),N("error");return}finally{K(A)}try{V();const M=t??await I("realtime",e.api.realtime,m);if(a!==d||l)return;c=M.channel,await u(a,M.channel)}catch(M){if(a!==d||l)return;e.log("error","channel join failed",{error:Q(M)}),P("off")}a!==d||l||N("ready")}async function S(){if(!c)return;const t=d;G(),e.realtime.disconnect();try{await u(t,c)}catch(o){e.log("error","channel reopen failed",{error:Q(o)})}}async function _(t,o,a){if(!n){n=t,f=o,e.log("ticket","first hello",{tab:o}),await w(),n===t&&s==="ready"&&(b=a);return}if(t===n){if(f!==o&&e.log("tab","casting tab switched",{tab:o}),f=o,b=a,s==="error"||s==="ready"&&!y){await w();return}e.send(T(),a);return}let m;try{m=await e.api.realtime(t)}catch(g){e.log("ticket","refused",{status:q(g)}),e.send(T(),a);return}if(!l){if(n=t,f=o,b=a,k=-1/0,c&&m.channel===c&&s==="ready"){let g=null;try{g=await e.api.deck(t)}catch(A){e.log("ticket","deck check failed",{status:q(A)})}if(l)return;if(g&&JSON.stringify(g)!==B){e.log("ticket","deck changed",{tab:o}),await w(m,g);return}if(e.log("ticket","swapped",{tab:o}),await S(),l)return;e.send(T(),a);return}e.log("ticket","new deck",{tab:o}),await w(m)}}function Y(t){const o=e.report?.()??{summary:null,device:null,events:[],previousRun:[]},a=Le(JSON.stringify(Ne(o)));e.log("log","sending",{parts:a.length,senderId:t});for(const m of a){if(!ue(m)){e.log("log","part dropped",{part:m.part});continue}e.send(m,t)}}function ee(t){const o=e.view.current();e.send({type:"position",number:o?.number??0,special:o?.special??!1},t)}async function te(t,o){if(l)return;const a=Ae(t);if(!a){e.log("foreign","unknown message",{senderId:o});return}if(e.log("rx",a.type,{senderId:o}),a.type==="where"){ee(o);return}if(a.type==="log"){Y(o);return}const m=b!==void 0&&o===b||a.ticket===n;if(!m&&b!==void 0){if(r(){if(h){if(h.trusted&&!m){e.log("foreign","hello dropped behind a trusted one",{senderId:a}),g();return}e.log("rx","hello superseded",{senderId:h.senderId}),h.settle()}h={ticket:t,tab:o,senderId:a,trusted:m,settle:g},j||ge()})}async function ge(){j=!0;try{for(;h&&!l;){const t=h;h=null;try{await _(t.ticket,t.tab,t.senderId)}catch(o){e.log("error","hello failed",{error:Q(o)})}finally{t.settle()}}}finally{j=!1,h?.settle(),h=null}}function pe(t){t===void 0||t!==b||(b=void 0,e.log("rx","pinned sender left",{senderId:t}))}function ve(){l=!0,d++,G(),e.realtime.setTokenSource(null),K()}function he(){return{ws:p,applied:W,foreign:z,reconnects:H}}return{handle:te,senderLeft:pe,status:T,stats:he,close:ve}}const Xe={key:1,class:"cast-screen cast-cover",role:"status"},et={key:2,class:"cast-screen"},tt={key:0,class:"cast-hint"},nt={key:3,class:"cast-screen"},rt={key:4,class:"cast-screen"},ot=6e4,le=1e3,ft=be({__name:"CastReceiverView",setup(e){const r=Z("boot"),n=se(null),f=se({}),c=Z("pending"),y=Z(null),s=Z(!1);let p=null,v=null,d=0;const k=new Set(me),l=Pe("bm.cast.log"),b=Date.now();let E={};function h(i,u,w){l.note(i,u,w),i==="error"&&l.persist()}function j(){const i=performance.memory;return i?Math.round(i.usedJSHeapSize/1048576):null}function C(){const i=navigator;return{ua:navigator.userAgent,screen:`${window.screen.width}x${window.screen.height}`,viewport:`${window.innerWidth}x${window.innerHeight}`,dpr:window.devicePixelRatio,cores:navigator.hardwareConcurrency,memoryGB:i.deviceMemory??null}}function B(i,u){if(!k.has(i)){h(i.startsWith("keep-awake")?"awake":"send",i,u),i==="keep-awake-failed"&&l.persist();return}i==="READY"&&p?(E={...E,capabilities:p.deviceCapabilities()},h("caf",i,{...u,capabilities:E.capabilities})):h("caf",i,u),i==="SENDER_DISCONNECTED"&&typeof u?.senderId=="string"&&v?.senderLeft(u.senderId),l.persist()}function W(){return"serviceWorker"in navigator&&navigator.serviceWorker.controller!==null}function z(){return{screen:r.value,covered:s.value,coverInDom:document.querySelector(".cast-cover")!==null,visibility:document.visibilityState,focus:document.hasFocus(),sw:W()}}async function H(){const i=await ze(le),u=v?.stats();h("beat","heartbeat",{uptimeMin:+((Date.now()-b)/6e4).toFixed(1),ws:u?.ws??"off",applied:u?.applied??0,foreign:u?.foreign??0,reconnects:u?.reconnects??0,heapMB:j(),frames:i,frameSampleMs:le,...z()}),l.persist(),v&&p?.send(v.status())}async function T(){const i=await de(3,3e3);h("paint",i.ok?"frames after the cover":"no frames after the cover",{...i,...z()}),l.persist()}async function U(){if(!("serviceWorker"in navigator))return;const i=navigator.serviceWorker;try{const u=await i.getRegistrations(),w=i.controller!==null;if(u.length===0&&!w)return;const S=await Promise.all(u.map(_=>_.unregister().catch(()=>!1)));h("boot","service worker unregistered",{controlled:w,scopes:u.map(_=>_.scope),unregistered:S.filter(Boolean).length})}catch(u){h("boot","service worker check failed",String(u))}l.persist()}function N(i){h("error","window error",{message:String(i.message),source:i.filename,line:i.lineno})}function P(i){const u=i.reason instanceof Error?i.reason.message:String(i.reason);h("error","unhandled rejection",{reason:u})}function D(){h("boot","pagehide"),l.persist()}function I(i){return new Promise(u=>window.setTimeout(u,i))}function $(){return new Promise(i=>requestAnimationFrame(()=>i()))}function V(){return y.value?.sections()??[]}async function K(i,u){s.value=!0;const w=performance.now();try{n.value=i,f.value=u,c.value="ready",r.value="deck",await Te(),await We(()=>V().some(te=>te.classList.contains("on")),2e4)||h("error","the first slide did not show in 20 s"),await document.fonts.ready,await I(50);const S=performance.now(),_=await je(document.fonts),Y=performance.now(),ee=await Be(V(),$);await $(),h("perf","warm-up",{stageMs:Math.round(S-w),faces:_,warmMs:Math.round(Y-S),sections:ee,prerenderMs:Math.round(performance.now()-Y),totalMs:Math.round(performance.now()-w)})}finally{s.value=!1,T()}p?.setStatusText(`BM · ${i.title}`)}let x=null;function G(i){i.phase!==x&&(x=i.phase,i.phase==="loading"?s.value=!0:i.phase==="error"?(s.value=!1,r.value="error"):i.phase==="ready"&&n.value&&(s.value=!1,r.value="deck"))}return Ee(async()=>{E=C();const i=l.previous[l.previous.length-1];if(h("boot","receiver loaded",{...E,cafAtBoot:qe(),sw:W(),previousRunEvents:l.previous.length,lastPrevious:i??null}),l.persist(),U(),window.addEventListener("error",N),window.addEventListener("unhandledrejection",P),window.addEventListener("pagehide",D),d=window.setInterval(()=>{H()},ot),document.documentElement.classList.add("deck-public"),!document.querySelector('meta[data-deck-public="1"]')){const w=document.createElement("meta");w.name="robots",w.content="noindex",w.dataset.deckPublic="1",document.head.appendChild(w)}if(!await He()){r.value="unsupported",h("boot","no CAF SDK");return}r.value="waiting",v=Qe({api:ye,realtime:{setTokenSource:Ce,openChannel:Re,disconnect:ie},view:{load:K,show:(w,S,_)=>{y.value?.showSlide(w,S,_)},current:()=>y.value?.current()??null},send:(w,S)=>{p?.send(w,S)},log:h,objectURL:w=>URL.createObjectURL(w),revokeURL:w=>URL.revokeObjectURL(w),onStatus:G,report:()=>({summary:l.summary(),device:E,events:l.events,previousRun:l.previous})});const u=v;try{p=Ke({statusText:"BM · prezentacja",onMessage:(w,S)=>{u.handle(w,S)},onEvent:B}),h("caf","started")}catch(w){h("error","receiver start failed",String(w)),r.value="unsupported"}}),Se(()=>{window.clearInterval(d),window.removeEventListener("error",N),window.removeEventListener("unhandledrejection",P),window.removeEventListener("pagehide",D),l.persist(),v?.close(),ie(),document.documentElement.classList.remove("deck-public"),document.querySelector('meta[data-deck-public="1"]')?.remove()}),(i,u)=>(L(),F(_e,null,[n.value?(L(),Me(ke,{key:0,ref_key:"viewer",ref:y,phase:c.value,deck:n.value,error:"",mode:"public","no-toolbar":"","extra-css":n.value.css,theme:n.value.theme,images:f.value},null,8,["phase","deck","extra-css","theme","images"])):ne("",!0),s.value?(L(),F("div",Xe,[...u[0]||(u[0]=[J("p",null,"Przygotowuję slajdy…",-1)])])):r.value==="boot"||r.value==="waiting"?(L(),F("div",et,[u[1]||(u[1]=J("p",null,"BM · czekam na pilota…",-1)),r.value==="waiting"?(L(),F("p",tt,"Na telefonie otwórz pilota prezentacji i wybierz Wyświetl na TV.")):ne("",!0)])):r.value==="unsupported"?(L(),F("div",nt,[...u[2]||(u[2]=[J("p",null,"Ta strona działa tylko na urządzeniu Google Cast.",-1)])])):r.value==="error"?(L(),F("div",rt,[...u[3]||(u[3]=[J("p",null,"Nie mogę wczytać prezentacji. Połącz ponownie z telefonu.",-1)])])):ne("",!0)],64))}});export{ft as default};