@kosdev-code/kos-ui-sdk 2.1.16 → 2.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.cjs +1 -1
- package/index.cjs.map +1 -1
- package/index.js +7 -5
- package/index.js.map +1 -1
- package/models/models/storage-device/services/storage-device-services.d.ts +1 -0
- package/models/models/storage-device/services/storage-device-services.d.ts.map +1 -1
- package/models/models/storage-device/storage-device-container-model.d.ts.map +1 -1
- package/package.json +2 -2
package/index.cjs
CHANGED
|
@@ -112,7 +112,7 @@ ${u}topics:${t}
|
|
|
112
112
|
gl_FragColor = vec4(rgb, 1.0);
|
|
113
113
|
}
|
|
114
114
|
`,i=this.compileShader(r.VERTEX_SHADER,o),a=this.compileShader(r.FRAGMENT_SHADER,n);this.program=this.createProgram(i,a),this.posBuffer=r.createBuffer(),r.bindBuffer(r.ARRAY_BUFFER,this.posBuffer),r.bufferData(r.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),r.STATIC_DRAW),this.aPosition=r.getAttribLocation(this.program,"a_position"),this.uMinHue=r.getUniformLocation(this.program,"minHue"),this.uMaxHue=r.getUniformLocation(this.program,"maxHue"),this.uHueOffset=r.getUniformLocation(this.program,"hueOffset"),this.uGridHeight=r.getUniformLocation(this.program,"gridHeight")}reset(){this.hueOffset=0,this.lastUpdate=performance.now()}renderFrame(s,r){const o=this.gl;if(this.canvas.width=s,this.canvas.height=r,this.shouldStep(50)){const n=this.speedPx/r;this.hueOffset=(this.hueOffset+n)%1}o.viewport(0,0,s,r),o.clear(o.COLOR_BUFFER_BIT),o.useProgram(this.program),o.enableVertexAttribArray(this.aPosition),o.bindBuffer(o.ARRAY_BUFFER,this.posBuffer),o.vertexAttribPointer(this.aPosition,2,o.FLOAT,!1,0,0),o.uniform1f(this.uMinHue,this.minHue/360),o.uniform1f(this.uMaxHue,this.maxHue/360),o.uniform1f(this.uHueOffset,this.hueOffset),o.uniform1f(this.uGridHeight,r),o.drawArrays(o.TRIANGLES,0,6)}compileShader(s,r){const o=this.gl.createShader(s);if(this.gl.shaderSource(o,r),this.gl.compileShader(o),!this.gl.getShaderParameter(o,this.gl.COMPILE_STATUS))throw new Error(this.gl.getShaderInfoLog(o)||"Shader compile failed");return o}createProgram(s,r){const o=this.gl.createProgram();if(this.gl.attachShader(o,s),this.gl.attachShader(o,r),this.gl.linkProgram(o),!this.gl.getProgramParameter(o,this.gl.LINK_STATUS))throw new Error("Program linking failed");return o}}class at{constructor(){l(this,"canvas");l(this,"ctx");l(this,"lastUpdate",0);this.canvas=document.createElement("canvas");const t=this.canvas.getContext("2d");if(!t)throw new Error("2D canvas not supported");this.ctx=t}dispose(){this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.canvas.remove()}shouldStep(t){const s=performance.now();return s-this.lastUpdate>=t?(this.lastUpdate=s,!0):!1}readPixels(t,s){return this.ctx.getImageData(0,0,t,s).data}}function Vn(e){class t extends e{constructor(){super(...arguments);l(this,"doneCallback",null);l(this,"oneShotDone",!1)}isOneShot(){return!0}onDone(o){this.doneCallback=o}signalDoneIfNeeded(){var o;this.oneShotDone||((o=this.doneCallback)==null||o.call(this),this.oneShotDone=!0)}resetOneShot(){this.doneCallback=null,this.oneShotDone=!1}get isOneShotDone(){return this.oneShotDone}}return t}const ov=Vn(at);class nv extends ov{constructor({colors:s=["red","yellow","green"],direction:r="horizontal",speed:o=2,loop:n=!0}={}){super();l(this,"offset",0);l(this,"speed");l(this,"colors");l(this,"direction");l(this,"loop");this.colors=s,this.direction=r,this.speed=o,this.loop=n}reset(){this.offset=0,this.lastUpdate=performance.now(),this.loop||this.resetOneShot()}renderFrame(s,r){if(!this.loop&&this.isOneShotDone)return;this.loop&&this.shouldStep(50)&&(this.offset+=this.speed);const o=this.loop?-this.offset:0,n=this.loop?s*2-this.offset:s,i=this.ctx.createLinearGradient(o,0,n,0),a=1/(this.colors.length-1);this.colors.forEach((c,u)=>{i.addColorStop(u*a,c)}),this.ctx.fillStyle=i,this.ctx.fillRect(0,0,s,r),!this.loop&&!this.isOneShotDone&&this.signalDoneIfNeeded()}}const iv=Vn(at);class Uu extends iv{constructor({src:s}){super();l(this,"img");l(this,"loaded",!1);this.img=new Image,this.img.src=s,this.img.crossOrigin="anonymous",this.img.onload=()=>{this.loaded=!0}}reset(){this.resetOneShot()}renderFrame(s,r){!this.loaded||this.isOneShotDone||(this.canvas.width=s,this.canvas.height=r,this.ctx.drawImage(this.img,0,0,s,r),this.signalDoneIfNeeded())}}class av extends Nu{constructor(s){super(s);l(this,"loopConfig");l(this,"currentLoopCount",0);l(this,"startTime");l(this,"endTime");l(this,"completionCallback",null);this.loopConfig=s.loop??!1,this.startTime=s.startTime??0,this.endTime=s.endTime??null,this.video.removeEventListener("ended",this.handleEnded),this.video.addEventListener("ended",this.handleVideoEnd.bind(this)),this.startTime>0&&(this.video.currentTime=this.startTime),this.endTime!==null&&this.video.addEventListener("timeupdate",this.handleTimeUpdate.bind(this))}handleTimeUpdate(){this.endTime!==null&&this.video.currentTime>=this.endTime&&this.handleVideoEnd()}handleVideoEnd(){this.loopConfig===!0?(this.video.currentTime=this.startTime,this.video.play().catch(console.warn)):typeof this.loopConfig=="number"&&this.currentLoopCount<this.loopConfig-1?(this.currentLoopCount++,this.video.currentTime=this.startTime,this.video.play().catch(console.warn)):(this.video.pause(),this.completionCallback&&this.completionCallback())}reset(){super.reset(),this.currentLoopCount=0,this.video.currentTime=this.startTime}onDone(s){this.completionCallback=s}isOneShot(){return this.loopConfig===!1||this.loopConfig===1}dispose(){this.video.removeEventListener("ended",this.handleVideoEnd),this.video.removeEventListener("timeupdate",this.handleTimeUpdate),this.completionCallback=null,super.dispose()}}function cv(e){const t=e.replace("#","");if(!/^[0-9A-Fa-f]{3}$|^[0-9A-Fa-f]{6}$/.test(t))throw new Error(`Invalid hex color: ${e}`);let s,r,o;return t.length===3?(s=parseInt(t[0]+t[0],16),r=parseInt(t[1]+t[1],16),o=parseInt(t[2]+t[2],16)):(s=parseInt(t.substring(0,2),16),r=parseInt(t.substring(2,4),16),o=parseInt(t.substring(4,6),16)),{r:s,g:r,b:o}}function ju(e){return typeof e=="string"?cv(e):e}function vr(e){const t=ju(e);return`rgb(${t.r},${t.g},${t.b})`}class lv extends at{constructor(s={}){super();l(this,"columns",[]);l(this,"fallChance");l(this,"speed");l(this,"baseColor");l(this,"trailColors");this.speed=s.speed??1,this.fallChance=s.fallChance??.7,s.baseColor?this.baseColor=ju(s.baseColor):this.baseColor={r:0,g:255,b:255},this.trailColors=this.calculateTrailColors()}calculateTrailColors(){const r=[];for(let o=0;o<=5;o++){const n=1-o/5*.6;r.push({r:Math.floor(this.baseColor.r*n),g:Math.floor(this.baseColor.g*n),b:Math.floor(this.baseColor.b*n)})}return r}reset(){this.columns=[],this.lastUpdate=performance.now()}renderFrame(s,r){this.columns.length!==s&&(this.columns=Array(s).fill(0).map(()=>Math.floor(Math.random()*r))),this.shouldStep(50)&&(this.columns=this.columns.map(i=>i>r+5?0:i+(Math.random()<this.fallChance?this.speed:0)));const o=this.ctx.createImageData(s,r),n=o.data;n.fill(0);for(let i=0;i<r;i++)for(let a=0;a<s;a++){const c=this.columns[a];let u=0,d=0,h=0;if(i===c)u=this.baseColor.r,d=this.baseColor.g,h=this.baseColor.b;else if(i<c&&i>c-this.trailColors.length){const p=c-i;if(p<this.trailColors.length){const b=this.trailColors[p];u=b.r,d=b.g,h=b.b}}const f=(i*s+a)*4;n[f]=u,n[f+1]=d,n[f+2]=h,n[f+3]=255}this.ctx.putImageData(o,0,0)}}class uv{constructor(t,s){l(this,"baseRenderer");l(this,"overlayIcons",new Map);l(this,"overlayConfigs");l(this,"loadedIcons",new Set);l(this,"canvas");l(this,"ctx");l(this,"persistOverlaysOnComplete");l(this,"baseRendererCompleted",!1);l(this,"completionCallback",null);l(this,"hasSignaledCompletion",!1);this.baseRenderer=s(t.baseRenderer.type,t.baseRenderer.data),this.overlayConfigs=t.overlays,this.persistOverlaysOnComplete=t.persistOverlaysOnComplete!==!1,this.canvas=document.createElement("canvas");const r=this.canvas.getContext("2d");if(!r)throw new Error("2D canvas not supported");this.ctx=r,this.loadOverlayImages(),"onDone"in this.baseRenderer&&typeof this.baseRenderer.onDone=="function"&&this.baseRenderer.onDone(()=>{this.baseRendererCompleted=!0,!this.persistOverlaysOnComplete&&this.completionCallback&&this.completionCallback()})}async loadOverlayImages(){for(const t of this.overlayConfigs){const s=new Image;s.crossOrigin="anonymous",s.onload=()=>{this.loadedIcons.add(t.src)},s.onerror=r=>{console.error(`Failed to load overlay image: ${t.src}`,r)},s.src=t.src,this.overlayIcons.set(t.src,s)}}calculateOverlayPosition(t,s,r){let o,n;if(typeof t.position=="string")switch(t.position){case"top-left":o=0,n=0;break;case"top-center":o=(s-t.size)/2,n=0;break;case"top-right":o=s-t.size,n=0;break;case"center-left":o=0,n=(r-t.size)/2;break;case"center":o=(s-t.size)/2,n=(r-t.size)/2;break;case"center-right":o=s-t.size,n=(r-t.size)/2;break;case"bottom-left":o=0,n=r-t.size;break;case"bottom-center":o=(s-t.size)/2,n=r-t.size;break;case"bottom-right":o=s-t.size,n=r-t.size;break;default:o=0,n=0}else o=t.position.x,n=t.position.y;return t.offset&&(o+=t.offset.x||0,n+=t.offset.y||0),{x:o,y:n}}reset(){this.baseRenderer.reset(),this.baseRendererCompleted=!1,this.hasSignaledCompletion=!1}renderFrame(t,s){if(this.canvas.width=t,this.canvas.height=s,this.ctx.clearRect(0,0,t,s),this.baseRendererCompleted&&this.persistOverlaysOnComplete)this.renderOverlays(t,s);else{this.baseRenderer.renderFrame(t,s);const r=this.baseRenderer.readPixels(t,s);if(r&&r.length>0){const o=new ImageData(r,t,s);this.ctx.putImageData(o,0,0)}this.renderOverlays(t,s)}}renderOverlays(t,s){for(const r of this.overlayConfigs){if(!r.persistent&&r.persistent!==void 0)continue;const o=this.overlayIcons.get(r.src);if(!o||!this.loadedIcons.has(r.src))continue;const n=this.calculateOverlayPosition(r,t,s);this.ctx.save(),r.opacity!==void 0&&(this.ctx.globalAlpha=Math.max(0,Math.min(1,r.opacity))),this.ctx.drawImage(o,n.x,n.y,r.size,r.size),this.ctx.restore()}}readPixels(t,s){return this.ctx.getImageData(0,0,t,s).data}play(){this.baseRenderer.play&&this.baseRenderer.play()}pause(){this.baseRenderer.pause&&this.baseRenderer.pause()}dispose(){this.overlayIcons.clear(),this.loadedIcons.clear(),this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.canvas.remove(),this.baseRenderer.dispose&&this.baseRenderer.dispose()}onDone(t){this.completionCallback=t,this.hasSignaledCompletion&&t()}isOneShot(){return this.persistOverlaysOnComplete?!1:"isOneShot"in this.baseRenderer&&typeof this.baseRenderer.isOneShot=="function"?this.baseRenderer.isOneShot():!1}}class Bu extends at{constructor(s){super();l(this,"img");l(this,"loaded",!1);l(this,"scrollConfig");l(this,"loopConfig");l(this,"duration");l(this,"pauseDuration");l(this,"colorOverride");l(this,"originalSvgData",null);l(this,"position",0);l(this,"startTime",0);l(this,"lastFrameTime",0);l(this,"currentLoopCount",0);l(this,"completionCallback",null);l(this,"isPlaying",!1);l(this,"completed",!1);l(this,"isPaused",!1);l(this,"pauseStartTime",0);this.img=new Image,this.img.crossOrigin="anonymous",this.scrollConfig=s.scroll,this.loopConfig=s.loop??!1,this.duration=s.duration,this.pauseDuration=s.pauseBetweenLoops??0,this.colorOverride=s.colorOverride,this.colorOverride&&s.src.toLowerCase().includes(".svg")?this.loadAndProcessSvg(s.src):this.img.src=s.src,this.img.onload=()=>{this.loaded=!0},this.img.onerror=r=>{console.error("Failed to load image:",r)}}reset(){this.position=0,this.startTime=performance.now(),this.lastFrameTime=this.startTime,this.currentLoopCount=0,this.completed=!1,this.isPlaying=!1,this.isPaused=!1,this.pauseStartTime=0}play(){this.isPlaying||(this.isPlaying=!0,this.startTime=performance.now(),this.lastFrameTime=this.startTime)}pause(){this.isPlaying=!1}renderFrame(s,r){var a;if(!this.loaded||this.completed)return;if(this.isPaused){this.canvas.width=s,this.canvas.height=r,this.ctx.clearRect(0,0,s,r),this.pauseDuration>0&&performance.now()-this.pauseStartTime>=this.pauseDuration&&(this.isPaused=!1,this.position=0,this.startTime=performance.now(),this.lastFrameTime=this.startTime);return}if(this.canvas.width=s,this.canvas.height=r,this.ctx.clearRect(0,0,s,r),!((a=this.scrollConfig)!=null&&a.enabled)){this.ctx.drawImage(this.img,0,0,s,r),this.duration&&this.isPlaying&&performance.now()-this.startTime>=this.duration&&this.handleCompletion();return}const o=this.scrollConfig.direction||"left",n=this.scrollConfig.speed||50,i=this.scrollConfig.gap||0;if(this.isPlaying){const c=performance.now(),u=(c-this.lastFrameTime)/1e3;this.lastFrameTime=c;const d=n*u;switch(o){case"left":this.position+=d;break;case"right":this.position+=d;break;case"up":this.position+=d;break;case"down":this.position+=d;break}}this.drawScrollingImage(s,r,o,i),this.checkScrollCompletion(s,r,o,i)}drawScrollingImage(s,r,o,n){var h,f,p,b,w,M,_,F,Q;const i=this.img.width/this.img.height;let a,c;((h=this.scrollConfig)==null?void 0:h.maintainAspectRatio)!==!1?(f=this.scrollConfig)!=null&&f.height?(c=this.scrollConfig.height,a=c*i):(p=this.scrollConfig)!=null&&p.width?(a=this.scrollConfig.width,c=a/i):o==="left"||o==="right"?(c=r,a=c*i):(a=s,c=a/i):(a=((b=this.scrollConfig)==null?void 0:b.width)||s,c=((w=this.scrollConfig)==null?void 0:w.height)||r);let u,d;switch(o==="left"||o==="right"?(u=0,((M=this.scrollConfig)==null?void 0:M.offsetY)==="center"||((_=this.scrollConfig)==null?void 0:_.offsetY)===void 0?d=(r-c)/2:d=this.scrollConfig.offsetY):(((F=this.scrollConfig)==null?void 0:F.offsetX)==="center"||((Q=this.scrollConfig)==null?void 0:Q.offsetX)===void 0?u=(s-a)/2:u=this.scrollConfig.offsetX,d=0),o){case"left":{const D=s-this.position;if(D<s&&D>-a&&this.ctx.drawImage(this.img,D,d,a,c),this.loopConfig&&this.pauseDuration===0&&this.position>n){const O=D+a+n;O<s&&this.ctx.drawImage(this.img,O,d,a,c)}break}case"right":{const D=-a+this.position;if(D>-a&&D<s&&this.ctx.drawImage(this.img,D,d,a,c),this.loopConfig&&this.pauseDuration===0&&D-n-a>-a){const O=D-a-n;O<s&&this.ctx.drawImage(this.img,O,d,a,c)}break}case"up":{const D=r-this.position;if(D>-c&&D<r&&this.ctx.drawImage(this.img,u,D,a,c),this.loopConfig&&this.pauseDuration===0&&D+c+n<r){const O=D+c+n;O>-c&&this.ctx.drawImage(this.img,u,O,a,c)}break}case"down":{const D=-c+this.position;if(D>-c&&D<r&&this.ctx.drawImage(this.img,u,D,a,c),this.loopConfig&&this.pauseDuration===0&&D-n-c>-c){const O=D-c-n;O<r&&this.ctx.drawImage(this.img,u,O,a,c)}break}}}checkScrollCompletion(s,r,o,n){var h,f,p,b,w;if(!this.isPlaying)return;const i=this.img.width/this.img.height;let a,c;switch(((h=this.scrollConfig)==null?void 0:h.maintainAspectRatio)!==!1?(f=this.scrollConfig)!=null&&f.height?(c=this.scrollConfig.height,a=c*i):(p=this.scrollConfig)!=null&&p.width?(a=this.scrollConfig.width,c=a/i):o==="left"||o==="right"?(c=r,a=c*i):(a=s,c=a/i):(a=((b=this.scrollConfig)==null?void 0:b.width)||s,c=((w=this.scrollConfig)==null?void 0:w.height)||r),o){case"left":case"right":this.loopConfig;break;case"up":case"down":this.loopConfig;break}let u=!1;const d=1;switch(o){case"left":u=s-this.position<-a-d;break;case"right":u=-a+this.position>s+d;break;case"up":u=r-this.position<-c-d;break;case"down":u=-c+this.position>r+d;break}u&&(this.loopConfig===!1||typeof this.loopConfig=="number"&&this.loopConfig===1?this.handleCompletion():typeof this.loopConfig=="number"&&this.loopConfig>1?(this.currentLoopCount++,this.currentLoopCount>=this.loopConfig?this.handleCompletion():this.startPauseOrNextLoop()):this.loopConfig===!0&&this.startPauseOrNextLoop())}startPauseOrNextLoop(){this.pauseDuration>0?(this.isPaused=!0,this.pauseStartTime=performance.now()):this.position=0}handleCompletion(){this.completed=!0,this.isPlaying=!1,this.completionCallback&&this.completionCallback()}onDone(s){this.completionCallback=s}isOneShot(){var s;return!((s=this.scrollConfig)!=null&&s.enabled)&&!this.loopConfig}async loadAndProcessSvg(s){try{const o=await(await fetch(s)).text();this.originalSvgData=o;const n=this.applySvgColorOverride(o),i=`data:image/svg+xml;base64,${btoa(n)}`;this.img.src=i}catch(r){console.error("Failed to load and process SVG:",r),this.img.src=s}}applySvgColorOverride(s){if(!this.colorOverride)return s;const r=vr(this.colorOverride);return s.replace(/fill\s*=\s*["'][^"']*["']/gi,`fill="${r}"`).replace(/fill\s*:\s*[^;"]*/gi,`fill:${r}`).replace(/stroke\s*=\s*["'][^"']*["']/gi,`stroke="${r}"`).replace(/stroke\s*:\s*[^;"]*/gi,`stroke:${r}`)}dispose(){this.img.removeAttribute("src"),this.completionCallback=null,this.originalSvgData=null}}class dv extends at{constructor(s){super();l(this,"text");l(this,"lines");l(this,"fontSize");l(this,"fontFamily");l(this,"lineHeight");l(this,"textColor");l(this,"scrollConfig");l(this,"loopConfig");l(this,"duration");l(this,"pauseDuration");l(this,"position",0);l(this,"startTime",0);l(this,"lastFrameTime",0);l(this,"currentLoopCount",0);l(this,"completionCallback",null);l(this,"isPlaying",!1);l(this,"completed",!1);l(this,"isPaused",!1);l(this,"pauseStartTime",0);l(this,"textWidth",0);l(this,"textHeight",0);l(this,"lineWidths",[]);l(this,"textMeasured",!1);this.text=s.text,this.lines=s.text.split(`
|
|
115
|
-
`),this.fontSize=s.fontSize??8,this.lineHeight=s.lineHeight??this.fontSize+2,this.fontFamily=s.fontFamily??"monospace, 'Lucida Console', 'Courier New', Courier",this.scrollConfig=s.scroll,this.loopConfig=s.loop??!1,this.duration=s.duration,this.pauseDuration=s.pauseBetweenLoops??0,s.color?this.textColor=vr(s.color):this.textColor="rgb(255,255,255)"}measureText(){if(this.textMeasured)return;this.ctx.font=`${this.fontSize}px ${this.fontFamily}`,this.lineWidths=[];let s=0;for(const r of this.lines){const n=this.ctx.measureText(r).width;this.lineWidths.push(n),s=Math.max(s,n)}this.textWidth=s,this.textHeight=this.lines.length*this.lineHeight,this.textMeasured=!0}reset(){this.position=0,this.startTime=performance.now(),this.lastFrameTime=this.startTime,this.currentLoopCount=0,this.completed=!1,this.isPlaying=!1,this.isPaused=!1,this.pauseStartTime=0,this.textMeasured=!1,this.lineWidths=[]}play(){this.isPlaying||(this.isPlaying=!0,this.startTime=performance.now(),this.lastFrameTime=this.startTime)}pause(){this.isPlaying=!1}renderFrame(s,r){var a;if(this.canvas.width=s,this.canvas.height=r,this.measureText(),this.completed)return;if(this.isPaused){this.ctx.clearRect(0,0,s,r),this.pauseDuration>0&&performance.now()-this.pauseStartTime>=this.pauseDuration&&(this.isPaused=!1,this.position=0,this.startTime=performance.now(),this.lastFrameTime=this.startTime);return}if(this.ctx.clearRect(0,0,s,r),!((a=this.scrollConfig)!=null&&a.enabled)){this.drawStaticText(s,r),this.duration&&this.isPlaying&&performance.now()-this.startTime>=this.duration&&this.handleCompletion();return}const o=this.scrollConfig.direction||"left",n=this.scrollConfig.speed||50,i=this.scrollConfig.gap||0;if(this.isPlaying){const c=performance.now(),u=(c-this.lastFrameTime)/1e3;this.lastFrameTime=c;const d=n*u;switch(o){case"left":case"right":case"up":case"down":this.position+=d;break}}this.drawScrollingText(s,r,o,i),this.checkScrollCompletion(s,r,o)}drawStaticText(s,r){this.ctx.font=`${this.fontSize}px ${this.fontFamily}`,this.ctx.fillStyle=this.textColor,this.ctx.textBaseline="top";const o=this.textHeight;let n=(r-o)/2;for(let i=0;i<this.lines.length;i++){const a=this.lines[i],c=this.lineWidths[i],u=(s-c)/2,d=n+i*this.lineHeight;this.ctx.fillText(a,u,d)}}drawScrollingText(s,r,o,n){var c,u,d,h;this.ctx.font=`${this.fontSize}px ${this.fontFamily}`,this.ctx.fillStyle=this.textColor,this.ctx.textBaseline="top";let i,a;o==="left"||o==="right"?(i=0,((c=this.scrollConfig)==null?void 0:c.offsetY)==="center"||((u=this.scrollConfig)==null?void 0:u.offsetY)===void 0?a=(r-this.textHeight)/2:a=this.scrollConfig.offsetY):(((d=this.scrollConfig)==null?void 0:d.offsetX)==="center"||((h=this.scrollConfig)==null?void 0:h.offsetX)===void 0?(i=s/2,this.ctx.textAlign="center"):(i=this.scrollConfig.offsetX,this.ctx.textAlign="left"),a=0),this.drawMultiLineScrollText(o,s,r,n,i,a)}drawMultiLineScrollText(s,r,o,n,i,a){switch(s){case"left":{const c=r-this.position;if(c<r&&c>-this.textWidth&&this.drawTextBlock(c,a,"left"),this.loopConfig&&this.pauseDuration===0&&this.position>n){const u=c+this.textWidth+n;u<r&&this.drawTextBlock(u,a,"left")}break}case"right":{const c=-this.textWidth+this.position;if(c>-this.textWidth&&c<r&&this.drawTextBlock(c,a,"left"),this.loopConfig&&this.pauseDuration===0&&c-n-this.textWidth>-this.textWidth){const u=c-this.textWidth-n;u<r&&this.drawTextBlock(u,a,"left")}break}case"up":{const c=o-this.position;if(c>-this.textHeight&&c<o&&this.drawTextBlock(i,c,"center"),this.loopConfig&&this.pauseDuration===0&&c+this.textHeight+n<o){const u=c+this.textHeight+n;u>-this.textHeight&&this.drawTextBlock(i,u,"center")}break}case"down":{const c=-this.textHeight+this.position;if(c>-this.textHeight&&c<o&&this.drawTextBlock(i,c,"center"),this.loopConfig&&this.pauseDuration===0&&c-n-this.textHeight>-this.textHeight){const u=c-this.textHeight-n;u<o&&this.drawTextBlock(i,u,"center")}break}}}drawTextBlock(s,r,o){for(let n=0;n<this.lines.length;n++){const i=this.lines[n],a=this.lineWidths[n];let c;o==="center"?c=s-a/2:c=s;const u=r+n*this.lineHeight;this.ctx.fillText(i,c,u)}}checkScrollCompletion(s,r,o){if(!this.isPlaying)return;let n=!1;const i=1;switch(o){case"left":n=s-this.position<-this.textWidth-i;break;case"right":n=-this.textWidth+this.position>s+i;break;case"up":n=r-this.position<-this.textHeight-i;break;case"down":n=-this.textHeight+this.position>r+i;break}n&&(this.loopConfig===!1||typeof this.loopConfig=="number"&&this.loopConfig===1?this.handleCompletion():typeof this.loopConfig=="number"&&this.loopConfig>1?(this.currentLoopCount++,this.currentLoopCount>=this.loopConfig?this.handleCompletion():this.startPauseOrNextLoop()):this.loopConfig===!0&&this.startPauseOrNextLoop())}startPauseOrNextLoop(){this.pauseDuration>0?(this.isPaused=!0,this.pauseStartTime=performance.now()):this.position=0}handleCompletion(){this.completed=!0,this.isPlaying=!1,this.completionCallback&&this.completionCallback()}onDone(s){this.completionCallback=s}isOneShot(){var s;return!((s=this.scrollConfig)!=null&&s.enabled)&&!this.loopConfig}dispose(){this.completionCallback=null}}class hv{constructor(t){l(this,"patterns");l(this,"currentPatternIndex",0);l(this,"currentRenderer",null);l(this,"loopConfig");l(this,"currentLoopCount",0);l(this,"transitionDuration");l(this,"patternOverrides");l(this,"completionCallback",null);l(this,"patternStore");l(this,"canvas");l(this,"ctx");l(this,"width",0);l(this,"height",0);this.patterns=t.patterns,this.loopConfig=t.loop??!1,this.transitionDuration=t.transitionDuration??0,this.patternOverrides=t.patternOverrides??{},this.patternStore=t.patternStore??new Map,this.canvas=document.createElement("canvas");const s=this.canvas.getContext("2d");if(!s)throw new Error("2D canvas not supported");if(this.ctx=s,this.patterns.length===0)throw new Error("SequenceRenderer requires at least one pattern");this.loadCurrentPattern()}loadCurrentPattern(){var n,i,a,c;const t=this.patterns[this.currentPatternIndex],s=this.patternStore.get(t);if(!s){console.warn(`Pattern "${t}" not found in store, skipping`),this.moveToNextPattern();return}this.currentRenderer&&((i=(n=this.currentRenderer).dispose)==null||i.call(n));const r=this.patternOverrides[t]??{},o={...s.data,...r};try{this.currentRenderer=wr({mode:s.type,data:o}),this.currentRenderer&&this.isDoneAware(this.currentRenderer)&&this.currentRenderer.onDone(()=>{this.handlePatternComplete()}),this.currentRenderer&&(this.currentRenderer.reset(),(c=(a=this.currentRenderer).play)==null||c.call(a),this.width>0&&this.height>0&&this.currentRenderer.renderFrame(this.width,this.height))}catch(u){console.error(`Failed to create renderer for pattern "${t}":`,u),this.moveToNextPattern()}}isDoneAware(t){return typeof(t==null?void 0:t.onDone)=="function"}handlePatternComplete(){this.transitionDuration>0?setTimeout(()=>{this.moveToNextPattern()},this.transitionDuration):this.moveToNextPattern()}moveToNextPattern(){this.currentPatternIndex++,this.currentPatternIndex>=this.patterns.length?this.loopConfig===!0?(this.currentPatternIndex=0,this.loadCurrentPattern()):typeof this.loopConfig=="number"&&this.currentLoopCount<this.loopConfig-1?(this.currentLoopCount++,this.currentPatternIndex=0,this.loadCurrentPattern()):this.completionCallback&&this.completionCallback():this.loadCurrentPattern()}reset(){this.currentPatternIndex=0,this.currentLoopCount=0,this.loadCurrentPattern()}play(){var t,s;(s=(t=this.currentRenderer)==null?void 0:t.play)==null||s.call(t)}pause(){var t,s;(s=(t=this.currentRenderer)==null?void 0:t.pause)==null||s.call(t)}renderFrame(t,s){this.width=t,this.height=s,this.canvas.width=t,this.canvas.height=s,this.currentRenderer&&this.currentRenderer.renderFrame(t,s)}readPixels(t,s){return this.currentRenderer?this.currentRenderer.readPixels(t,s):this.ctx.getImageData(0,0,t,s).data}onDone(t){this.completionCallback=t}isOneShot(){var t,s;return this.loopConfig===!1||this.loopConfig===1?this.patterns.length===1&&this.currentRenderer?((s=(t=this.currentRenderer).isOneShot)==null?void 0:s.call(t))??!1:!0:!1}dispose(){var t,s;this.currentRenderer&&((s=(t=this.currentRenderer).dispose)==null||s.call(t)),this.completionCallback=null}setPatternStore(t){this.patternStore=t,this.patterns.length>0&&this.loadCurrentPattern()}}const fv=Vn(at);class pv extends fv{constructor(s={r:0,g:0,b:0}){super();l(this,"color");let r;s.color!==void 0?r=s.color:s.r!==void 0&&s.g!==void 0&&s.b!==void 0?r={r:s.r,g:s.g,b:s.b}:r={r:0,g:0,b:0},this.color=vr(r)}setColor(s){this.color=vr(s),this.resetOneShot()}reset(){this.resetOneShot()}renderFrame(s,r){this.isOneShotDone||(this.canvas.width=s,this.canvas.height=r,this.ctx.fillStyle=this.color,this.ctx.fillRect(0,0,s,r),this.signalDoneIfNeeded())}}class gv extends at{constructor({minHue:s=0,maxHue:r=360,speed:o=1}={}){super();l(this,"offset",0);l(this,"minHue");l(this,"maxHue");l(this,"speed");this.minHue=s,this.maxHue=r,this.speed=o}reset(){this.offset=0,this.lastUpdate=performance.now()}hslToRgb(s,r,o){let n,i,a;if(r===0)n=i=a=o;else{const c=(h,f,p)=>(p<0&&(p+=1),p>1&&(p-=1),p<.16666666666666666?h+(f-h)*6*p:p<.5?f:p<.6666666666666666?h+(f-h)*(.6666666666666666-p)*6:h),u=o<.5?o*(1+r):o+r-o*r,d=2*o-u;n=c(d,u,s+1/3),i=c(d,u,s),a=c(d,u,s-1/3)}return[Math.round(n*255),Math.round(i*255),Math.round(a*255)]}renderFrame(s,r){this.shouldStep(50)&&(this.offset=(this.offset+this.speed)%s);const o=this.ctx.createImageData(s,r),n=o.data;let i=0;for(let a=0;a<r;a++)for(let c=0;c<s;c++){const u=(c+this.offset)%s/s,d=this.minHue/360+u*((this.maxHue-this.minHue)/360),[h,f,p]=this.hslToRgb(d,1,.5);n[i++]=h,n[i++]=f,n[i++]=p,n[i++]=255}this.ctx.putImageData(o,0,0)}}const qi=new Map;$s(te,{register(e,t){qi.set(e,t)},execute(e,t){const s=qi.get(e);return s?new s(t):null}});S.canvas.registerRenderer("video",av);S.canvas.registerRenderer("video-basic",Nu);S[te].register("image-static",Uu);S[te].register("image-scrolling",Bu);const mv=class{constructor(e){var t;return(t=e.scroll)!=null&&t.enabled?new Bu(e):new Uu(e)}};S[te].register("image",mv);S[te].register("color",pv);S[te].register("matrix",lv);S[te].register("sweep",gv);S[te].register("gradient",nv);S[te].register("drop",rv);S[te].register("sequence",hv);S[te].register("text",dv);const yv=class{constructor(e){const t=(s,r)=>{const o=wr({mode:s,data:r});if(!o)throw new Error(`Failed to create renderer of type: ${s}`);return o};return new uv(e,t)}};S[te].register("overlay",yv);const wr=({mode:e,data:t})=>{const s=S[te].execute(e,t);if(s)return s;throw new Error(`Unknown mode: ${e}`)};var bv=Object.defineProperty,vv=Object.getOwnPropertyDescriptor,Bt=(e,t,s,r)=>{for(var o=r>1?void 0:r?vv(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=(r?i(t,s,o):i(o))||o);return r&&o&&bv(t,s,o),o};const Ku="canvas-dispatcher-model";function wv(e){if(e=e.replace(/^#/,""),e.length===3&&(e=e.split("").map(s=>s+s).join("")),e.length!==6)return null;const t=parseInt(e,16);return{r:t>>16&255,g:t>>8&255,b:t&255}}let ze=class{constructor(e,t,s){l(this,"id");l(this,"logger");l(this,"_content",new Map);l(this,"_patterns",new Map);l(this,"_endpointRenderers");l(this,"pattern");l(this,"data");this.id=e,this.logger=s.logger,this._endpointRenderers=new Se}addNamedEndpoint(e,t){this._endpointRenderers.getModel(e)&&this.logger.warn(`Endpoint "${e}" already exists. Overwriting.`);const s=Gn.instance(e).options({apiPath:t.apiPath,width:t.width,height:t.height,fps:t.fps,durationMs:t.durationMs??null,endpoint:e}).build();return this._endpointRenderers.addModel(s),s}addContent(e,t){this._content.has(e)&&this.logger.warn(`Content "${e}" already exists. Overwriting.`),this._content.set(e,t)}addPattern(e,t){this._patterns.has(e)&&this.logger.warn(`Pattern "${e}" already exists. Overwriting.`),this._patterns.set(e,t)}async handlePatternsPost(e,t){var o,n;const s=e.body,r=Array.isArray(s)?s:[s];if(r.some(i=>!i.id||!i.type||!i.data)){(o=t.status)==null||o.call(t,400).send({error:"Invalid pattern data"});return}for(const i of r)this._patterns.has(i.id)&&this.logger.warn(`Pattern "${i.id}" already exists. Overwriting.`),this.addPattern(i.id,i);(n=t.status)==null||n.call(t,200).send({status:"OK"})}async handlePatternApplication(e,t){var u,d,h;const s=e.params.pattern,r=e.params.endpoint,o=this._endpointRenderers.getModel(r);if(!o){(u=t.status)==null||u.call(t,404).send({error:`Endpoint "${r}" not found`});return}if(!this._patterns.has(s)){(d=t.status)==null||d.call(t,404).send({error:`Pattern "${s}" not found`});return}const n=this._patterns.get(s),i=n.type,a=e.body||{};this.data={...n.data,...a};const c=i==="sequence"?{...this.data,patternStore:this._patterns}:this.data;o.renderer=wr({mode:i,data:c}),o.setClearOnComplete(n.clearOnComplete),o.startStreaming(),(h=t.status)==null||h.call(t,200).send({status:"OK"})}async handleColorApplication(e,t){var u,d,h;const s=e.params.color,r=wv(s);if(!r){(u=t.status)==null||u.call(t,400).send({error:"Invalid color format"});return}const o=e.params.endpoint,n=this._endpointRenderers.getModel(o);if(!n){(d=t.status)==null||d.call(t,404).send({error:`Endpoint "${o}" not found`});return}const{r:i,b:a,g:c}=r;n.renderer=wr({mode:"color",data:{r:i,g:c,b:a}}),n.startStreaming(),(h=t.status)==null||h.call(t,200).send({status:"OK"})}async handleEndpointCreation(e,t){var r,o;const s=e.body;if(!s.apiPath||!s.id){(r=t.status)==null||r.call(t,400).send({error:"Name and path are required"});return}this.addNamedEndpoint(s.id,s),(o=t.status)==null||o.call(t,200).send({status:"OK"})}async load(e){var s;const t=e==null?void 0:e.get(Ct.loader);t&&((s=t.patterns)==null||s.forEach(r=>{if(!r.id||!r.type||!r.data){this.logger.warn(`Invalid pattern data: ${JSON.stringify(r)}`);return}this.addPattern(r.id,r)}))}};Bt([Ie],ze.prototype,"_endpointRenderers",2);Bt([Cs("/api/ui/canvas/patterns")],ze.prototype,"handlePatternsPost",1);Bt([Cs("/api/ui/canvas/pattern/:endpoint/:pattern")],ze.prototype,"handlePatternApplication",1);Bt([Cs("/api/ui/canvas/color/:endpoint/:color")],ze.prototype,"handleColorApplication",1);Bt([Cs("/api/ui/canvas/endpoint")],ze.prototype,"handleEndpointCreation",1);ze=Bt([A(Ku)],ze);const Ct=new Me({class:ze,type:Ku}),{URL:Yn}=ae(),{getOne:Hu}=oe.build({basePath:`${Yn}/api/device`}),Er=m.createLogger({name:"device-service",group:"Services"}),zu=async()=>{Er.debug("sending GET for device serial number");try{const e=await Hu({urlOverride:`${Yn}/api/kos/device/serialNumber`});return[void 0,e==null?void 0:e.data.serialNumber]}catch(e){if(e instanceof pe)return Er.error(`Error fetching device serial number: ${e.payload.error}`),[e.payload.error,void 0]}return["unknownError",void 0]},Gu=async()=>{Er.debug("sending GET for device details");try{const e=await Hu({urlOverride:`${Yn}/api/kos/device`});return e?[void 0,e.data]:["unknownError",void 0]}catch(e){if(e instanceof pe)return Er.error(`Error fetching device serial number: ${e.payload.error}`),[e.payload.error,void 0]}return["unknownError",void 0]},Ev=Object.freeze(Object.defineProperty({__proto__:null,getDeviceDetails:Gu,getSerialNumber:zu},Symbol.toStringTag,{value:"Module"}));var Mv=Object.defineProperty,Tv=Object.getOwnPropertyDescriptor,Vu=(e,t,s,r)=>{for(var o=r>1?void 0:r?Tv(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=(r?i(t,s,o):i(o))||o);return r&&o&&Mv(t,s,o),o};const Yu="device-model",_v="/kos/criticalData/changed",Ov="/kos/criticalData/available";let Mr=class{constructor(e,t,s){l(this,"id");l(this,"logger");l(this,"_serialNumber");l(this,"_name");l(this,"_nodeId");this.id=e,this.logger=s.logger,this._serialNumber="unassigned",this._name="unassigned",this._nodeId="unassigned"}get serialNumber(){return this._serialNumber}get name(){return this._name}get nodeId(){return this._nodeId}get nodeType(){const[e]=this.nodeId.split("-");return e}get nodeName(){const[,e]=this.nodeId.split("-");return e}updateModel(e){this._serialNumber=e.serialNumber??"unassigned",this._name=e.name??"unassigned",this._nodeId=e.nodeId??"unassigned"}async loadDeviceData(){const[e,t]=await Gu();if(e){this.logger.error(`Error fetching device serial number: ${e}`);return}if(t){const{name:s,nodeId:r}=t;this.updateModel({name:s,nodeId:r,serialNumber:this.serialNumber})}}async loadSerialNumber(){const[e,t]=await zu();if(e){this.logger.error(`Error fetching device serial number: ${e}`);return}this.updateModel({serialNumber:t,name:this.name,nodeId:this.nodeId})}async handleCriticalDataChanged(){this.logger.debug(`Critical data changed for device ${this.id}`),await this.loadSerialNumber()}async init(){this.logger.debug(`initializing device ${this.id}`)}async load(){this.logger.debug(`loading device ${this.id}`),await this.loadDeviceData(),await this.loadSerialNumber()}};Vu([U({topic:[_v,Ov],websocket:!0})],Mr.prototype,"handleCriticalDataChanged",1);Mr=Vu([A(Yu)],Mr);const Tr=new Me({class:Mr,type:Yu});var Iv=Object.getOwnPropertyDescriptor,Sv=(e,t,s,r)=>{for(var o=r>1?void 0:r?Iv(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=i(o)||o);return o};const qu="network-interface-model";let xo=class{constructor(e,t,s){l(this,"id");l(this,"name");l(this,"type");l(this,"nmdevicestate");l(this,"hwaddress");l(this,"mtu");l(this,"configured");l(this,"wifi");l(this,"ethernet");l(this,"ip4settings");l(this,"category");l(this,"logger");this.id=e,this.logger=s.logger,this.name=t.name,this.type=t.type,this.nmdevicestate=t.nmdevicestate,this.hwaddress=t.hwaddress,this.mtu=t.mtu,this.configured=t.configured,this.wifi=t.wifi,this.ethernet=t.ethernet,this.ip4settings=t.ip4settings,this.category=t.category}updateModel(e){this.name=e.name,this.type=e.type,this.nmdevicestate=e.nmdevicestate,this.hwaddress=e.hwaddress,this.mtu=e.mtu,this.configured=e.configured,this.wifi=e.wifi,this.ethernet=e.ethernet,this.ip4settings=e.ip4settings,this.category=e.category}async init(){this.logger.debug(`initializing network-interface ${this.id}`)}async load(){this.logger.debug(`loading network-interface ${this.id}`)}};xo=Sv([A(qu)],xo);const qn=new me({class:xo,type:qu}),{URL:$v}=ae(),{getAll:Cv}=oe.build({basePath:`${$v}/api/kos/network/interfaces`}),Wi=m.createLogger({name:"network-interface-service",group:"Services"}),Wu=async()=>{Wi.debug("sending GET for copy-logs");try{const e=await Cv({});return[void 0,e==null?void 0:e.data]}catch(e){if(e instanceof pe)return Wi.error(`Error fetching log file size: ${e.payload.error}`),[e.payload.error,void 0]}return["unknownError",void 0]},Dv=Object.freeze(Object.defineProperty({__proto__:null,getNetworkInterfaces:Wu},Symbol.toStringTag,{value:"Module"}));var xv=Object.defineProperty,Av=Object.getOwnPropertyDescriptor,Qu=(e,t,s,r)=>{for(var o=r>1?void 0:r?Av(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=(r?i(t,s,o):i(o))||o);return r&&o&&xv(t,s,o),o};const Zu="network-interface-container-model";let _r=class{constructor(e,t,s){l(this,"id");l(this,"logger");l(this,"_models");this.id=e,this.logger=s.logger,this._models=new Se({parentId:e,indexMap:{byCategory:"category"}})}getModel(e){return this._models.getModel(e)}get models(){return this._models}get data(){return this._models.data}addModel(e){this._models.addModel(e)}removeModel(e){this._models.removeModel(e)}async init(){this.logger.debug(`initializing network-interface-container container ${this.id}`)}async refreshInterfaces(){this.logger.debug("refreshing interfaces");const[e,t]=await Wu();if(e){this.logger.error(`Error loading network interfaces: ${e}`);return}t&&t.forEach(s=>{const r=qn.instance(s.name).forceUpdate.options(s).build();this.addModel(r)})}async load(){this.logger.debug(`loading network-interface-container container ${this.id}`),this.refreshInterfaces()}};Qu([Ie],_r.prototype,"_models",2);_r=Qu([A(Zu)],_r);const Ts=new Me({class:_r,type:Zu});Ts.addRelatedModel(qn);const{URL:Pv}=ae(),{getAll:Rv}=oe.build({basePath:`${Pv}/api/kos/storage/devices`}),Qi=m.createLogger({name:"storage-device-service",group:"Services"}),Xu=async()=>{Qi.debug("sending GET for storage-device");const e=await Rv({});return!(e!=null&&e.data)||e.status!==200?(Qi.error("Failed to retrieve storage-device data",e),[]):e.data},kv=Object.freeze(Object.defineProperty({__proto__:null,getStorageDevices:Xu},Symbol.toStringTag,{value:"Module"}));var Lv=Object.getOwnPropertyDescriptor,Fv=(e,t,s,r)=>{for(var o=r>1?void 0:r?Lv(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=i(o)||o);return o};const Ju="storage-device-model";let Ao=class{constructor(e,t,s){l(this,"id");l(this,"mountDir");l(this,"removed");l(this,"vendor");l(this,"runTimeMs");l(this,"model");l(this,"nodeId");l(this,"local");l(this,"label");l(this,"syspath");l(this,"logger");this.id=e,this.logger=s.logger,this.mountDir=t.mountDir,this.removed=t.removed,this.vendor=t.vendor,this.runTimeMs=t.runTimeMs,this.model=t.model,this.nodeId=t.nodeId,this.local=t.local,this.label=t.label,this.syspath=t.syspath}updateModel(e){this.mountDir=e.mountDir,this.removed=e.removed,this.vendor=e.vendor,this.runTimeMs=e.runTimeMs,this.model=e.model,this.nodeId=e.nodeId,this.local=e.local,this.label=e.label,this.syspath=e.syspath}async init(){this.logger.debug(`initializing storage-device ${this.id}`)}async load(){this.logger.debug(`loading storage-device ${this.id}`)}};Ao=Fv([Ar(),A(Ju)],Ao);const Or=new me({class:Ao,type:Ju});var Nv=Object.defineProperty,Uv=Object.getOwnPropertyDescriptor,Wn=(e,t,s,r)=>{for(var o=r>1?void 0:r?Uv(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=(r?i(t,s,o):i(o))||o);return r&&o&&Nv(t,s,o),o};const ed="storage-device-container-model",jv="/kos/storage";let _s=class{constructor(e,t,s){l(this,"id");l(this,"logger");l(this,"_models");this.id=e,this.logger=s.logger,this._models=new Se({parentId:e})}getModel(e){return this._models.getModel(e)}get models(){return this._models}get data(){return this._models.data}addModel(e){this._models.addModel(e)}removeModel(e){this._models.removeModel(e)}async init(){this.logger.debug(`initializing storage-device-container container ${this.id}`)}get isStorageInserted(){return this.data.length>0}get volumes(){return this.data}handleStorageAvailability(e){this._models.data.filter(s=>!e.find(r=>r.id===s.id)).forEach(s=>{this.removeModel(s.id)}),e.forEach(s=>{const r=this.getModel(s.id);if(r){const o={...s,kosParentId:this.id};r.updateModel(o)}else{const o={...s,kosParentId:this.id},n=Or.instance(s.id).options(o).build();this.addModel(n)}})}async load(){this.logger.debug(`loading storage-device-container container ${this.id}`),(await Xu()).forEach(t=>{const s={...t,kosParentId:this.id},r=Or.instance(t.id).options(s).build();this.addModel(r)})}};Wn([Ie],_s.prototype,"_models",2);Wn([U({topic:jv,websocket:!0})],_s.prototype,"handleStorageAvailability",1);_s=Wn([A(ed)],_s);const Dt=new Me({class:_s,type:ed});Dt.addRelatedModel(Or);const{URL:Qn}=ae(),{getAll:Bv,postModel:Kv}=oe.build({basePath:`${Qn}/api/kos/update/available`}),Zi=m.createLogger({name:"usb-update-service",group:"Services"}),td=async()=>{Zi.debug("sending GET for usb-update");const e=await Bv({urlOverride:`${Qn}/api/kos/update/available`});return!(e!=null&&e.data)||(e==null?void 0:e.status)!==200?(Zi.error("Failed to retrieve usb-update data",e),[]):e.data},sd=async(e,t,s)=>{const r=await Kv({model:{manifestId:e,deviceId:t},tracker:s,urlOverride:`${Qn}/api/kos/update/install`});if(!(r!=null&&r.data))throw new Error("No response from server");return r.data},Hv=Object.freeze(Object.defineProperty({__proto__:null,getAvailableUpdates:td,installUpdate:sd},Symbol.toStringTag,{value:"Module"}));var zv=Object.defineProperty,Gv=Object.getOwnPropertyDescriptor,rd=(e,t,s,r)=>{for(var o=r>1?void 0:r?Gv(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=(r?i(t,s,o):i(o))||o);return r&&o&&zv(t,s,o),o};const od="usb-update-model";let Ir=class{constructor(e,t,s){l(this,"id");l(this,"active");l(this,"blocked");l(this,"createTime");l(this,"deviceId");l(this,"manifestId");l(this,"notes");l(this,"futureHandler");l(this,"logger");this.id=e,this.logger=s.logger,this.active=t.active,this.blocked=t.blocked,this.createTime=t.createTime,this.deviceId=t.deviceId,this.manifestId=t.manifestId,this.notes=t.notes,this.futureHandler=new Rr(this)}updateModel(e){this.active=e.active,this.blocked=e.blocked,this.createTime=e.createTime,this.deviceId=e.deviceId,this.manifestId=e.manifestId,this.notes=e.notes}reset(){this.futureHandler.removeFuture()}get future(){return this.futureHandler.future}async install(e){if(!e)throw new Error("No tracker provided");return this.logger.info(`Installing update for manifest ${this.manifestId} from device ${this.deviceId}`),sd(this.manifestId,this.deviceId,e)}async init(){this.logger.debug(`initializing usb-update ${this.id}`)}async load(){this.logger.debug(`loading usb-update ${this.id}`)}};rd([si()],Ir.prototype,"install",1);Ir=rd([A(od)],Ir);const Zn=new me({class:Ir,type:od});var Vv=Object.defineProperty,Yv=Object.getOwnPropertyDescriptor,qr=(e,t,s,r)=>{for(var o=r>1?void 0:r?Yv(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=(r?i(t,s,o):i(o))||o);return r&&o&&Vv(t,s,o),o};const nd="usb-update-container-model";let xt=class{constructor(e,t,s){l(this,"id");l(this,"disposer");l(this,"storageService");l(this,"_activeUpdate");l(this,"logger");l(this,"_models");this.id=e,this.logger=s.logger,this._models=new Se({parentId:e})}getModel(e){return this._models.getModel(e)}get models(){return this._models}get data(){return this._models.data}addModel(e){this._models.addModel(e)}removeModel(e){this._models.removeModel(e)}get activeUpdate(){return this._activeUpdate}reset(){this.clearActiveUpdate()}clearActiveUpdate(){this._activeUpdate=void 0}updateActiveUpdate(e){this._activeUpdate=e}get isUsbInserted(){return this.storageService.isStorageInserted}get hasAvailableUpdates(){return this._models.data.length>0}async syncAvailableUpdates(){const e=await td();X(()=>{const t=e.map(s=>`${s.deviceId}-${s.manifestId}`);this._models.data.filter(s=>!t.includes(s.id)).forEach(s=>this.removeModel(s.id)),e.forEach(s=>{const r=`${s.deviceId}-${s.manifestId}`,o=Zn.instance(r).forceUpdate.options({...s,createTime:new Date(s.createTime)}).build();this.addModel(o)}),this.data.length===1?this.updateActiveUpdate(this.data[0]):this.clearActiveUpdate()})}usbInsertedEffect(){this.isUsbInserted?this.syncAvailableUpdates():(this._models.clear(),this.clearActiveUpdate())}async init(){this.logger.debug(`initializing usb-update-container container ${this.id}`)}unload(){var e;(e=this.disposer)==null||e.call(this)}async activate(){this.logger.debug(`activating usb-update-container container ${this.id}`),await this.syncAvailableUpdates()}async load(){this.logger.debug(`loading usb-update-container container ${this.id}`)}};qr([Pt({modelType:Dt.type})],xt.prototype,"storageService",2);qr([Ie],xt.prototype,"_models",2);qr([lc({dependencies:e=>[e.isUsbInserted]})],xt.prototype,"usbInsertedEffect",1);xt=qr([A(nd)],xt);const Os=new Me({class:xt,type:nd});Os.addRelatedModel(Zn);const qv=()=>({...{[Lt.type]:{class:Dl},[He.type]:{class:Ll,singleton:!0},...re.registration,...rt.registration,...St.registration,...mr.registration,...ke.registration,[Hn.type]:{class:exports.WsEventModel,singleton:!0},...Ms.registration,...Bn.registration,...ar.registration}}),Xn=qv(),Wv={models:Xn,preloadModels:[]},Xi=!0,id=e=>()=>{const t=Xn;return bc(Po)(Es).model(St).model(Dt).model(Os).model(Tr).model(hr).model(ps).model(fr).model(Dn).model(Ts).model(Ct).model(Gn).model(Yl).model(Sn,Xi).model(Ps).model(Ql,Xi),Object.keys(t).forEach(s=>{const r=t[s];yc(Po)(s,r)}),{preload:x.model.preloadModel(e),model:x.model.register(e),companion:x.companion.register(e),legacy:x.model.registerLegacyModel(e)}},we={};we.core={models:id(we)};we.preload=x.model.preloadModel(we);we.model=x.model.register(we);we.companion=x.companion.register(we);we.legacy=x.model.registerLegacyModel(we);const Po=we;class Qv{registerTroubleRankMapper(t){return S.propertyMapper.registerPropertyMapper(be.TroubleRank,t),this}registerTroubleRoleMapper(t){return S.propertyMapper.registerPropertyMapper(be.TroubleRole,t),this}registerTroubleColorMapper(t){return S.propertyMapper.registerPropertyMapper(be.TroubleColor,t),this}registerModelLoader(t,s){S.loader.registerLoader(t,s)}registerCanvasPatternLoader(t){S.loader.registerLoader(Ct.loader,t)}}const Zv=async(e,t)=>{const s=Dn.instance(e).options({}).build(),r=t?`${t}-`:"";return await ue(s),{getState:o=>s.data[`${r}${o}`],updateState:async(o,n)=>{await s.updateState(`${r}${o}`,n)},clean:async()=>{for(const o of s.data.keys)await s.updateState(`${r}${o}`,void 0)},unsubscribe:()=>{Xe(s)}}},ad="kos:service:region",cd="regionId",Xv=`${ad}-${cd}`,ld=async e=>{const t=rt.factory(Xv)({path:ad,attribute:cd});await ue(t),t.updateProperty(e)},Jn="/kos-timer-event",ei="/kos-timer-event/tick",ti="defaultTimerEnd",es=m.createLogger({name:"timer-manager"}),Jv=e=>e.updateProperty!==void 0;class ud{constructor(t,s,r){l(this,"name");l(this,"timeout");l(this,"timer");l(this,"state","inactive");l(this,"decrementValue",1);l(this,"remainingTime");l(this,"timeoutActions",new Map);this.name=t;const o=typeof s=="number"?s:s.value||60;this.timeout=o,this.state="inactive",this.remainingTime=o,Jv(s)&&Y(()=>{m.info(`Updating config value timer ${t} with new timeout value ${s.value}`);const n=s.value||60;this.updateTimeout(n)}),this.addTimeoutAction({name:ti}),r&&r.forEach(n=>{this.addTimeoutAction(n)})}get id(){return this.name}start(){if(this.state==="active"){es.debug(`Timer ${this.name} already started`);return}(this.state==="inactive"||this.state==="paused")&&(this.state="active",this.timer=setInterval(()=>this.updateTimer(),1e3))}pause(){this.timer&&(es.debug(`Pausing timer ${this.name}`),this.state="paused",clearInterval(this.timer))}restart(){this.pause(),this.remainingTime=this.timeout,this.start()}reset(){this.pause(),this.remainingTime=this.timeout,this.state="inactive"}updateTimeout(t){this.timeout=t,this.restart()}addTimeoutAction(t){const s=t.remainingTime??0;this.timeoutActions.has(s)||this.timeoutActions.set(s,[]);const r=t.name,o=this.timeoutActions.get(s).find(n=>n.name===r);o?o.action=t.action:this.timeoutActions.get(s).push(t)}removeTimeoutAction(t){for(const[s,r]of this.timeoutActions.entries()){const o=r.filter(n=>n.name!==t);o.length===0?this.timeoutActions.delete(s):this.timeoutActions.set(s,o)}}updateTimer(){if(this.remainingTime=Math.round((this.remainingTime-this.decrementValue)*100)/100,this.remainingTime<=0){this.state==="active"&&this.executeActions(0),this.pause();return}this.state==="active"&&this.executeActions(this.remainingTime)}executeActions(t){this.timeoutActions.has(t)&&this.timeoutActions.get(t).forEach(s=>{var r;es.debug(`Executing timer action ${s.name} at ${t}`),(r=s.action)==null||r.call(s,s.name,t),this.notifyTimeoutAction(s),s.singleUse&&(es.info(`${this.name} Removing single-use action ${s.name}`),this.removeTimeoutAction(s.name))}),this.notifyTick()}notifyTick(){z(`${ei}/${this.name}`,{name:this.name,remainingTime:this.remainingTime})}notifyTimeoutAction(t){z(Jn,{name:this.name,action:t.name,remainingTime:this.remainingTime})}}const ts=new Map,ht=(e,t)=>{const s=ts.get(e);if(!s){es.error(`Timer ${e} not found`);return}t(s)},dd={createRelativeTimer(e,t,s){const r=new Date,o=Math.round((t.getTime()-r.getTime())/1e3);return this.createTimer(e,o,s)},createTimer(e,t=60,s){if(ts.has(e))return ts.get(e);const r=new ud(e,t,s);return ts.set(e,r),r},getTimer(e){return ts.get(e)},clearTimer(e){ht(e,t=>t.pause())},restartTimer(e){ht(e,t=>t.restart())},resetTimer(e){ht(e,t=>t.reset())},addTimeoutAction(e,t){ht(e,s=>s.addTimeoutAction(t))},removeTimeoutAction(e,t){ht(e,s=>s.removeTimeoutAction(t))},startTimer(e){ht(e,t=>t.start())}},hd="kos:service:region:settings",fd="timeZone",ew=`${hd}-${fd}`,Ro=async e=>{const t=rt.factory(ew)({path:hd,attribute:fd});await ue(t),t.updateProperty(e)},tw=e=>!e||!e.data;function si(e={}){const{alias:t,namespace:s,abortController:r=!1}=e;return(o,n,i)=>{o[os]=o[os]||{},t&&(o[as]=o[as]||new Map,o[as].set(n,t));const a=i.value,c=async function(...u){const d=tt();m.debug(`Calling future service ${n} with tracker ${d}`);let h,f;r&&(h=new AbortController);const p=Je.initiateFuture({tracker:d,id:yn});s&&(p.namespace=s),m.debug(`waiting for future ${p.id} to be ready`),await ue(p),m.debug(`future ${p.id} is ready`),X(()=>{m.debug(`Adding future ${p.id} to futureHandler`),this.futureHandler.addFuture(p,t)}),r&&h&&(f=Y(()=>{(p.status==="CANCELLED"||p.endState===Ke.Canceled)&&(m.debug(`Future ${p.id} cancelled, aborting request`),h==null||h.abort())}),h.signal.addEventListener("abort",async()=>{if(p.status!=="CANCELLED"&&p.endState!==Ke.Canceled&&!p.endState){m.debug(`AbortController aborted, cancelling future ${p.id}`);try{await p.cancelFuture()}catch(w){m.error(`Failed to cancel future ${p.id}:`,w)}}},{once:!0}));const b=()=>{f&&(f(),f=void 0)};try{const w=[...u];if(r&&h){const F=w[w.length-1];F&&typeof F=="object"&&"aborted"in F?w[w.length-1]=h.signal:w.push(h.signal)}w.push(d);const M=await a.apply(this,w);m.debug(`received future response for ${d}`,M);const _=tw(M)?M:M==null?void 0:M.data;return _?(_.progress=1,m.debug("mapping future response to future model"),p.endState?m.debug(`future ${p.id} has already completed. Not updating the model`):On(_,p)):this.futureHandler.removeFuture(t),b(),_}catch(w){if(b(),r&&(h!=null&&h.signal.aborted)){const M=new Error("Operation cancelled");throw m.debug(`Operation ${n} was cancelled`),M}throw m.error(w),w}};o[os][n]={handler:c}}}const sw=({path:e})=>(t,s)=>{t[k]=t[k]||{},t[k][s]={modelType:Ms.type,id:`${Ms.type}-${e}`,options:{path:e},lifecycle:H.INIT}};function rw(e){const{path:t,attribute:s}=e;return(r,o)=>{r[k]=r[k]||{},r[k][o]={modelType:Bn.type,id:`${t}-${s}`,options:{path:t,attribute:s},lifecycle:H.INIT}}}const mt=m.createLogger({name:"services",group:"Services"}),ow=async(e,t)=>pd(e,t,`${exports.BASE_URL}/api/server/login`),pd=async(e,t,s=`${exports.BASE_URL}/api/login`)=>{const r=await exports.kosFetch(`${s}`,{method:"POST",destinationAddress:"",body:JSON.stringify({email:e,password:t})});if(!r.ok){const n=await r.json();throw Error(`${n==null?void 0:n.error}`)}return await r.json()},nw=async e=>gd(e,`${exports.BASE_URL}/api/server/startPasswordReset`,""),gd=async(e,t=`${exports.BASE_URL}/api/startPasswordReset`,s="server")=>{const r=await exports.kosFetch(`${t}?email=${e}`,{method:"POST",destinationAddress:s});if(!r.ok)throw Error(`There was a problem reseting config; returned status ${r.status}`);return await r.json()},iw=async(e,t)=>md(e,t,`${exports.BASE_URL}/api/server/resetPassword`),md=async(e,t,s=`${exports.BASE_URL}/api/resetPassword`)=>{mt.debug(`resetting password with token ${e} and password ${t.replace(/./g,"*")}`);const r=await exports.kosFetch(`${s}`,{method:"POST",destinationAddress:"",body:JSON.stringify({token:e,password:t})});if(mt.debug(`password reset returned status ${r.status}`),!r.ok){mt.error(`password reset failed with message ${r.statusText}`);const n=await r.json();throw Error(`${n==null?void 0:n.error}:There was a problem resetting the password.`)}return await r.json()},aw=async(e,t,s)=>yd(e,t,s,`${exports.BASE_URL}/api/server/acceptInvite`),yd=async(e,t,s,r=`${exports.BASE_URL}/api/server/acceptInvite`)=>{mt.debug(`accepting invite with token ${e} and password ${t.replace(/./g,"*")}`);const o=await exports.kosFetch(`${r}`,{method:"POST",destinationAddress:"",body:JSON.stringify({token:e,password:t,name:s})});if(mt.debug(`invitation accept returned status ${o.status}`),!o.ok){mt.error(`invite failed with message ${o.statusText}`);const i=await o.json();throw Error(`${i==null?void 0:i.error}:There was a problem accepting the invite.`)}return await o.json()};function cw(e,t,s,r){const o=e instanceof Promise?{promise:e,abortController:t,cancelFuture:s,future:r}:e,{promise:n,abortController:i,cancelFuture:a,future:c}=o,u=n;let d=0,h="PENDING",f=!0;const p=new Set;let b;return c&&typeof c=="object"&&(b=E.autorun(()=>{const w=c.progress||0,M=c.status||"PENDING",_=!c.endState;(w!==d||M!==h||_!==f)&&(d=w,h=M,f=_,p.forEach(F=>{try{F(d,h)}catch(Q){console.warn("Progress callback error:",Q)}}))})),n.finally(()=>{f=!1,i!=null&&i.signal.aborted||(h="COMPLETED",p.forEach(w=>{try{w(d,h)}catch(M){console.warn("Progress callback error:",M)}})),b&&b(),p.clear()}),u.cancel=async()=>{i&&!i.signal.aborted&&i.abort(),a&&await a(),f=!1,h="CANCELLED",p.forEach(w=>{try{w(d,h)}catch(M){console.warn("Progress callback error:",M)}}),b&&b()},u.getController=()=>i,u.isCancelled=()=>(i==null?void 0:i.signal.aborted)??!1,Object.defineProperty(u,"progress",{get:()=>d,enumerable:!0}),Object.defineProperty(u,"status",{get:()=>h,enumerable:!0}),Object.defineProperty(u,"isRunning",{get:()=>f,enumerable:!0}),u.onProgressUpdate=w=>(p.add(w),w(d,h),()=>p.delete(w)),u}const lw=qe.keyframes`
|
|
115
|
+
`),this.fontSize=s.fontSize??8,this.lineHeight=s.lineHeight??this.fontSize+2,this.fontFamily=s.fontFamily??"monospace, 'Lucida Console', 'Courier New', Courier",this.scrollConfig=s.scroll,this.loopConfig=s.loop??!1,this.duration=s.duration,this.pauseDuration=s.pauseBetweenLoops??0,s.color?this.textColor=vr(s.color):this.textColor="rgb(255,255,255)"}measureText(){if(this.textMeasured)return;this.ctx.font=`${this.fontSize}px ${this.fontFamily}`,this.lineWidths=[];let s=0;for(const r of this.lines){const n=this.ctx.measureText(r).width;this.lineWidths.push(n),s=Math.max(s,n)}this.textWidth=s,this.textHeight=this.lines.length*this.lineHeight,this.textMeasured=!0}reset(){this.position=0,this.startTime=performance.now(),this.lastFrameTime=this.startTime,this.currentLoopCount=0,this.completed=!1,this.isPlaying=!1,this.isPaused=!1,this.pauseStartTime=0,this.textMeasured=!1,this.lineWidths=[]}play(){this.isPlaying||(this.isPlaying=!0,this.startTime=performance.now(),this.lastFrameTime=this.startTime)}pause(){this.isPlaying=!1}renderFrame(s,r){var a;if(this.canvas.width=s,this.canvas.height=r,this.measureText(),this.completed)return;if(this.isPaused){this.ctx.clearRect(0,0,s,r),this.pauseDuration>0&&performance.now()-this.pauseStartTime>=this.pauseDuration&&(this.isPaused=!1,this.position=0,this.startTime=performance.now(),this.lastFrameTime=this.startTime);return}if(this.ctx.clearRect(0,0,s,r),!((a=this.scrollConfig)!=null&&a.enabled)){this.drawStaticText(s,r),this.duration&&this.isPlaying&&performance.now()-this.startTime>=this.duration&&this.handleCompletion();return}const o=this.scrollConfig.direction||"left",n=this.scrollConfig.speed||50,i=this.scrollConfig.gap||0;if(this.isPlaying){const c=performance.now(),u=(c-this.lastFrameTime)/1e3;this.lastFrameTime=c;const d=n*u;switch(o){case"left":case"right":case"up":case"down":this.position+=d;break}}this.drawScrollingText(s,r,o,i),this.checkScrollCompletion(s,r,o)}drawStaticText(s,r){this.ctx.font=`${this.fontSize}px ${this.fontFamily}`,this.ctx.fillStyle=this.textColor,this.ctx.textBaseline="top";const o=this.textHeight;let n=(r-o)/2;for(let i=0;i<this.lines.length;i++){const a=this.lines[i],c=this.lineWidths[i],u=(s-c)/2,d=n+i*this.lineHeight;this.ctx.fillText(a,u,d)}}drawScrollingText(s,r,o,n){var c,u,d,h;this.ctx.font=`${this.fontSize}px ${this.fontFamily}`,this.ctx.fillStyle=this.textColor,this.ctx.textBaseline="top";let i,a;o==="left"||o==="right"?(i=0,((c=this.scrollConfig)==null?void 0:c.offsetY)==="center"||((u=this.scrollConfig)==null?void 0:u.offsetY)===void 0?a=(r-this.textHeight)/2:a=this.scrollConfig.offsetY):(((d=this.scrollConfig)==null?void 0:d.offsetX)==="center"||((h=this.scrollConfig)==null?void 0:h.offsetX)===void 0?(i=s/2,this.ctx.textAlign="center"):(i=this.scrollConfig.offsetX,this.ctx.textAlign="left"),a=0),this.drawMultiLineScrollText(o,s,r,n,i,a)}drawMultiLineScrollText(s,r,o,n,i,a){switch(s){case"left":{const c=r-this.position;if(c<r&&c>-this.textWidth&&this.drawTextBlock(c,a,"left"),this.loopConfig&&this.pauseDuration===0&&this.position>n){const u=c+this.textWidth+n;u<r&&this.drawTextBlock(u,a,"left")}break}case"right":{const c=-this.textWidth+this.position;if(c>-this.textWidth&&c<r&&this.drawTextBlock(c,a,"left"),this.loopConfig&&this.pauseDuration===0&&c-n-this.textWidth>-this.textWidth){const u=c-this.textWidth-n;u<r&&this.drawTextBlock(u,a,"left")}break}case"up":{const c=o-this.position;if(c>-this.textHeight&&c<o&&this.drawTextBlock(i,c,"center"),this.loopConfig&&this.pauseDuration===0&&c+this.textHeight+n<o){const u=c+this.textHeight+n;u>-this.textHeight&&this.drawTextBlock(i,u,"center")}break}case"down":{const c=-this.textHeight+this.position;if(c>-this.textHeight&&c<o&&this.drawTextBlock(i,c,"center"),this.loopConfig&&this.pauseDuration===0&&c-n-this.textHeight>-this.textHeight){const u=c-this.textHeight-n;u<o&&this.drawTextBlock(i,u,"center")}break}}}drawTextBlock(s,r,o){for(let n=0;n<this.lines.length;n++){const i=this.lines[n],a=this.lineWidths[n];let c;o==="center"?c=s-a/2:c=s;const u=r+n*this.lineHeight;this.ctx.fillText(i,c,u)}}checkScrollCompletion(s,r,o){if(!this.isPlaying)return;let n=!1;const i=1;switch(o){case"left":n=s-this.position<-this.textWidth-i;break;case"right":n=-this.textWidth+this.position>s+i;break;case"up":n=r-this.position<-this.textHeight-i;break;case"down":n=-this.textHeight+this.position>r+i;break}n&&(this.loopConfig===!1||typeof this.loopConfig=="number"&&this.loopConfig===1?this.handleCompletion():typeof this.loopConfig=="number"&&this.loopConfig>1?(this.currentLoopCount++,this.currentLoopCount>=this.loopConfig?this.handleCompletion():this.startPauseOrNextLoop()):this.loopConfig===!0&&this.startPauseOrNextLoop())}startPauseOrNextLoop(){this.pauseDuration>0?(this.isPaused=!0,this.pauseStartTime=performance.now()):this.position=0}handleCompletion(){this.completed=!0,this.isPlaying=!1,this.completionCallback&&this.completionCallback()}onDone(s){this.completionCallback=s}isOneShot(){var s;return!((s=this.scrollConfig)!=null&&s.enabled)&&!this.loopConfig}dispose(){this.completionCallback=null}}class hv{constructor(t){l(this,"patterns");l(this,"currentPatternIndex",0);l(this,"currentRenderer",null);l(this,"loopConfig");l(this,"currentLoopCount",0);l(this,"transitionDuration");l(this,"patternOverrides");l(this,"completionCallback",null);l(this,"patternStore");l(this,"canvas");l(this,"ctx");l(this,"width",0);l(this,"height",0);this.patterns=t.patterns,this.loopConfig=t.loop??!1,this.transitionDuration=t.transitionDuration??0,this.patternOverrides=t.patternOverrides??{},this.patternStore=t.patternStore??new Map,this.canvas=document.createElement("canvas");const s=this.canvas.getContext("2d");if(!s)throw new Error("2D canvas not supported");if(this.ctx=s,this.patterns.length===0)throw new Error("SequenceRenderer requires at least one pattern");this.loadCurrentPattern()}loadCurrentPattern(){var n,i,a,c;const t=this.patterns[this.currentPatternIndex],s=this.patternStore.get(t);if(!s){console.warn(`Pattern "${t}" not found in store, skipping`),this.moveToNextPattern();return}this.currentRenderer&&((i=(n=this.currentRenderer).dispose)==null||i.call(n));const r=this.patternOverrides[t]??{},o={...s.data,...r};try{this.currentRenderer=wr({mode:s.type,data:o}),this.currentRenderer&&this.isDoneAware(this.currentRenderer)&&this.currentRenderer.onDone(()=>{this.handlePatternComplete()}),this.currentRenderer&&(this.currentRenderer.reset(),(c=(a=this.currentRenderer).play)==null||c.call(a),this.width>0&&this.height>0&&this.currentRenderer.renderFrame(this.width,this.height))}catch(u){console.error(`Failed to create renderer for pattern "${t}":`,u),this.moveToNextPattern()}}isDoneAware(t){return typeof(t==null?void 0:t.onDone)=="function"}handlePatternComplete(){this.transitionDuration>0?setTimeout(()=>{this.moveToNextPattern()},this.transitionDuration):this.moveToNextPattern()}moveToNextPattern(){this.currentPatternIndex++,this.currentPatternIndex>=this.patterns.length?this.loopConfig===!0?(this.currentPatternIndex=0,this.loadCurrentPattern()):typeof this.loopConfig=="number"&&this.currentLoopCount<this.loopConfig-1?(this.currentLoopCount++,this.currentPatternIndex=0,this.loadCurrentPattern()):this.completionCallback&&this.completionCallback():this.loadCurrentPattern()}reset(){this.currentPatternIndex=0,this.currentLoopCount=0,this.loadCurrentPattern()}play(){var t,s;(s=(t=this.currentRenderer)==null?void 0:t.play)==null||s.call(t)}pause(){var t,s;(s=(t=this.currentRenderer)==null?void 0:t.pause)==null||s.call(t)}renderFrame(t,s){this.width=t,this.height=s,this.canvas.width=t,this.canvas.height=s,this.currentRenderer&&this.currentRenderer.renderFrame(t,s)}readPixels(t,s){return this.currentRenderer?this.currentRenderer.readPixels(t,s):this.ctx.getImageData(0,0,t,s).data}onDone(t){this.completionCallback=t}isOneShot(){var t,s;return this.loopConfig===!1||this.loopConfig===1?this.patterns.length===1&&this.currentRenderer?((s=(t=this.currentRenderer).isOneShot)==null?void 0:s.call(t))??!1:!0:!1}dispose(){var t,s;this.currentRenderer&&((s=(t=this.currentRenderer).dispose)==null||s.call(t)),this.completionCallback=null}setPatternStore(t){this.patternStore=t,this.patterns.length>0&&this.loadCurrentPattern()}}const fv=Vn(at);class pv extends fv{constructor(s={r:0,g:0,b:0}){super();l(this,"color");let r;s.color!==void 0?r=s.color:s.r!==void 0&&s.g!==void 0&&s.b!==void 0?r={r:s.r,g:s.g,b:s.b}:r={r:0,g:0,b:0},this.color=vr(r)}setColor(s){this.color=vr(s),this.resetOneShot()}reset(){this.resetOneShot()}renderFrame(s,r){this.isOneShotDone||(this.canvas.width=s,this.canvas.height=r,this.ctx.fillStyle=this.color,this.ctx.fillRect(0,0,s,r),this.signalDoneIfNeeded())}}class gv extends at{constructor({minHue:s=0,maxHue:r=360,speed:o=1}={}){super();l(this,"offset",0);l(this,"minHue");l(this,"maxHue");l(this,"speed");this.minHue=s,this.maxHue=r,this.speed=o}reset(){this.offset=0,this.lastUpdate=performance.now()}hslToRgb(s,r,o){let n,i,a;if(r===0)n=i=a=o;else{const c=(h,f,p)=>(p<0&&(p+=1),p>1&&(p-=1),p<.16666666666666666?h+(f-h)*6*p:p<.5?f:p<.6666666666666666?h+(f-h)*(.6666666666666666-p)*6:h),u=o<.5?o*(1+r):o+r-o*r,d=2*o-u;n=c(d,u,s+1/3),i=c(d,u,s),a=c(d,u,s-1/3)}return[Math.round(n*255),Math.round(i*255),Math.round(a*255)]}renderFrame(s,r){this.shouldStep(50)&&(this.offset=(this.offset+this.speed)%s);const o=this.ctx.createImageData(s,r),n=o.data;let i=0;for(let a=0;a<r;a++)for(let c=0;c<s;c++){const u=(c+this.offset)%s/s,d=this.minHue/360+u*((this.maxHue-this.minHue)/360),[h,f,p]=this.hslToRgb(d,1,.5);n[i++]=h,n[i++]=f,n[i++]=p,n[i++]=255}this.ctx.putImageData(o,0,0)}}const qi=new Map;$s(te,{register(e,t){qi.set(e,t)},execute(e,t){const s=qi.get(e);return s?new s(t):null}});S.canvas.registerRenderer("video",av);S.canvas.registerRenderer("video-basic",Nu);S[te].register("image-static",Uu);S[te].register("image-scrolling",Bu);const mv=class{constructor(e){var t;return(t=e.scroll)!=null&&t.enabled?new Bu(e):new Uu(e)}};S[te].register("image",mv);S[te].register("color",pv);S[te].register("matrix",lv);S[te].register("sweep",gv);S[te].register("gradient",nv);S[te].register("drop",rv);S[te].register("sequence",hv);S[te].register("text",dv);const yv=class{constructor(e){const t=(s,r)=>{const o=wr({mode:s,data:r});if(!o)throw new Error(`Failed to create renderer of type: ${s}`);return o};return new uv(e,t)}};S[te].register("overlay",yv);const wr=({mode:e,data:t})=>{const s=S[te].execute(e,t);if(s)return s;throw new Error(`Unknown mode: ${e}`)};var bv=Object.defineProperty,vv=Object.getOwnPropertyDescriptor,Bt=(e,t,s,r)=>{for(var o=r>1?void 0:r?vv(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=(r?i(t,s,o):i(o))||o);return r&&o&&bv(t,s,o),o};const Ku="canvas-dispatcher-model";function wv(e){if(e=e.replace(/^#/,""),e.length===3&&(e=e.split("").map(s=>s+s).join("")),e.length!==6)return null;const t=parseInt(e,16);return{r:t>>16&255,g:t>>8&255,b:t&255}}let ze=class{constructor(e,t,s){l(this,"id");l(this,"logger");l(this,"_content",new Map);l(this,"_patterns",new Map);l(this,"_endpointRenderers");l(this,"pattern");l(this,"data");this.id=e,this.logger=s.logger,this._endpointRenderers=new Se}addNamedEndpoint(e,t){this._endpointRenderers.getModel(e)&&this.logger.warn(`Endpoint "${e}" already exists. Overwriting.`);const s=Gn.instance(e).options({apiPath:t.apiPath,width:t.width,height:t.height,fps:t.fps,durationMs:t.durationMs??null,endpoint:e}).build();return this._endpointRenderers.addModel(s),s}addContent(e,t){this._content.has(e)&&this.logger.warn(`Content "${e}" already exists. Overwriting.`),this._content.set(e,t)}addPattern(e,t){this._patterns.has(e)&&this.logger.warn(`Pattern "${e}" already exists. Overwriting.`),this._patterns.set(e,t)}async handlePatternsPost(e,t){var o,n;const s=e.body,r=Array.isArray(s)?s:[s];if(r.some(i=>!i.id||!i.type||!i.data)){(o=t.status)==null||o.call(t,400).send({error:"Invalid pattern data"});return}for(const i of r)this._patterns.has(i.id)&&this.logger.warn(`Pattern "${i.id}" already exists. Overwriting.`),this.addPattern(i.id,i);(n=t.status)==null||n.call(t,200).send({status:"OK"})}async handlePatternApplication(e,t){var u,d,h;const s=e.params.pattern,r=e.params.endpoint,o=this._endpointRenderers.getModel(r);if(!o){(u=t.status)==null||u.call(t,404).send({error:`Endpoint "${r}" not found`});return}if(!this._patterns.has(s)){(d=t.status)==null||d.call(t,404).send({error:`Pattern "${s}" not found`});return}const n=this._patterns.get(s),i=n.type,a=e.body||{};this.data={...n.data,...a};const c=i==="sequence"?{...this.data,patternStore:this._patterns}:this.data;o.renderer=wr({mode:i,data:c}),o.setClearOnComplete(n.clearOnComplete),o.startStreaming(),(h=t.status)==null||h.call(t,200).send({status:"OK"})}async handleColorApplication(e,t){var u,d,h;const s=e.params.color,r=wv(s);if(!r){(u=t.status)==null||u.call(t,400).send({error:"Invalid color format"});return}const o=e.params.endpoint,n=this._endpointRenderers.getModel(o);if(!n){(d=t.status)==null||d.call(t,404).send({error:`Endpoint "${o}" not found`});return}const{r:i,b:a,g:c}=r;n.renderer=wr({mode:"color",data:{r:i,g:c,b:a}}),n.startStreaming(),(h=t.status)==null||h.call(t,200).send({status:"OK"})}async handleEndpointCreation(e,t){var r,o;const s=e.body;if(!s.apiPath||!s.id){(r=t.status)==null||r.call(t,400).send({error:"Name and path are required"});return}this.addNamedEndpoint(s.id,s),(o=t.status)==null||o.call(t,200).send({status:"OK"})}async load(e){var s;const t=e==null?void 0:e.get(Ct.loader);t&&((s=t.patterns)==null||s.forEach(r=>{if(!r.id||!r.type||!r.data){this.logger.warn(`Invalid pattern data: ${JSON.stringify(r)}`);return}this.addPattern(r.id,r)}))}};Bt([Ie],ze.prototype,"_endpointRenderers",2);Bt([Cs("/api/ui/canvas/patterns")],ze.prototype,"handlePatternsPost",1);Bt([Cs("/api/ui/canvas/pattern/:endpoint/:pattern")],ze.prototype,"handlePatternApplication",1);Bt([Cs("/api/ui/canvas/color/:endpoint/:color")],ze.prototype,"handleColorApplication",1);Bt([Cs("/api/ui/canvas/endpoint")],ze.prototype,"handleEndpointCreation",1);ze=Bt([A(Ku)],ze);const Ct=new Me({class:ze,type:Ku}),{URL:Yn}=ae(),{getOne:Hu}=oe.build({basePath:`${Yn}/api/device`}),Er=m.createLogger({name:"device-service",group:"Services"}),zu=async()=>{Er.debug("sending GET for device serial number");try{const e=await Hu({urlOverride:`${Yn}/api/kos/device/serialNumber`});return[void 0,e==null?void 0:e.data.serialNumber]}catch(e){if(e instanceof pe)return Er.error(`Error fetching device serial number: ${e.payload.error}`),[e.payload.error,void 0]}return["unknownError",void 0]},Gu=async()=>{Er.debug("sending GET for device details");try{const e=await Hu({urlOverride:`${Yn}/api/kos/device`});return e?[void 0,e.data]:["unknownError",void 0]}catch(e){if(e instanceof pe)return Er.error(`Error fetching device serial number: ${e.payload.error}`),[e.payload.error,void 0]}return["unknownError",void 0]},Ev=Object.freeze(Object.defineProperty({__proto__:null,getDeviceDetails:Gu,getSerialNumber:zu},Symbol.toStringTag,{value:"Module"}));var Mv=Object.defineProperty,Tv=Object.getOwnPropertyDescriptor,Vu=(e,t,s,r)=>{for(var o=r>1?void 0:r?Tv(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=(r?i(t,s,o):i(o))||o);return r&&o&&Mv(t,s,o),o};const Yu="device-model",_v="/kos/criticalData/changed",Ov="/kos/criticalData/available";let Mr=class{constructor(e,t,s){l(this,"id");l(this,"logger");l(this,"_serialNumber");l(this,"_name");l(this,"_nodeId");this.id=e,this.logger=s.logger,this._serialNumber="unassigned",this._name="unassigned",this._nodeId="unassigned"}get serialNumber(){return this._serialNumber}get name(){return this._name}get nodeId(){return this._nodeId}get nodeType(){const[e]=this.nodeId.split("-");return e}get nodeName(){const[,e]=this.nodeId.split("-");return e}updateModel(e){this._serialNumber=e.serialNumber??"unassigned",this._name=e.name??"unassigned",this._nodeId=e.nodeId??"unassigned"}async loadDeviceData(){const[e,t]=await Gu();if(e){this.logger.error(`Error fetching device serial number: ${e}`);return}if(t){const{name:s,nodeId:r}=t;this.updateModel({name:s,nodeId:r,serialNumber:this.serialNumber})}}async loadSerialNumber(){const[e,t]=await zu();if(e){this.logger.error(`Error fetching device serial number: ${e}`);return}this.updateModel({serialNumber:t,name:this.name,nodeId:this.nodeId})}async handleCriticalDataChanged(){this.logger.debug(`Critical data changed for device ${this.id}`),await this.loadSerialNumber()}async init(){this.logger.debug(`initializing device ${this.id}`)}async load(){this.logger.debug(`loading device ${this.id}`),await this.loadDeviceData(),await this.loadSerialNumber()}};Vu([U({topic:[_v,Ov],websocket:!0})],Mr.prototype,"handleCriticalDataChanged",1);Mr=Vu([A(Yu)],Mr);const Tr=new Me({class:Mr,type:Yu});var Iv=Object.getOwnPropertyDescriptor,Sv=(e,t,s,r)=>{for(var o=r>1?void 0:r?Iv(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=i(o)||o);return o};const qu="network-interface-model";let xo=class{constructor(e,t,s){l(this,"id");l(this,"name");l(this,"type");l(this,"nmdevicestate");l(this,"hwaddress");l(this,"mtu");l(this,"configured");l(this,"wifi");l(this,"ethernet");l(this,"ip4settings");l(this,"category");l(this,"logger");this.id=e,this.logger=s.logger,this.name=t.name,this.type=t.type,this.nmdevicestate=t.nmdevicestate,this.hwaddress=t.hwaddress,this.mtu=t.mtu,this.configured=t.configured,this.wifi=t.wifi,this.ethernet=t.ethernet,this.ip4settings=t.ip4settings,this.category=t.category}updateModel(e){this.name=e.name,this.type=e.type,this.nmdevicestate=e.nmdevicestate,this.hwaddress=e.hwaddress,this.mtu=e.mtu,this.configured=e.configured,this.wifi=e.wifi,this.ethernet=e.ethernet,this.ip4settings=e.ip4settings,this.category=e.category}async init(){this.logger.debug(`initializing network-interface ${this.id}`)}async load(){this.logger.debug(`loading network-interface ${this.id}`)}};xo=Sv([A(qu)],xo);const qn=new me({class:xo,type:qu}),{URL:$v}=ae(),{getAll:Cv}=oe.build({basePath:`${$v}/api/kos/network/interfaces`}),Wi=m.createLogger({name:"network-interface-service",group:"Services"}),Wu=async()=>{Wi.debug("sending GET for copy-logs");try{const e=await Cv({});return[void 0,e==null?void 0:e.data]}catch(e){if(e instanceof pe)return Wi.error(`Error fetching log file size: ${e.payload.error}`),[e.payload.error,void 0]}return["unknownError",void 0]},Dv=Object.freeze(Object.defineProperty({__proto__:null,getNetworkInterfaces:Wu},Symbol.toStringTag,{value:"Module"}));var xv=Object.defineProperty,Av=Object.getOwnPropertyDescriptor,Qu=(e,t,s,r)=>{for(var o=r>1?void 0:r?Av(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=(r?i(t,s,o):i(o))||o);return r&&o&&xv(t,s,o),o};const Zu="network-interface-container-model";let _r=class{constructor(e,t,s){l(this,"id");l(this,"logger");l(this,"_models");this.id=e,this.logger=s.logger,this._models=new Se({parentId:e,indexMap:{byCategory:"category"}})}getModel(e){return this._models.getModel(e)}get models(){return this._models}get data(){return this._models.data}addModel(e){this._models.addModel(e)}removeModel(e){this._models.removeModel(e)}async init(){this.logger.debug(`initializing network-interface-container container ${this.id}`)}async refreshInterfaces(){this.logger.debug("refreshing interfaces");const[e,t]=await Wu();if(e){this.logger.error(`Error loading network interfaces: ${e}`);return}t&&t.forEach(s=>{const r=qn.instance(s.name).forceUpdate.options(s).build();this.addModel(r)})}async load(){this.logger.debug(`loading network-interface-container container ${this.id}`),this.refreshInterfaces()}};Qu([Ie],_r.prototype,"_models",2);_r=Qu([A(Zu)],_r);const Ts=new Me({class:_r,type:Zu});Ts.addRelatedModel(qn);const{URL:Pv}=ae(),{getAll:Rv}=oe.build({basePath:`${Pv}/api/kos/storage/devices`}),Qi=m.createLogger({name:"storage-device-service",group:"Services"}),Xu=async()=>{Qi.debug("sending GET for storage-device");const e=await Rv({});return!(e!=null&&e.data)||e.status!==200?(Qi.error("Failed to retrieve storage-device data",e),[]):e.data},kv=Object.freeze(Object.defineProperty({__proto__:null,getStorageDevices:Xu},Symbol.toStringTag,{value:"Module"}));var Lv=Object.getOwnPropertyDescriptor,Fv=(e,t,s,r)=>{for(var o=r>1?void 0:r?Lv(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=i(o)||o);return o};const Ju="storage-device-model";let Ao=class{constructor(e,t,s){l(this,"id");l(this,"mountDir");l(this,"removed");l(this,"vendor");l(this,"runTimeMs");l(this,"model");l(this,"nodeId");l(this,"local");l(this,"label");l(this,"syspath");l(this,"logger");this.id=e,this.logger=s.logger,this.mountDir=t.mountDir,this.removed=t.removed,this.vendor=t.vendor,this.runTimeMs=t.runTimeMs,this.model=t.model,this.nodeId=t.nodeId,this.local=t.local,this.label=t.label,this.syspath=t.syspath}updateModel(e){this.mountDir=e.mountDir,this.removed=e.removed,this.vendor=e.vendor,this.runTimeMs=e.runTimeMs,this.model=e.model,this.nodeId=e.nodeId,this.local=e.local,this.label=e.label,this.syspath=e.syspath}async init(){this.logger.debug(`initializing storage-device ${this.id}`)}async load(){this.logger.debug(`loading storage-device ${this.id}`)}};Ao=Fv([Ar(),A(Ju)],Ao);const Or=new me({class:Ao,type:Ju});var Nv=Object.defineProperty,Uv=Object.getOwnPropertyDescriptor,Wn=(e,t,s,r)=>{for(var o=r>1?void 0:r?Uv(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=(r?i(t,s,o):i(o))||o);return r&&o&&Nv(t,s,o),o};const ed="storage-device-container-model",jv="/kos/storage";let _s=class{constructor(e,t,s){l(this,"id");l(this,"logger");l(this,"_models");this.id=e,this.logger=s.logger,this._models=new Se({parentId:e})}getModel(e){return this._models.getModel(e)}get models(){return this._models}get data(){return this._models.data}addModel(e){this._models.addModel(e)}removeModel(e){this._models.removeModel(e)}async init(){this.logger.debug(`initializing storage-device-container container ${this.id}`)}get isStorageInserted(){return this.data.length>0}get volumes(){return this.data}handleStorageAvailability(e){this._models.data.filter(s=>!e.find(r=>r.id===s.id)).forEach(s=>{this.removeModel(s.id)}),e.forEach(s=>{const r=this.getModel(s.id);if(r){const o={...s,kosParentId:this.id};r.updateModel(o)}else{const o={...s,kosParentId:this.id},n=Or.instance(s.id).options(o).build();this.addModel(n)}})}async load(){this.logger.debug(`loading storage-device-container container ${this.id}`),(await Xu()).forEach(t=>{if(t.deviceType!=="disk"){const s={...t,kosParentId:this.id},r=Or.instance(t.id).options(s).build();this.addModel(r)}})}};Wn([Ie],_s.prototype,"_models",2);Wn([U({topic:jv,websocket:!0})],_s.prototype,"handleStorageAvailability",1);_s=Wn([A(ed)],_s);const Dt=new Me({class:_s,type:ed});Dt.addRelatedModel(Or);const{URL:Qn}=ae(),{getAll:Bv,postModel:Kv}=oe.build({basePath:`${Qn}/api/kos/update/available`}),Zi=m.createLogger({name:"usb-update-service",group:"Services"}),td=async()=>{Zi.debug("sending GET for usb-update");const e=await Bv({urlOverride:`${Qn}/api/kos/update/available`});return!(e!=null&&e.data)||(e==null?void 0:e.status)!==200?(Zi.error("Failed to retrieve usb-update data",e),[]):e.data},sd=async(e,t,s)=>{const r=await Kv({model:{manifestId:e,deviceId:t},tracker:s,urlOverride:`${Qn}/api/kos/update/install`});if(!(r!=null&&r.data))throw new Error("No response from server");return r.data},Hv=Object.freeze(Object.defineProperty({__proto__:null,getAvailableUpdates:td,installUpdate:sd},Symbol.toStringTag,{value:"Module"}));var zv=Object.defineProperty,Gv=Object.getOwnPropertyDescriptor,rd=(e,t,s,r)=>{for(var o=r>1?void 0:r?Gv(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=(r?i(t,s,o):i(o))||o);return r&&o&&zv(t,s,o),o};const od="usb-update-model";let Ir=class{constructor(e,t,s){l(this,"id");l(this,"active");l(this,"blocked");l(this,"createTime");l(this,"deviceId");l(this,"manifestId");l(this,"notes");l(this,"futureHandler");l(this,"logger");this.id=e,this.logger=s.logger,this.active=t.active,this.blocked=t.blocked,this.createTime=t.createTime,this.deviceId=t.deviceId,this.manifestId=t.manifestId,this.notes=t.notes,this.futureHandler=new Rr(this)}updateModel(e){this.active=e.active,this.blocked=e.blocked,this.createTime=e.createTime,this.deviceId=e.deviceId,this.manifestId=e.manifestId,this.notes=e.notes}reset(){this.futureHandler.removeFuture()}get future(){return this.futureHandler.future}async install(e){if(!e)throw new Error("No tracker provided");return this.logger.info(`Installing update for manifest ${this.manifestId} from device ${this.deviceId}`),sd(this.manifestId,this.deviceId,e)}async init(){this.logger.debug(`initializing usb-update ${this.id}`)}async load(){this.logger.debug(`loading usb-update ${this.id}`)}};rd([si()],Ir.prototype,"install",1);Ir=rd([A(od)],Ir);const Zn=new me({class:Ir,type:od});var Vv=Object.defineProperty,Yv=Object.getOwnPropertyDescriptor,qr=(e,t,s,r)=>{for(var o=r>1?void 0:r?Yv(t,s):t,n=e.length-1,i;n>=0;n--)(i=e[n])&&(o=(r?i(t,s,o):i(o))||o);return r&&o&&Vv(t,s,o),o};const nd="usb-update-container-model";let xt=class{constructor(e,t,s){l(this,"id");l(this,"disposer");l(this,"storageService");l(this,"_activeUpdate");l(this,"logger");l(this,"_models");this.id=e,this.logger=s.logger,this._models=new Se({parentId:e})}getModel(e){return this._models.getModel(e)}get models(){return this._models}get data(){return this._models.data}addModel(e){this._models.addModel(e)}removeModel(e){this._models.removeModel(e)}get activeUpdate(){return this._activeUpdate}reset(){this.clearActiveUpdate()}clearActiveUpdate(){this._activeUpdate=void 0}updateActiveUpdate(e){this._activeUpdate=e}get isUsbInserted(){return this.storageService.isStorageInserted}get hasAvailableUpdates(){return this._models.data.length>0}async syncAvailableUpdates(){const e=await td();X(()=>{const t=e.map(s=>`${s.deviceId}-${s.manifestId}`);this._models.data.filter(s=>!t.includes(s.id)).forEach(s=>this.removeModel(s.id)),e.forEach(s=>{const r=`${s.deviceId}-${s.manifestId}`,o=Zn.instance(r).forceUpdate.options({...s,createTime:new Date(s.createTime)}).build();this.addModel(o)}),this.data.length===1?this.updateActiveUpdate(this.data[0]):this.clearActiveUpdate()})}usbInsertedEffect(){this.isUsbInserted?this.syncAvailableUpdates():(this._models.clear(),this.clearActiveUpdate())}async init(){this.logger.debug(`initializing usb-update-container container ${this.id}`)}unload(){var e;(e=this.disposer)==null||e.call(this)}async activate(){this.logger.debug(`activating usb-update-container container ${this.id}`),await this.syncAvailableUpdates()}async load(){this.logger.debug(`loading usb-update-container container ${this.id}`)}};qr([Pt({modelType:Dt.type})],xt.prototype,"storageService",2);qr([Ie],xt.prototype,"_models",2);qr([lc({dependencies:e=>[e.isUsbInserted]})],xt.prototype,"usbInsertedEffect",1);xt=qr([A(nd)],xt);const Os=new Me({class:xt,type:nd});Os.addRelatedModel(Zn);const qv=()=>({...{[Lt.type]:{class:Dl},[He.type]:{class:Ll,singleton:!0},...re.registration,...rt.registration,...St.registration,...mr.registration,...ke.registration,[Hn.type]:{class:exports.WsEventModel,singleton:!0},...Ms.registration,...Bn.registration,...ar.registration}}),Xn=qv(),Wv={models:Xn,preloadModels:[]},Xi=!0,id=e=>()=>{const t=Xn;return bc(Po)(Es).model(St).model(Dt).model(Os).model(Tr).model(hr).model(ps).model(fr).model(Dn).model(Ts).model(Ct).model(Gn).model(Yl).model(Sn,Xi).model(Ps).model(Ql,Xi),Object.keys(t).forEach(s=>{const r=t[s];yc(Po)(s,r)}),{preload:x.model.preloadModel(e),model:x.model.register(e),companion:x.companion.register(e),legacy:x.model.registerLegacyModel(e)}},we={};we.core={models:id(we)};we.preload=x.model.preloadModel(we);we.model=x.model.register(we);we.companion=x.companion.register(we);we.legacy=x.model.registerLegacyModel(we);const Po=we;class Qv{registerTroubleRankMapper(t){return S.propertyMapper.registerPropertyMapper(be.TroubleRank,t),this}registerTroubleRoleMapper(t){return S.propertyMapper.registerPropertyMapper(be.TroubleRole,t),this}registerTroubleColorMapper(t){return S.propertyMapper.registerPropertyMapper(be.TroubleColor,t),this}registerModelLoader(t,s){S.loader.registerLoader(t,s)}registerCanvasPatternLoader(t){S.loader.registerLoader(Ct.loader,t)}}const Zv=async(e,t)=>{const s=Dn.instance(e).options({}).build(),r=t?`${t}-`:"";return await ue(s),{getState:o=>s.data[`${r}${o}`],updateState:async(o,n)=>{await s.updateState(`${r}${o}`,n)},clean:async()=>{for(const o of s.data.keys)await s.updateState(`${r}${o}`,void 0)},unsubscribe:()=>{Xe(s)}}},ad="kos:service:region",cd="regionId",Xv=`${ad}-${cd}`,ld=async e=>{const t=rt.factory(Xv)({path:ad,attribute:cd});await ue(t),t.updateProperty(e)},Jn="/kos-timer-event",ei="/kos-timer-event/tick",ti="defaultTimerEnd",es=m.createLogger({name:"timer-manager"}),Jv=e=>e.updateProperty!==void 0;class ud{constructor(t,s,r){l(this,"name");l(this,"timeout");l(this,"timer");l(this,"state","inactive");l(this,"decrementValue",1);l(this,"remainingTime");l(this,"timeoutActions",new Map);this.name=t;const o=typeof s=="number"?s:s.value||60;this.timeout=o,this.state="inactive",this.remainingTime=o,Jv(s)&&Y(()=>{m.info(`Updating config value timer ${t} with new timeout value ${s.value}`);const n=s.value||60;this.updateTimeout(n)}),this.addTimeoutAction({name:ti}),r&&r.forEach(n=>{this.addTimeoutAction(n)})}get id(){return this.name}start(){if(this.state==="active"){es.debug(`Timer ${this.name} already started`);return}(this.state==="inactive"||this.state==="paused")&&(this.state="active",this.timer=setInterval(()=>this.updateTimer(),1e3))}pause(){this.timer&&(es.debug(`Pausing timer ${this.name}`),this.state="paused",clearInterval(this.timer))}restart(){this.pause(),this.remainingTime=this.timeout,this.start()}reset(){this.pause(),this.remainingTime=this.timeout,this.state="inactive"}updateTimeout(t){this.timeout=t,this.restart()}addTimeoutAction(t){const s=t.remainingTime??0;this.timeoutActions.has(s)||this.timeoutActions.set(s,[]);const r=t.name,o=this.timeoutActions.get(s).find(n=>n.name===r);o?o.action=t.action:this.timeoutActions.get(s).push(t)}removeTimeoutAction(t){for(const[s,r]of this.timeoutActions.entries()){const o=r.filter(n=>n.name!==t);o.length===0?this.timeoutActions.delete(s):this.timeoutActions.set(s,o)}}updateTimer(){if(this.remainingTime=Math.round((this.remainingTime-this.decrementValue)*100)/100,this.remainingTime<=0){this.state==="active"&&this.executeActions(0),this.pause();return}this.state==="active"&&this.executeActions(this.remainingTime)}executeActions(t){this.timeoutActions.has(t)&&this.timeoutActions.get(t).forEach(s=>{var r;es.debug(`Executing timer action ${s.name} at ${t}`),(r=s.action)==null||r.call(s,s.name,t),this.notifyTimeoutAction(s),s.singleUse&&(es.info(`${this.name} Removing single-use action ${s.name}`),this.removeTimeoutAction(s.name))}),this.notifyTick()}notifyTick(){z(`${ei}/${this.name}`,{name:this.name,remainingTime:this.remainingTime})}notifyTimeoutAction(t){z(Jn,{name:this.name,action:t.name,remainingTime:this.remainingTime})}}const ts=new Map,ht=(e,t)=>{const s=ts.get(e);if(!s){es.error(`Timer ${e} not found`);return}t(s)},dd={createRelativeTimer(e,t,s){const r=new Date,o=Math.round((t.getTime()-r.getTime())/1e3);return this.createTimer(e,o,s)},createTimer(e,t=60,s){if(ts.has(e))return ts.get(e);const r=new ud(e,t,s);return ts.set(e,r),r},getTimer(e){return ts.get(e)},clearTimer(e){ht(e,t=>t.pause())},restartTimer(e){ht(e,t=>t.restart())},resetTimer(e){ht(e,t=>t.reset())},addTimeoutAction(e,t){ht(e,s=>s.addTimeoutAction(t))},removeTimeoutAction(e,t){ht(e,s=>s.removeTimeoutAction(t))},startTimer(e){ht(e,t=>t.start())}},hd="kos:service:region:settings",fd="timeZone",ew=`${hd}-${fd}`,Ro=async e=>{const t=rt.factory(ew)({path:hd,attribute:fd});await ue(t),t.updateProperty(e)},tw=e=>!e||!e.data;function si(e={}){const{alias:t,namespace:s,abortController:r=!1}=e;return(o,n,i)=>{o[os]=o[os]||{},t&&(o[as]=o[as]||new Map,o[as].set(n,t));const a=i.value,c=async function(...u){const d=tt();m.debug(`Calling future service ${n} with tracker ${d}`);let h,f;r&&(h=new AbortController);const p=Je.initiateFuture({tracker:d,id:yn});s&&(p.namespace=s),m.debug(`waiting for future ${p.id} to be ready`),await ue(p),m.debug(`future ${p.id} is ready`),X(()=>{m.debug(`Adding future ${p.id} to futureHandler`),this.futureHandler.addFuture(p,t)}),r&&h&&(f=Y(()=>{(p.status==="CANCELLED"||p.endState===Ke.Canceled)&&(m.debug(`Future ${p.id} cancelled, aborting request`),h==null||h.abort())}),h.signal.addEventListener("abort",async()=>{if(p.status!=="CANCELLED"&&p.endState!==Ke.Canceled&&!p.endState){m.debug(`AbortController aborted, cancelling future ${p.id}`);try{await p.cancelFuture()}catch(w){m.error(`Failed to cancel future ${p.id}:`,w)}}},{once:!0}));const b=()=>{f&&(f(),f=void 0)};try{const w=[...u];if(r&&h){const F=w[w.length-1];F&&typeof F=="object"&&"aborted"in F?w[w.length-1]=h.signal:w.push(h.signal)}w.push(d);const M=await a.apply(this,w);m.debug(`received future response for ${d}`,M);const _=tw(M)?M:M==null?void 0:M.data;return _?(_.progress=1,m.debug("mapping future response to future model"),p.endState?m.debug(`future ${p.id} has already completed. Not updating the model`):On(_,p)):this.futureHandler.removeFuture(t),b(),_}catch(w){if(b(),r&&(h!=null&&h.signal.aborted)){const M=new Error("Operation cancelled");throw m.debug(`Operation ${n} was cancelled`),M}throw m.error(w),w}};o[os][n]={handler:c}}}const sw=({path:e})=>(t,s)=>{t[k]=t[k]||{},t[k][s]={modelType:Ms.type,id:`${Ms.type}-${e}`,options:{path:e},lifecycle:H.INIT}};function rw(e){const{path:t,attribute:s}=e;return(r,o)=>{r[k]=r[k]||{},r[k][o]={modelType:Bn.type,id:`${t}-${s}`,options:{path:t,attribute:s},lifecycle:H.INIT}}}const mt=m.createLogger({name:"services",group:"Services"}),ow=async(e,t)=>pd(e,t,`${exports.BASE_URL}/api/server/login`),pd=async(e,t,s=`${exports.BASE_URL}/api/login`)=>{const r=await exports.kosFetch(`${s}`,{method:"POST",destinationAddress:"",body:JSON.stringify({email:e,password:t})});if(!r.ok){const n=await r.json();throw Error(`${n==null?void 0:n.error}`)}return await r.json()},nw=async e=>gd(e,`${exports.BASE_URL}/api/server/startPasswordReset`,""),gd=async(e,t=`${exports.BASE_URL}/api/startPasswordReset`,s="server")=>{const r=await exports.kosFetch(`${t}?email=${e}`,{method:"POST",destinationAddress:s});if(!r.ok)throw Error(`There was a problem reseting config; returned status ${r.status}`);return await r.json()},iw=async(e,t)=>md(e,t,`${exports.BASE_URL}/api/server/resetPassword`),md=async(e,t,s=`${exports.BASE_URL}/api/resetPassword`)=>{mt.debug(`resetting password with token ${e} and password ${t.replace(/./g,"*")}`);const r=await exports.kosFetch(`${s}`,{method:"POST",destinationAddress:"",body:JSON.stringify({token:e,password:t})});if(mt.debug(`password reset returned status ${r.status}`),!r.ok){mt.error(`password reset failed with message ${r.statusText}`);const n=await r.json();throw Error(`${n==null?void 0:n.error}:There was a problem resetting the password.`)}return await r.json()},aw=async(e,t,s)=>yd(e,t,s,`${exports.BASE_URL}/api/server/acceptInvite`),yd=async(e,t,s,r=`${exports.BASE_URL}/api/server/acceptInvite`)=>{mt.debug(`accepting invite with token ${e} and password ${t.replace(/./g,"*")}`);const o=await exports.kosFetch(`${r}`,{method:"POST",destinationAddress:"",body:JSON.stringify({token:e,password:t,name:s})});if(mt.debug(`invitation accept returned status ${o.status}`),!o.ok){mt.error(`invite failed with message ${o.statusText}`);const i=await o.json();throw Error(`${i==null?void 0:i.error}:There was a problem accepting the invite.`)}return await o.json()};function cw(e,t,s,r){const o=e instanceof Promise?{promise:e,abortController:t,cancelFuture:s,future:r}:e,{promise:n,abortController:i,cancelFuture:a,future:c}=o,u=n;let d=0,h="PENDING",f=!0;const p=new Set;let b;return c&&typeof c=="object"&&(b=E.autorun(()=>{const w=c.progress||0,M=c.status||"PENDING",_=!c.endState;(w!==d||M!==h||_!==f)&&(d=w,h=M,f=_,p.forEach(F=>{try{F(d,h)}catch(Q){console.warn("Progress callback error:",Q)}}))})),n.finally(()=>{f=!1,i!=null&&i.signal.aborted||(h="COMPLETED",p.forEach(w=>{try{w(d,h)}catch(M){console.warn("Progress callback error:",M)}})),b&&b(),p.clear()}),u.cancel=async()=>{i&&!i.signal.aborted&&i.abort(),a&&await a(),f=!1,h="CANCELLED",p.forEach(w=>{try{w(d,h)}catch(M){console.warn("Progress callback error:",M)}}),b&&b()},u.getController=()=>i,u.isCancelled=()=>(i==null?void 0:i.signal.aborted)??!1,Object.defineProperty(u,"progress",{get:()=>d,enumerable:!0}),Object.defineProperty(u,"status",{get:()=>h,enumerable:!0}),Object.defineProperty(u,"isRunning",{get:()=>f,enumerable:!0}),u.onProgressUpdate=w=>(p.add(w),w(d,h),()=>p.delete(w)),u}const lw=qe.keyframes`
|
|
116
116
|
0% {
|
|
117
117
|
left: -90px;
|
|
118
118
|
color: #eee;
|