@aryacode/dsh-local-llm 0.8.1 → 0.8.2
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/LEGACY-CONTROL-CENTER.md +2 -2
- package/README.md +6 -0
- package/lib/client.js +349 -59
- package/lib/client.js.map +1 -1
- package/lib/event-stream-BkIJ4cYy.js +80 -0
- package/lib/index.d.ts +75 -71
- package/lib/index.js +129 -22
- package/lib/openai-completions-C58ZnIdi.js +11710 -0
- package/package.json +1 -1
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["copy","useId","copy","useState","describe","rpc","useState","rate","useState","useState","useState","useRef","useState","Dashboard"],"sources":["../src/model-output.ts","../src/client/output-settings.ts","../src/client/Connection.tsx","../src/client/TuningSlider.tsx","../src/client/OutputTuning.tsx","../src/client/NInferTuning.tsx","../src/client/theme.ts","../src/client/Dashboard.tsx","../src/ninfer-log.ts","../src/client/use-ninfer-live.ts","../src/client/NInferPanel.tsx","../src/client/use-ninfer.ts","../src/client/StrataControlCenter.tsx","../src/client/index.ts"],"sourcesContent":["export interface OutputModel { id: string; name?: string; contextWindow?: number; maxTokens?: number }\nexport interface OutputProvider { baseURL?: string; models?: OutputModel[] }\nexport interface OutputNamespace { ns: string; revision: number; value: { providers: Record<string, OutputProvider> } }\nexport const localProviders = ['ninfer', 'llamacpp', 'strata', 'freetoken', 'ollama']\n\n/** A configured local chat model, independent of engine availability and model files. */\nexport interface OutputChoice extends OutputModel { provider: string; key: string; engine: string; contextWindow: number }\n/** Include a loopback OpenAI-compatible Ollama route without exposing cloud providers. */\nfunction localRoute(provider: string, value: OutputProvider): boolean {\n if(localProviders.includes(provider))return true\n if(provider!=='openai'||!value.baseURL)return false\n try{return ['localhost','127.0.0.1','[::1]'].includes(new URL(value.baseURL).hostname)}catch{return false}\n}\n/** Read output-capable local chat models even when their engines are stopped. */\nexport function outputCatalog(namespace: OutputNamespace | null): OutputChoice[] {\n return Object.entries(namespace?.value.providers??{}).filter(([provider,value])=>localRoute(provider,value)).flatMap(([provider,value])=>(value.models??[]).flatMap(model=>{\n if(typeof model.contextWindow!=='number'||!Number.isSafeInteger(model.contextWindow)||model.contextWindow<=1024)return []\n return [{...model,contextWindow:model.contextWindow,provider,key:provider+'\\n'+model.id,engine:provider==='openai'?'ollama':provider}]\n }))\n}\n\n/** Validate a per-response allowance against the selected model's configured context. */\nexport function validateOutputLimit(value: number, contextWindow: number): number {\n if (!Number.isSafeInteger(value) || value < 1024 || value >= contextWindow) throw Error('Choose a whole output limit between 1,024 tokens and below the model context, so input history keeps room.');\n return value\n}\n/** Update only the requested model in freshly read settings, preserving other model fields. */\nexport function outputModels(namespace: OutputNamespace, provider: string, id: string, value: number): OutputModel[] {\n if (!namespace.value.providers[provider] || !localRoute(provider, namespace.value.providers[provider]!)) throw Error('Choose a local model provider.');\n const models = namespace.value.providers[provider]?.models;\n const model = models?.find(entry => entry.id === id);\n if (!model || !model.contextWindow) throw Error('This model is no longer configured. Reload models.');\n const maxTokens = validateOutputLimit(value, model.contextWindow);\n return models!.map(entry => entry.id === id ? { ...entry, maxTokens } : entry)\n}\n","import type {OutputNamespace} from '../model-output.ts'\n/** Use the host settings service with optimistic revision checks. */\nexport async function outputRpc<T>(method:string,args:Record<string,unknown>={},signal?:AbortSignal):Promise<T>{\n const response=await fetch('/api/'+method,{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({type:'client-request',rpcId:'local-llm-output',method,payload:{args}}),...(signal?{signal}:{})})\n const data=await response.json() as {result?:{ok:boolean;value:T;error?:{message?:string}}}\n if(!response.ok||!data.result?.ok)throw Error(data.result?.error?.message??'Model settings could not be updated.')\n return data.result.value\n}\n/** Read configured chat models without requiring a running inference engine. */\nexport async function describeOutput(signal?:AbortSignal):Promise<OutputNamespace>{\n const settings=await outputRpc<{namespaces:OutputNamespace[]}>('settings/describe',{},signal)\n const namespace=settings.namespaces.find(entry=>entry.ns==='llm-pi-ai')\n if(!namespace)throw Error('Chat model settings are unavailable.')\n return namespace\n}\n","import { useEffect, useState } from 'react'\n\ntype State = { enabled?: boolean; canManageConnections?: boolean; pairs?: { id:string; label:string }[]; connection?: { address:string } | null }\nconst endpoint = '/api/local-llm/connection'\n\n/** Read errors before JSON decoding so a missing backend never looks like malformed model data. */\nexport async function responseData(response: Response) {\n if (!response.headers.get('content-type')?.includes('application/json')) {\n throw Error(response.status===404 ? 'This control is unavailable. Check the engine setup or the plugin’s startup status.' : `The host returned an unexpected response (${response.status}). Try reconnecting.`)\n }\n const result = await response.json()\n if (!response.ok) throw Error(result.detail ?? `Request failed (${response.status}).`)\n return result\n}\n\nexport function Connection({remote,onChange}:{remote:boolean;onChange:(value:boolean)=>void}) {\n const [state,setState]=useState<State>({}), [address,setAddress]=useState(''), [token,setToken]=useState('')\n const [label,setLabel]=useState('My other computer'), [key,setKey]=useState(''), [error,setError]=useState('')\n const [message,setMessage]=useState(''), [busy,setBusy]=useState(false), [open,setOpen]=useState(false)\n const [mode,setMode]=useState<'connect'|'share'>('connect')\n useEffect(()=>{\n const abort=new AbortController()\n void fetch(endpoint,{signal:abort.signal}).then(responseData).then(result=>{\n if(abort.signal.aborted)return\n setState(result)\n if(result.connection){setAddress(result.connection.address);onChange(true)}\n }).catch(error=>{if(!abort.signal.aborted)setError(error.message)})\n return()=>abort.abort()\n },[])\n async function action(operation:string,body:Record<string,unknown>={}) {\n setBusy(true);setError('');setMessage('')\n try {\n const result=await responseData(await fetch(endpoint,{method:'POST',headers:{'content-type':'application/json','x-local-llm-control':'1'},body:JSON.stringify({operation,...body})}))\n if(result.token)setKey(result.token)\n if(operation==='connect'){setToken('');onChange(true);setOpen(false)}\n if(operation==='disconnect')onChange(false)\n setMessage(result.detail??'Connection updated.')\n setState(await responseData(await fetch(endpoint)))\n }catch(error){setError(error instanceof Error?error.message:String(error))}finally{setBusy(false)}\n }\n const owner=state.canManageConnections!==false\n return <section className=\"lc-connection\">\n <div className=\"lc-connection-bar\"><div><span className=\"lc-eyebrow\">COMPUTER</span><strong>{remote?state.connection?.address:owner?'This computer':'Connected host computer'}</strong></div>\n <div className=\"lc-actions\"><button className={`lc-button ${!remote?'primary':''}`} onClick={()=>onChange(false)}>{owner?'This computer':'Host models'}</button>\n {state.connection&&<button className={`lc-button ${remote?'primary':''}`} onClick={()=>onChange(true)} disabled={busy}>Other computer</button>}\n {owner&&<button className=\"lc-button\" aria-expanded={open} onClick={()=>setOpen(!open)}>{open?'Close connections':state.connection?'Manage connections':'Connect another computer'}</button>}\n </div>\n </div>\n {!owner&&<p className=\"lc-sub\">You are controlling the host through your paired AryaAI browser. No separate LLM connection is needed.</p>}\n {error&&<p className=\"lc-notice error\" role=\"alert\">{error}</p>}{message&&<p className=\"lc-notice\" role=\"status\">{message}</p>}\n {open&&owner&&<div className=\"lc-card lc-connection-setup\"><div className=\"lc-actions\"><button className={`lc-button ${mode==='connect'?'primary':''}`} onClick={()=>setMode('connect')}>Use another computer’s models</button><button className={`lc-button ${mode==='share'?'primary':''}`} onClick={()=>setMode('share')}>Share this computer’s models</button></div>\n {mode==='connect'?<form onSubmit={event=>{event.preventDefault();void action('connect',{address:address.trim(),token:token.trim()})}}>\n <h3>Connect to the computer that runs your models</h3><ol className=\"lc-steps\"><li>Open Control Center on that computer.</li><li>Choose Share this computer’s models and create a key.</li><li>Enter its Tailscale address and paste the key below.</li></ol>\n <div className=\"lc-grid lc-connection-fields\"><label className=\"lc-field\">Host address<input className=\"lc-input\" type=\"url\" required value={address} onChange={event=>setAddress(event.target.value)} placeholder=\"https://your-pc.your-tailnet.ts.net\"/></label><label className=\"lc-field\">Pairing key<input className=\"lc-input\" type=\"password\" autoComplete=\"off\" required value={token} onChange={event=>setToken(event.target.value)}/></label></div>\n <div className=\"lc-actions\"><button className=\"lc-button primary\" disabled={busy||!address.trim()||!token.trim()}>{busy?'Connecting…':'Connect and find models'}</button>{state.connection&&<><button type=\"button\" className=\"lc-button\" disabled={busy} onClick={()=>void action('refresh')}>Refresh available models</button><button type=\"button\" className=\"lc-button danger\" disabled={busy} onClick={()=>void action('disconnect')}>Disconnect</button></>}</div>\n <p className=\"lc-sub\">Using a phone? Open Mobile & Remote in AryaAI instead. That pairs your browser with this computer.</p>\n </form>:<div><h3>Allow another AryaAI computer to use these models</h3><p className=\"lc-muted\">This also allows engine changes and local benchmarks. Your paid API providers are excluded.</p>\n <label className=\"lc-field\">Name of the other computer<input className=\"lc-input\" value={label} onChange={event=>setLabel(event.target.value)}/></label>\n <div className=\"lc-actions\"><button className=\"lc-button primary\" disabled={busy||!label.trim()} onClick={()=>void action('pair',{label})}>Create pairing key</button><button className=\"lc-button\" disabled={busy} onClick={()=>void action('sharing',{enabled:!state.enabled})}>{state.enabled?'Pause sharing':'Enable sharing'}</button></div>\n {key&&<div className=\"lc-notice\"><p>Copy this private key into the other computer. It is shown only now.</p><input className=\"lc-input\" aria-label=\"New pairing key\" value={key} readOnly/><div className=\"lc-actions\"><button className=\"lc-button\" onClick={()=>void navigator.clipboard.writeText(key).then(()=>setMessage('Pairing key copied.')).catch(()=>setError('Select and copy the key manually.'))}>Copy key</button><button className=\"lc-button\" onClick={()=>setKey('')}>Hide key</button></div></div>}\n {(state.pairs??[]).map(pair=><div className=\"lc-select-line\" key={pair.id}><span>{pair.label}</span><button className=\"lc-button danger\" disabled={busy} onClick={()=>void action('revoke',{id:pair.id})}>Revoke access</button></div>)}\n </div>}\n </div>}\n </section>\n}\n\nexport function controlUrl(path:string,remote:boolean){return '/api/local-llm/'+(remote?'proxy':'device')+'?path='+encodeURIComponent(path)}\n\n/** Loopback links belong to the engine computer, never the phone viewing its dashboard. */\nexport function accessibleWebUi(value:unknown, remote:boolean):string|undefined {\n if(typeof value!=='string')return\n try {\n const url=new URL(value)\n if(!['http:','https:'].includes(url.protocol)||url.username||url.password)return\n const loopback=['127.0.0.1','localhost','[::1]'].includes(url.hostname)\n const localDocument=location.protocol==='dsh-app:'||['127.0.0.1','localhost','[::1]'].includes(location.hostname)\n if(loopback&&(remote||!localDocument))return\n return url.href\n } catch { return }\n}\n","import {useId} from 'react'\n\nconst contextPoints=[4096,8192,16384,32768,65536,98304,102400,131072,196608,262144]\nconst copy={slider:'slider',exact:'Exact value',tokens:'tokens',contextHint:'More context reserves more memory. Filled conversations also take longer to process.',low:'Minimum',high:'Maximum'}\n/** Format the actual setting without rounding away an exact value. */\nfunction display(value:number,context:boolean){return context?`${Number((value/1024).toFixed(2))}K`:Number.isInteger(value)?value.toLocaleString():String(value)}\n/** Pair keyboard-accessible sliders and quick context choices with an exact numeric input. */\nexport function TuningSlider({label,value,min,max,step=1,onChange,disabled=false,context=false,hint}:{label:string;value:number;min:number;max:number;step?:number;onChange:(value:number)=>void;disabled?:boolean;context?:boolean;hint?:string}){\n const id=useId(),description=hint??(context?copy.contextHint:undefined)\n const points=context?contextPoints.filter(n=>n>=min&&n<=max):[]\n const finite=Number.isFinite(value),safe=finite?Math.min(max,Math.max(min,value)):min\n const index=points.reduce((best,n,i)=>Math.abs(n-safe)<Math.abs(points[best]!-safe)?i:best,0)\n const quick=points.filter(n=>[32768,65536,102400,131072,262144].includes(n))\n return <div className=\"lc-tune-control\"><div className=\"lc-tune-heading\"><label htmlFor={id+'-range'}>{label}</label><output htmlFor={id+'-range'}>{finite?display(value,context):'—'}</output></div>\n <div className=\"lc-tune-row\"><input id={id+'-range'} className=\"lc-tune-range\" type=\"range\" aria-label={label+' '+copy.slider} aria-describedby={description?id+'-hint':undefined} aria-valuetext={finite?display(value,context)+(context?' '+copy.tokens:''):undefined} min={context?0:min} max={context?points.length-1:max} step={context?1:step} value={context?index:safe} disabled={disabled} onChange={event=>onChange(context?points[Number(event.target.value)]!:Number(event.target.value))}/><input className=\"lc-input lc-tune-exact\" aria-label={label} title={copy.exact} type=\"number\" min={min} max={max} step={step} value={finite?value:''} disabled={disabled} onChange={event=>onChange(event.target.value===''?NaN:Number(event.target.value))}/></div>\n <div className=\"lc-tune-scale\"><span>{display(min,context)}</span><span>{display(max,context)}</span></div>\n {context&&<div className=\"lc-tune-choices\" role=\"group\" aria-label={label+' quick choices'}>{quick.map(n=><button key={n} type=\"button\" className={'lc-button '+(value===n?'primary':'ghost')} aria-label={label+' '+display(n,true)} aria-pressed={value===n} disabled={disabled} onClick={()=>onChange(n)}>{display(n,true)}</button>)}</div>}\n {description&&<p id={id+'-hint'} className=\"lc-sub\">{description}</p>}\n </div>\n}\n","import {useEffect,useState} from 'react'\nimport {TuningSlider} from './TuningSlider.tsx'\nimport {outputCatalog,outputModels,validateOutputLimit,type OutputNamespace} from '../model-output.ts'\nimport {describeOutput as describe,outputRpc as rpc} from './output-settings.ts'\nconst copy={title:'Chat output',model:'Chat model',limit:'Output tokens per response',save:'Save output limit',reload:'Reload models',empty:'No configured local chat models.',note:'Thinking, tool arguments and the answer share this allowance. It applies to each response, not the whole task. Input plus output must fit the context, and the limit must stay below the context window. The active compression gateway reclaims output room after compressing history. The engine context window still limits input plus output.',saved:'Output limit saved. It applies to subsequent model requests; an in-progress response keeps its existing limit.',remote:'Open Tuning on the local host to change its chat model output limits.'}\n/** Edit persisted chat output defaults independently of server context and sampling. */\nexport function OutputTuning({remote,initialModel=''}:{remote:boolean;initialModel?:string}){\n const[namespace,setNamespace]=useState<OutputNamespace|null>(null),[appliedInitial,setAppliedInitial]=useState(''),[selected,setSelected]=useState(''),[value,setValue]=useState(65536),[busy,setBusy]=useState(false),[error,setError]=useState(''),[message,setMessage]=useState('')\n const models=outputCatalog(namespace)\n const model=models.find(entry=>entry.key===selected),max=model?.contextWindow??102400,ceiling=Math.max(1024,max-1024),recommended=Math.max(1024,Math.floor(max/2))\n async function load(){setBusy(true);setError('');try{setNamespace(await describe())}catch(e){setError(e instanceof Error?e.message:String(e))}finally{setBusy(false)}}\n useEffect(()=>{if(!remote)void load()},[remote])\n useEffect(()=>{if(!initialModel||!namespace||appliedInitial===initialModel)return;const next=outputCatalog(namespace).find(model=>model.key===initialModel);if(next){setAppliedInitial(initialModel);setSelected(initialModel);setValue(next.maxTokens??Math.min(65536,next.contextWindow-1024));setMessage('');setError('')}},[initialModel,namespace,appliedInitial])\n function choose(key:string){setSelected(key);const next=models.find(entry=>entry.key===key);setValue(next?.maxTokens??Math.min(65536,next?.contextWindow??65536));setMessage('');setError('')}\n async function save(){if(!model)return;setBusy(true);setError('');setMessage('');try{const fresh=await describe();const updated=outputModels(fresh,model.provider,model.id,value);await rpc('settings/mutate',{ns:fresh.ns,expectedRevision:fresh.revision,ops:[{op:'set',path:['providers',model.provider,'models'],value:updated}]});setNamespace(await describe());setMessage(copy.saved)}catch(e){setError(e instanceof Error?e.message:String(e))}finally{setBusy(false)}}\n let invalid=false;try{validateOutputLimit(value,max)}catch{invalid=true}\n return <section className=\"lc-card\"><h2>{copy.title}</h2>{remote?<p className=\"lc-sub\">{copy.remote}</p>:<><label className=\"lc-field\">{copy.model}<select className=\"lc-input\" aria-label={copy.model} value={selected} disabled={busy} onChange={event=>choose(event.target.value)}><option value=\"\">Choose a model</option>{models.map(entry=><option key={entry.key} value={entry.key}>{entry.name??entry.id} · {entry.provider}</option>)}</select></label>{model&&<><p className=\"lc-sub\">Context: {(max/1024).toLocaleString()}K tokens · saved output: {model.maxTokens?.toLocaleString()??'provider default'}</p><TuningSlider label={copy.limit} value={value} min={1024} max={ceiling} step={1024} disabled={busy} hint={copy.note} onChange={setValue}/><div className=\"lc-actions\">{[8192,16384,32768,65536].filter(n=>n<=recommended).map(n=><button key={n} className={'lc-button '+(n===value?'primary':'ghost')} disabled={busy} onClick={()=>setValue(n)}>{n/1024}K output</button>)}</div></>}{!busy&&!models.length&&<p className=\"lc-sub\">{copy.empty}</p>}<div className=\"lc-actions\"><button className=\"lc-button primary\" disabled={busy||!model||invalid} onClick={()=>void save()}>{copy.save}</button><button className=\"lc-button\" disabled={busy} onClick={()=>void load()}>{copy.reload}</button></div>{error&&<p className=\"lc-notice error\" role=\"alert\">{error}</p>}{message&&<p className=\"lc-notice\" role=\"status\">{message}</p>}</>}</section>\n}\n","import {TuningSlider} from './TuningSlider.tsx'\nimport {useEffect,useState} from 'react'\nimport type {NInferSettings} from '../ninfer.ts'\nconst copy={title:'NInfer tuning',context:'Context tokens',prefill:'Prompt chunk tokens',hostKvMiB:'Host cache MiB',draftTokens:'MTP draft tokens',outputTokens:'Response output tokens',ngram:'N-gram drafts',vision:'Enable vision',save:'Save NInfer settings',note:'Stop NInfer before saving. Context is shared by the prompt and the reply, so the output allowance must stay below it. MTP and vision use GPU memory. Configured context is not a retrieval test. Match the chat model context to this setting. The n-gram chain drafts from the prompt and the reply as it is written: it pays off on repetitive and structured output and costs a little on novel prose.'}\n/** Preserve unsaved edits across polling and edit only a stopped runtime. */\nexport function NInferTuning({state,busy,save}:{state:Partial<NInferSettings>&{phase?:string}|undefined;busy:boolean;save:(settings:NInferSettings)=>void}){\n const [values,setValues]=useState<NInferSettings|null>(null)\n useEffect(()=>{if(state?.context!==undefined&&state.prefill!==undefined&&state.hostKvMiB!==undefined&&state.draftTokens!==undefined&&state.vision!==undefined&&state.ngram!==undefined&&state.outputTokens!==undefined)setValues({context:state.context,prefill:state.prefill,hostKvMiB:state.hostKvMiB,draftTokens:state.draftTokens,vision:state.vision,ngram:state.ngram,outputTokens:state.outputTokens})},[state?.context,state?.prefill,state?.hostKvMiB,state?.draftTokens,state?.vision,state?.ngram,state?.outputTokens])\n if(!values)return null\n const disabled=busy||state?.phase!=='stopped'\n return <details style={{marginTop:18}}><summary className=\"lc-muted\">{copy.title}</summary><div className=\"lc-facts\">{([['context',4096,102400],['prefill',128,4096],['hostKvMiB',0,16384],['draftTokens',1,3]] as const).map(([key,min,max])=><TuningSlider key={key} label={'NInfer '+copy[key]} value={values[key]} min={min} max={max} disabled={disabled} context={key==='context'} onChange={value=>setValues(current=>{if(!current)return current;const next={...current,[key]:value};if(next.outputTokens>next.context-1024)next.outputTokens=Math.max(1024,next.context-1024);return next})}/>)}<TuningSlider label={'NInfer '+copy.outputTokens} value={values.outputTokens} min={1024} max={Math.max(1024,values.context-1024)} disabled={disabled} onChange={value=>setValues(values=>({...values!,outputTokens:value}))}/></div><label className=\"lc-field\">{copy.ngram}<select className=\"lc-input\" disabled={disabled} value={values.ngram} onChange={event=>setValues({...values,ngram:event.target.value==='off'?'off':'chain'})}><option value=\"chain\">Chain</option><option value=\"off\">Off</option></select></label><label className=\"lc-field\"><input type=\"checkbox\" disabled={disabled} checked={values.vision} onChange={event=>setValues({...values,vision:event.target.checked})}/>{copy.vision}</label><button className=\"lc-button primary\" disabled={disabled} onClick={()=>save(values)}>{copy.save}</button><p className=\"lc-sub\">{copy.note}</p></details>\n}\n","export const css = \".lc{--bg:var(--dsw-alias-bg-base);--panel:var(--dsw-alias-bg-layer-1);--line:var(--dsw-alias-border-l1);--ink:var(--dsw-alias-label-primary);--muted:var(--dsw-alias-label-secondary);--blue:var(--dsw-alias-label-primary);--teal:var(--dsw-alias-state-success-primary);box-sizing:border-box;height:100%;overflow:auto;background:var(--bg);color:var(--ink);font:14px/1.5 var(--dsw-font-family-sans,system-ui,sans-serif);padding:30px 34px}.lc *{box-sizing:border-box}.lc button,.lc input,.lc select{font:inherit}.lc button{cursor:pointer}.lc button:disabled{opacity:.4;cursor:default}.lc a{color:var(--blue)}.lc h1,.lc h2,.lc h3,.lc p{margin:0}.lc h1{font-size:30px;letter-spacing:-1.1px;font-weight:500}.lc h2{font-size:18px;letter-spacing:-.3px}.lc h3{font-size:15px}.lc-muted{color:var(--muted)}.lc-header{display:flex;justify-content:space-between;align-items:center;gap:18px;margin-bottom:24px}.lc-eyebrow{color:var(--blue);font-size:10px;letter-spacing:2px;font-weight:500;text-transform:uppercase;margin-bottom:7px}.lc-brand{display:flex;align-items:center;gap:15px}.lc-mark{width:49px;height:49px;background:var(--dsw-alias-bg-layer-2);color:var(--ink);border:1px solid var(--line);border-radius:14px;display:grid;place-items:center;box-shadow:none}.lc-pill{display:inline-flex;align-items:center;gap:7px;padding:5px 10px;border:1px solid var(--line);border-radius:20px;font-size:11px;color:var(--muted);white-space:nowrap}.lc-dot{height:6px;width:6px;border-radius:50%;background:currentColor}.lc-pill.good{color:var(--teal);background:color-mix(in srgb,var(--teal) 7%,var(--panel));border-color:color-mix(in srgb,var(--teal) 25%,var(--line))}.lc-pill.warm{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 7%,var(--panel));border-color:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 25%,var(--line))}.lc-tabs{display:flex;gap:6px;padding:5px;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--line);border-radius:11px;width:fit-content;margin-bottom:23px}.lc-tab{display:flex;align-items:center;gap:8px;border:0;color:var(--muted);background:transparent;padding:9px 17px;border-radius:7px;font-size:12px}.lc-tab.active{color:var(--ink);background:var(--dsw-alias-interactive-bg-hover);box-shadow:none}.lc-grid{display:grid;gap:16px}.lc-kpis{grid-template-columns:repeat(4,minmax(0,1fr));margin-bottom:20px}.lc-card{border:1px solid var(--line);border-radius:14px;background:var(--panel);padding:20px}.lc-kpi-head{display:flex;justify-content:space-between;align-items:center;font-size:12px;color:var(--muted)}.lc-value{font-size:28px;font-weight:500;letter-spacing:-1px;margin:9px 0 3px}.lc-value small{font-size:13px;font-weight:400;color:var(--muted);letter-spacing:0}.lc-sub{font-size:11px;color:var(--muted)}.lc-bar{height:5px;background:var(--dsw-alias-border-l1);border-radius:8px;overflow:hidden;margin:14px 0 6px}.lc-bar span{height:100%;display:block;background:var(--ink);border-radius:8px}.lc-section{display:flex;align-items:center;justify-content:space-between;margin:23px 0 13px}.lc-section small{color:var(--muted);font-size:11px}.lc-charts{grid-template-columns:1.6fr 1fr}.lc-chart{width:100%;height:145px;display:block;margin-top:18px}.lc-chart-footer{display:flex;justify-content:space-between;color:var(--muted);font-size:10px}.lc-legend{display:flex;gap:16px;font-size:11px;color:var(--muted)}.lc-engine-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.lc-engine{position:relative;transition:transform .15s,border-color .15s;cursor:pointer;text-align:left;color:var(--ink)}.lc-engine:hover{transform:translateY(-2px);border-color:var(--dsw-alias-border-l2)}.lc-engine.selected{border-color:var(--dsw-alias-label-primary);box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2)}.lc-engine .lc-logo{width:36px;height:36px;display:grid;place-items:center;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--line);border-radius:10px;margin-bottom:16px;font-size:16px;font-weight:500}.lc-engine h3{margin-bottom:4px}.lc-engine-state{position:absolute;top:22px;right:16px}.lc-engine-note{font-size:11px;color:var(--muted);margin-top:17px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lc-button{display:inline-flex;align-items:center;justify-content:center;gap:7px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-floating-fill);color:var(--dsw-alias-label-primary);padding:9px 14px;border-radius:8px;font-size:12px}.lc-button.primary{background:var(--dsw-alias-button-primary-fill);border-color:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-invert, var(--bg));font-weight:500}.lc-button.danger{color:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 30%,var(--line));background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 7%,var(--panel))}.lc-button.ghost{background:transparent}.lc-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:18px 0}.lc-detail-grid{grid-template-columns:1.5fr 1fr;margin-top:16px}.lc-facts{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin:20px 0}.lc-facts span{display:block;color:var(--muted);font-size:11px;margin-bottom:5px}.lc-facts strong{font-size:13px;font-weight:500}.lc-input{background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);color:var(--ink);padding:10px 12px;border-radius:8px;min-width:0}.lc-input:focus{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:1px}.lc-search{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin:18px 0}.lc-search input{flex:1;min-width:180px}.lc-model-grid{grid-template-columns:repeat(auto-fill,minmax(270px,1fr))}.lc-model-desc{font-size:12px;color:var(--muted);margin:9px 0 15px!important;min-height:36px}.lc-tags{display:flex;flex-wrap:wrap;gap:5px;margin:10px 0}.lc-tag{padding:3px 7px;background:var(--dsw-alias-bg-layer-2);color:var(--muted);border-radius:5px;font-size:10px}.lc table{width:100%;border-collapse:collapse;font-size:12px}.lc th{text-align:left;color:var(--muted);font-weight:500;font-size:10px;letter-spacing:1px;text-transform:uppercase;padding:14px 12px;border-bottom:1px solid var(--line)}.lc td{padding:14px 12px;border-bottom:1px solid var(--line)}.lc td .lc-button{padding:5px 10px;font-size:11px}.lc-code{font:12px ui-monospace,monospace;color:var(--ink)}.lc-terminal{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--line);padding:18px;border-radius:10px;white-space:pre-wrap;overflow:auto;max-height:440px;font:11px/1.7 ui-monospace,monospace;color:var(--muted);margin-top:18px}.lc-notice{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);padding:12px 16px;border-radius:9px;margin-bottom:16px;font-size:12px}.lc-notice.error{border-color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 7%,var(--panel));color:var(--dsw-alias-state-error-primary)}.lc-empty{padding:45px;text-align:center;color:var(--muted);border:1px dashed var(--line);border-radius:12px}.lc-select-line{display:flex;gap:10px;align-items:center;margin-top:12px}.lc-select-line input,.lc-select-line select{flex:1;min-width:0}.lc-footer{margin:25px 0 5px;color:var(--muted);font-size:10px;display:flex;justify-content:space-between}.lc-field{display:block;color:var(--muted);font-size:12px;margin-top:14px}.lc-field input{width:100%;margin-top:6px}.lc svg{flex-shrink:0}.lc svg text{font:10px system-ui;fill:var(--muted)}@media(max-width:1150px){.lc{padding:24px}.lc-kpis,.lc-engine-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:700px){.lc-charts,.lc-detail-grid{grid-template-columns:1fr}.lc-header{align-items:flex-start}.lc h1{font-size:23px}.lc-tabs{flex-wrap:wrap;width:100%}.lc-tab{padding:8px}.lc-facts{grid-template-columns:1fr}.lc table{display:block;overflow:auto}}\\n.lb-setup{grid-template-columns:1fr 1fr 1fr}.lb-options{display:flex;flex-direction:column;gap:14px;margin-top:18px;max-height:290px;overflow:auto}.lb-option{display:flex;gap:10px;align-items:flex-start;font-size:13px;cursor:pointer}.lb-option input{margin-top:4px;accent-color:var(--ink);flex-shrink:0}.lb-option small{display:block;color:var(--muted);font-size:11px;margin-top:4px}.lb-settings{display:grid;grid-template-columns:1fr 1fr;gap:0 12px}.lb-settings select{display:block;width:100%;margin-top:6px}.lb-settings .lb-option{grid-column:1/-1;margin-top:16px}.lb-tasks{grid-template-columns:repeat(3,1fr);margin-top:20px;gap:20px}.lb-tasks details{margin-top:8px;margin-left:23px}.lb-summary{grid-template-columns:repeat(auto-fit,minmax(230px,1fr));margin-top:16px}.lb-table{overflow:auto}.lb-table td{vertical-align:top;min-width:90px}.lb-table td:first-child{min-width:210px}.lb-table td:nth-child(6){max-width:300px}.lb-previews{grid-template-columns:repeat(auto-fit,minmax(400px,1fr))}.lb-preview{margin-top:16px;overflow:auto;border:1px solid var(--line);border-radius:9px;background:var(--bg);max-height:650px}.lb-preview img{display:block;width:100%;height:auto}.lb-preview iframe{display:block;width:100%;height:600px;border:0;background:var(--bg)}.lb-preview.mobile{max-width:390px;margin-inline:auto}.lb .lc-field>select{margin-left:10px}.lb-settings .lc-field>select{margin-left:0}@media(max-width:1100px){.lb-setup{grid-template-columns:1fr 1fr}.lb-setup>section:last-child{grid-column:1/-1}}@media(max-width:700px){.lb-setup,.lb-tasks,.lb-previews{grid-template-columns:1fr}.lb-setup>section:last-child{grid-column:auto}.lb-preview iframe{height:500px}}\\n.lb-history-actions{gap:12px;flex-wrap:wrap}.lb-comparison{margin-bottom:18px}.lb-compare-picker{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px;max-height:220px;overflow:auto;margin:18px 0}.lb-comparison-table table{min-width:760px}.lb-comparison-table th:not(:first-child),.lb-comparison-table td{min-width:230px;max-width:340px}.lb-comparison-table th small{display:block;margin-top:5px;letter-spacing:0;text-transform:none}.lb-comparison-table tbody th{min-width:210px;text-transform:none;letter-spacing:0;font-size:12px}.lb-comparison-table caption{text-align:left;padding:10px 0}.lb-comparison-table thead th{position:sticky;top:0;background:var(--panel)}\\n\\n.lb-config{grid-template-columns:repeat(3,minmax(0,1fr))}.lb-config .lc-field{min-width:0}.lc-field select{max-width:100%}.lc-engine-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.lc .lb-tasks>div{min-width:0;overflow-wrap:anywhere}.lc button:focus-visible,.lc input:focus-visible,.lc select:focus-visible{outline:2px solid var(--ink);outline-offset:3px}@media(max-width:1100px){.lb-config{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:700px){.lb-config,.lc-engine-grid,.lb-settings{grid-template-columns:1fr}.lc{padding:16px}.lc-footer{flex-wrap:wrap;gap:8px}}\\n\\n.lc h1,.lc h2,.lc h3,.lc strong{font-weight:500}.lb-config .lc-sub{grid-column:1/-1;margin-top:10px}\\n.ld-heading{display:flex;justify-content:space-between;align-items:center;gap:24px;margin:8px 0 24px}.ld-heading h2{font-size:26px;margin:8px 0}.ld-hardware{display:flex;gap:20px;flex-wrap:wrap;padding:14px 18px;background:var(--panel);border:1px solid var(--line);border-radius:10px;font-size:12px;color:var(--muted)}.ld-hardware strong{color:var(--ink)}.ld-search{display:grid;grid-template-columns:210px minmax(200px,1fr) auto;gap:10px;padding:14px;background:var(--panel);border:1px solid var(--line);border-radius:12px}.ld-toolbar{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;margin:16px 0 22px}.ld-suggestions,.ld-filters{display:flex;gap:8px;flex-wrap:wrap}.ld-workspace{display:grid;grid-template-columns:minmax(0,1fr);gap:22px;align-items:start}.ld-workspace.has-selection{grid-template-columns:minmax(0,1fr) minmax(320px,390px)}.ld-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px}.ld-model{display:flex;flex-direction:column;gap:10px;padding:20px;min-height:220px;transition:border-color .15s}.ld-model.is-selected{border-color:var(--ink);background:var(--dsw-alias-bg-layer-2)}.ld-model-top{display:flex;gap:6px}.ld-model-title{font-size:15px;font-weight:500;color:var(--ink);overflow-wrap:anywhere;text-decoration:none;line-height:1.45}.ld-model-title:hover,.ld-detail a:hover{text-decoration:underline}.ld-publisher{margin-top:-6px!important}.ld-description{font-size:12px;color:var(--muted);line-height:1.5;overflow-wrap:anywhere}.ld-model-meta{display:flex;gap:12px;flex-wrap:wrap;font-size:11px;color:var(--muted);margin-top:auto}.ld-model>.lc-button{align-self:flex-start;margin-top:4px}.ld-results-label{font-size:12px;color:var(--muted);min-height:22px;margin-bottom:8px}.ld-detail{position:sticky;top:16px;padding:22px;max-height:calc(100vh - 50px);overflow:auto}.ld-detail-header{display:flex;justify-content:space-between;align-items:center;gap:8px}.ld-detail h3{margin:16px 0;overflow-wrap:anywhere;line-height:1.5}.ld-detail a{color:var(--ink)}.ld-budget{display:grid;grid-template-columns:1fr 1fr;gap:12px}.ld-budget small,.ld-version small{display:block;color:var(--muted);font-size:11px;margin-top:4px}.ld-detail select{display:block;width:100%;margin-top:6px}.ld-versions{border:0;padding:0;margin:20px 0}.ld-versions legend{font-size:12px;color:var(--muted);margin-bottom:10px}.ld-version{display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:9px;padding:12px;margin-top:8px;cursor:pointer;font-size:13px}.ld-version.is-selected{border-color:var(--ink);background:var(--dsw-alias-bg-layer-2)}.ld-version>span{flex:1;min-width:0;overflow-wrap:anywhere}.ld-version input{accent-color:var(--ink)}.ld-total{display:flex;justify-content:space-between;gap:12px;padding-top:18px;margin-top:18px;border-top:1px solid var(--line);font-size:14px}.ld-fit{font-size:12px;margin:10px 0;color:var(--ink)}.ld-detail>.lc-button,.ld-detail .lc-button.primary{width:100%;margin:16px 0 12px}.ld-file-list{margin:16px 0;font-size:12px;color:var(--muted)}.ld-file-list summary{cursor:pointer}.ld-file-list div{display:flex;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:1px solid var(--line)}.ld-file-list div span:first-child{overflow-wrap:anywhere;min-width:0}.ld-file-list div span:last-child{white-space:nowrap}.ld-skeleton{height:220px;display:flex;flex-direction:column;gap:20px}.ld-skeleton span{height:16px;background:var(--dsw-alias-bg-layer-2);border-radius:4px}.ld-skeleton span:nth-child(2){width:65%}.ld-skeleton span:last-child{width:40%;margin-top:auto}.ld a:focus-visible{outline:2px solid var(--ink);outline-offset:3px}@media(max-width:1000px){.ld-workspace.has-selection{grid-template-columns:1fr}.ld-detail{position:static;max-height:none;grid-row:1}.ld-heading{align-items:flex-start;flex-direction:column}.ld-search{grid-template-columns:180px 1fr}.ld-search .lc-button{grid-column:1/-1}}@media(max-width:600px){.ld-search{grid-template-columns:1fr}.ld-cards{grid-template-columns:1fr}.ld-budget{grid-template-columns:1fr}.ld-filters{width:100%}.ld-filters select{flex:1;min-width:0}.ld-heading h2{font-size:23px}}\\n\\n.lc-tune-control{min-width:0;display:grid;gap:8px;color:var(--dsw-alias-label-primary);font-size:13px}.lc-tune-heading{display:flex;align-items:center;justify-content:space-between;gap:12px}.lc-tune-heading output{font-weight:500;font-variant-numeric:tabular-nums}.lc-tune-row{display:flex;align-items:center;gap:12px;min-width:0}.lc-tune-range{flex:1;min-width:0;height:24px;accent-color:var(--dsw-alias-label-primary);cursor:pointer}.lc-tune-exact{width:100px;flex:0 0 100px;min-width:0;text-align:right}.lc-tune-scale{display:flex;justify-content:space-between;padding-right:112px;font-size:11px;color:var(--dsw-alias-label-secondary)}.lc-tune-choices{display:flex;gap:6px;flex-wrap:wrap}.lc-tune-choices .lc-button{padding:5px 9px;font-size:12px}.lc-tune-range:focus-visible{outline:2px solid var(--dsw-alias-label-primary);outline-offset:3px;border-radius:6px}.lc-tune-control .lc-sub{margin:0}.lc-tune-range:disabled{cursor:default}\\n.lc-tune-control{align-self:start;align-content:start}\\n.lb-config .lb-settings{grid-template-columns:1fr}\\n\\n.lc{padding:24px;max-width:none;margin:0;width:100%;align-self:stretch;min-width:0}.lc-card{background:var(--dsw-alias-bg-base);border-radius:12px}.lc h1{font-size:26px;letter-spacing:-.6px}.lc h2,.lc h3{font-weight:500}.lc-sub{font-size:12px;line-height:1.6}.lc-tabs{max-width:100%;flex-wrap:wrap;background:transparent;padding:0;border:0;gap:4px}.lc-tab{padding:10px 14px;font-size:13px}.lc-tab.active{background:var(--dsw-alias-bg-layer-2)}.lc-header{margin:24px 0 20px}.lc-model-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:16px}.lc-model-card{display:flex;flex-direction:column;align-items:flex-start;gap:12px;min-width:0}.lc-model-card h3,.lc-model-card p{overflow-wrap:anywhere}.lc-model-card .lc-actions{margin-top:auto;flex-wrap:wrap}.lc-health-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.lc-health-meter{margin:18px 0}.lc-health-meter>div{display:flex;justify-content:space-between;gap:12px;font-size:13px}.lc-health-meter strong{font-weight:500}.lc-health-meter progress{display:block;width:100%;height:7px;margin:9px 0;accent-color:var(--dsw-alias-label-primary)}.lc-health-meter small{font-size:12px;color:var(--dsw-alias-label-secondary)}.lc-core-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}.lc-core-grid>div{display:flex;align-items:center;gap:6px;font-size:10px;color:var(--dsw-alias-label-secondary)}.lc-core-grid progress{width:100%;height:5px;accent-color:var(--dsw-alias-state-success-primary)}.lc-network-row{display:grid;gap:4px;padding:12px 0;border-bottom:1px solid var(--dsw-alias-border-l1);font-size:12px}.lc-network-row strong{font-weight:500}.lc-connection{border-bottom:1px solid var(--dsw-alias-border-l1);padding-bottom:18px}.lc-connection-bar{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap}.lc-connection-bar strong{display:block;overflow-wrap:anywhere;font-size:13px;font-weight:500}.lc-connection-fields{grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:16px;margin:18px 0}.lc-connection .lc-actions{flex-wrap:wrap;margin:0}.lc-connection-setup{margin-top:18px}.lc-connection-setup h3{margin-top:20px}.lc-connection input{width:100%;min-width:0}.lc-steps{padding-left:20px;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.9}.lc-webui-link{display:inline-flex;text-decoration:none;margin:12px 0}.lc-engine-setup{margin-bottom:24px}.lc-engine-setup .lc-card p{margin:12px 0}.lc-engine-setup summary{cursor:pointer}.lc .lc-facts>div{min-width:0}.lc .lc-facts strong{overflow-wrap:anywhere}.lc-empty h3{margin-bottom:8px}.lc-empty .lc-button{margin-top:16px}.lc button:focus-visible,.lc a:focus-visible,.lc input:focus-visible{outline:2px solid var(--dsw-alias-label-primary);outline-offset:3px}\\n@media(max-width:800px){.lc-health-grid{grid-template-columns:1fr}.lc{padding:16px}.lc-header{align-items:flex-start}.lc-connection-bar{align-items:flex-start}.lc-tabs{gap:3px}.lc-tab{padding:9px 11px}.lc-section{gap:12px;flex-wrap:wrap}.lc-header h1{font-size:23px}.lc-header .lc-mark{display:none}.lc-connection-bar .lc-actions{width:100%}.lc-network-row{overflow-wrap:anywhere}}\\n.lc-ninfer-hero{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:20px;align-items:start}\\n.lc-ninfer-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end}\\n.lc-ninfer-kpis{grid-template-columns:repeat(4,minmax(0,1fr))}\\n.lc-pill.bad{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 7%,var(--panel));border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 25%,var(--line))}\\n@media(max-width:1150px){.lc-ninfer-kpis{grid-template-columns:repeat(2,minmax(0,1fr))}}\\n@media(max-width:700px){.lc-ninfer-hero{grid-template-columns:1fr}.lc-ninfer-actions{justify-content:flex-start}}\\n@media(max-width:520px){.lc-ninfer-kpis{grid-template-columns:1fr}}\\n\"\n","import {Health} from './Health.tsx'\r\nimport {Models} from './Models.tsx'\r\nimport {EngineSetup} from './EngineSetup.tsx'\r\nimport {OutputTuning} from './OutputTuning.tsx'\r\nimport {TuningSlider} from './TuningSlider.tsx'\r\nimport {NInferTuning} from './NInferTuning.tsx'\r\nimport {Discover} from './Discover.tsx'\r\nimport { StrataModels } from './StrataModels.tsx'\r\nimport { FreeTokenTuning } from './FreeTokenTuning.tsx'\r\nimport { StrataTuning } from './StrataTuning.tsx'\r\nimport { OllamaTuning } from './OllamaTuning.tsx'\r\nimport { useEffect, useState, useId } from 'react'\r\nimport { css } from './theme.ts'\r\nimport { TuningPanel } from './Tuning.tsx'\r\nimport { BenchmarksPanel } from './Benchmarks.tsx'\r\nimport { Connection, controlUrl, responseData, accessibleWebUi } from './Connection.tsx'\r\ntype Engine='strata'|'ollama'|'llamacpp'|'freetoken'|'ninfer'\r\ntype Data=Record<string,any>\r\nconst engines:Engine[]=['strata','ollama','llamacpp','freetoken','ninfer']\r\nconst names={strata:'Strata',ollama:'Ollama',llamacpp:'llama.cpp',freetoken:'FreeToken',ninfer:'NInfer'}\r\nconst notes={strata:'Qwen inference engine',ollama:'Local model library',llamacpp:'Flexible GGUF runtime',freetoken:'Isolated MoE runtime',ninfer:'Qwen with MTP and vision'}\r\nconst API='/api/llamacpp'\r\nfunction Icon({kind='chip',size=18}:{kind?:string;size?:number}){const paths:Record<string,string>={chip:'M8 3v3m8-3v3M8 18v3m8-3v3M3 8h3m-3 8h3m12-8h3m-3 8h3M6 6h12v12H6zM9 9h6v6H9z',chart:'M3 3v18h18M6 16l4-6 4 3 6-9',box:'M3 7l9-4 9 4-9 4zM3 7v10l9 4 9-4V7M12 11v10',download:'M12 3v12m-5-5 5 5 5-5M4 16v5h16v-5',server:'M3 3h18v7H3zM3 14h18v7H3zM6 6h2m-2 11h2',logs:'M5 4h14v16H5zM8 8h8M8 12h8M8 16h5',play:'M7 4l13 8-13 8z'};return <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d={paths[kind]??paths.chip}/></svg>}\r\nfunction Badge({text,good=false,warm=false}:{text:string;good?:boolean;warm?:boolean}){return <span className={`lc-pill ${good?'good':warm?'warm':''}`}><i className=\"lc-dot\"/>{text}</span>}\r\nfunction LineChart({series,color='var(--dsw-alias-label-primary)',max=100,label}:{series:(number|null)[];color?:string;max?:number;label:string}){const id=useId().replace(/:/g,'');const values=series.filter((v):v is number=>v!==null&&Number.isFinite(v));if(!values.length)return <div className=\"lc-empty\">Waiting for live {label.toLowerCase()} readings</div>;const pts=values.map((v,i)=>`${40+i*520/Math.max(1,values.length-1)},${130-Math.min(max,v)/max*110}`).join(' ');return <><svg className=\"lc-chart\" viewBox=\"0 0 580 150\" role=\"img\" aria-label={`${label}, ${values.length} live samples`}><defs><linearGradient id={id} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop stopColor={color} stopOpacity=\".22\"/><stop offset=\"1\" stopColor={color} stopOpacity=\"0\"/></linearGradient></defs>{[0,1,2,3].map(i=><g key={i}><path d={`M40 ${20+i*110/3}H560`} stroke=\"var(--dsw-alias-border-l1)\" strokeDasharray=\"3 4\"/><text x=\"3\" y={24+i*110/3}>{Math.round(max*(1-i/3))}</text></g>)}{values.length>1&&<polygon points={`40,130 ${pts} 560,130`} fill={`url(#${id})`}/>}<polyline points={pts} stroke={color} strokeWidth=\"2.5\" fill=\"none\"/>{values.length===1&&<circle cx=\"40\" cy={130-values[0]!/max*110} r=\"3\" fill={color}/>}<title>{label}: {values.map(v=>v.toFixed(1)).join(', ')}</title></svg><div className=\"lc-chart-footer\"><span>Oldest sample</span><span>{values.length} samples · 5s refresh</span><span>Now</span></div></>}\r\nfunction RuntimeSettings({state,files,save,busy}:{state:Data|undefined;files:Data[];save:(body:Data)=>void;busy:boolean}){\r\n const [values,setValues]=useState<Data>({context:131072,threads:8,cpuMoeLayers:24,selectedModel:'',selectedVision:''})\r\n useEffect(()=>{if(state)setValues({context:state.context,threads:state.threads,cpuMoeLayers:state.cpuMoeLayers,selectedModel:state.selectedModel??'Ornith-1.5-35B-Q4_K_M.gguf',selectedVision:state.selectedVision??'mmproj-Ornith-1.5-35B-BF16.gguf'})},[state?.context,state?.threads,state?.cpuMoeLayers,state?.selectedModel,state?.selectedVision])\r\n return <details style={{marginTop:18}}><summary className=\"lc-muted\" style={{cursor:'pointer'}}>Runtime settings</summary><label className=\"lc-field\">Model file<select aria-label=\"Runtime model\" className=\"lc-input\" style={{width:'100%',marginTop:6}} value={values.selectedModel} onChange={e=>setValues({...values,...state?.presets?.[e.target.value],selectedModel:e.target.value,selectedVision:state?.presets?.[e.target.value]?.selectedVision??''})}>{files.filter(f=>!f.name.startsWith('mmproj')).map(f=><option key={f.name} value={f.name}>{f.name}</option>)}</select></label><label className=\"lc-field\">Vision projector<select aria-label=\"Vision projector\" className=\"lc-input\" style={{width:'100%',marginTop:6}} value={values.selectedVision} onChange={e=>setValues({...values,selectedVision:e.target.value})}><option value=\"\">None / text only</option>{files.filter(f=>f.name.startsWith('mmproj')).map(f=><option key={f.name} value={f.name}>{f.name}</option>)}</select></label><div className=\"lc-facts\">{[['context','Context tokens',4096,262144],['threads','CPU threads',1,32],['cpuMoeLayers','CPU expert layers',0,64]].map(([key,label,min,max])=><TuningSlider key={String(key)} label={String(label)} value={values[String(key)]??Number(min)} min={Number(min)} max={Number(max)} context={key==='context'} onChange={value=>setValues({...values,[String(key)]:value})}/>)}</div><button className=\"lc-button primary\" disabled={busy||state?.owned} onClick={()=>save({context:values.context,threads:values.threads,cpuMoeLayers:values.cpuMoeLayers,selectedModel:values.selectedModel,selectedVision:values.selectedVision})}>Save runtime settings</button><p className=\"lc-sub\" style={{marginTop:10}}>Stop the server first. Match the vision projector to its model. Larger context uses more memory; match AryaAI’s model context to this setting. CPU expert layers apply to supported MoE models.</p></details>\r\n}\r\nconst fmt=(n:number|undefined,d=1)=>Number.isFinite(n)?n!.toFixed(d):'—'\r\nconst gb=(n:number)=>`${(n/1e9).toFixed(1)} GB`\r\nfunction EngineDashboard({remote}:{remote:boolean}){\r\n const url=(path:string)=>controlUrl(path,remote)\r\n async function get(path:string){return responseData(await fetch(url(path)))}\r\n const[data,setData]=useState<Partial<Record<Engine,Data>>>({}),[metrics,setMetrics]=useState<Data>({}),[history,setHistory]=useState<Data[]>([]),[revision,setRevision]=useState(0),[webuis,setWebuis]=useState<Data>({}),[outputModel,setOutputModel]=useState(''),[tuneFile,setTuneFile]=useState(''),[calibrationModel,setCalibrationModel]=useState(''),[selected,setSelected]=useState<Engine>('llamacpp'),[tab,setTab]=useState('Health'),[tuningEngine,setTuningEngine]=useState('output'),[busy,setBusy]=useState(false),[message,setMessage]=useState(''),[error,setError]=useState(''),[downloads,setDownloads]=useState<Data[]>([]),[locals,setLocals]=useState<Data[]>([]),[logs,setLogs]=useState(''),[updated,setUpdated]=useState('')\r\n useEffect(()=>{let active=true;let timer:ReturnType<typeof setTimeout>;async function poll(){const r=await Promise.allSettled([...engines.map(e=>get(e==='ninfer'?'/api/ninfer/status':e==='freetoken'?'/api/freetoken/status':e==='strata'?'/api/aryastrata/status':`${API}/${e==='llamacpp'?'status':e}`)),get(`${API}/telemetry`),get(`${API}/downloads`),get(`${API}/local-files`),get(`${API}/webuis`)]);if(!active)return;const next:Partial<Record<Engine,Data>>={};r.slice(0,engines.length).forEach((x,i)=>next[engines[i]!]=x.status==='fulfilled'?x.value:{error:String(x.reason)});setData(next);const telemetry=r[engines.length],downloadResult=r[engines.length+1],filesResult=r[engines.length+2];const t=telemetry?.status==='fulfilled'?telemetry.value:{};const gpu=t.gpus?.[0];const m={...t,gpuName:gpu?.name,vramUsed:gpu?.usedMiB,vramTotal:gpu?.memoryMiB,gpuPct:gpu?.utilization,temp:gpu?.temperature,tps:next.strata?.timing?.decodeTokPerSec??null};setMetrics(m);setHistory(h=>[...h,m].slice(-60));if(downloadResult?.status==='fulfilled')setDownloads(downloadResult.value.jobs);if(filesResult?.status==='fulfilled')setLocals(filesResult.value.files);const uiResult=r[engines.length+3];if(uiResult?.status==='fulfilled')setWebuis(uiResult.value.links??{});if(telemetry?.status==='fulfilled')setUpdated(new Date().toLocaleTimeString());timer=setTimeout(poll,5000)}void poll();return()=>{active=false;clearTimeout(timer)}},[revision])\r\n async function action(e:Engine,op:string,body?:Data){setBusy(true);setError('');try{const base=e==='ninfer'?'/api/ninfer':e==='freetoken'?'/api/freetoken':e==='strata'?'/api/aryastrata':API;const r=await fetch(url(`${base}/${op}`),{method:'POST',headers:{['x-local-llm-control']:'1','content-type':'application/json'},...(body?{body:JSON.stringify(body)}:{})});const d=await responseData(r);if(d.ok===false)throw new Error(d.detail??'Action failed');setMessage(d.detail??'Download queued. Track it in Downloads.');if(d.job)setTab('Downloads');setRevision(value=>value+1)}catch(e){setError(e instanceof Error?e.message:String(e))}finally{setBusy(false)}}\r\n const phase=(e:Engine)=>{const s=data[e];return !s?'Connecting':s.error?'Unavailable':e==='ollama'?s.ready?s.loaded?.models?.length?'Model loaded':'Ready':'Offline':s.phase==='running'?'Ready':s.phase==='starting'?'Loading':s.phase==='missing-model'?'Choose a model':s.phase==='not-configured'?'Not configured':s.phase==='downloading'?'Downloading':s.phase==='foreign'||s.phase==='unmanaged'?'External':'Stopped'}\r\n useEffect(()=>{if(tab!=='Logs')return;let active=true;async function pollLogs(){try{const d=selected==='ninfer'?await get('/api/ninfer/logs'):selected==='freetoken'?await get('/api/freetoken/logs'):selected==='strata'?await get('/api/aryastrata/logs'):selected==='llamacpp'?await get(`${API}/status`):null;if(active)setLogs(d?.text??d?.logs??'This engine exposes logs through its desktop application.')}catch(e){if(active)setLogs(String(e))}}void pollLogs();const timer=setInterval(pollLogs,5000);return()=>{active=false;clearInterval(timer)}},[selected,tab])\r\n const button=(label:string,e:Engine,op:string,disabled=false,body?:Data,kind='')=><button className={`lc-button ${kind}`} disabled={busy||disabled} onClick={()=>void action(e,op,body)}>{label}</button>\r\n const s=data[selected], loaded=data.ollama?.loaded?.models??[], vramPct=metrics.vramUsed/metrics.vramTotal*100\r\n const controls=<div className=\"lc-actions\">{selected==='strata'||selected==='llamacpp'||selected==='freetoken'||selected==='ninfer'?<>{button('▶ Start server',selected,'start',!s||s.owned||((selected==='llamacpp'||selected==='freetoken'||selected==='ninfer')&&!s.complete)||((selected==='freetoken'||selected==='ninfer')&&remote)||['External','Unavailable'].includes(phase(selected)),undefined,'primary')}{button('Stop',selected,'stop',!s?.owned,undefined,'danger')}{button('↻ Restart',selected,'restart',!s?.owned)}</>:<>{button(`Open ${names[selected]}`,selected,`${selected}-open`,false,undefined,'primary')}{button('Stop',selected,`${selected}-stop`,selected==='ollama'?!s?.ready:!s?.appRunning,undefined,'danger')}{button('↻ Restart',selected,`${selected}-restart`,selected==='ollama'?!s?.ready:!s?.appRunning)}</>}</div>\r\n const uiLink=accessibleWebUi(webuis[selected],remote)\r\n const engineCards=<div className=\"lc-grid lc-engine-grid\">{engines.map(e=><button key={e} className={`lc-card lc-engine ${selected===e?'selected':''}`} aria-pressed={selected===e} onClick={()=>setSelected(e)}><div className=\"lc-logo\"><Icon kind={'server'}/></div><span className=\"lc-engine-state\"><Badge text={phase(e)} good={['Ready','Model loaded'].includes(phase(e))} warm={['Loading','Downloading'].includes(phase(e))}/></span><h3>{names[e]}</h3><p className=\"lc-sub\">{notes[e]}</p><div className=\"lc-engine-note\">{e==='ollama'?loaded[0]?.name??`${data.ollama?.tags?.models?.length??0} installed models`:e==='llamacpp'?`${data[e]?.complete?'Files ready':fmt(data[e]?.downloadPercent)+'%'} · ${data[e]?.selectedModel?.replace(/\\.gguf$/,'' )??'No model selected'}`:e==='strata'||e==='freetoken'||e==='ninfer'?data[e]?.modelName??'No active model':'Desktop application'}</div></button>)}</div>\r\n const detail=<div className=\"lc-grid lc-detail-grid\"><section className=\"lc-card\"><div className=\"lc-section\" style={{marginTop:0}}><h2>{names[selected]} / Server controls</h2><Badge text={phase(selected)} good={phase(selected)==='Ready'}/></div>{s?.error&&<p className=\"lc-muted\">{s.error}</p>}{controls}{uiLink?<a className=\"lc-button lc-webui-link\" href={uiLink} target=\"_blank\" rel=\"noopener noreferrer\">Open {names[selected]} web interface ↗</a>:webuis[selected]?<p className=\"lc-sub\">This engine’s interface is on its host computer. Configure a reachable webUiUrls address to open it from this device.</p>:null}<p className=\"lc-sub\">Remote changes wait for tracked inference and benchmarks to finish.</p><div className=\"lc-facts\"><div><span>ENDPOINT</span><strong className=\"lc-code\">{remote?'Remote host':selected==='ollama'?'127.0.0.1:11434':selected==='llamacpp'?'127.0.0.1:8081':selected==='strata'?'127.0.0.1:8080':selected==='ninfer'?s?.baseUrl??'127.0.0.1:8083':selected==='freetoken'?s?.baseUrl??'127.0.0.1:1919':'Not connected'}</strong></div><div><span>CONTEXT</span><strong>{selected==='llamacpp'||selected==='freetoken'||selected==='ninfer'?`${(s?.context??131072)/1024}K`:selected==='ollama'?loaded[0]?.context_length?.toLocaleString()??'—':s?.health?.maxContext?.toLocaleString()??'—'}</strong></div><div><span>PROCESS</span><strong>{s?.pid??s?.serverPid??s?.containerId?.slice(0,12)??(selected==='ollama'?'Ollama managed':'—')}</strong></div></div>{selected==='ollama'&&loaded.map((m:Data)=><div key={m.name} className=\"lc-select-line\"><span className=\"lc-code\" style={{flex:1}}>{m.name}</span>{button('Unload model','ollama','ollama-unload',false,{model:m.name})}</div>)}{selected==='llamacpp'&&<p className=\"lc-sub\">{s?.cpuMoeLayers??24} CPU expert layers · {s?.threads??8} threads · {s?.cacheType??'q8_0'} cache · {s?.complete?'Model files ready.':'Start available after the download finishes.'}</p>}{selected==='llamacpp'&&<RuntimeSettings state={s} files={locals} busy={busy} save={body=>void action('llamacpp','configure',body)}/>}{selected==='strata'&&<StrataModels remote={remote} stopped={s?.phase==='stopped'} busy={busy} modelName={s?.modelName} save={body=>action('llamacpp','strata-select',body)}/> }{selected==='ninfer'&&<NInferTuning state={s} busy={busy} save={body=>void action('ninfer','configure',body)}/>} {selected==='freetoken'&&<FreeTokenTuning state={s} busy={busy} save={body=>void action('freetoken','configure',body)}/>}</section><aside className=\"lc-card\"><div className=\"lc-eyebrow\">Operational awareness</div><h2>GPU capacity</h2><div className=\"lc-value\">{fmt((metrics.vramTotal-metrics.vramUsed)/1024)} <small>GiB available</small></div><div className=\"lc-bar\"><span style={{width:`${Math.min(100,vramPct||0)}%`}}/></div><p className=\"lc-sub\">{metrics.gpuName??'Detecting GPU'}</p><p className=\"lc-muted\" style={{fontSize:12,marginTop:15}}>Unload the current model after its task finishes before loading a large model in another engine.</p><div className=\"lc-actions\"><button className=\"lc-button ghost\" onClick={()=>setTab('Models')}><Icon kind=\"box\"/>Manage models</button></div></aside></div>\r\n return <main className=\"lc\" style={{padding:0,height:'auto',overflow:'visible'}}><style>{css}</style><header className=\"lc-header\"><div className=\"lc-brand\"><div className=\"lc-mark\"><Icon size={27}/></div><div><div className=\"lc-eyebrow\">AryaAI / Local infrastructure</div><h1>Local LLM Control Center</h1><p className=\"lc-sub\">Your computer, engines and models — in one place.</p></div></div><Badge text={`LIVE · ${updated||'Connecting'}`} good={!!updated}/></header><nav className=\"lc-tabs\">{['Health','Models','Engines','Tuning','Benchmarks','Discover','Downloads','Logs'].map((t,i)=><button key={t} className={`lc-tab ${t===tab?'active':''}`} onClick={()=>setTab(t)}><Icon size={15} kind={['chart','server','box','box','download','chip','chart','logs'][i]!}/>{t}{t==='Downloads'&&downloads.filter(j=>j.status==='downloading').length>0&&` (${downloads.filter(j=>j.status==='downloading').length})`}</button>)}</nav>{error&&<div className=\"lc-notice error\" role=\"alert\">{error}</div>}{message&&<div className=\"lc-notice\" role=\"status\">{message}<button className=\"lc-button ghost\" style={{float:'right',padding:0,border:0}} onClick={()=>setMessage('')}>Dismiss</button></div>}\r\n {tab==='Health'&&<Health metrics={metrics}/>}\r\n {tab==='Engines'&&<><EngineSetup remote={remote} busy={busy} save={body=>action('llamacpp','engine-setup',body)}/><div className=\"lc-section\"><h2>Engine health and controls</h2></div>{engineCards}{detail}</>}\r\n {tab==='Models'&&<Models remote={remote} onOutput={key=>{setOutputModel(key);setTuningEngine('output');setTab('Tuning')}} data={data} files={locals} busy={busy} action={action} tune={file=>{setTuneFile(file);setTuningEngine('llamacpp');setTab('Tuning')}} calibrate={id=>{setCalibrationModel(id);setTab('Benchmarks')}} add={()=>setTab('Discover')}/>}\r\n {tab==='Discover'&&<Discover key={remote?'remote':'local'} remote={remote} vramMiB={metrics.vramTotal} ramGiB={metrics.ramTotalGiB} busy={busy} onDownload={(engine,op,body)=>void action(engine,op,body)}/>}\r\n {tab==='Downloads'&&<><div className=\"lc-section\"><h2>Download activity</h2><small>Catalog downloads tracked during this AryaAI run</small></div>{downloads.map(j=><section className=\"lc-card\" key={j.id} style={{marginTop:14}}><div className=\"lc-section\" style={{margin:0}}><h3>{j.name}</h3><Badge text={j.status} good={j.status==='complete'} warm={j.status==='downloading'}/></div><p className=\"lc-sub\">{j.engine==='ollama'?'Ollama':'Hugging Face / llama.cpp'} · {j.detail}</p>{j.total>0&&<><div className=\"lc-bar\"><span style={{width:`${Math.min(100,j.completed/j.total*100)}%`}}/></div><p className=\"lc-sub\">{gb(j.completed)} / {gb(j.total)} · {fmt(j.completed/j.total*100)}%</p></>}</section>)}{!downloads.length&&data.llamacpp?.complete&&<div className=\"lc-empty\">No downloads yet. Add a model from Discover.</div>}</>}\r\n {tab==='Tuning'&&<><div className=\"lc-actions\" style={{marginTop:0}}>{['output','llamacpp','ollama','strata'].map(e=><button key={e} className={`lc-button ${tuningEngine===e?'primary':''}`} aria-pressed={tuningEngine===e} onClick={()=>setTuningEngine(e)}>{e==='output'?'Chat output':e==='llamacpp'?'llama.cpp profiles':e==='ollama'?'Ollama variants':'Strata engine'}</button>)}</div>{tuningEngine==='output'?<OutputTuning remote={remote} initialModel={outputModel}/>:tuningEngine==='llamacpp'?<TuningPanel key={tuneFile} initialFile={tuneFile} state={data.llamacpp} files={locals} busy={busy} save={body=>void action('llamacpp','preset-save',body)}/>:tuningEngine==='ollama'?<OllamaTuning models={data.ollama?.tags?.models??[]} busy={busy} save={body=>void action('ollama','ollama-tune',body)}/>:<StrataTuning remote={remote} stopped={data.strata?.phase==='stopped'} busy={busy} save={body=>void action('llamacpp','strata-tune',body)}/>}</>}\r\n {tab==='Benchmarks'&&<BenchmarksPanel key={calibrationModel} initialModel={calibrationModel} remote={remote}/>}\r\n {tab==='Logs'&&<><div className=\"lc-section\"><h2>Server log stream</h2><select className=\"lc-input\" aria-label=\"Log engine\" value={selected} onChange={e=>setSelected(e.target.value as Engine)}>{engines.map(e=><option key={e} value={e}>{names[e]}</option>)}</select></div><pre className=\"lc-terminal\">{logs||'Waiting for logs…'}</pre></>}\r\n <footer className=\"lc-footer\"><span>{remote?'REMOTE HOST':'LOCAL HOST'} · Charts show observed readings, not benchmark estimates.</span><span>{metrics.gpuName??'Host hardware'} · Live measurements</span></footer></main>\r\n}\r\nexport function Dashboard(){const [remote,setRemote]=useState(false);return <div className=\"lc\"><style>{css}</style><Connection remote={remote} onChange={setRemote}/><EngineDashboard key={remote?'remote':'local'} remote={remote}/></div>}\r\nexport const SidebarIcon=Icon\r\n","/** Read the NInfer server log into the live figures its dashboard shows. */\nexport interface NInferLogSummary {\n weightPercent?: number | undefined\n weightGiB?: number | undefined\n weightTotalGiB?: number | undefined\n weightBytesPerSecond?: number | undefined\n etaSeconds?: number | undefined\n decodeTokPerSecond?: number | undefined\n prefillTokPerSecond?: number | undefined\n running?: number | undefined\n batch?: number | undefined\n hostPercent?: number | undefined\n mtpAccepted?: number | undefined\n mtpOffered?: number | undefined\n mtpPercent?: number | undefined\n requests?: number | undefined\n error?: string | undefined\n listening?: boolean | undefined\n ready?: boolean | undefined\n}\n\nconst number = (value: string | undefined) => {\n if (value === undefined) return undefined\n const parsed = Number(value.replace(/,/gu, ''))\n return Number.isFinite(parsed) ? parsed : undefined\n}\nconst rate = (value: string | undefined, suffix: string | undefined) => {\n const parsed = number(value)\n if (parsed === undefined) return undefined\n return suffix === 'k' ? parsed * 1000 : parsed\n}\n\n/**\n * Summarize the part of the log that belongs to the latest start.\n *\n * The log is append-only across restarts, so a new `starting engine` line ends\n * the previous run's figures. A later `listening on` clears an earlier failure;\n * a later `server stopped` clears the throughput that only describes a live run.\n */\nexport function parseNInferLog(text: string): NInferLogSummary {\n const lines = text.split(/\\r?\\n/u)\n let start = -1\n for (let index = 0; index < lines.length; index++) if (lines[index]!.includes('starting engine')) start = index\n const run = start >= 0 ? lines.slice(start) : lines\n const out: NInferLogSummary = {}\n for (const line of run) {\n const request = line.match(/req#(\\d+)/u)\n if (request) {\n const seen = number(request[1])\n if (seen !== undefined) out.requests = Math.max(out.requests ?? 0, seen)\n }\n let match: RegExpMatchArray | null\n if ((match = line.match(/loading weights\\s+([\\d.]+)%\\s*\\|\\s*([\\d.]+)\\s*GiB\\/([\\d.]+)\\s*GiB\\s*\\|\\s*([\\d.]+)\\s*MiB\\/s\\s*\\|\\s*ETA\\s*([\\d.]+)s/u))) {\n out.weightPercent = number(match[1])\n out.weightGiB = number(match[2])\n out.weightTotalGiB = number(match[3])\n out.weightBytesPerSecond = (number(match[4]) ?? 0) * 1024 * 1024\n out.etaSeconds = number(match[5])\n } else if (/weights ready/u.test(line)) {\n out.weightPercent = 100\n out.ready = true\n out.etaSeconds = 0\n } else if (/engine ready/u.test(line)) {\n out.ready = true\n } else if (/listening on http/u.test(line)) {\n out.listening = true\n out.error = undefined\n } else if ((match = line.match(/throughput\\s*\\|\\s*[\\d.]+s\\s*\\|\\s*prefill\\s+([\\d.]+)(k?)\\s*tok\\/s.*?decode\\s+([\\d.]+)(k?)\\s*tok\\/s.*?running\\s+(\\d+)/u))) {\n out.prefillTokPerSecond = rate(match[1], match[2])\n out.decodeTokPerSecond = rate(match[3], match[4])\n out.running = number(match[5])\n } else if ((match = line.match(/mtp accepted\\s+([\\d,]+)\\/([\\d,]+)\\s*\\(([\\d.]+)%\\)/u))) {\n out.mtpAccepted = number(match[1])\n out.mtpOffered = number(match[2])\n out.mtpPercent = number(match[3])\n } else if (/(FATAL|ERROR)\\s+.*(startup failed|server failed)/u.test(line)) {\n out.error = line.replace(/^.*?(?:FATAL|ERROR)\\s+/u, '').trim()\n out.listening = false\n out.ready = false\n } else if (/server stopped/u.test(line)) {\n out.running = 0\n out.decodeTokPerSecond = undefined\n out.prefillTokPerSecond = undefined\n }\n }\n if (out.listening) out.error = undefined\n return out\n}\n","import { useEffect, useState } from 'react'\nimport { parseNInferLog, type NInferLogSummary } from '../ninfer-log.ts'\n\nexport interface NInferGpu { name?: string; memoryMiB?: number | null; usedMiB?: number | null; utilization?: number | null; temperature?: number | null; powerWatts?: number | null }\nexport interface NInferTelemetry { gpus?: NInferGpu[]; cpuPct?: number | null; ramUsedGiB?: number; ramTotalGiB?: number }\nexport interface NInferSample { decode: number | null; prefill: number | null; vram: number | null }\n\n/**\n * Read the engine's own log and the host telemetry while this view is open.\n *\n * The log is the only place NInfer reports load progress, throughput and the\n * reason a start failed, so the dashboard reads it on the same cadence as the\n * hardware snapshot and keeps a short history for the chart.\n */\nexport function useNInferLive({ enabled }: { enabled: boolean }) {\n const [telemetry, setTelemetry] = useState<NInferTelemetry>()\n const [summary, setSummary] = useState<NInferLogSummary>({})\n const [text, setText] = useState('')\n const [history, setHistory] = useState<NInferSample[]>([])\n const [refreshKey, setRefreshKey] = useState(0)\n\n useEffect(() => {\n if (!enabled) return\n let alive = true\n async function tick() {\n try {\n const response = await fetch('/api/llamacpp/telemetry', { signal: AbortSignal.timeout(8000) })\n if (response.ok) {\n const value = await response.json() as NInferTelemetry\n if (alive) setTelemetry(value)\n }\n } catch { /* A missing sensor reading never hides the engine state. */ }\n try {\n const response = await fetch('/api/ninfer/logs', { signal: AbortSignal.timeout(15000) })\n if (response.ok) {\n const value = await response.json() as { text?: unknown }\n if (alive && typeof value.text === 'string') {\n setText(value.text)\n setSummary(parseNInferLog(value.text))\n }\n }\n } catch { /* The last figures stay until the next successful read. */ }\n }\n void tick()\n const timer = setInterval(() => { if (document.visibilityState === 'visible') void tick() }, 3000)\n return () => { alive = false; clearInterval(timer) }\n }, [enabled, refreshKey])\n\n useEffect(() => {\n if (!enabled) return\n setHistory(current => [...current, { decode: summary.decodeTokPerSecond ?? null, prefill: summary.prefillTokPerSecond ?? null, vram: telemetry?.gpus?.[0]?.usedMiB ?? null }].slice(-60))\n }, [enabled, summary.decodeTokPerSecond, summary.prefillTokPerSecond, telemetry])\n\n return { telemetry, summary, text, history, refresh: () => setRefreshKey(value => value + 1) }\n}\n","import { useState, type ReactNode } from 'react'\nimport type { NInferEngine } from './use-ninfer.ts'\nimport { useNInferLive, type NInferSample } from './use-ninfer-live.ts'\nimport { NInferTuning } from './NInferTuning.tsx'\n\nconst gb = (mib: number | null | undefined) => mib == null ? '—' : (mib / 1024).toFixed(1)\nconst rate = (value: number | undefined) => value == null ? '—' : value >= 1000 ? (value / 1000).toFixed(2) + 'k' : value.toFixed(1)\n\n/** One KPI card in the engine's own monitoring vocabulary. */\nfunction Kpi({ label, value, detail, children }: { label: string; value: ReactNode; detail?: ReactNode; children?: ReactNode }) {\n return <section className=\"lc-card\"><div className=\"lc-kpi-head\"><span>{label}</span></div><div className=\"lc-value\">{value}</div>{children}{detail !== undefined && <p className=\"lc-sub\">{detail}</p>}</section>\n}\n\n/** Decode throughput from the samples this view has seen since it opened. */\nfunction Sparkline({ samples }: { samples: NInferSample[] }) {\n const values = samples.map(sample => sample.decode).filter((value): value is number => typeof value === 'number' && value > 0)\n if (values.length === 0) return <div className=\"lc-empty\" style={{ padding: '26px 0' }}>Throughput appears after the first request.</div>\n const max = Math.max(...values) * 1.15 || 1\n const points = values.map((value, index) => `${40 + index * 520 / Math.max(1, values.length - 1)},${130 - Math.min(1, value / max) * 110}`).join(' ')\n return <svg className=\"lc-chart\" viewBox=\"0 0 580 150\" role=\"img\" aria-label={`Decode throughput across ${values.length} samples`}>\n <defs><linearGradient id=\"ninfer-throughput\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop stopColor=\"var(--dsw-alias-state-success-primary)\" stopOpacity=\".18\"/><stop offset=\"1\" stopColor=\"var(--dsw-alias-state-success-primary)\" stopOpacity=\"0\"/></linearGradient></defs>\n {[0, 1, 2, 3].map(row => <g key={row}><path d={`M40 ${20 + row * 110 / 3}H560`} stroke=\"var(--dsw-alias-border-l1)\" strokeDasharray=\"3 4\"/><text x=\"3\" y={24 + row * 110 / 3}>{Math.round(max * (1 - row / 3))}</text></g>)}\n {values.length > 1 && <polygon points={`40,130 ${points} 560,130`} fill=\"url(#ninfer-throughput)\"/>}\n <polyline points={points} stroke=\"var(--dsw-alias-state-success-primary)\" strokeWidth=\"2.5\" strokeLinecap=\"round\" fill=\"none\"/>\n {values.length === 1 && <circle cx={40} cy={130 - Math.min(1, values[0]! / max) * 110} r={3} fill=\"var(--dsw-alias-state-success-primary)\"/>}\n </svg>\n}\n\n/**\n * The local NInfer engine as an operations view: state, GPU, throughput,\n * speculative-decoding acceptance, load progress and the reason a start failed.\n */\nexport function NInferPanel({ ninfer, strataActive, onShowStrata }: { ninfer: NInferEngine; strataActive: boolean; onShowStrata: () => void }) {\n const { state, error, statusError, notice, busy, act, save, refresh } = ninfer\n const live = useNInferLive({ enabled: true })\n const [stoppingStrata, setStoppingStrata] = useState(false)\n const phase = state?.phase\n const gpu = live.telemetry?.gpus?.[0]\n const vramUsed = gpu?.usedMiB\n const vramTotal = gpu?.memoryMiB\n const vramPercent = vramUsed != null && vramTotal ? vramUsed / vramTotal * 100 : null\n const failed = typeof live.summary.error === 'string' && live.summary.error !== ''\n const loading = phase === 'starting'\n const running = phase === 'running' && state?.healthy !== false\n const label = failed ? 'Failed' : running ? 'Serving' : loading ? 'Loading' : phase === 'unmanaged' ? 'External' : phase === 'stopped' ? 'Stopped' : 'Connecting'\n const pill = failed ? 'bad' : running ? 'good' : loading ? 'warm' : ''\n const context = state?.context === undefined ? '—' : Math.round(state.context / 1024) + 'K'\n const identity = state?.runtime === 'wsl' ? 'WSL · pid ' + (state.pid ?? '—') : state?.containerId ? 'Container · ' + state.containerId.slice(0, 12) : 'local process'\n const endpoint = state?.baseUrl ?? 'http://127.0.0.1:8083/v1'\n const dashboard = endpoint.replace(/\\/v1\\/?$/u, '') + '/'\n const canStart = phase === 'stopped' && state?.complete === true\n const progress = loading ? Math.max(0, Math.min(100, live.summary.weightPercent ?? 0)) : 0\n const sampleCount = live.history.filter(sample => sample.decode != null).length\n const vramReading = vramUsed != null && vramTotal != null\n\n async function stopStrata() {\n if (stoppingStrata) return\n setStoppingStrata(true)\n try {\n await fetch('/api/aryastrata/stop', { method: 'POST', headers: { 'x-strata-control': '1' }, signal: AbortSignal.timeout(240000) })\n refresh()\n } catch { /* The page's own Strata poll reports the outcome. */ } finally { setStoppingStrata(false) }\n }\n\n return <section>\n <section className=\"lc-card\" style={{ padding: '22px 24px' }}>\n <div className=\"lc-ninfer-hero\">\n <div>\n <div className=\"lc-eyebrow\">NInfer · local engine</div>\n <h2 style={{ fontSize: 26, letterSpacing: '-.6px' }}>Qwen3.8-27B</h2>\n <p className=\"lc-sub\">Dense · GSQ3 · {context} context · {state?.vision ? 'vision' : 'text only'} · {state?.draftTokens ?? 3} MTP drafts · {identity}</p>\n <div className=\"lc-actions\" style={{ marginTop: 14 }}>\n <span className={`lc-pill ${pill}`}><i className=\"lc-dot\"/>{label}</span>\n <span className=\"lc-pill\">{endpoint}</span>\n </div>\n </div>\n <div className=\"lc-ninfer-actions\">\n <button className=\"lc-button primary\" disabled={busy || !canStart} onClick={() => void act('start')}>Start NInfer</button>\n <button className=\"lc-button\" disabled={busy || state?.owned !== true} onClick={() => void act('stop')}>Stop NInfer</button>\n <button className=\"lc-button\" disabled={busy || state?.owned !== true} onClick={() => void act('restart')}>Restart NInfer</button>\n <button className=\"lc-button ghost\" disabled={busy} onClick={() => { refresh(); live.refresh() }}>Refresh</button>\n {running && <a className=\"lc-button\" href={dashboard} target=\"_blank\" rel=\"noopener noreferrer\">Open NInfer dashboard</a>}\n </div>\n </div>\n </section>\n\n {error !== '' && <p className=\"lc-notice error\" role=\"alert\">{error}</p>}\n {statusError !== '' && <p className=\"lc-notice error\" role=\"status\">{statusError}</p>}\n {notice !== '' && <p className=\"lc-notice\" role=\"status\">{notice}</p>}\n\n {failed && <section className=\"lc-notice error\" role=\"alert\">\n <strong>NInfer could not start.</strong> {live.summary.error}\n <p className=\"lc-sub\">{vramReading ? `The GPU shows ${gb(vramUsed)} of ${gb(vramTotal)} GB in use${strataActive ? ' — Strata is holding it' : ''}. ` : ''}Starting again stops Strata first.</p>\n <div className=\"lc-actions\">\n {strataActive && <button className=\"lc-button\" disabled={stoppingStrata} onClick={() => void stopStrata()}>{stoppingStrata ? 'Stopping Strata…' : 'Stop Strata'}</button>}\n <button className=\"lc-button primary\" disabled={busy || !canStart} onClick={() => void act('start')}>Retry start</button>\n <button className=\"lc-button ghost\" onClick={onShowStrata}>Open Strata controls</button>\n </div>\n </section>}\n\n {!failed && strataActive && phase === 'stopped' && <section className=\"lc-notice\" role=\"status\">\n <strong>Strata has the GPU.</strong> {vramReading ? `It is using ${gb(vramUsed)} of ${gb(vramTotal)} GB. ` : ''}Starting NInfer stops Strata first.\n <div className=\"lc-actions\">\n <button className=\"lc-button ghost\" onClick={onShowStrata}>Open Strata controls</button>\n </div>\n </section>}\n\n {loading && <section className=\"lc-card\">\n <div className=\"lc-section\" style={{ marginTop: 0 }}><div><h3>Loading model</h3><p className=\"lc-sub\">Weights are read from the pinned artifact before the server listens.</p></div><span className=\"lc-pill warm\"><i className=\"lc-dot\"/>{progress.toFixed(0)}%</span></div>\n <div className=\"lc-bar\"><span style={{ width: progress + '%' }}/></div>\n <p className=\"lc-sub\">{gb(live.summary.weightGiB)} / {gb(live.summary.weightTotalGiB)} GiB · {rate(live.summary.weightBytesPerSecond ? live.summary.weightBytesPerSecond / 1024 / 1024 : undefined)} MiB/s · ETA {live.summary.etaSeconds ?? '—'}s</p>\n </section>}\n\n <div className=\"lc-grid lc-ninfer-kpis\" style={{ marginTop: 16 }}>\n <Kpi label=\"MODEL STATE\" value={label} detail={running ? ((live.summary.running ?? 0) > 0 ? `${live.summary.running} in flight` : 'Waiting for a request') : loading ? 'Reading weights' : failed ? 'Startup failed' : 'Not loaded'}/>\n <Kpi label=\"DECODE\" value={running ? rate(live.summary.decodeTokPerSecond) : '—'} detail={'prefill ' + rate(live.summary.prefillTokPerSecond) + ' tok/s'}/>\n <Kpi label=\"MTP ACCEPTANCE\" value={live.summary.mtpPercent == null ? '—' : live.summary.mtpPercent.toFixed(1) + '%'} detail={live.summary.mtpOffered ? `${live.summary.mtpAccepted?.toLocaleString()} / ${live.summary.mtpOffered.toLocaleString()} accepted` : 'No speculative request yet'}/>\n <Kpi label=\"VRAM\" value={`${gb(vramUsed)} / ${gb(vramTotal)} GB`} detail={gpu?.name ?? 'No GPU reading'}><div className=\"lc-bar\" style={{ margin: '10px 0 4px' }}><span style={{ width: (vramPercent ?? 0) + '%' }}/></div></Kpi>\n <Kpi label=\"GPU LOAD\" value={gpu?.utilization == null ? '—' : Math.round(gpu.utilization) + '%'} detail={gpu?.temperature == null ? 'No temperature' : `${Math.round(gpu.temperature)} °C${gpu.powerWatts == null ? '' : ' · ' + Math.round(gpu.powerWatts) + ' W'}`}/>\n <Kpi label=\"CONTEXT\" value={context} detail={`${state?.vision ? 'vision' : 'text only'} · MTP ${state?.draftTokens ?? 3}`}/>\n <Kpi label=\"ACTIVE REQUESTS\" value={running ? String(live.summary.running ?? 0) : '—'} detail={`${live.summary.requests?.toLocaleString() ?? 0} requests served`}/>\n <Kpi label=\"HOST\" value={live.telemetry?.cpuPct == null ? '—' : Math.round(live.telemetry.cpuPct) + '%'} detail={live.telemetry?.ramTotalGiB ? `CPU · RAM ${live.telemetry.ramUsedGiB?.toFixed(1)} / ${live.telemetry.ramTotalGiB.toFixed(1)} GiB` : 'CPU · no memory reading'}/>\n </div>\n\n <section className=\"lc-card\">\n <div className=\"lc-section\" style={{ marginTop: 0 }}><div><h3>Decode throughput</h3><p className=\"lc-sub\">Tokens per second reported by the engine's own throughput log.</p></div><small>{sampleCount} {sampleCount === 1 ? 'sample' : 'samples'} · 3 s refresh</small></div>\n <Sparkline samples={live.history}/>\n </section>\n\n <NInferTuning state={state} busy={busy} save={save}/>\n <details style={{ marginTop: 18 }}><summary className=\"lc-muted\">NInfer logs</summary><div className=\"lc-actions\"><button className=\"lc-button\" onClick={() => live.refresh()}>Refresh logs</button></div><pre className=\"lc-terminal\">{live.text === '' ? 'No NInfer log output yet.' : live.text}</pre></details>\n </section>\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { NInferSettings } from '../ninfer.ts'\nimport { responseData } from './Connection.tsx'\n\n/** `/api/ninfer/status` as the host reports it, plus the tuning fields it echoes. */\nexport type NInferStatus = Partial<NInferSettings> & { phase?: string; owned?: boolean; healthy?: boolean; complete?: boolean; containerId?: string | null; modelName?: string; baseUrl?: string; runtime?: 'wsl'; pid?: number; available?: boolean }\n\n/** The engine's state and the calls the page may make against it. */\nexport type NInferEngine = ReturnType<typeof useNInfer>\n\n/**\n * Poll the owned local engine and drive its existing routes.\n *\n * Status reads abort the previous one, so a poll that started before an action\n * cannot overwrite the state that action produced. Polling pauses while the\n * page is hidden: in WSL and Docker modes every read is a real process call.\n */\nexport function useNInfer({ enabled, intervalMs }: { enabled: boolean; intervalMs: number }) {\n const [state, setState] = useState<NInferStatus>()\n const [error, setError] = useState('')\n const [statusError, setStatusError] = useState('')\n const [notice, setNotice] = useState('')\n const [busy, setBusy] = useState(false)\n const [logs, setLogs] = useState('')\n const [logsError, setLogsError] = useState('')\n const inflight = useRef<AbortController | null>(null)\n const acting = useRef(false)\n\n function readStatus() {\n inflight.current?.abort()\n const controller = new AbortController()\n inflight.current = controller\n void (async () => {\n try {\n const next = await responseData(await fetch('/api/ninfer/status', { signal: AbortSignal.any([controller.signal, AbortSignal.timeout(15000)]) })) as NInferStatus\n if (controller.signal.aborted) return\n setState(next)\n setStatusError('')\n } catch (reason) {\n if (!controller.signal.aborted) setStatusError(reason instanceof Error ? reason.message : String(reason))\n }\n })()\n }\n\n async function act(action: 'start' | 'stop' | 'restart') {\n if (!enabled || acting.current) return\n acting.current = true\n setBusy(true)\n setError('')\n setNotice('')\n try {\n const result = await responseData(await fetch('/api/ninfer/' + action, { method: 'POST', headers: { 'x-ninfer-control': '1' }, signal: AbortSignal.timeout(240000) }))\n setNotice(typeof result.detail === 'string' ? result.detail : 'NInfer ' + action + ' requested.')\n readStatus()\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason))\n } finally {\n acting.current = false\n setBusy(false)\n }\n }\n\n async function save(settings: NInferSettings) {\n if (!enabled || acting.current) return\n acting.current = true\n setBusy(true)\n setError('')\n setNotice('')\n try {\n const result = await responseData(await fetch('/api/ninfer/configure', { method: 'POST', headers: { 'x-ninfer-control': '1', 'content-type': 'application/json' }, body: JSON.stringify(settings), signal: AbortSignal.timeout(30000) }))\n setNotice(typeof result.detail === 'string' ? result.detail : 'NInfer settings saved.')\n readStatus()\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason))\n } finally {\n acting.current = false\n setBusy(false)\n }\n }\n\n async function loadLogs() {\n if (!enabled) return\n try {\n const result = await responseData(await fetch('/api/ninfer/logs', { signal: AbortSignal.timeout(15000) }))\n setLogs(typeof result.text === 'string' ? result.text : '')\n setLogsError('')\n } catch (reason) {\n setLogsError(reason instanceof Error ? reason.message : String(reason))\n }\n }\n\n useEffect(() => {\n if (!enabled) return\n readStatus()\n let timer: ReturnType<typeof setTimeout>\n const schedule = () => {\n timer = setTimeout(() => {\n if (document.visibilityState === 'visible') readStatus()\n schedule()\n }, intervalMs)\n }\n schedule()\n const onVisible = () => { if (document.visibilityState === 'visible') readStatus() }\n document.addEventListener('visibilitychange', onVisible)\n return () => {\n clearTimeout(timer)\n document.removeEventListener('visibilitychange', onVisible)\n inflight.current?.abort()\n inflight.current = null\n }\n }, [enabled, intervalMs])\n\n return { state, error, statusError, notice, busy, logs, logsError, act, save, loadLogs, refresh: readStatus }\n}\n","import {useEffect,useState} from 'react'\nimport {css} from './theme.ts'\nimport {OutputTuning} from './OutputTuning.tsx'\nimport {responseData} from './Connection.tsx'\nimport {NInferPanel} from './NInferPanel.tsx'\nimport {useNInfer} from './use-ninfer.ts'\n\ntype State={phase:string;responding:boolean;owned:boolean;baseUrl:string;port?:number;modelName:string;detail:string}\n\n/** The target this computer was pointed at, as `/api/aryastrata/connection` reports it. */\ntype Target={address:string;token:string;storage:string;acceptsControl:boolean;paired:number}\n\n/** One outstanding pairing code and the addresses a second computer can use it at. */\ntype Offer={code:string;display:string;expiresAt:number;targets:{kind:string;address:string;url:string}[]}\n\n/** One computer already paired with this engine, as this Host recorded it. */\ntype Device={id:string;label:string;created:number}\n\n/** One machine on this computer's tailnet, offered as an address to pair with. */\ntype Peer={name:string;address:string;online:boolean}\n\n/** Header that routes one call at the configured Host instead of this machine. */\nconst remoteHeader={'x-strata-target':'remote'}\n\n/** Port the paired-computer relay listens on, assumed when a peer is picked from the list. */\nconst PAGE_PORT='45900'\n\n/** Header that marks a write, as every lifecycle route demands. */\nconst controlHeader={'x-strata-control':'1'}\n\n/** Whole minutes until a code expires, floored at zero. */\nfunction minutesLeft(expiresAt:number):number{\n return Math.max(0,Math.ceil((expiresAt-Date.now())/60000))\n}\n\n/** Accept a typed address in the form people actually type it. */\nfunction asAddress(value:string):string{\n const trimmed=value.trim()\n if(trimmed===''||trimmed.startsWith('/')||/^[a-z][a-z0-9+.-]*:\\/\\//iu.test(trimmed))return trimmed\n return 'http://'+trimmed\n}\n\n/** AryaStrata lifecycle controls, for this computer or for the Host it was pointed at. */\nexport function StrataControlCenter(){\n const [state,setState]=useState<State>(),[target,setTarget]=useState<Target>(),[error,setError]=useState(''),[loadError,setLoadError]=useState(''),[notice,setNotice]=useState(''),[busy,setBusy]=useState(false),[generation,setGeneration]=useState(0)\n const [address,setAddress]=useState(''),[token,setToken]=useState(''),[pairing,setPairing]=useState(false),[pairNotice,setPairNotice]=useState(''),[pairError,setPairError]=useState('')\n const [code,setCode]=useState(''),[joining,setJoining]=useState(false),[joinError,setJoinError]=useState(''),[joinNotice,setJoinNotice]=useState('')\n const [peers,setPeers]=useState<Peer[]>(),[peerNote,setPeerNote]=useState(''),[finding,setFinding]=useState(false)\n const [offer,setOffer]=useState<Offer>(),[offerError,setOfferError]=useState(''),[minting,setMinting]=useState(false)\n const [devices,setDevices]=useState<Device[]>(),[deviceNote,setDeviceNote]=useState(''),[revoking,setRevoking]=useState('')\n const [webUi,setWebUi]=useState<{url:string|null;detail:string}>()\n const remote=!!target&&target.address!==''\n // This computer's own engines, not the Host a paired page controls: NInfer\n // routes answer loopback callers only, so the switch exists only here.\n const localHost=location.protocol==='dsh-app:'||['localhost','127.0.0.1','[::1]'].includes(location.hostname)\n const enginesHere=localHost&&!remote\n const [engine,setEngine]=useState<'strata'|'ninfer'>('strata')\n const ninfer=useNInfer({enabled:enginesHere,intervalMs:engine==='ninfer'?5000:20000})\n const strataActive=['running','starting'].includes(state?.phase??'')\n const strataBlocked=['running','starting'].includes(ninfer.state?.phase??'')\n useEffect(()=>{if(!enginesHere)setEngine('strata')},[enginesHere])\n useEffect(()=>{\n const abort=new AbortController()\n void (async()=>{try{setTarget(await responseData(await fetch('/api/aryastrata/connection',{signal:AbortSignal.any([abort.signal,AbortSignal.timeout(15000)])})) as Target)}catch(e){if(!abort.signal.aborted)setLoadError(e instanceof Error?e.message:String(e))}})()\n return()=>abort.abort()\n },[generation])\n useEffect(()=>{\n const abort=new AbortController();let pending=false\n async function refresh(){if(pending)return;pending=true;try{const data=await responseData(await fetch('/api/aryastrata/status',{headers:remote?remoteHeader:{},signal:AbortSignal.any([abort.signal,AbortSignal.timeout(15000)])}));if(!abort.signal.aborted){setState(data);setLoadError('')}}catch(e){if(!abort.signal.aborted)setLoadError(e instanceof Error?e.message:String(e))}finally{pending=false}}\n void refresh();const timer=setInterval(()=>void refresh(),3000)\n return()=>{abort.abort();clearInterval(timer)}\n },[remote])\n // The engine's interface sits on the engine computer's loopback, which a second\n // computer cannot load. Ask this computer's Host whether that port answers on\n // the address it already pairs with, and offer only an address that did.\n useEffect(()=>{\n if(!remote||!state?.port)return\n const abort=new AbortController()\n void (async()=>{try{const data=await responseData(await fetch('/api/aryastrata/webui?port='+String(state.port),{signal:AbortSignal.any([abort.signal,AbortSignal.timeout(20000)])})) as {url:string|null;detail:string};if(!abort.signal.aborted)setWebUi(data)}catch(e){if(!abort.signal.aborted)setWebUi({url:null,detail:e instanceof Error?e.message:String(e)})}})()\n return()=>abort.abort()\n },[remote,state?.port,generation])\n async function action(operation:'start'|'stop'|'restart'){\n if(busy)return;setBusy(true);setError('');setNotice('')\n try{const result=await responseData(await fetch('/api/aryastrata/'+operation,{method:'POST',headers:remote?{...remoteHeader,'x-strata-control':'1'}:{'x-strata-control':'1'},signal:AbortSignal.timeout(240000)}));if(result.state)setState(result.state);if(result.ok===false)throw Error(result.detail);setNotice(result.detail);setGeneration(n=>n+1)}catch(e){setError(e instanceof Error?e.message:String(e))}finally{setBusy(false)}\n }\n async function call(path:'/connection/test'|'/connection/save',draft?:{address:string;token:string}){\n if(pairing)return;setPairing(true);setPairError('');setPairNotice('')\n try{const body=draft??{address:asAddress(address),token};const result=await responseData(await fetch('/api/aryastrata'+path,{method:'POST',headers:{...controlHeader,'content-type':'application/json'},body:JSON.stringify(body),signal:AbortSignal.timeout(30000)}));if(result.ok===false)throw Error(result.detail);setPairNotice(result.detail);if(path==='/connection/save')setGeneration(n=>n+1)}catch(e){setPairError(e instanceof Error?e.message:String(e))}finally{setPairing(false)}\n }\n async function useThisComputer(){setAddress('');setToken('');await call('/connection/save',{address:'',token:''})}\n /** Ask this Host for a code another computer can redeem. */\n async function createCode(){\n if(minting)return;setMinting(true);setOfferError('')\n try{const result=await responseData(await fetch('/api/aryastrata/pair/offer',{signal:AbortSignal.timeout(15000)}));if(result.ok===false)throw Error(result.detail);setOffer(result as Offer)}catch(e){setOfferError(e instanceof Error?e.message:String(e))}finally{setMinting(false)}\n }\n /** Redeem the typed code on the typed address, then start controlling that engine. */\n async function join(){\n if(joining)return;setJoining(true);setJoinError('');setJoinNotice('')\n try{const result=await responseData(await fetch('/api/aryastrata/pair',{method:'POST',headers:{...controlHeader,'content-type':'application/json'},body:JSON.stringify({address:asAddress(address),code:code.replace(/[^a-z0-9]/giu,'').toUpperCase()}),signal:AbortSignal.timeout(30000)}));if(result.ok===false)throw Error(result.detail);setJoinNotice(result.detail);setCode('');setGeneration(n=>n+1)}catch(e){setJoinError(e instanceof Error?e.message:String(e))}finally{setJoining(false)}\n }\n /** List the machines on this computer's tailnet, so pairing needs no address typed. */\n async function findComputers(){\n if(finding)return;setFinding(true);setPeerNote('')\n try{const result=await responseData(await fetch('/api/aryastrata/peers',{signal:AbortSignal.timeout(20000)}));setPeers((result.peers??[]) as Peer[]);if(result.detail)setPeerNote(String(result.detail));else if(!(result.peers??[]).length)setPeerNote('No other machine answered, so type the host address instead.')}catch(e){setPeerNote(e instanceof Error?e.message:String(e))}finally{setFinding(false)}\n }\n async function loadDevices(){\n try{const result=await responseData(await fetch('/api/aryastrata/pair/devices',{signal:AbortSignal.timeout(15000)}));setDevices((result.devices??[]) as Device[]);setDeviceNote('')}catch(e){setDeviceNote(e instanceof Error?e.message:String(e))}\n }\n async function revokeDevice(id:string){\n if(revoking!=='')return;setRevoking(id);setDeviceNote('')\n try{const result=await responseData(await fetch('/api/aryastrata/pair/revoke',{method:'POST',headers:{...controlHeader,'content-type':'application/json'},body:JSON.stringify({id}),signal:AbortSignal.timeout(15000)}));setDevices((result.devices??[]) as Device[]);setDeviceNote(result.ok===false?result.detail:'Unpaired. That computer can no longer control this engine.')}catch(e){setDeviceNote(e instanceof Error?e.message:String(e))}finally{setRevoking('')}\n }\n let url:URL|undefined\n try{if(state){const address=remote&&webUi?.url?webUi.url:state.baseUrl;const candidate=new URL(address);if(['http:','https:'].includes(candidate.protocol)){candidate.hash='monitor';url=candidate}}}catch{/* An invalid configured engine URL is not embedded. */}\n const loopback=url&&['localhost','127.0.0.1','[::1]'].includes(url.hostname)\n // The engine's own web interface listens on the Host's loopback, so a panel\n // driving another computer offers the address this computer just proved it\n // can reach, and never the loopback one.\n const accessible=!!url&&(remote?webUi?.url!=null:(!loopback||localHost))\n const embedded=accessible&&!(location.protocol==='https:'&&url?.protocol==='http:')\n const where=remote?target.address.replace(/^https?:\\/\\//u,''):'This computer'\n const remaining=offer?minutesLeft(offer.expiresAt):0\n return <main className=\"lc\" style={{height:'100%',display:'flex',flexDirection:'column',minHeight:0}}><style>{css}</style>\n <header className=\"lc-header\"><div><h1>AryaStrata Control Center</h1><p className=\"lc-sub\">Run AryaStrata, or the local NInfer Qwen3.8 dense model, on this computer.</p></div><span role=\"status\" className=\"lc-pill\">{engine==='ninfer'?(ninfer.busy?'Working…':ninfer.state?.phase??'Connecting…'):(busy?'Working…':state?.phase??'Connecting…')}</span></header>\n {enginesHere&&<nav className=\"lc-tabs\" aria-label=\"Engines\"><button className={'lc-tab '+(engine==='strata'?'active':'')} aria-pressed={engine==='strata'} onClick={()=>setEngine('strata')}>Strata</button><button className={'lc-tab '+(engine==='ninfer'?'active':'')} aria-pressed={engine==='ninfer'} onClick={()=>setEngine('ninfer')}>NInfer</button></nav>}\n {engine==='ninfer'&&enginesHere?<NInferPanel ninfer={ninfer} strataActive={strataActive} onShowStrata={()=>setEngine('strata')}/>:<>\n <div className=\"lc-actions\" style={{flexWrap:'wrap'}}>\n <button className=\"lc-button primary\" disabled={busy||!state||state.phase!=='stopped'} onClick={()=>void action('start')}>Start engine</button>\n <button className=\"lc-button\" disabled={busy||!state?.owned} onClick={()=>void action('stop')}>Stop engine</button>\n <button className=\"lc-button\" disabled={busy||!state?.owned} onClick={()=>void action('restart')}>Restart engine</button>\n {accessible&&<a className=\"lc-button\" href={url?.href} target=\"_blank\" rel=\"noopener noreferrer\">Open AryaStrata web UI</a>}\n <button className=\"lc-button\" onClick={()=>{setWebUi(undefined);setGeneration(n=>n+1)}}>Reload web UI</button>\n </div>\n {strataBlocked&&<p className=\"lc-sub\">NInfer is running. Starting Strata stops NInfer automatically. <button className=\"lc-button ghost\" disabled={busy} onClick={()=>setEngine('ninfer')}>Open NInfer controls</button></p>}\n {(error||loadError)&&<p className=\"lc-notice error\" role=\"alert\">{error||loadError}</p>}\n {notice&&<p className=\"lc-notice\" role=\"status\">{notice}</p>}\n <div className=\"lc-connection\" style={{marginTop:12}}>\n <span className=\"lc-muted\">Controlling</span><strong>{where}</strong>\n {remote&&target.storage!=='none'&&<span className=\"lc-tag\">{target.storage==='profile'?'saved in this profile':'saved in strata-connection.json'}</span>}\n <details className=\"lc-connection-setup\" style={{marginLeft:'auto'}}><summary>{remote?'Change computer':'Control another computer'}</summary>\n <div className=\"lc-connection-fields\">\n <label className=\"lc-field\"><span>Computer</span>\n <select aria-label=\"Computer\" className=\"lc-input\" value={peers?.some(peer=>asAddress(address)===`http://${peer.address}:${PAGE_PORT}`)?asAddress(address):''} onChange={event=>{if(event.target.value!=='')setAddress(event.target.value)}}>\n <option value=\"\">Choose a computer on your tailnet…</option>\n {(peers??[]).map(peer=><option key={peer.address} value={`http://${peer.address}:${PAGE_PORT}`}>{peer.name} · {peer.address}</option>)}\n </select>\n </label>\n <div className=\"lc-actions\" style={{flexWrap:'wrap'}}><button className=\"lc-button\" disabled={finding} onClick={()=>void findComputers()}>{finding?'Looking…':'Find computers'}</button></div>\n {peerNote!==''&&<p className=\"lc-muted\">{peerNote}</p>}\n <label className=\"lc-field\"><span>Host address</span><input className=\"lc-input\" value={address} placeholder=\"100.x.y.z:45900 (the address shown beside the code)\" onChange={event=>setAddress(event.target.value)}/></label>\n <label className=\"lc-field\"><span>Pairing code</span><input className=\"lc-input\" value={code} maxLength={9} autoComplete=\"off\" spellCheck={false} placeholder=\"ABCD-2345\" onChange={event=>setCode(event.target.value.toUpperCase())}/></label>\n </div>\n <div className=\"lc-actions\" style={{flexWrap:'wrap'}}>\n <button className=\"lc-button primary\" disabled={joining||code.replace(/[^A-Z0-9]/giu,'').length!==8||asAddress(address)===''} onClick={()=>void join()}>{joining?'Pairing…':'Pair and control'}</button>\n {remote&&<button className=\"lc-button\" disabled={joining} onClick={()=>void useThisComputer()}>Use this computer</button>}\n </div>\n {joinError!==''&&<p className=\"lc-notice error\" role=\"alert\">{joinError}</p>}\n {joinNotice!==''&&<p className=\"lc-notice\" role=\"status\">{joinNotice}</p>}\n <p className=\"lc-muted\">On the engine computer open <strong>AryaStrata → Let another computer control this engine</strong>, create a code, then type it here. The code works once and expires after five minutes.</p>\n <details><summary>Use a control token instead</summary>\n <div className=\"lc-connection-fields\">\n <label className=\"lc-field\"><span>Control token</span><input className=\"lc-input\" value={token} autoComplete=\"off\" placeholder=\"the other computer's strata.controlToken\" onChange={event=>setToken(event.target.value)}/></label>\n </div>\n <div className=\"lc-actions\" style={{flexWrap:'wrap'}}>\n <button className=\"lc-button\" disabled={pairing} onClick={()=>void call('/connection/test')}>Test connection</button>\n <button className=\"lc-button\" disabled={pairing} onClick={()=>void call('/connection/save')}>Save and use</button>\n </div>\n {pairError!==''&&<p className=\"lc-notice error\" role=\"alert\">{pairError}</p>}\n {pairNotice!==''&&<p className=\"lc-notice\" role=\"status\">{pairNotice}</p>}\n <p className=\"lc-muted\">Both computers run this plugin. On the other one, set <code>strata.controlToken</code> in its plugin configuration and enter that token here.</p>\n </details>\n {!remote&&target&&!target.acceptsControl&&<p className=\"lc-muted\">This computer has no <code>strata.controlToken</code> and no paired computer yet, so it answers only this computer until one of those is set up.</p>}\n </details>\n <details className=\"lc-connection-setup\"><summary>Let another computer control this engine</summary>\n {offer===undefined\n ?<div className=\"lc-actions\" style={{flexWrap:'wrap'}}><button className=\"lc-button\" disabled={minting} onClick={()=>void createCode()}>{minting?'Creating…':'Create pairing code'}</button></div>\n :<div>\n <p style={{display:'flex',alignItems:'baseline',gap:12,margin:'8px 0'}}><code className=\"lc-code\" style={{fontSize:22,letterSpacing:'0.12em'}}>{offer.display}</code><span className=\"lc-muted\">{remaining===0?'expired':`${remaining} minute${remaining===1?'':'s'} left`} · works once</span></p>\n <ul className=\"lc-facts\">{offer.targets.map(targetAddress=><li key={targetAddress.address}><span className=\"lc-tag\">{targetAddress.kind}</span> <code>{targetAddress.url}</code></li>)}</ul>\n {offer.targets.length===0&&<p className=\"lc-notice\">This computer has no network address another machine can reach, so pair it over Tailscale first.</p>}\n <div className=\"lc-actions\" style={{flexWrap:'wrap'}}><button className=\"lc-button\" disabled={minting} onClick={()=>void createCode()}>{minting?'Creating…':'New code'}</button>{offer.targets[0]!==undefined&&<CopyButton label=\"Copy address\" value={offer.targets[0].url}/>}<CopyButton label=\"Copy code\" value={offer.code}/></div>\n <p className=\"lc-muted\">On the other computer open <strong>AryaStrata → Control another computer</strong>, pick the address above, type the code, then <strong>Pair and control</strong>.</p>\n </div>}\n {offerError!==''&&<p className=\"lc-notice error\" role=\"alert\">{offerError}</p>}\n <details onToggle={event=>{if((event.target as HTMLDetailsElement).open&&devices===undefined)void loadDevices()}}><summary>Paired computers{devices===undefined?'':` (${devices.length})`}</summary>\n <div className=\"lc-actions\" style={{flexWrap:'wrap'}}><button className=\"lc-button\" onClick={()=>void loadDevices()}>Refresh</button></div>\n {devices!==undefined&&devices.length===0&&<p className=\"lc-muted\">No computer is paired with this engine yet.</p>}\n {devices!==undefined&&devices.length>0&&<ul className=\"lc-facts\">{devices.map(device=><li key={device.id}>{device.label} <span className=\"lc-muted\">{new Date(device.created).toLocaleDateString()}</span> <button className=\"lc-button\" disabled={revoking!==''} onClick={()=>void revokeDevice(device.id)}>Unpair</button></li>)}</ul>}\n {deviceNote!==''&&<p className=\"lc-notice\" role=\"status\">{deviceNote}</p>}\n </details>\n </details>\n </div>\n <details style={{marginTop:16}}><summary>Chat output limits</summary><OutputTuning remote={!localHost}/></details>\n {state&&<p className=\"lc-sub\">{state.modelName} · {state.detail}</p>}\n {remote\n ?embedded&&state?.responding?<iframe key={generation} title=\"AryaStrata engine web UI\" src={url?.href} style={{flex:1,width:'100%',minHeight:560,border:'1px solid var(--dsw-alias-border-l1)',borderRadius:12,marginTop:16}}/>:<div className=\"lc-empty\">{!state?'Connecting to '+where+'…':!state.responding?'Start the engine on '+where+' to use its web interface there.':webUi===undefined?'Looking for the engine web interface on '+where+'…':webUi.url===null?webUi.detail:'Open the web UI in a separate tab to use this HTTP engine from a secure page.'}</div>\n :embedded&&state?.responding?<iframe key={generation} title=\"AryaStrata engine web UI\" src={url?.href} style={{flex:1,width:'100%',minHeight:560,border:'1px solid var(--dsw-alias-border-l1)',borderRadius:12,marginTop:16}}/>:<div className=\"lc-empty\">{!state?'Connecting to the engine controller…':!accessible?'Open AryaStrata on the host computer. Its loopback address is unavailable from this device.':!embedded?'Open the web UI in a separate tab to use this HTTP engine from a secure page.':'Start the engine to open its web UI.'}</div>}\n </>}\n </main>\n}\n\n/** Copy one value to the clipboard, saying so only while it happened. */\nfunction CopyButton({label,value}:{label:string;value:string}){\n const [done,setDone]=useState(false)\n return <button className=\"lc-button\" onClick={()=>{void navigator.clipboard.writeText(value).then(()=>{setDone(true);setTimeout(()=>setDone(false),1500)},()=>setDone(false))}}>{done?'Copied':label}</button>\n}\n","import { SidebarIcon } from './Dashboard.tsx'\r\nimport { StrataControlCenter as Dashboard } from './StrataControlCenter.tsx'\r\nexport const inject=['slots']\r\nexport function apply(ctx:{slots:{inject(name:string,cb:()=>unknown):void;register(options:Record<string,unknown>,component:unknown):unknown}}){ctx.slots.inject('main',()=>ctx.slots.register({name:'main',key:'llamacpp'},Dashboard));ctx.slots.inject('sidebar.panellist',()=>ctx.slots.register({name:'sidebar.panellist',id:'llamacpp',order:-7,label:'AryaStrata'},SidebarIcon))}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["copy","useId","copy","useState","describe","rpc","useState","rate","useState","useState","useState","useState","useRef","useState","Dashboard"],"sources":["../src/model-output.ts","../src/client/output-settings.ts","../src/client/Connection.tsx","../src/client/TuningSlider.tsx","../src/client/OutputTuning.tsx","../src/client/NInferTuning.tsx","../src/client/theme.ts","../src/client/Dashboard.tsx","../src/ninfer-log.ts","../src/client/use-ninfer-live.ts","../src/client/NInferApi.tsx","../src/client/NInferPanel.tsx","../src/client/use-ninfer.ts","../src/client/StrataControlCenter.tsx","../src/client/index.ts"],"sourcesContent":["export interface OutputModel { id: string; name?: string; contextWindow?: number; maxTokens?: number }\nexport interface OutputProvider { baseURL?: string; models?: OutputModel[] }\nexport interface OutputNamespace { ns: string; revision: number; value: { providers: Record<string, OutputProvider> } }\nexport const localProviders = ['ninfer', 'llamacpp', 'strata', 'freetoken', 'ollama']\n\n/** A configured local chat model, independent of engine availability and model files. */\nexport interface OutputChoice extends OutputModel { provider: string; key: string; engine: string; contextWindow: number }\n/** Include a loopback OpenAI-compatible Ollama route without exposing cloud providers. */\nfunction localRoute(provider: string, value: OutputProvider): boolean {\n if(localProviders.includes(provider))return true\n if(provider!=='openai'||!value.baseURL)return false\n try{return ['localhost','127.0.0.1','[::1]'].includes(new URL(value.baseURL).hostname)}catch{return false}\n}\n/** Read output-capable local chat models even when their engines are stopped. */\nexport function outputCatalog(namespace: OutputNamespace | null): OutputChoice[] {\n return Object.entries(namespace?.value.providers??{}).filter(([provider,value])=>localRoute(provider,value)).flatMap(([provider,value])=>(value.models??[]).flatMap(model=>{\n if(typeof model.contextWindow!=='number'||!Number.isSafeInteger(model.contextWindow)||model.contextWindow<=1024)return []\n return [{...model,contextWindow:model.contextWindow,provider,key:provider+'\\n'+model.id,engine:provider==='openai'?'ollama':provider}]\n }))\n}\n\n/** Validate a per-response allowance against the selected model's configured context. */\nexport function validateOutputLimit(value: number, contextWindow: number): number {\n if (!Number.isSafeInteger(value) || value < 1024 || value >= contextWindow) throw Error('Choose a whole output limit between 1,024 tokens and below the model context, so input history keeps room.');\n return value\n}\n/** Update only the requested model in freshly read settings, preserving other model fields. */\nexport function outputModels(namespace: OutputNamespace, provider: string, id: string, value: number): OutputModel[] {\n if (!namespace.value.providers[provider] || !localRoute(provider, namespace.value.providers[provider]!)) throw Error('Choose a local model provider.');\n const models = namespace.value.providers[provider]?.models;\n const model = models?.find(entry => entry.id === id);\n if (!model || !model.contextWindow) throw Error('This model is no longer configured. Reload models.');\n const maxTokens = validateOutputLimit(value, model.contextWindow);\n return models!.map(entry => entry.id === id ? { ...entry, maxTokens } : entry)\n}\n","import type {OutputNamespace} from '../model-output.ts'\n/** Use the host settings service with optimistic revision checks. */\nexport async function outputRpc<T>(method:string,args:Record<string,unknown>={},signal?:AbortSignal):Promise<T>{\n const response=await fetch('/api/'+method,{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({type:'client-request',rpcId:'local-llm-output',method,payload:{args}}),...(signal?{signal}:{})})\n const data=await response.json() as {result?:{ok:boolean;value:T;error?:{message?:string}}}\n if(!response.ok||!data.result?.ok)throw Error(data.result?.error?.message??'Model settings could not be updated.')\n return data.result.value\n}\n/** Read configured chat models without requiring a running inference engine. */\nexport async function describeOutput(signal?:AbortSignal):Promise<OutputNamespace>{\n const settings=await outputRpc<{namespaces:OutputNamespace[]}>('settings/describe',{},signal)\n const namespace=settings.namespaces.find(entry=>entry.ns==='llm-pi-ai')\n if(!namespace)throw Error('Chat model settings are unavailable.')\n return namespace\n}\n","import { useEffect, useState } from 'react'\n\ntype State = { enabled?: boolean; canManageConnections?: boolean; pairs?: { id:string; label:string }[]; connection?: { address:string } | null }\nconst endpoint = '/api/local-llm/connection'\n\n/** Read errors before JSON decoding so a missing backend never looks like malformed model data. */\nexport async function responseData(response: Response) {\n if (!response.headers.get('content-type')?.includes('application/json')) {\n throw Error(response.status===404 ? 'This control is unavailable. Check the engine setup or the plugin’s startup status.' : `The host returned an unexpected response (${response.status}). Try reconnecting.`)\n }\n const result = await response.json()\n if (!response.ok) throw Error(result.detail ?? `Request failed (${response.status}).`)\n return result\n}\n\nexport function Connection({remote,onChange}:{remote:boolean;onChange:(value:boolean)=>void}) {\n const [state,setState]=useState<State>({}), [address,setAddress]=useState(''), [token,setToken]=useState('')\n const [label,setLabel]=useState('My other computer'), [key,setKey]=useState(''), [error,setError]=useState('')\n const [message,setMessage]=useState(''), [busy,setBusy]=useState(false), [open,setOpen]=useState(false)\n const [mode,setMode]=useState<'connect'|'share'>('connect')\n useEffect(()=>{\n const abort=new AbortController()\n void fetch(endpoint,{signal:abort.signal}).then(responseData).then(result=>{\n if(abort.signal.aborted)return\n setState(result)\n if(result.connection){setAddress(result.connection.address);onChange(true)}\n }).catch(error=>{if(!abort.signal.aborted)setError(error.message)})\n return()=>abort.abort()\n },[])\n async function action(operation:string,body:Record<string,unknown>={}) {\n setBusy(true);setError('');setMessage('')\n try {\n const result=await responseData(await fetch(endpoint,{method:'POST',headers:{'content-type':'application/json','x-local-llm-control':'1'},body:JSON.stringify({operation,...body})}))\n if(result.token)setKey(result.token)\n if(operation==='connect'){setToken('');onChange(true);setOpen(false)}\n if(operation==='disconnect')onChange(false)\n setMessage(result.detail??'Connection updated.')\n setState(await responseData(await fetch(endpoint)))\n }catch(error){setError(error instanceof Error?error.message:String(error))}finally{setBusy(false)}\n }\n const owner=state.canManageConnections!==false\n return <section className=\"lc-connection\">\n <div className=\"lc-connection-bar\"><div><span className=\"lc-eyebrow\">COMPUTER</span><strong>{remote?state.connection?.address:owner?'This computer':'Connected host computer'}</strong></div>\n <div className=\"lc-actions\"><button className={`lc-button ${!remote?'primary':''}`} onClick={()=>onChange(false)}>{owner?'This computer':'Host models'}</button>\n {state.connection&&<button className={`lc-button ${remote?'primary':''}`} onClick={()=>onChange(true)} disabled={busy}>Other computer</button>}\n {owner&&<button className=\"lc-button\" aria-expanded={open} onClick={()=>setOpen(!open)}>{open?'Close connections':state.connection?'Manage connections':'Connect another computer'}</button>}\n </div>\n </div>\n {!owner&&<p className=\"lc-sub\">You are controlling the host through your paired AryaAI browser. No separate LLM connection is needed.</p>}\n {error&&<p className=\"lc-notice error\" role=\"alert\">{error}</p>}{message&&<p className=\"lc-notice\" role=\"status\">{message}</p>}\n {open&&owner&&<div className=\"lc-card lc-connection-setup\"><div className=\"lc-actions\"><button className={`lc-button ${mode==='connect'?'primary':''}`} onClick={()=>setMode('connect')}>Use another computer’s models</button><button className={`lc-button ${mode==='share'?'primary':''}`} onClick={()=>setMode('share')}>Share this computer’s models</button></div>\n {mode==='connect'?<form onSubmit={event=>{event.preventDefault();void action('connect',{address:address.trim(),token:token.trim()})}}>\n <h3>Connect to the computer that runs your models</h3><ol className=\"lc-steps\"><li>Open Control Center on that computer.</li><li>Choose Share this computer’s models and create a key.</li><li>Enter its Tailscale address and paste the key below.</li></ol>\n <div className=\"lc-grid lc-connection-fields\"><label className=\"lc-field\">Host address<input className=\"lc-input\" type=\"url\" required value={address} onChange={event=>setAddress(event.target.value)} placeholder=\"https://your-pc.your-tailnet.ts.net\"/></label><label className=\"lc-field\">Pairing key<input className=\"lc-input\" type=\"password\" autoComplete=\"off\" required value={token} onChange={event=>setToken(event.target.value)}/></label></div>\n <div className=\"lc-actions\"><button className=\"lc-button primary\" disabled={busy||!address.trim()||!token.trim()}>{busy?'Connecting…':'Connect and find models'}</button>{state.connection&&<><button type=\"button\" className=\"lc-button\" disabled={busy} onClick={()=>void action('refresh')}>Refresh available models</button><button type=\"button\" className=\"lc-button danger\" disabled={busy} onClick={()=>void action('disconnect')}>Disconnect</button></>}</div>\n <p className=\"lc-sub\">Using a phone? Open Mobile & Remote in AryaAI instead. That pairs your browser with this computer.</p>\n </form>:<div><h3>Allow another AryaAI computer to use these models</h3><p className=\"lc-muted\">This also allows engine changes and local benchmarks. Your paid API providers are excluded.</p>\n <label className=\"lc-field\">Name of the other computer<input className=\"lc-input\" value={label} onChange={event=>setLabel(event.target.value)}/></label>\n <div className=\"lc-actions\"><button className=\"lc-button primary\" disabled={busy||!label.trim()} onClick={()=>void action('pair',{label})}>Create pairing key</button><button className=\"lc-button\" disabled={busy} onClick={()=>void action('sharing',{enabled:!state.enabled})}>{state.enabled?'Pause sharing':'Enable sharing'}</button></div>\n {key&&<div className=\"lc-notice\"><p>Copy this private key into the other computer. It is shown only now.</p><input className=\"lc-input\" aria-label=\"New pairing key\" value={key} readOnly/><div className=\"lc-actions\"><button className=\"lc-button\" onClick={()=>void navigator.clipboard.writeText(key).then(()=>setMessage('Pairing key copied.')).catch(()=>setError('Select and copy the key manually.'))}>Copy key</button><button className=\"lc-button\" onClick={()=>setKey('')}>Hide key</button></div></div>}\n {(state.pairs??[]).map(pair=><div className=\"lc-select-line\" key={pair.id}><span>{pair.label}</span><button className=\"lc-button danger\" disabled={busy} onClick={()=>void action('revoke',{id:pair.id})}>Revoke access</button></div>)}\n </div>}\n </div>}\n </section>\n}\n\nexport function controlUrl(path:string,remote:boolean){return '/api/local-llm/'+(remote?'proxy':'device')+'?path='+encodeURIComponent(path)}\n\n/** Loopback links belong to the engine computer, never the phone viewing its dashboard. */\nexport function accessibleWebUi(value:unknown, remote:boolean):string|undefined {\n if(typeof value!=='string')return\n try {\n const url=new URL(value)\n if(!['http:','https:'].includes(url.protocol)||url.username||url.password)return\n const loopback=['127.0.0.1','localhost','[::1]'].includes(url.hostname)\n const localDocument=location.protocol==='dsh-app:'||['127.0.0.1','localhost','[::1]'].includes(location.hostname)\n if(loopback&&(remote||!localDocument))return\n return url.href\n } catch { return }\n}\n","import {useId} from 'react'\n\nconst contextPoints=[4096,8192,16384,32768,65536,98304,102400,131072,196608,262144]\nconst copy={slider:'slider',exact:'Exact value',tokens:'tokens',contextHint:'More context reserves more memory. Filled conversations also take longer to process.',low:'Minimum',high:'Maximum'}\n/** Format the actual setting without rounding away an exact value. */\nfunction display(value:number,context:boolean){return context?`${Number((value/1024).toFixed(2))}K`:Number.isInteger(value)?value.toLocaleString():String(value)}\n/** Pair keyboard-accessible sliders and quick context choices with an exact numeric input. */\nexport function TuningSlider({label,value,min,max,step=1,onChange,disabled=false,context=false,hint}:{label:string;value:number;min:number;max:number;step?:number;onChange:(value:number)=>void;disabled?:boolean;context?:boolean;hint?:string}){\n const id=useId(),description=hint??(context?copy.contextHint:undefined)\n const points=context?contextPoints.filter(n=>n>=min&&n<=max):[]\n const finite=Number.isFinite(value),safe=finite?Math.min(max,Math.max(min,value)):min\n const index=points.reduce((best,n,i)=>Math.abs(n-safe)<Math.abs(points[best]!-safe)?i:best,0)\n const quick=points.filter(n=>[32768,65536,102400,131072,262144].includes(n))\n return <div className=\"lc-tune-control\"><div className=\"lc-tune-heading\"><label htmlFor={id+'-range'}>{label}</label><output htmlFor={id+'-range'}>{finite?display(value,context):'—'}</output></div>\n <div className=\"lc-tune-row\"><input id={id+'-range'} className=\"lc-tune-range\" type=\"range\" aria-label={label+' '+copy.slider} aria-describedby={description?id+'-hint':undefined} aria-valuetext={finite?display(value,context)+(context?' '+copy.tokens:''):undefined} min={context?0:min} max={context?points.length-1:max} step={context?1:step} value={context?index:safe} disabled={disabled} onChange={event=>onChange(context?points[Number(event.target.value)]!:Number(event.target.value))}/><input className=\"lc-input lc-tune-exact\" aria-label={label} title={copy.exact} type=\"number\" min={min} max={max} step={step} value={finite?value:''} disabled={disabled} onChange={event=>onChange(event.target.value===''?NaN:Number(event.target.value))}/></div>\n <div className=\"lc-tune-scale\"><span>{display(min,context)}</span><span>{display(max,context)}</span></div>\n {context&&<div className=\"lc-tune-choices\" role=\"group\" aria-label={label+' quick choices'}>{quick.map(n=><button key={n} type=\"button\" className={'lc-button '+(value===n?'primary':'ghost')} aria-label={label+' '+display(n,true)} aria-pressed={value===n} disabled={disabled} onClick={()=>onChange(n)}>{display(n,true)}</button>)}</div>}\n {description&&<p id={id+'-hint'} className=\"lc-sub\">{description}</p>}\n </div>\n}\n","import {useEffect,useState} from 'react'\nimport {TuningSlider} from './TuningSlider.tsx'\nimport {outputCatalog,outputModels,validateOutputLimit,type OutputNamespace} from '../model-output.ts'\nimport {describeOutput as describe,outputRpc as rpc} from './output-settings.ts'\nconst copy={title:'Chat output',model:'Chat model',limit:'Output tokens per response',save:'Save output limit',reload:'Reload models',empty:'No configured local chat models.',note:'Thinking, tool arguments and the answer share this allowance. It applies to each response, not the whole task. Input plus output must fit the context, and the limit must stay below the context window. The active compression gateway reclaims output room after compressing history. The engine context window still limits input plus output.',saved:'Output limit saved. It applies to subsequent model requests; an in-progress response keeps its existing limit.',remote:'Open Tuning on the local host to change its chat model output limits.'}\n/** Edit persisted chat output defaults independently of server context and sampling. */\nexport function OutputTuning({remote,initialModel=''}:{remote:boolean;initialModel?:string}){\n const[namespace,setNamespace]=useState<OutputNamespace|null>(null),[appliedInitial,setAppliedInitial]=useState(''),[selected,setSelected]=useState(''),[value,setValue]=useState(65536),[busy,setBusy]=useState(false),[error,setError]=useState(''),[message,setMessage]=useState('')\n const models=outputCatalog(namespace)\n const model=models.find(entry=>entry.key===selected),max=model?.contextWindow??102400,ceiling=Math.max(1024,max-1024),recommended=Math.max(1024,Math.floor(max/2))\n async function load(){setBusy(true);setError('');try{setNamespace(await describe())}catch(e){setError(e instanceof Error?e.message:String(e))}finally{setBusy(false)}}\n useEffect(()=>{if(!remote)void load()},[remote])\n useEffect(()=>{if(!initialModel||!namespace||appliedInitial===initialModel)return;const next=outputCatalog(namespace).find(model=>model.key===initialModel);if(next){setAppliedInitial(initialModel);setSelected(initialModel);setValue(next.maxTokens??Math.min(65536,next.contextWindow-1024));setMessage('');setError('')}},[initialModel,namespace,appliedInitial])\n function choose(key:string){setSelected(key);const next=models.find(entry=>entry.key===key);setValue(next?.maxTokens??Math.min(65536,next?.contextWindow??65536));setMessage('');setError('')}\n async function save(){if(!model)return;setBusy(true);setError('');setMessage('');try{const fresh=await describe();const updated=outputModels(fresh,model.provider,model.id,value);await rpc('settings/mutate',{ns:fresh.ns,expectedRevision:fresh.revision,ops:[{op:'set',path:['providers',model.provider,'models'],value:updated}]});setNamespace(await describe());setMessage(copy.saved)}catch(e){setError(e instanceof Error?e.message:String(e))}finally{setBusy(false)}}\n let invalid=false;try{validateOutputLimit(value,max)}catch{invalid=true}\n return <section className=\"lc-card\"><h2>{copy.title}</h2>{remote?<p className=\"lc-sub\">{copy.remote}</p>:<><label className=\"lc-field\">{copy.model}<select className=\"lc-input\" aria-label={copy.model} value={selected} disabled={busy} onChange={event=>choose(event.target.value)}><option value=\"\">Choose a model</option>{models.map(entry=><option key={entry.key} value={entry.key}>{entry.name??entry.id} · {entry.provider}</option>)}</select></label>{model&&<><p className=\"lc-sub\">Context: {(max/1024).toLocaleString()}K tokens · saved output: {model.maxTokens?.toLocaleString()??'provider default'}</p><TuningSlider label={copy.limit} value={value} min={1024} max={ceiling} step={1024} disabled={busy} hint={copy.note} onChange={setValue}/><div className=\"lc-actions\">{[8192,16384,32768,65536].filter(n=>n<=recommended).map(n=><button key={n} className={'lc-button '+(n===value?'primary':'ghost')} disabled={busy} onClick={()=>setValue(n)}>{n/1024}K output</button>)}</div></>}{!busy&&!models.length&&<p className=\"lc-sub\">{copy.empty}</p>}<div className=\"lc-actions\"><button className=\"lc-button primary\" disabled={busy||!model||invalid} onClick={()=>void save()}>{copy.save}</button><button className=\"lc-button\" disabled={busy} onClick={()=>void load()}>{copy.reload}</button></div>{error&&<p className=\"lc-notice error\" role=\"alert\">{error}</p>}{message&&<p className=\"lc-notice\" role=\"status\">{message}</p>}</>}</section>\n}\n","import {TuningSlider} from './TuningSlider.tsx'\nimport {useEffect,useState} from 'react'\nimport type {NInferSettings} from '../ninfer.ts'\nconst copy={title:'NInfer tuning',context:'Context tokens',prefill:'Prompt chunk tokens',hostKvMiB:'Host cache MiB',draftTokens:'MTP draft tokens',outputTokens:'Response output tokens',ngram:'N-gram drafts',vision:'Enable vision',save:'Save NInfer settings',note:'Stop NInfer before saving. Context is shared by the prompt and the reply, so the output allowance must stay below it. MTP and vision use GPU memory. Configured context is not a retrieval test. Match the chat model context to this setting. The n-gram chain drafts from the prompt and the reply as it is written: it pays off on repetitive and structured output and costs a little on novel prose.'}\n/** Preserve unsaved edits across polling and edit only a stopped runtime. */\nexport function NInferTuning({state,busy,save}:{state:Partial<NInferSettings>&{phase?:string}|undefined;busy:boolean;save:(settings:NInferSettings)=>void}){\n const [values,setValues]=useState<NInferSettings|null>(null)\n useEffect(()=>{if(state?.context!==undefined&&state.prefill!==undefined&&state.hostKvMiB!==undefined&&state.draftTokens!==undefined&&state.vision!==undefined&&state.ngram!==undefined&&state.outputTokens!==undefined)setValues({context:state.context,prefill:state.prefill,hostKvMiB:state.hostKvMiB,draftTokens:state.draftTokens,vision:state.vision,ngram:state.ngram,outputTokens:state.outputTokens})},[state?.context,state?.prefill,state?.hostKvMiB,state?.draftTokens,state?.vision,state?.ngram,state?.outputTokens])\n if(!values)return null\n const disabled=busy||state?.phase!=='stopped'\n return <details style={{marginTop:18}}><summary className=\"lc-muted\">{copy.title}</summary><div className=\"lc-facts\">{([['context',4096,102400],['prefill',128,4096],['hostKvMiB',0,16384],['draftTokens',1,3]] as const).map(([key,min,max])=><TuningSlider key={key} label={'NInfer '+copy[key]} value={values[key]} min={min} max={max} disabled={disabled} context={key==='context'} onChange={value=>setValues(current=>{if(!current)return current;const next={...current,[key]:value};if(next.outputTokens>next.context-1024)next.outputTokens=Math.max(1024,next.context-1024);return next})}/>)}<TuningSlider label={'NInfer '+copy.outputTokens} value={values.outputTokens} min={1024} max={Math.max(1024,values.context-1024)} disabled={disabled} onChange={value=>setValues(values=>({...values!,outputTokens:value}))}/></div><label className=\"lc-field\">{copy.ngram}<select className=\"lc-input\" disabled={disabled} value={values.ngram} onChange={event=>setValues({...values,ngram:event.target.value==='off'?'off':'chain'})}><option value=\"chain\">Chain</option><option value=\"off\">Off</option></select></label><label className=\"lc-field\"><input type=\"checkbox\" disabled={disabled} checked={values.vision} onChange={event=>setValues({...values,vision:event.target.checked})}/>{copy.vision}</label><button className=\"lc-button primary\" disabled={disabled} onClick={()=>save(values)}>{copy.save}</button><p className=\"lc-sub\">{copy.note}</p></details>\n}\n","export const css = \".lc{--bg:var(--dsw-alias-bg-base);--panel:var(--dsw-alias-bg-layer-1);--line:var(--dsw-alias-border-l1);--ink:var(--dsw-alias-label-primary);--muted:var(--dsw-alias-label-secondary);--blue:var(--dsw-alias-label-primary);--teal:var(--dsw-alias-state-success-primary);box-sizing:border-box;height:100%;overflow:auto;background:var(--bg);color:var(--ink);font:14px/1.5 var(--dsw-font-family-sans,system-ui,sans-serif);padding:30px 34px}.lc *{box-sizing:border-box}.lc button,.lc input,.lc select{font:inherit}.lc button{cursor:pointer}.lc button:disabled{opacity:.4;cursor:default}.lc a{color:var(--blue)}.lc h1,.lc h2,.lc h3,.lc p{margin:0}.lc h1{font-size:30px;letter-spacing:-1.1px;font-weight:500}.lc h2{font-size:18px;letter-spacing:-.3px}.lc h3{font-size:15px}.lc-muted{color:var(--muted)}.lc-header{display:flex;justify-content:space-between;align-items:center;gap:18px;margin-bottom:24px}.lc-eyebrow{color:var(--blue);font-size:10px;letter-spacing:2px;font-weight:500;text-transform:uppercase;margin-bottom:7px}.lc-brand{display:flex;align-items:center;gap:15px}.lc-mark{width:49px;height:49px;background:var(--dsw-alias-bg-layer-2);color:var(--ink);border:1px solid var(--line);border-radius:14px;display:grid;place-items:center;box-shadow:none}.lc-pill{display:inline-flex;align-items:center;gap:7px;padding:5px 10px;border:1px solid var(--line);border-radius:20px;font-size:11px;color:var(--muted);white-space:nowrap}.lc-dot{height:6px;width:6px;border-radius:50%;background:currentColor}.lc-pill.good{color:var(--teal);background:color-mix(in srgb,var(--teal) 7%,var(--panel));border-color:color-mix(in srgb,var(--teal) 25%,var(--line))}.lc-pill.warm{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 7%,var(--panel));border-color:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 25%,var(--line))}.lc-tabs{display:flex;gap:6px;padding:5px;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--line);border-radius:11px;width:fit-content;margin-bottom:23px}.lc-tab{display:flex;align-items:center;gap:8px;border:0;color:var(--muted);background:transparent;padding:9px 17px;border-radius:7px;font-size:12px}.lc-tab.active{color:var(--ink);background:var(--dsw-alias-interactive-bg-hover);box-shadow:none}.lc-grid{display:grid;gap:16px}.lc-kpis{grid-template-columns:repeat(4,minmax(0,1fr));margin-bottom:20px}.lc-card{border:1px solid var(--line);border-radius:14px;background:var(--panel);padding:20px}.lc-kpi-head{display:flex;justify-content:space-between;align-items:center;font-size:12px;color:var(--muted)}.lc-value{font-size:28px;font-weight:500;letter-spacing:-1px;margin:9px 0 3px}.lc-value small{font-size:13px;font-weight:400;color:var(--muted);letter-spacing:0}.lc-sub{font-size:11px;color:var(--muted)}.lc-bar{height:5px;background:var(--dsw-alias-border-l1);border-radius:8px;overflow:hidden;margin:14px 0 6px}.lc-bar span{height:100%;display:block;background:var(--ink);border-radius:8px}.lc-section{display:flex;align-items:center;justify-content:space-between;margin:23px 0 13px}.lc-section small{color:var(--muted);font-size:11px}.lc-charts{grid-template-columns:1.6fr 1fr}.lc-chart{width:100%;max-width:760px;height:145px;display:block;margin:18px auto 0}.lc-chart-footer{display:flex;justify-content:space-between;color:var(--muted);font-size:10px}.lc-legend{display:flex;gap:16px;font-size:11px;color:var(--muted)}.lc-engine-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.lc-engine{position:relative;transition:transform .15s,border-color .15s;cursor:pointer;text-align:left;color:var(--ink)}.lc-engine:hover{transform:translateY(-2px);border-color:var(--dsw-alias-border-l2)}.lc-engine.selected{border-color:var(--dsw-alias-label-primary);box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2)}.lc-engine .lc-logo{width:36px;height:36px;display:grid;place-items:center;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--line);border-radius:10px;margin-bottom:16px;font-size:16px;font-weight:500}.lc-engine h3{margin-bottom:4px}.lc-engine-state{position:absolute;top:22px;right:16px}.lc-engine-note{font-size:11px;color:var(--muted);margin-top:17px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lc-button{display:inline-flex;align-items:center;justify-content:center;gap:7px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-floating-fill);color:var(--dsw-alias-label-primary);padding:9px 14px;border-radius:8px;font-size:12px}.lc-button.primary{background:var(--dsw-alias-button-primary-fill);border-color:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-invert, var(--bg));font-weight:500}.lc-button.danger{color:var(--dsw-alias-state-error-primary);border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 30%,var(--line));background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 7%,var(--panel))}.lc-button.ghost{background:transparent}.lc-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:18px 0}.lc-detail-grid{grid-template-columns:1.5fr 1fr;margin-top:16px}.lc-facts{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin:20px 0}.lc-facts span{display:block;color:var(--muted);font-size:11px;margin-bottom:5px}.lc-facts strong{font-size:13px;font-weight:500}.lc-input{background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);color:var(--ink);padding:10px 12px;border-radius:8px;min-width:0}.lc-input:focus{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:1px}.lc-search{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin:18px 0}.lc-search input{flex:1;min-width:180px}.lc-model-grid{grid-template-columns:repeat(auto-fill,minmax(270px,1fr))}.lc-model-desc{font-size:12px;color:var(--muted);margin:9px 0 15px!important;min-height:36px}.lc-tags{display:flex;flex-wrap:wrap;gap:5px;margin:10px 0}.lc-tag{padding:3px 7px;background:var(--dsw-alias-bg-layer-2);color:var(--muted);border-radius:5px;font-size:10px}.lc table{width:100%;border-collapse:collapse;font-size:12px}.lc th{text-align:left;color:var(--muted);font-weight:500;font-size:10px;letter-spacing:1px;text-transform:uppercase;padding:14px 12px;border-bottom:1px solid var(--line)}.lc td{padding:14px 12px;border-bottom:1px solid var(--line)}.lc td .lc-button{padding:5px 10px;font-size:11px}.lc-code{font:12px ui-monospace,monospace;color:var(--ink)}.lc-terminal{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--line);padding:18px;border-radius:10px;white-space:pre-wrap;overflow:auto;max-height:440px;font:11px/1.7 ui-monospace,monospace;color:var(--muted);margin-top:18px}.lc-notice{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);padding:12px 16px;border-radius:9px;margin-bottom:16px;font-size:12px}.lc-notice.error{border-color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 7%,var(--panel));color:var(--dsw-alias-state-error-primary)}.lc-empty{padding:45px;text-align:center;color:var(--muted);border:1px dashed var(--line);border-radius:12px}.lc-select-line{display:flex;gap:10px;align-items:center;margin-top:12px}.lc-select-line input,.lc-select-line select{flex:1;min-width:0}.lc-footer{margin:25px 0 5px;color:var(--muted);font-size:10px;display:flex;justify-content:space-between}.lc-field{display:block;color:var(--muted);font-size:12px;margin-top:14px}.lc-field input{width:100%;margin-top:6px}.lc svg{flex-shrink:0}.lc svg text{font:10px system-ui;fill:var(--muted)}@media(max-width:1150px){.lc{padding:24px}.lc-kpis,.lc-engine-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:700px){.lc-charts,.lc-detail-grid{grid-template-columns:1fr}.lc-header{align-items:flex-start}.lc h1{font-size:23px}.lc-tabs{flex-wrap:wrap;width:100%}.lc-tab{padding:8px}.lc-facts{grid-template-columns:1fr}.lc table{display:block;overflow:auto}}\\n.lb-setup{grid-template-columns:1fr 1fr 1fr}.lb-options{display:flex;flex-direction:column;gap:14px;margin-top:18px;max-height:290px;overflow:auto}.lb-option{display:flex;gap:10px;align-items:flex-start;font-size:13px;cursor:pointer}.lb-option input{margin-top:4px;accent-color:var(--ink);flex-shrink:0}.lb-option small{display:block;color:var(--muted);font-size:11px;margin-top:4px}.lb-settings{display:grid;grid-template-columns:1fr 1fr;gap:0 12px}.lb-settings select{display:block;width:100%;margin-top:6px}.lb-settings .lb-option{grid-column:1/-1;margin-top:16px}.lb-tasks{grid-template-columns:repeat(3,1fr);margin-top:20px;gap:20px}.lb-tasks details{margin-top:8px;margin-left:23px}.lb-summary{grid-template-columns:repeat(auto-fit,minmax(230px,1fr));margin-top:16px}.lb-table{overflow:auto}.lb-table td{vertical-align:top;min-width:90px}.lb-table td:first-child{min-width:210px}.lb-table td:nth-child(6){max-width:300px}.lb-previews{grid-template-columns:repeat(auto-fit,minmax(400px,1fr))}.lb-preview{margin-top:16px;overflow:auto;border:1px solid var(--line);border-radius:9px;background:var(--bg);max-height:650px}.lb-preview img{display:block;width:100%;height:auto}.lb-preview iframe{display:block;width:100%;height:600px;border:0;background:var(--bg)}.lb-preview.mobile{max-width:390px;margin-inline:auto}.lb .lc-field>select{margin-left:10px}.lb-settings .lc-field>select{margin-left:0}@media(max-width:1100px){.lb-setup{grid-template-columns:1fr 1fr}.lb-setup>section:last-child{grid-column:1/-1}}@media(max-width:700px){.lb-setup,.lb-tasks,.lb-previews{grid-template-columns:1fr}.lb-setup>section:last-child{grid-column:auto}.lb-preview iframe{height:500px}}\\n.lb-history-actions{gap:12px;flex-wrap:wrap}.lb-comparison{margin-bottom:18px}.lb-compare-picker{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px;max-height:220px;overflow:auto;margin:18px 0}.lb-comparison-table table{min-width:760px}.lb-comparison-table th:not(:first-child),.lb-comparison-table td{min-width:230px;max-width:340px}.lb-comparison-table th small{display:block;margin-top:5px;letter-spacing:0;text-transform:none}.lb-comparison-table tbody th{min-width:210px;text-transform:none;letter-spacing:0;font-size:12px}.lb-comparison-table caption{text-align:left;padding:10px 0}.lb-comparison-table thead th{position:sticky;top:0;background:var(--panel)}\\n\\n.lb-config{grid-template-columns:repeat(3,minmax(0,1fr))}.lb-config .lc-field{min-width:0}.lc-field select{max-width:100%}.lc-engine-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.lc .lb-tasks>div{min-width:0;overflow-wrap:anywhere}.lc button:focus-visible,.lc input:focus-visible,.lc select:focus-visible{outline:2px solid var(--ink);outline-offset:3px}@media(max-width:1100px){.lb-config{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:700px){.lb-config,.lc-engine-grid,.lb-settings{grid-template-columns:1fr}.lc{padding:16px}.lc-footer{flex-wrap:wrap;gap:8px}}\\n\\n.lc h1,.lc h2,.lc h3,.lc strong{font-weight:500}.lb-config .lc-sub{grid-column:1/-1;margin-top:10px}\\n.ld-heading{display:flex;justify-content:space-between;align-items:center;gap:24px;margin:8px 0 24px}.ld-heading h2{font-size:26px;margin:8px 0}.ld-hardware{display:flex;gap:20px;flex-wrap:wrap;padding:14px 18px;background:var(--panel);border:1px solid var(--line);border-radius:10px;font-size:12px;color:var(--muted)}.ld-hardware strong{color:var(--ink)}.ld-search{display:grid;grid-template-columns:210px minmax(200px,1fr) auto;gap:10px;padding:14px;background:var(--panel);border:1px solid var(--line);border-radius:12px}.ld-toolbar{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;margin:16px 0 22px}.ld-suggestions,.ld-filters{display:flex;gap:8px;flex-wrap:wrap}.ld-workspace{display:grid;grid-template-columns:minmax(0,1fr);gap:22px;align-items:start}.ld-workspace.has-selection{grid-template-columns:minmax(0,1fr) minmax(320px,390px)}.ld-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px}.ld-model{display:flex;flex-direction:column;gap:10px;padding:20px;min-height:220px;transition:border-color .15s}.ld-model.is-selected{border-color:var(--ink);background:var(--dsw-alias-bg-layer-2)}.ld-model-top{display:flex;gap:6px}.ld-model-title{font-size:15px;font-weight:500;color:var(--ink);overflow-wrap:anywhere;text-decoration:none;line-height:1.45}.ld-model-title:hover,.ld-detail a:hover{text-decoration:underline}.ld-publisher{margin-top:-6px!important}.ld-description{font-size:12px;color:var(--muted);line-height:1.5;overflow-wrap:anywhere}.ld-model-meta{display:flex;gap:12px;flex-wrap:wrap;font-size:11px;color:var(--muted);margin-top:auto}.ld-model>.lc-button{align-self:flex-start;margin-top:4px}.ld-results-label{font-size:12px;color:var(--muted);min-height:22px;margin-bottom:8px}.ld-detail{position:sticky;top:16px;padding:22px;max-height:calc(100vh - 50px);overflow:auto}.ld-detail-header{display:flex;justify-content:space-between;align-items:center;gap:8px}.ld-detail h3{margin:16px 0;overflow-wrap:anywhere;line-height:1.5}.ld-detail a{color:var(--ink)}.ld-budget{display:grid;grid-template-columns:1fr 1fr;gap:12px}.ld-budget small,.ld-version small{display:block;color:var(--muted);font-size:11px;margin-top:4px}.ld-detail select{display:block;width:100%;margin-top:6px}.ld-versions{border:0;padding:0;margin:20px 0}.ld-versions legend{font-size:12px;color:var(--muted);margin-bottom:10px}.ld-version{display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:9px;padding:12px;margin-top:8px;cursor:pointer;font-size:13px}.ld-version.is-selected{border-color:var(--ink);background:var(--dsw-alias-bg-layer-2)}.ld-version>span{flex:1;min-width:0;overflow-wrap:anywhere}.ld-version input{accent-color:var(--ink)}.ld-total{display:flex;justify-content:space-between;gap:12px;padding-top:18px;margin-top:18px;border-top:1px solid var(--line);font-size:14px}.ld-fit{font-size:12px;margin:10px 0;color:var(--ink)}.ld-detail>.lc-button,.ld-detail .lc-button.primary{width:100%;margin:16px 0 12px}.ld-file-list{margin:16px 0;font-size:12px;color:var(--muted)}.ld-file-list summary{cursor:pointer}.ld-file-list div{display:flex;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:1px solid var(--line)}.ld-file-list div span:first-child{overflow-wrap:anywhere;min-width:0}.ld-file-list div span:last-child{white-space:nowrap}.ld-skeleton{height:220px;display:flex;flex-direction:column;gap:20px}.ld-skeleton span{height:16px;background:var(--dsw-alias-bg-layer-2);border-radius:4px}.ld-skeleton span:nth-child(2){width:65%}.ld-skeleton span:last-child{width:40%;margin-top:auto}.ld a:focus-visible{outline:2px solid var(--ink);outline-offset:3px}@media(max-width:1000px){.ld-workspace.has-selection{grid-template-columns:1fr}.ld-detail{position:static;max-height:none;grid-row:1}.ld-heading{align-items:flex-start;flex-direction:column}.ld-search{grid-template-columns:180px 1fr}.ld-search .lc-button{grid-column:1/-1}}@media(max-width:600px){.ld-search{grid-template-columns:1fr}.ld-cards{grid-template-columns:1fr}.ld-budget{grid-template-columns:1fr}.ld-filters{width:100%}.ld-filters select{flex:1;min-width:0}.ld-heading h2{font-size:23px}}\\n\\n.lc-tune-control{min-width:0;display:grid;gap:8px;color:var(--dsw-alias-label-primary);font-size:13px}.lc-tune-heading{display:flex;align-items:center;justify-content:space-between;gap:12px}.lc-tune-heading output{font-weight:500;font-variant-numeric:tabular-nums}.lc-tune-row{display:flex;align-items:center;gap:12px;min-width:0}.lc-tune-range{flex:1;min-width:0;height:24px;accent-color:var(--dsw-alias-label-primary);cursor:pointer}.lc-tune-exact{width:100px;flex:0 0 100px;min-width:0;text-align:right}.lc-tune-scale{display:flex;justify-content:space-between;padding-right:112px;font-size:11px;color:var(--dsw-alias-label-secondary)}.lc-tune-choices{display:flex;gap:6px;flex-wrap:wrap}.lc-tune-choices .lc-button{padding:5px 9px;font-size:12px}.lc-tune-range:focus-visible{outline:2px solid var(--dsw-alias-label-primary);outline-offset:3px;border-radius:6px}.lc-tune-control .lc-sub{margin:0}.lc-tune-range:disabled{cursor:default}\\n.lc-tune-control{align-self:start;align-content:start}\\n.lb-config .lb-settings{grid-template-columns:1fr}\\n\\n.lc{padding:24px;max-width:none;margin:0;width:100%;align-self:stretch;min-width:0}.lc-card{background:var(--dsw-alias-bg-base);border-radius:12px}.lc h1{font-size:26px;letter-spacing:-.6px}.lc h2,.lc h3{font-weight:500}.lc-sub{font-size:12px;line-height:1.6}.lc-tabs{max-width:100%;flex-wrap:wrap;background:transparent;padding:0;border:0;gap:4px}.lc-tab{padding:10px 14px;font-size:13px}.lc-tab.active{background:var(--dsw-alias-bg-layer-2)}.lc-header{margin:24px 0 20px}.lc-model-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:16px}.lc-model-card{display:flex;flex-direction:column;align-items:flex-start;gap:12px;min-width:0}.lc-model-card h3,.lc-model-card p{overflow-wrap:anywhere}.lc-model-card .lc-actions{margin-top:auto;flex-wrap:wrap}.lc-health-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.lc-health-meter{margin:18px 0}.lc-health-meter>div{display:flex;justify-content:space-between;gap:12px;font-size:13px}.lc-health-meter strong{font-weight:500}.lc-health-meter progress{display:block;width:100%;height:7px;margin:9px 0;accent-color:var(--dsw-alias-label-primary)}.lc-health-meter small{font-size:12px;color:var(--dsw-alias-label-secondary)}.lc-core-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}.lc-core-grid>div{display:flex;align-items:center;gap:6px;font-size:10px;color:var(--dsw-alias-label-secondary)}.lc-core-grid progress{width:100%;height:5px;accent-color:var(--dsw-alias-state-success-primary)}.lc-network-row{display:grid;gap:4px;padding:12px 0;border-bottom:1px solid var(--dsw-alias-border-l1);font-size:12px}.lc-network-row strong{font-weight:500}.lc-connection{border-bottom:1px solid var(--dsw-alias-border-l1);padding-bottom:18px}.lc-connection-bar{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap}.lc-connection-bar strong{display:block;overflow-wrap:anywhere;font-size:13px;font-weight:500}.lc-connection-fields{grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:16px;margin:18px 0}.lc-connection .lc-actions{flex-wrap:wrap;margin:0}.lc-connection-setup{margin-top:18px}.lc-connection-setup h3{margin-top:20px}.lc-connection input{width:100%;min-width:0}.lc-steps{padding-left:20px;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.9}.lc-webui-link{display:inline-flex;text-decoration:none;margin:12px 0}.lc-engine-setup{margin-bottom:24px}.lc-engine-setup .lc-card p{margin:12px 0}.lc-engine-setup summary{cursor:pointer}.lc .lc-facts>div{min-width:0}.lc .lc-facts strong{overflow-wrap:anywhere}.lc-empty h3{margin-bottom:8px}.lc-empty .lc-button{margin-top:16px}.lc button:focus-visible,.lc a:focus-visible,.lc input:focus-visible{outline:2px solid var(--dsw-alias-label-primary);outline-offset:3px}\\n@media(max-width:800px){.lc-health-grid{grid-template-columns:1fr}.lc{padding:16px}.lc-header{align-items:flex-start}.lc-connection-bar{align-items:flex-start}.lc-tabs{gap:3px}.lc-tab{padding:9px 11px}.lc-section{gap:12px;flex-wrap:wrap}.lc-header h1{font-size:23px}.lc-header .lc-mark{display:none}.lc-connection-bar .lc-actions{width:100%}.lc-network-row{overflow-wrap:anywhere}}\\n.lc-ninfer-hero{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:20px;align-items:start}\\n.lc-ninfer-actions{display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end}\\n.lc-ninfer-kpis{grid-template-columns:repeat(4,minmax(0,1fr))}\\n.lc-pill.bad{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 7%,var(--panel));border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 25%,var(--line))}\\n@media(max-width:1150px){.lc-ninfer-kpis{grid-template-columns:repeat(2,minmax(0,1fr))}}\\n@media(max-width:700px){.lc-ninfer-hero{grid-template-columns:1fr}.lc-ninfer-actions{justify-content:flex-start}}\\n@media(max-width:520px){.lc-ninfer-kpis{grid-template-columns:1fr}}\\n\\n/* NInfer: connection details, client examples and engine facts. */\\n.lc-ninfer-split{display:grid;grid-template-columns:minmax(0,1.45fr) minmax(0,1fr);gap:16px;margin-top:16px;align-items:start}.lc-ninfer-split>*{min-width:0}\\n.lc-api-rows{display:grid;gap:9px}\\n.lc-api-row{display:grid;gap:6px;padding:11px 13px;border:1px solid var(--line);border-radius:10px;background:var(--dsw-alias-bg-layer-1);min-width:0}\\n.lc-api-row>header{display:flex;align-items:center;justify-content:space-between;gap:10px}\\n.lc-api-row>header>span{font-size:10px;letter-spacing:1.6px;text-transform:uppercase;color:var(--muted)}\\n.lc-api-row code{font:12.5px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--ink);overflow-wrap:anywhere}\\n.lc-api-note{margin-top:10px}\\n.lc-copy{border:1px solid var(--line);background:var(--dsw-alias-bg-base);color:var(--muted);border-radius:7px;padding:4px 10px;font-size:11px;line-height:1.4;white-space:nowrap;min-width:58px}\\n.lc-copy:hover{color:var(--ink);border-color:var(--ink)}\\n.lc-copy.copied{color:var(--teal);border-color:color-mix(in srgb,var(--teal) 45%,var(--line))}\\n.lc-example{margin-top:14px;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--dsw-alias-bg-layer-1);min-width:0}\\n.lc-example>header{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 12px;border-bottom:1px solid var(--line);flex-wrap:wrap}\\n.lc-example-tabs{display:flex;gap:2px;padding:3px;background:var(--dsw-alias-bg-layer-2);border-radius:9px}\\n.lc-example-tab{border:0;background:transparent;color:var(--muted);font-size:11px;padding:5px 11px;border-radius:7px;line-height:1.4}\\n.lc-example-tab.active{background:var(--dsw-alias-bg-layer-2);color:var(--ink)}\\n.lc-example pre{margin:0;padding:13px 14px;max-height:230px;overflow:auto;font:11.5px/1.65 ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--ink);white-space:pre}\\n.lc-spec-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}\\n.lc-spec{padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--dsw-alias-bg-layer-1);min-width:0}\\n.lc-spec>span{display:block;font-size:10px;letter-spacing:1.6px;text-transform:uppercase;color:var(--muted)}\\n.lc-spec>strong{display:block;margin-top:4px;font-size:13px;font-weight:500;overflow-wrap:anywhere}\\n.lc-ninfer-kpis{gap:12px}\\n.lc-ninfer-kpis .lc-card{padding:14px 15px}\\n.lc-ninfer-kpis .lc-value{font-size:21px;margin:6px 0 2px}\\n@media(max-width:1180px){.lc-ninfer-split{grid-template-columns:minmax(0,1fr)}}\\n@media(max-width:700px){.lc-spec-grid{grid-template-columns:1fr}.lc-example pre{max-height:180px}}\"\n","import {Health} from './Health.tsx'\r\nimport {Models} from './Models.tsx'\r\nimport {EngineSetup} from './EngineSetup.tsx'\r\nimport {OutputTuning} from './OutputTuning.tsx'\r\nimport {TuningSlider} from './TuningSlider.tsx'\r\nimport {NInferTuning} from './NInferTuning.tsx'\r\nimport {Discover} from './Discover.tsx'\r\nimport { StrataModels } from './StrataModels.tsx'\r\nimport { FreeTokenTuning } from './FreeTokenTuning.tsx'\r\nimport { StrataTuning } from './StrataTuning.tsx'\r\nimport { OllamaTuning } from './OllamaTuning.tsx'\r\nimport { useEffect, useState, useId } from 'react'\r\nimport { css } from './theme.ts'\r\nimport { TuningPanel } from './Tuning.tsx'\r\nimport { BenchmarksPanel } from './Benchmarks.tsx'\r\nimport { Connection, controlUrl, responseData, accessibleWebUi } from './Connection.tsx'\r\ntype Engine='strata'|'ollama'|'llamacpp'|'freetoken'|'ninfer'\r\ntype Data=Record<string,any>\r\nconst engines:Engine[]=['strata','ollama','llamacpp','freetoken','ninfer']\r\nconst names={strata:'Strata',ollama:'Ollama',llamacpp:'llama.cpp',freetoken:'FreeToken',ninfer:'NInfer'}\r\nconst notes={strata:'Qwen inference engine',ollama:'Local model library',llamacpp:'Flexible GGUF runtime',freetoken:'Isolated MoE runtime',ninfer:'Qwen with MTP and vision'}\r\nconst API='/api/llamacpp'\r\nfunction Icon({kind='chip',size=18}:{kind?:string;size?:number}){const paths:Record<string,string>={chip:'M8 3v3m8-3v3M8 18v3m8-3v3M3 8h3m-3 8h3m12-8h3m-3 8h3M6 6h12v12H6zM9 9h6v6H9z',chart:'M3 3v18h18M6 16l4-6 4 3 6-9',box:'M3 7l9-4 9 4-9 4zM3 7v10l9 4 9-4V7M12 11v10',download:'M12 3v12m-5-5 5 5 5-5M4 16v5h16v-5',server:'M3 3h18v7H3zM3 14h18v7H3zM6 6h2m-2 11h2',logs:'M5 4h14v16H5zM8 8h8M8 12h8M8 16h5',play:'M7 4l13 8-13 8z'};return <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d={paths[kind]??paths.chip}/></svg>}\r\nfunction Badge({text,good=false,warm=false}:{text:string;good?:boolean;warm?:boolean}){return <span className={`lc-pill ${good?'good':warm?'warm':''}`}><i className=\"lc-dot\"/>{text}</span>}\r\nfunction LineChart({series,color='var(--dsw-alias-label-primary)',max=100,label}:{series:(number|null)[];color?:string;max?:number;label:string}){const id=useId().replace(/:/g,'');const values=series.filter((v):v is number=>v!==null&&Number.isFinite(v));if(!values.length)return <div className=\"lc-empty\">Waiting for live {label.toLowerCase()} readings</div>;const pts=values.map((v,i)=>`${40+i*520/Math.max(1,values.length-1)},${130-Math.min(max,v)/max*110}`).join(' ');return <><svg className=\"lc-chart\" viewBox=\"0 0 580 150\" role=\"img\" aria-label={`${label}, ${values.length} live samples`}><defs><linearGradient id={id} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop stopColor={color} stopOpacity=\".22\"/><stop offset=\"1\" stopColor={color} stopOpacity=\"0\"/></linearGradient></defs>{[0,1,2,3].map(i=><g key={i}><path d={`M40 ${20+i*110/3}H560`} stroke=\"var(--dsw-alias-border-l1)\" strokeDasharray=\"3 4\"/><text x=\"3\" y={24+i*110/3}>{Math.round(max*(1-i/3))}</text></g>)}{values.length>1&&<polygon points={`40,130 ${pts} 560,130`} fill={`url(#${id})`}/>}<polyline points={pts} stroke={color} strokeWidth=\"2.5\" fill=\"none\"/>{values.length===1&&<circle cx=\"40\" cy={130-values[0]!/max*110} r=\"3\" fill={color}/>}<title>{label}: {values.map(v=>v.toFixed(1)).join(', ')}</title></svg><div className=\"lc-chart-footer\"><span>Oldest sample</span><span>{values.length} samples · 5s refresh</span><span>Now</span></div></>}\r\nfunction RuntimeSettings({state,files,save,busy}:{state:Data|undefined;files:Data[];save:(body:Data)=>void;busy:boolean}){\r\n const [values,setValues]=useState<Data>({context:131072,threads:8,cpuMoeLayers:24,selectedModel:'',selectedVision:''})\r\n useEffect(()=>{if(state)setValues({context:state.context,threads:state.threads,cpuMoeLayers:state.cpuMoeLayers,selectedModel:state.selectedModel??'Ornith-1.5-35B-Q4_K_M.gguf',selectedVision:state.selectedVision??'mmproj-Ornith-1.5-35B-BF16.gguf'})},[state?.context,state?.threads,state?.cpuMoeLayers,state?.selectedModel,state?.selectedVision])\r\n return <details style={{marginTop:18}}><summary className=\"lc-muted\" style={{cursor:'pointer'}}>Runtime settings</summary><label className=\"lc-field\">Model file<select aria-label=\"Runtime model\" className=\"lc-input\" style={{width:'100%',marginTop:6}} value={values.selectedModel} onChange={e=>setValues({...values,...state?.presets?.[e.target.value],selectedModel:e.target.value,selectedVision:state?.presets?.[e.target.value]?.selectedVision??''})}>{files.filter(f=>!f.name.startsWith('mmproj')).map(f=><option key={f.name} value={f.name}>{f.name}</option>)}</select></label><label className=\"lc-field\">Vision projector<select aria-label=\"Vision projector\" className=\"lc-input\" style={{width:'100%',marginTop:6}} value={values.selectedVision} onChange={e=>setValues({...values,selectedVision:e.target.value})}><option value=\"\">None / text only</option>{files.filter(f=>f.name.startsWith('mmproj')).map(f=><option key={f.name} value={f.name}>{f.name}</option>)}</select></label><div className=\"lc-facts\">{[['context','Context tokens',4096,262144],['threads','CPU threads',1,32],['cpuMoeLayers','CPU expert layers',0,64]].map(([key,label,min,max])=><TuningSlider key={String(key)} label={String(label)} value={values[String(key)]??Number(min)} min={Number(min)} max={Number(max)} context={key==='context'} onChange={value=>setValues({...values,[String(key)]:value})}/>)}</div><button className=\"lc-button primary\" disabled={busy||state?.owned} onClick={()=>save({context:values.context,threads:values.threads,cpuMoeLayers:values.cpuMoeLayers,selectedModel:values.selectedModel,selectedVision:values.selectedVision})}>Save runtime settings</button><p className=\"lc-sub\" style={{marginTop:10}}>Stop the server first. Match the vision projector to its model. Larger context uses more memory; match AryaAI’s model context to this setting. CPU expert layers apply to supported MoE models.</p></details>\r\n}\r\nconst fmt=(n:number|undefined,d=1)=>Number.isFinite(n)?n!.toFixed(d):'—'\r\nconst gb=(n:number)=>`${(n/1e9).toFixed(1)} GB`\r\nfunction EngineDashboard({remote}:{remote:boolean}){\r\n const url=(path:string)=>controlUrl(path,remote)\r\n async function get(path:string){return responseData(await fetch(url(path)))}\r\n const[data,setData]=useState<Partial<Record<Engine,Data>>>({}),[metrics,setMetrics]=useState<Data>({}),[history,setHistory]=useState<Data[]>([]),[revision,setRevision]=useState(0),[webuis,setWebuis]=useState<Data>({}),[outputModel,setOutputModel]=useState(''),[tuneFile,setTuneFile]=useState(''),[calibrationModel,setCalibrationModel]=useState(''),[selected,setSelected]=useState<Engine>('llamacpp'),[tab,setTab]=useState('Health'),[tuningEngine,setTuningEngine]=useState('output'),[busy,setBusy]=useState(false),[message,setMessage]=useState(''),[error,setError]=useState(''),[downloads,setDownloads]=useState<Data[]>([]),[locals,setLocals]=useState<Data[]>([]),[logs,setLogs]=useState(''),[updated,setUpdated]=useState('')\r\n useEffect(()=>{let active=true;let timer:ReturnType<typeof setTimeout>;async function poll(){const r=await Promise.allSettled([...engines.map(e=>get(e==='ninfer'?'/api/ninfer/status':e==='freetoken'?'/api/freetoken/status':e==='strata'?'/api/aryastrata/status':`${API}/${e==='llamacpp'?'status':e}`)),get(`${API}/telemetry`),get(`${API}/downloads`),get(`${API}/local-files`),get(`${API}/webuis`)]);if(!active)return;const next:Partial<Record<Engine,Data>>={};r.slice(0,engines.length).forEach((x,i)=>next[engines[i]!]=x.status==='fulfilled'?x.value:{error:String(x.reason)});setData(next);const telemetry=r[engines.length],downloadResult=r[engines.length+1],filesResult=r[engines.length+2];const t=telemetry?.status==='fulfilled'?telemetry.value:{};const gpu=t.gpus?.[0];const m={...t,gpuName:gpu?.name,vramUsed:gpu?.usedMiB,vramTotal:gpu?.memoryMiB,gpuPct:gpu?.utilization,temp:gpu?.temperature,tps:next.strata?.timing?.decodeTokPerSec??null};setMetrics(m);setHistory(h=>[...h,m].slice(-60));if(downloadResult?.status==='fulfilled')setDownloads(downloadResult.value.jobs);if(filesResult?.status==='fulfilled')setLocals(filesResult.value.files);const uiResult=r[engines.length+3];if(uiResult?.status==='fulfilled')setWebuis(uiResult.value.links??{});if(telemetry?.status==='fulfilled')setUpdated(new Date().toLocaleTimeString());timer=setTimeout(poll,5000)}void poll();return()=>{active=false;clearTimeout(timer)}},[revision])\r\n async function action(e:Engine,op:string,body?:Data){setBusy(true);setError('');try{const base=e==='ninfer'?'/api/ninfer':e==='freetoken'?'/api/freetoken':e==='strata'?'/api/aryastrata':API;const r=await fetch(url(`${base}/${op}`),{method:'POST',headers:{['x-local-llm-control']:'1','content-type':'application/json'},...(body?{body:JSON.stringify(body)}:{})});const d=await responseData(r);if(d.ok===false)throw new Error(d.detail??'Action failed');setMessage(d.detail??'Download queued. Track it in Downloads.');if(d.job)setTab('Downloads');setRevision(value=>value+1)}catch(e){setError(e instanceof Error?e.message:String(e))}finally{setBusy(false)}}\r\n const phase=(e:Engine)=>{const s=data[e];return !s?'Connecting':s.error?'Unavailable':e==='ollama'?s.ready?s.loaded?.models?.length?'Model loaded':'Ready':'Offline':s.phase==='running'?'Ready':s.phase==='starting'?'Loading':s.phase==='missing-model'?'Choose a model':s.phase==='not-configured'?'Not configured':s.phase==='downloading'?'Downloading':s.phase==='foreign'||s.phase==='unmanaged'?'External':'Stopped'}\r\n useEffect(()=>{if(tab!=='Logs')return;let active=true;async function pollLogs(){try{const d=selected==='ninfer'?await get('/api/ninfer/logs'):selected==='freetoken'?await get('/api/freetoken/logs'):selected==='strata'?await get('/api/aryastrata/logs'):selected==='llamacpp'?await get(`${API}/status`):null;if(active)setLogs(d?.text??d?.logs??'This engine exposes logs through its desktop application.')}catch(e){if(active)setLogs(String(e))}}void pollLogs();const timer=setInterval(pollLogs,5000);return()=>{active=false;clearInterval(timer)}},[selected,tab])\r\n const button=(label:string,e:Engine,op:string,disabled=false,body?:Data,kind='')=><button className={`lc-button ${kind}`} disabled={busy||disabled} onClick={()=>void action(e,op,body)}>{label}</button>\r\n const s=data[selected], loaded=data.ollama?.loaded?.models??[], vramPct=metrics.vramUsed/metrics.vramTotal*100\r\n const controls=<div className=\"lc-actions\">{selected==='strata'||selected==='llamacpp'||selected==='freetoken'||selected==='ninfer'?<>{button('▶ Start server',selected,'start',!s||s.owned||((selected==='llamacpp'||selected==='freetoken'||selected==='ninfer')&&!s.complete)||((selected==='freetoken'||selected==='ninfer')&&remote)||['External','Unavailable'].includes(phase(selected)),undefined,'primary')}{button('Stop',selected,'stop',!s?.owned,undefined,'danger')}{button('↻ Restart',selected,'restart',!s?.owned)}</>:<>{button(`Open ${names[selected]}`,selected,`${selected}-open`,false,undefined,'primary')}{button('Stop',selected,`${selected}-stop`,selected==='ollama'?!s?.ready:!s?.appRunning,undefined,'danger')}{button('↻ Restart',selected,`${selected}-restart`,selected==='ollama'?!s?.ready:!s?.appRunning)}</>}</div>\r\n const uiLink=accessibleWebUi(webuis[selected],remote)\r\n const engineCards=<div className=\"lc-grid lc-engine-grid\">{engines.map(e=><button key={e} className={`lc-card lc-engine ${selected===e?'selected':''}`} aria-pressed={selected===e} onClick={()=>setSelected(e)}><div className=\"lc-logo\"><Icon kind={'server'}/></div><span className=\"lc-engine-state\"><Badge text={phase(e)} good={['Ready','Model loaded'].includes(phase(e))} warm={['Loading','Downloading'].includes(phase(e))}/></span><h3>{names[e]}</h3><p className=\"lc-sub\">{notes[e]}</p><div className=\"lc-engine-note\">{e==='ollama'?loaded[0]?.name??`${data.ollama?.tags?.models?.length??0} installed models`:e==='llamacpp'?`${data[e]?.complete?'Files ready':fmt(data[e]?.downloadPercent)+'%'} · ${data[e]?.selectedModel?.replace(/\\.gguf$/,'' )??'No model selected'}`:e==='strata'||e==='freetoken'||e==='ninfer'?data[e]?.modelName??'No active model':'Desktop application'}</div></button>)}</div>\r\n const detail=<div className=\"lc-grid lc-detail-grid\"><section className=\"lc-card\"><div className=\"lc-section\" style={{marginTop:0}}><h2>{names[selected]} / Server controls</h2><Badge text={phase(selected)} good={phase(selected)==='Ready'}/></div>{s?.error&&<p className=\"lc-muted\">{s.error}</p>}{controls}{uiLink?<a className=\"lc-button lc-webui-link\" href={uiLink} target=\"_blank\" rel=\"noopener noreferrer\">Open {names[selected]} web interface ↗</a>:webuis[selected]?<p className=\"lc-sub\">This engine’s interface is on its host computer. Configure a reachable webUiUrls address to open it from this device.</p>:null}<p className=\"lc-sub\">Remote changes wait for tracked inference and benchmarks to finish.</p><div className=\"lc-facts\"><div><span>ENDPOINT</span><strong className=\"lc-code\">{remote?'Remote host':selected==='ollama'?'127.0.0.1:11434':selected==='llamacpp'?'127.0.0.1:8081':selected==='strata'?'127.0.0.1:8080':selected==='ninfer'?s?.baseUrl??'127.0.0.1:8083':selected==='freetoken'?s?.baseUrl??'127.0.0.1:1919':'Not connected'}</strong></div><div><span>CONTEXT</span><strong>{selected==='llamacpp'||selected==='freetoken'||selected==='ninfer'?`${(s?.context??131072)/1024}K`:selected==='ollama'?loaded[0]?.context_length?.toLocaleString()??'—':s?.health?.maxContext?.toLocaleString()??'—'}</strong></div><div><span>PROCESS</span><strong>{s?.pid??s?.serverPid??s?.containerId?.slice(0,12)??(selected==='ollama'?'Ollama managed':'—')}</strong></div></div>{selected==='ollama'&&loaded.map((m:Data)=><div key={m.name} className=\"lc-select-line\"><span className=\"lc-code\" style={{flex:1}}>{m.name}</span>{button('Unload model','ollama','ollama-unload',false,{model:m.name})}</div>)}{selected==='llamacpp'&&<p className=\"lc-sub\">{s?.cpuMoeLayers??24} CPU expert layers · {s?.threads??8} threads · {s?.cacheType??'q8_0'} cache · {s?.complete?'Model files ready.':'Start available after the download finishes.'}</p>}{selected==='llamacpp'&&<RuntimeSettings state={s} files={locals} busy={busy} save={body=>void action('llamacpp','configure',body)}/>}{selected==='strata'&&<StrataModels remote={remote} stopped={s?.phase==='stopped'} busy={busy} modelName={s?.modelName} save={body=>action('llamacpp','strata-select',body)}/> }{selected==='ninfer'&&<NInferTuning state={s} busy={busy} save={body=>void action('ninfer','configure',body)}/>} {selected==='freetoken'&&<FreeTokenTuning state={s} busy={busy} save={body=>void action('freetoken','configure',body)}/>}</section><aside className=\"lc-card\"><div className=\"lc-eyebrow\">Operational awareness</div><h2>GPU capacity</h2><div className=\"lc-value\">{fmt((metrics.vramTotal-metrics.vramUsed)/1024)} <small>GiB available</small></div><div className=\"lc-bar\"><span style={{width:`${Math.min(100,vramPct||0)}%`}}/></div><p className=\"lc-sub\">{metrics.gpuName??'Detecting GPU'}</p><p className=\"lc-muted\" style={{fontSize:12,marginTop:15}}>Unload the current model after its task finishes before loading a large model in another engine.</p><div className=\"lc-actions\"><button className=\"lc-button ghost\" onClick={()=>setTab('Models')}><Icon kind=\"box\"/>Manage models</button></div></aside></div>\r\n return <main className=\"lc\" style={{padding:0,height:'auto',overflow:'visible'}}><style>{css}</style><header className=\"lc-header\"><div className=\"lc-brand\"><div className=\"lc-mark\"><Icon size={27}/></div><div><div className=\"lc-eyebrow\">AryaAI / Local infrastructure</div><h1>Local LLM Control Center</h1><p className=\"lc-sub\">Your computer, engines and models — in one place.</p></div></div><Badge text={`LIVE · ${updated||'Connecting'}`} good={!!updated}/></header><nav className=\"lc-tabs\">{['Health','Models','Engines','Tuning','Benchmarks','Discover','Downloads','Logs'].map((t,i)=><button key={t} className={`lc-tab ${t===tab?'active':''}`} onClick={()=>setTab(t)}><Icon size={15} kind={['chart','server','box','box','download','chip','chart','logs'][i]!}/>{t}{t==='Downloads'&&downloads.filter(j=>j.status==='downloading').length>0&&` (${downloads.filter(j=>j.status==='downloading').length})`}</button>)}</nav>{error&&<div className=\"lc-notice error\" role=\"alert\">{error}</div>}{message&&<div className=\"lc-notice\" role=\"status\">{message}<button className=\"lc-button ghost\" style={{float:'right',padding:0,border:0}} onClick={()=>setMessage('')}>Dismiss</button></div>}\r\n {tab==='Health'&&<Health metrics={metrics}/>}\r\n {tab==='Engines'&&<><EngineSetup remote={remote} busy={busy} save={body=>action('llamacpp','engine-setup',body)}/><div className=\"lc-section\"><h2>Engine health and controls</h2></div>{engineCards}{detail}</>}\r\n {tab==='Models'&&<Models remote={remote} onOutput={key=>{setOutputModel(key);setTuningEngine('output');setTab('Tuning')}} data={data} files={locals} busy={busy} action={action} tune={file=>{setTuneFile(file);setTuningEngine('llamacpp');setTab('Tuning')}} calibrate={id=>{setCalibrationModel(id);setTab('Benchmarks')}} add={()=>setTab('Discover')}/>}\r\n {tab==='Discover'&&<Discover key={remote?'remote':'local'} remote={remote} vramMiB={metrics.vramTotal} ramGiB={metrics.ramTotalGiB} busy={busy} onDownload={(engine,op,body)=>void action(engine,op,body)}/>}\r\n {tab==='Downloads'&&<><div className=\"lc-section\"><h2>Download activity</h2><small>Catalog downloads tracked during this AryaAI run</small></div>{downloads.map(j=><section className=\"lc-card\" key={j.id} style={{marginTop:14}}><div className=\"lc-section\" style={{margin:0}}><h3>{j.name}</h3><Badge text={j.status} good={j.status==='complete'} warm={j.status==='downloading'}/></div><p className=\"lc-sub\">{j.engine==='ollama'?'Ollama':'Hugging Face / llama.cpp'} · {j.detail}</p>{j.total>0&&<><div className=\"lc-bar\"><span style={{width:`${Math.min(100,j.completed/j.total*100)}%`}}/></div><p className=\"lc-sub\">{gb(j.completed)} / {gb(j.total)} · {fmt(j.completed/j.total*100)}%</p></>}</section>)}{!downloads.length&&data.llamacpp?.complete&&<div className=\"lc-empty\">No downloads yet. Add a model from Discover.</div>}</>}\r\n {tab==='Tuning'&&<><div className=\"lc-actions\" style={{marginTop:0}}>{['output','llamacpp','ollama','strata'].map(e=><button key={e} className={`lc-button ${tuningEngine===e?'primary':''}`} aria-pressed={tuningEngine===e} onClick={()=>setTuningEngine(e)}>{e==='output'?'Chat output':e==='llamacpp'?'llama.cpp profiles':e==='ollama'?'Ollama variants':'Strata engine'}</button>)}</div>{tuningEngine==='output'?<OutputTuning remote={remote} initialModel={outputModel}/>:tuningEngine==='llamacpp'?<TuningPanel key={tuneFile} initialFile={tuneFile} state={data.llamacpp} files={locals} busy={busy} save={body=>void action('llamacpp','preset-save',body)}/>:tuningEngine==='ollama'?<OllamaTuning models={data.ollama?.tags?.models??[]} busy={busy} save={body=>void action('ollama','ollama-tune',body)}/>:<StrataTuning remote={remote} stopped={data.strata?.phase==='stopped'} busy={busy} save={body=>void action('llamacpp','strata-tune',body)}/>}</>}\r\n {tab==='Benchmarks'&&<BenchmarksPanel key={calibrationModel} initialModel={calibrationModel} remote={remote}/>}\r\n {tab==='Logs'&&<><div className=\"lc-section\"><h2>Server log stream</h2><select className=\"lc-input\" aria-label=\"Log engine\" value={selected} onChange={e=>setSelected(e.target.value as Engine)}>{engines.map(e=><option key={e} value={e}>{names[e]}</option>)}</select></div><pre className=\"lc-terminal\">{logs||'Waiting for logs…'}</pre></>}\r\n <footer className=\"lc-footer\"><span>{remote?'REMOTE HOST':'LOCAL HOST'} · Charts show observed readings, not benchmark estimates.</span><span>{metrics.gpuName??'Host hardware'} · Live measurements</span></footer></main>\r\n}\r\nexport function Dashboard(){const [remote,setRemote]=useState(false);return <div className=\"lc\"><style>{css}</style><Connection remote={remote} onChange={setRemote}/><EngineDashboard key={remote?'remote':'local'} remote={remote}/></div>}\r\nexport const SidebarIcon=Icon\r\n","/** Read the NInfer server log into the live figures its dashboard shows. */\nexport interface NInferLogSummary {\n weightPercent?: number | undefined\n weightGiB?: number | undefined\n weightTotalGiB?: number | undefined\n weightBytesPerSecond?: number | undefined\n etaSeconds?: number | undefined\n decodeTokPerSecond?: number | undefined\n prefillTokPerSecond?: number | undefined\n running?: number | undefined\n batch?: number | undefined\n hostPercent?: number | undefined\n mtpAccepted?: number | undefined\n mtpOffered?: number | undefined\n mtpPercent?: number | undefined\n requests?: number | undefined\n error?: string | undefined\n listening?: boolean | undefined\n ready?: boolean | undefined\n}\n\nconst number = (value: string | undefined) => {\n if (value === undefined) return undefined\n const parsed = Number(value.replace(/,/gu, ''))\n return Number.isFinite(parsed) ? parsed : undefined\n}\nconst rate = (value: string | undefined, suffix: string | undefined) => {\n const parsed = number(value)\n if (parsed === undefined) return undefined\n return suffix === 'k' ? parsed * 1000 : parsed\n}\n\n/**\n * Summarize the part of the log that belongs to the latest start.\n *\n * The log is append-only across restarts, so a new `starting engine` line ends\n * the previous run's figures. A later `listening on` clears an earlier failure;\n * a later `server stopped` clears the throughput that only describes a live run.\n */\nexport function parseNInferLog(text: string): NInferLogSummary {\n const lines = text.split(/\\r?\\n/u)\n let start = -1\n for (let index = 0; index < lines.length; index++) if (lines[index]!.includes('starting engine')) start = index\n const run = start >= 0 ? lines.slice(start) : lines\n const out: NInferLogSummary = {}\n for (const line of run) {\n const request = line.match(/req#(\\d+)/u)\n if (request) {\n const seen = number(request[1])\n if (seen !== undefined) out.requests = Math.max(out.requests ?? 0, seen)\n }\n let match: RegExpMatchArray | null\n if ((match = line.match(/loading weights\\s+([\\d.]+)%\\s*\\|\\s*([\\d.]+)\\s*GiB\\/([\\d.]+)\\s*GiB\\s*\\|\\s*([\\d.]+)\\s*MiB\\/s\\s*\\|\\s*ETA\\s*([\\d.]+)s/u))) {\n out.weightPercent = number(match[1])\n out.weightGiB = number(match[2])\n out.weightTotalGiB = number(match[3])\n out.weightBytesPerSecond = (number(match[4]) ?? 0) * 1024 * 1024\n out.etaSeconds = number(match[5])\n } else if (/weights ready/u.test(line)) {\n out.weightPercent = 100\n out.ready = true\n out.etaSeconds = 0\n } else if (/engine ready/u.test(line)) {\n out.ready = true\n } else if (/listening on http/u.test(line)) {\n out.listening = true\n out.error = undefined\n } else if ((match = line.match(/throughput\\s*\\|\\s*[\\d.]+s\\s*\\|\\s*prefill\\s+([\\d.]+)(k?)\\s*tok\\/s.*?decode\\s+([\\d.]+)(k?)\\s*tok\\/s.*?running\\s+(\\d+)/u))) {\n out.prefillTokPerSecond = rate(match[1], match[2])\n out.decodeTokPerSecond = rate(match[3], match[4])\n out.running = number(match[5])\n } else if ((match = line.match(/mtp accepted\\s+([\\d,]+)\\/([\\d,]+)\\s*\\(([\\d.]+)%\\)/u))) {\n out.mtpAccepted = number(match[1])\n out.mtpOffered = number(match[2])\n out.mtpPercent = number(match[3])\n } else if (/(FATAL|ERROR)\\s+.*(startup failed|server failed)/u.test(line)) {\n out.error = line.replace(/^.*?(?:FATAL|ERROR)\\s+/u, '').trim()\n out.listening = false\n out.ready = false\n } else if (/server stopped/u.test(line)) {\n out.running = 0\n out.decodeTokPerSecond = undefined\n out.prefillTokPerSecond = undefined\n }\n }\n if (out.listening) out.error = undefined\n return out\n}\n","import { useEffect, useState } from 'react'\nimport { parseNInferLog, type NInferLogSummary } from '../ninfer-log.ts'\n\nexport interface NInferGpu { name?: string; memoryMiB?: number | null; usedMiB?: number | null; utilization?: number | null; temperature?: number | null; powerWatts?: number | null }\nexport interface NInferTelemetry { gpus?: NInferGpu[]; cpuPct?: number | null; ramUsedGiB?: number; ramTotalGiB?: number }\nexport interface NInferSample { decode: number | null; prefill: number | null; vram: number | null }\n\n/**\n * Read the engine's own log and the host telemetry while this view is open.\n *\n * The log is the only place NInfer reports load progress, throughput and the\n * reason a start failed, so the dashboard reads it on the same cadence as the\n * hardware snapshot and keeps a short history for the chart.\n */\nexport function useNInferLive({ enabled }: { enabled: boolean }) {\n const [telemetry, setTelemetry] = useState<NInferTelemetry>()\n const [summary, setSummary] = useState<NInferLogSummary>({})\n const [text, setText] = useState('')\n const [history, setHistory] = useState<NInferSample[]>([])\n const [refreshKey, setRefreshKey] = useState(0)\n\n useEffect(() => {\n if (!enabled) return\n let alive = true\n async function tick() {\n try {\n const response = await fetch('/api/llamacpp/telemetry', { signal: AbortSignal.timeout(8000) })\n if (response.ok) {\n const value = await response.json() as NInferTelemetry\n if (alive) setTelemetry(value)\n }\n } catch { /* A missing sensor reading never hides the engine state. */ }\n try {\n const response = await fetch('/api/ninfer/logs', { signal: AbortSignal.timeout(15000) })\n if (response.ok) {\n const value = await response.json() as { text?: unknown }\n if (alive && typeof value.text === 'string') {\n setText(value.text)\n setSummary(parseNInferLog(value.text))\n }\n }\n } catch { /* The last figures stay until the next successful read. */ }\n }\n void tick()\n const timer = setInterval(() => { if (document.visibilityState === 'visible') void tick() }, 3000)\n return () => { alive = false; clearInterval(timer) }\n }, [enabled, refreshKey])\n\n useEffect(() => {\n if (!enabled) return\n setHistory(current => [...current, { decode: summary.decodeTokPerSecond ?? null, prefill: summary.prefillTokPerSecond ?? null, vram: telemetry?.gpus?.[0]?.usedMiB ?? null }].slice(-60))\n }, [enabled, summary.decodeTokPerSecond, summary.prefillTokPerSecond, telemetry])\n\n return { telemetry, summary, text, history, refresh: () => setRefreshKey(value => value + 1) }\n}\n","import { useEffect, useState } from 'react'\nimport type { NInferStatus } from './use-ninfer.ts'\n\n/** Copy with the async clipboard, falling back to the selection API in a page that denies it. */\nasync function copyText(value: string): Promise<boolean> {\n try {\n if (navigator.clipboard?.writeText) { await navigator.clipboard.writeText(value); return true }\n } catch (error) { /* A denied clipboard permission still has the selection fallback. */ }\n try {\n const area = document.createElement('textarea')\n area.value = value; area.readOnly = true; area.style.position = 'fixed'; area.style.top = '-1000px'; area.style.opacity = '0'\n document.body.appendChild(area); area.select()\n const copied = document.execCommand('copy')\n area.remove(); return copied\n } catch (error) { return false }\n}\n\n/** One copy button that says so for a moment, so a copy is never a guess. */\nfunction Copy({ value, what, label = '' }: { value: string; what: string; label?: string }) {\n const [copied, setCopied] = useState(false)\n useEffect(() => {\n if (!copied) return\n const timer = setTimeout(() => setCopied(false), 1600)\n return () => clearTimeout(timer)\n }, [copied])\n return <button type=\"button\" className={`lc-copy${copied ? ' copied' : ''}`} aria-label={`Copy ${what}`} onClick={() => void copyText(value).then(ok => { if (ok) setCopied(true) })}>{copied ? 'Copied' : label || 'Copy'}</button>\n}\n\n/** A labelled address with its own copy button. */\nfunction Address({ label, value, what, copy = true }: { label: string; value: string; what: string; copy?: boolean }) {\n return <div className=\"lc-api-row\"><header><span>{label}</span>{copy && <Copy value={value} what={what} />}</header><code>{value}</code></div>\n}\n\n/** One labelled engine figure. */\nfunction Spec({ label, value }: { label: string; value: string }) {\n return <div className=\"lc-spec\"><span>{label}</span><strong>{value}</strong></div>\n}\n\nconst examples = ['curl', 'python', 'node'] as const\ntype Example = typeof examples[number]\n\n/**\n * What a client needs to talk to this engine: the OpenAI-compatible address,\n * the model name, the auth the engine actually asks for, and a runnable example.\n */\nexport function NInferApi({ state, running }: { state: NInferStatus | undefined; running: boolean }) {\n const [example, setExample] = useState<Example>('curl')\n const endpoint = state?.baseUrl ?? 'http://127.0.0.1:8083/v1'\n const base = endpoint.replace(/\\/v1\\/?$/u, '')\n const model = state?.modelName ?? 'qwen3.8-27b'\n const env = `OPENAI_BASE_URL=${base}/v1\\nOPENAI_API_KEY=local\\nOPENAI_MODEL=${model}`\n const body = JSON.stringify({ model, messages: [{ role: 'user', content: 'Hello' }], max_tokens: 128 })\n const code = {\n curl: `curl ${base}/v1/chat/completions \\\\\\n -H 'content-type: application/json' \\\\\\n -d '${body}'`,\n python: `from openai import OpenAI\\n\\nclient = OpenAI(base_url=\"${base}/v1\", api_key=\"local\")\\nreply = client.chat.completions.create(\\n model=\"${model}\",\\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}],\\n)\\nprint(reply.choices[0].message.content)`,\n node: `import OpenAI from 'openai'\\n\\nconst client = new OpenAI({ baseURL: '${base}/v1', apiKey: 'local' })\\nconst reply = await client.chat.completions.create({\\n model: '${model}',\\n messages: [{ role: 'user', content: 'Hello' }],\\n})\\nconsole.log(reply.choices[0].message.content)`,\n } satisfies Record<Example, string>\n return <section className=\"lc-card\" aria-label=\"API and clients\">\n <div className=\"lc-section\" style={{ marginTop: 0 }}>\n <div><h3>Connect your tools</h3><p className=\"lc-sub\">Any OpenAI-compatible client works with these values. The engine answers on this computer only.</p></div>\n <div className=\"lc-actions\"><Copy label=\"Copy .env\" value={env} what=\"the .env settings\" /></div>\n </div>\n <div className=\"lc-api-rows\">\n <Address label=\"Base URL\" value={`${base}/v1`} what=\"the base URL\" />\n <Address label=\"Chat completions\" value={`${base}/v1/chat/completions`} what=\"the chat completions URL\" />\n <Address label=\"Model name\" value={model} what=\"the model name\" />\r\n <Address label=\"Models endpoint\" value={`${base}/v1/models`} what=\"the models URL\" />\n <Address label=\"API key\" value=\"Not required on this computer\" what=\"the API key\" copy={false} />\n </div>\n {!running && <p className=\"lc-sub lc-api-note\">NInfer is not serving right now, so these addresses answer after Start NInfer.</p>}\n <div className=\"lc-example\">\n <header>\n <div className=\"lc-example-tabs\" role=\"tablist\" aria-label=\"Client example\">\n {examples.map(name => <button key={name} type=\"button\" role=\"tab\" aria-selected={example === name} className={`lc-example-tab${example === name ? ' active' : ''}`} onClick={() => setExample(name)}>{name === 'curl' ? 'curl' : name === 'python' ? 'Python' : 'Node.js'}</button>)}\n </div>\n <Copy value={code[example]} what=\"the client example\" />\n </header>\n <pre>{code[example]}</pre>\n </div>\n </section>\n}\n\n/** The pinned engine this installation serves, as the host reports it. */\nexport function NInferSpec({ state }: { state: NInferStatus | undefined }) {\n const runtime = state?.runtime === 'wsl' ? `WSL · pid ${state.pid ?? '—'}` : state?.containerId ? `Container · ${state.containerId.slice(0, 12)}` : state?.pid ? `Process · pid ${state.pid}` : 'Not running'\n return <section className=\"lc-card\" aria-label=\"Engine configuration\">\n <div className=\"lc-section\" style={{ marginTop: 0 }}>\n <div><h3>Engine</h3><p className=\"lc-sub\">The pinned artifact this page starts and serves.</p></div>\n {state?.complete === true && <span className=\"lc-pill good\"><i className=\"lc-dot\" />verified</span>}\n </div>\n <div className=\"lc-spec-grid\">\n <Spec label=\"Model\" value={state?.modelName ?? 'qwen3.8-27b'} />\n <Spec label=\"Runtime\" value={runtime} />\n <Spec label=\"Context\" value={state?.context == null ? '—' : state.context.toLocaleString() + ' tokens'} />\n <Spec label=\"Response limit\" value={state?.outputTokens == null ? '—' : state.outputTokens.toLocaleString() + ' tokens'} />\n <Spec label=\"Prefill chunk\" value={state?.prefill == null ? '—' : state.prefill.toLocaleString()} />\n <Spec label=\"Host KV\" value={state?.hostKvMiB == null ? '—' : state.hostKvMiB.toLocaleString() + ' MiB'} />\n <Spec label=\"MTP drafts\" value={state?.draftTokens == null ? '—' : String(state.draftTokens)} />\n <Spec label=\"Vision\" value={state?.vision ? 'Enabled' : 'Text only'} />\n <Spec label=\"n-gram drafts\" value={state?.ngram ?? 'chain'} />\n <Spec label=\"Access\" value=\"127.0.0.1 only\" />\n </div>\n </section>\n}\n","import { useState, type ReactNode } from 'react'\r\nimport type { NInferEngine } from './use-ninfer.ts'\r\nimport { useNInferLive, type NInferSample } from './use-ninfer-live.ts'\r\nimport { NInferTuning } from './NInferTuning.tsx'\r\nimport { NInferApi, NInferSpec } from './NInferApi.tsx'\r\n\r\nconst gb = (mib: number | null | undefined) => mib == null ? '—' : (mib / 1024).toFixed(1)\r\nconst rate = (value: number | undefined) => value == null ? '—' : value >= 1000 ? (value / 1000).toFixed(2) + 'k' : value.toFixed(1)\r\n\r\n/** One KPI card in the engine's own monitoring vocabulary. */\r\nfunction Kpi({ label, value, detail, children }: { label: string; value: ReactNode; detail?: ReactNode; children?: ReactNode }) {\r\n return <section className=\"lc-card\"><div className=\"lc-kpi-head\"><span>{label}</span></div><div className=\"lc-value\">{value}</div>{children}{detail !== undefined && <p className=\"lc-sub\">{detail}</p>}</section>\r\n}\r\n\r\n/** Decode throughput from the samples this view has seen since it opened. */\r\nfunction Sparkline({ samples }: { samples: NInferSample[] }) {\r\n const values = samples.map(sample => sample.decode).filter((value): value is number => typeof value === 'number' && value > 0)\r\n if (values.length === 0) return <div className=\"lc-empty\" style={{ padding: '26px 0' }}>Throughput appears after the first request.</div>\r\n const max = Math.max(...values) * 1.15 || 1\r\n const points = values.map((value, index) => `${40 + index * 520 / Math.max(1, values.length - 1)},${130 - Math.min(1, value / max) * 110}`).join(' ')\r\n return <svg className=\"lc-chart\" viewBox=\"0 0 580 150\" role=\"img\" aria-label={`Decode throughput across ${values.length} samples`}>\r\n <defs><linearGradient id=\"ninfer-throughput\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop stopColor=\"var(--dsw-alias-state-success-primary)\" stopOpacity=\".18\"/><stop offset=\"1\" stopColor=\"var(--dsw-alias-state-success-primary)\" stopOpacity=\"0\"/></linearGradient></defs>\r\n {[0, 1, 2, 3].map(row => <g key={row}><path d={`M40 ${20 + row * 110 / 3}H560`} stroke=\"var(--dsw-alias-border-l1)\" strokeDasharray=\"3 4\"/><text x=\"3\" y={24 + row * 110 / 3}>{Math.round(max * (1 - row / 3))}</text></g>)}\r\n {values.length > 1 && <polygon points={`40,130 ${points} 560,130`} fill=\"url(#ninfer-throughput)\"/>}\r\n <polyline points={points} stroke=\"var(--dsw-alias-state-success-primary)\" strokeWidth=\"2.5\" strokeLinecap=\"round\" fill=\"none\"/>\r\n {values.length === 1 && <circle cx={40} cy={130 - Math.min(1, values[0]! / max) * 110} r={3} fill=\"var(--dsw-alias-state-success-primary)\"/>}\r\n </svg>\r\n}\r\n\r\n/**\r\n * The local NInfer engine as an operations view: state, GPU, throughput,\r\n * speculative-decoding acceptance, load progress and the reason a start failed.\r\n */\r\nexport function NInferPanel({ ninfer, strataActive, onShowStrata }: { ninfer: NInferEngine; strataActive: boolean; onShowStrata: () => void }) {\r\n const { state, error, statusError, notice, busy, act, save, refresh } = ninfer\r\n const live = useNInferLive({ enabled: true })\r\n const [stoppingStrata, setStoppingStrata] = useState(false)\r\n const phase = state?.phase\r\n const gpu = live.telemetry?.gpus?.[0]\r\n const vramUsed = gpu?.usedMiB\r\n const vramTotal = gpu?.memoryMiB\r\n const vramPercent = vramUsed != null && vramTotal ? vramUsed / vramTotal * 100 : null\r\n const failed = typeof live.summary.error === 'string' && live.summary.error !== ''\r\n const loading = phase === 'starting'\r\n const running = phase === 'running' && state?.healthy !== false\r\n const label = failed ? 'Failed' : running ? 'Serving' : loading ? 'Loading' : phase === 'unmanaged' ? 'External' : phase === 'stopped' ? 'Stopped' : 'Connecting'\r\n const pill = failed ? 'bad' : running ? 'good' : loading ? 'warm' : ''\r\n const context = state?.context === undefined ? '—' : Math.round(state.context / 1024) + 'K'\r\n const identity = state?.runtime === 'wsl' ? 'WSL · pid ' + (state.pid ?? '—') : state?.containerId ? 'Container · ' + state.containerId.slice(0, 12) : 'local process'\r\n const endpoint = state?.baseUrl ?? 'http://127.0.0.1:8083/v1'\r\n const dashboard = endpoint.replace(/\\/v1\\/?$/u, '') + '/'\r\n const canStart = phase === 'stopped' && state?.complete === true\r\n /** Another launcher may hold the engine; when it is provably ours the page can reclaim it. */\r\n const external = phase === 'unmanaged'\r\n const canTakeOver = external && state?.takeover === true\r\n const canStop = state?.owned === true || canTakeOver\r\n const progress = loading ? Math.max(0, Math.min(100, live.summary.weightPercent ?? 0)) : 0\r\n const sampleCount = live.history.filter(sample => sample.decode != null).length\r\n const vramReading = vramUsed != null && vramTotal != null\r\n\r\n async function stopStrata() {\r\n if (stoppingStrata) return\r\n setStoppingStrata(true)\r\n try {\r\n await fetch('/api/aryastrata/stop', { method: 'POST', headers: { 'x-strata-control': '1' }, signal: AbortSignal.timeout(240000) })\r\n refresh()\r\n } catch { /* The page's own Strata poll reports the outcome. */ } finally { setStoppingStrata(false) }\r\n }\r\n\r\n return <section>\r\n <section className=\"lc-card\" style={{ padding: '22px 24px' }}>\r\n <div className=\"lc-ninfer-hero\">\r\n <div>\r\n <div className=\"lc-eyebrow\">NInfer · local engine</div>\r\n <h2 style={{ fontSize: 26, letterSpacing: '-.6px' }}>Qwen3.8-27B</h2>\r\n <p className=\"lc-sub\">Dense · GSQ3 · {context} context · {state?.vision ? 'vision' : 'text only'} · {state?.draftTokens ?? 3} MTP drafts · {identity}</p>\r\n <div className=\"lc-actions\" style={{ marginTop: 14 }}>\r\n <span className={`lc-pill ${pill}`}><i className=\"lc-dot\"/>{label}</span>\r\n <span className=\"lc-pill\">{endpoint}</span>\r\n <span className=\"lc-pill\">{`MTP ${state?.draftTokens ?? 3}`}</span>\r\n {state?.vision === true && <span className=\"lc-pill\">vision</span>}\r\n </div>\r\n </div>\r\n <div className=\"lc-ninfer-actions\">\r\n <button className=\"lc-button primary\" disabled={busy || !canStart} onClick={() => void act('start')}>Start NInfer</button>\r\n <button className=\"lc-button\" disabled={busy || !canStop} onClick={() => void act('stop')}>Stop NInfer</button>\r\n <button className=\"lc-button\" disabled={busy || !canStop} onClick={() => void act('restart')}>Restart NInfer</button>\r\n <button className=\"lc-button ghost\" disabled={busy} onClick={() => { refresh(); live.refresh() }}>Refresh</button>\r\n {(running || external && state?.healthy === true) && <a className=\"lc-button\" href={dashboard} target=\"_blank\" rel=\"noopener noreferrer\">Open NInfer dashboard</a>}\r\n </div>\r\n </div>\r\n </section>\r\n\r\n {error !== '' && <p className=\"lc-notice error\" role=\"alert\">{error}</p>}\r\n {statusError !== '' && <p className=\"lc-notice error\" role=\"status\">{statusError}</p>}\r\n {notice !== '' && <p className=\"lc-notice\" role=\"status\">{notice}</p>}\r\n\r\n {external && <section className=\"lc-notice\" role=\"status\">\r\n <strong>NInfer is running outside this Control Center.</strong> {state?.detail}\r\n <div className=\"lc-actions\">\r\n {canTakeOver && <button className=\"lc-button primary\" disabled={busy} onClick={() => void act('start')}>Take over engine</button>}\r\n {canTakeOver && <button className=\"lc-button\" disabled={busy} onClick={() => void act('stop')}>Stop the external engine</button>}\r\n <button className=\"lc-button ghost\" disabled={busy} onClick={() => refresh()}>Refresh status</button>\r\n </div>\r\n </section>}\r\n\r\n {failed && <section className=\"lc-notice error\" role=\"alert\">\r\n <strong>NInfer could not start.</strong> {live.summary.error}\r\n <p className=\"lc-sub\">{vramReading ? `The GPU shows ${gb(vramUsed)} of ${gb(vramTotal)} GB in use${strataActive ? ' — Strata is holding it' : ''}. ` : ''}Starting again stops Strata first.</p>\r\n <div className=\"lc-actions\">\r\n {strataActive && <button className=\"lc-button\" disabled={stoppingStrata} onClick={() => void stopStrata()}>{stoppingStrata ? 'Stopping Strata…' : 'Stop Strata'}</button>}\r\n <button className=\"lc-button primary\" disabled={busy || !canStart} onClick={() => void act('start')}>Retry start</button>\r\n <button className=\"lc-button ghost\" onClick={onShowStrata}>Open Strata controls</button>\r\n </div>\r\n </section>}\r\n\r\n {!failed && strataActive && phase === 'stopped' && <section className=\"lc-notice\" role=\"status\">\r\n <strong>Strata has the GPU.</strong> {vramReading ? `It is using ${gb(vramUsed)} of ${gb(vramTotal)} GB. ` : ''}Starting NInfer stops Strata first.\r\n <div className=\"lc-actions\">\r\n <button className=\"lc-button ghost\" onClick={onShowStrata}>Open Strata controls</button>\r\n </div>\r\n </section>}\r\n\r\n {loading && <section className=\"lc-card\">\r\n <div className=\"lc-section\" style={{ marginTop: 0 }}><div><h3>Loading model</h3><p className=\"lc-sub\">Weights are read from the pinned artifact before the server listens.</p></div><span className=\"lc-pill warm\"><i className=\"lc-dot\"/>{progress.toFixed(0)}%</span></div>\r\n <div className=\"lc-bar\"><span style={{ width: progress + '%' }}/></div>\r\n <p className=\"lc-sub\">{gb(live.summary.weightGiB)} / {gb(live.summary.weightTotalGiB)} GiB · {rate(live.summary.weightBytesPerSecond ? live.summary.weightBytesPerSecond / 1024 / 1024 : undefined)} MiB/s · ETA {live.summary.etaSeconds ?? '—'}s</p>\r\n </section>}\r\n\r\n <div className=\"lc-ninfer-split\">\r\n <NInferApi state={state} running={running}/>\r\n <NInferSpec state={state}/>\r\n </div>\r\n\r\n <section className=\"lc-card\" style={{ marginTop: 16 }}>\r\n <div className=\"lc-section\" style={{ marginTop: 0 }}><div><h3>Live engine</h3><p className=\"lc-sub\">From the engine's own log and this computer's sensors.</p></div><small>3 s refresh</small></div>\r\n <div className=\"lc-grid lc-ninfer-kpis\">\r\n <Kpi label=\"MODEL STATE\" value={label} detail={running ? ((live.summary.running ?? 0) > 0 ? `${live.summary.running} in flight` : 'Waiting for a request') : loading ? 'Reading weights' : failed ? 'Startup failed' : 'Not loaded'}/>\r\n <Kpi label=\"DECODE\" value={running ? rate(live.summary.decodeTokPerSecond) : '—'} detail={'prefill ' + rate(live.summary.prefillTokPerSecond) + ' tok/s'}/>\r\n <Kpi label=\"MTP ACCEPTANCE\" value={live.summary.mtpPercent == null ? '—' : live.summary.mtpPercent.toFixed(1) + '%'} detail={live.summary.mtpOffered ? `${live.summary.mtpAccepted?.toLocaleString()} / ${live.summary.mtpOffered.toLocaleString()} accepted` : 'No speculative request yet'}/>\r\n <Kpi label=\"VRAM\" value={`${gb(vramUsed)} / ${gb(vramTotal)} GB`} detail={gpu?.name ?? 'No GPU reading'}><div className=\"lc-bar\" style={{ margin: '10px 0 4px' }}><span style={{ width: (vramPercent ?? 0) + '%' }}/></div></Kpi>\r\n <Kpi label=\"GPU LOAD\" value={gpu?.utilization == null ? '—' : Math.round(gpu.utilization) + '%'} detail={gpu?.temperature == null ? 'No temperature' : `${Math.round(gpu.temperature)} °C${gpu.powerWatts == null ? '' : ' · ' + Math.round(gpu.powerWatts) + ' W'}`}/>\r\n <Kpi label=\"CONTEXT\" value={context} detail={`${state?.vision ? 'vision' : 'text only'} · MTP ${state?.draftTokens ?? 3}`}/>\r\n <Kpi label=\"ACTIVE REQUESTS\" value={running ? String(live.summary.running ?? 0) : '—'} detail={`${live.summary.requests?.toLocaleString() ?? 0} requests served`}/>\r\n <Kpi label=\"HOST\" value={live.telemetry?.cpuPct == null ? '—' : Math.round(live.telemetry.cpuPct) + '%'} detail={live.telemetry?.ramTotalGiB ? `CPU · RAM ${live.telemetry.ramUsedGiB?.toFixed(1)} / ${live.telemetry.ramTotalGiB.toFixed(1)} GiB` : 'CPU · no memory reading'}/>\r\n </div>\r\n </section>\r\n\r\n <section className=\"lc-card\">\r\n <div className=\"lc-section\" style={{ marginTop: 0 }}><div><h3>Decode throughput</h3><p className=\"lc-sub\">Tokens per second reported by the engine's own throughput log.</p></div><small>{sampleCount} {sampleCount === 1 ? 'sample' : 'samples'} · 3 s refresh</small></div>\r\n <Sparkline samples={live.history}/>\r\n </section>\r\n\r\n <NInferTuning state={state} busy={busy} save={save}/>\r\n <details style={{ marginTop: 18 }}><summary className=\"lc-muted\">NInfer logs</summary><div className=\"lc-actions\"><button className=\"lc-button\" onClick={() => live.refresh()}>Refresh logs</button></div><pre className=\"lc-terminal\">{live.text === '' ? 'No NInfer log output yet.' : live.text}</pre></details>\r\n </section>\r\n}\r\n","import { useEffect, useRef, useState } from 'react'\r\nimport type { NInferSettings } from '../ninfer.ts'\r\nimport { responseData } from './Connection.tsx'\r\n\r\n/** `/api/ninfer/status` as the host reports it, plus the tuning fields it echoes. */\r\nexport type NInferStatus = Partial<NInferSettings> & { phase?: string; owned?: boolean; healthy?: boolean; complete?: boolean; containerId?: string | null; modelName?: string; baseUrl?: string; runtime?: 'wsl'; pid?: number; available?: boolean; external?: boolean; takeover?: boolean; detail?: string }\r\n\r\n/** The engine's state and the calls the page may make against it. */\r\nexport type NInferEngine = ReturnType<typeof useNInfer>\r\n\r\n/**\r\n * Poll the owned local engine and drive its existing routes.\r\n *\r\n * Status reads abort the previous one, so a poll that started before an action\r\n * cannot overwrite the state that action produced. Polling pauses while the\r\n * page is hidden: in WSL and Docker modes every read is a real process call.\r\n */\r\nexport function useNInfer({ enabled, intervalMs }: { enabled: boolean; intervalMs: number }) {\r\n const [state, setState] = useState<NInferStatus>()\r\n const [error, setError] = useState('')\r\n const [statusError, setStatusError] = useState('')\r\n const [notice, setNotice] = useState('')\r\n const [busy, setBusy] = useState(false)\r\n const [logs, setLogs] = useState('')\r\n const [logsError, setLogsError] = useState('')\r\n const inflight = useRef<AbortController | null>(null)\r\n const acting = useRef(false)\r\n\r\n function readStatus() {\r\n inflight.current?.abort()\r\n const controller = new AbortController()\r\n inflight.current = controller\r\n void (async () => {\r\n try {\r\n const next = await responseData(await fetch('/api/ninfer/status', { signal: AbortSignal.any([controller.signal, AbortSignal.timeout(15000)]) })) as NInferStatus\r\n if (controller.signal.aborted) return\r\n setState(next)\r\n setStatusError('')\r\n } catch (reason) {\r\n if (!controller.signal.aborted) setStatusError(reason instanceof Error ? reason.message : String(reason))\r\n }\r\n })()\r\n }\r\n\r\n async function act(action: 'start' | 'stop' | 'restart') {\r\n if (!enabled || acting.current) return\r\n acting.current = true\r\n setBusy(true)\r\n setError('')\r\n setNotice('')\r\n try {\r\n const result = await responseData(await fetch('/api/ninfer/' + action, { method: 'POST', headers: { 'x-ninfer-control': '1' }, signal: AbortSignal.timeout(240000) }))\r\n setNotice(typeof result.detail === 'string' ? result.detail : 'NInfer ' + action + ' requested.')\r\n readStatus()\r\n } catch (reason) {\r\n setError(reason instanceof Error ? reason.message : String(reason))\r\n } finally {\r\n acting.current = false\r\n setBusy(false)\r\n }\r\n }\r\n\r\n async function save(settings: NInferSettings) {\r\n if (!enabled || acting.current) return\r\n acting.current = true\r\n setBusy(true)\r\n setError('')\r\n setNotice('')\r\n try {\r\n const result = await responseData(await fetch('/api/ninfer/configure', { method: 'POST', headers: { 'x-ninfer-control': '1', 'content-type': 'application/json' }, body: JSON.stringify(settings), signal: AbortSignal.timeout(30000) }))\r\n setNotice(typeof result.detail === 'string' ? result.detail : 'NInfer settings saved.')\r\n readStatus()\r\n } catch (reason) {\r\n setError(reason instanceof Error ? reason.message : String(reason))\r\n } finally {\r\n acting.current = false\r\n setBusy(false)\r\n }\r\n }\r\n\r\n async function loadLogs() {\r\n if (!enabled) return\r\n try {\r\n const result = await responseData(await fetch('/api/ninfer/logs', { signal: AbortSignal.timeout(15000) }))\r\n setLogs(typeof result.text === 'string' ? result.text : '')\r\n setLogsError('')\r\n } catch (reason) {\r\n setLogsError(reason instanceof Error ? reason.message : String(reason))\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (!enabled) return\r\n readStatus()\r\n let timer: ReturnType<typeof setTimeout>\r\n const schedule = () => {\r\n timer = setTimeout(() => {\r\n if (document.visibilityState === 'visible') readStatus()\r\n schedule()\r\n }, intervalMs)\r\n }\r\n schedule()\r\n const onVisible = () => { if (document.visibilityState === 'visible') readStatus() }\r\n document.addEventListener('visibilitychange', onVisible)\r\n return () => {\r\n clearTimeout(timer)\r\n document.removeEventListener('visibilitychange', onVisible)\r\n inflight.current?.abort()\r\n inflight.current = null\r\n }\r\n }, [enabled, intervalMs])\r\n\r\n return { state, error, statusError, notice, busy, logs, logsError, act, save, loadLogs, refresh: readStatus }\r\n}\r\n","import {useEffect,useState} from 'react'\nimport {css} from './theme.ts'\nimport {OutputTuning} from './OutputTuning.tsx'\nimport {responseData} from './Connection.tsx'\nimport {NInferPanel} from './NInferPanel.tsx'\nimport {useNInfer} from './use-ninfer.ts'\n\ntype State={phase:string;responding:boolean;owned:boolean;baseUrl:string;port?:number;modelName:string;detail:string}\n\n/** The target this computer was pointed at, as `/api/aryastrata/connection` reports it. */\ntype Target={address:string;token:string;storage:string;acceptsControl:boolean;paired:number}\n\n/** One outstanding pairing code and the addresses a second computer can use it at. */\ntype Offer={code:string;display:string;expiresAt:number;targets:{kind:string;address:string;url:string}[]}\n\n/** One computer already paired with this engine, as this Host recorded it. */\ntype Device={id:string;label:string;created:number}\n\n/** One machine on this computer's tailnet, offered as an address to pair with. */\ntype Peer={name:string;address:string;online:boolean}\n\n/** Header that routes one call at the configured Host instead of this machine. */\nconst remoteHeader={'x-strata-target':'remote'}\n\n/** Port the paired-computer relay listens on, assumed when a peer is picked from the list. */\nconst PAGE_PORT='45900'\n\n/** Header that marks a write, as every lifecycle route demands. */\nconst controlHeader={'x-strata-control':'1'}\n\n/** Whole minutes until a code expires, floored at zero. */\nfunction minutesLeft(expiresAt:number):number{\n return Math.max(0,Math.ceil((expiresAt-Date.now())/60000))\n}\n\n/** Accept a typed address in the form people actually type it. */\nfunction asAddress(value:string):string{\n const trimmed=value.trim()\n if(trimmed===''||trimmed.startsWith('/')||/^[a-z][a-z0-9+.-]*:\\/\\//iu.test(trimmed))return trimmed\n return 'http://'+trimmed\n}\n\n/** AryaStrata lifecycle controls, for this computer or for the Host it was pointed at. */\nexport function StrataControlCenter(){\n const [state,setState]=useState<State>(),[target,setTarget]=useState<Target>(),[error,setError]=useState(''),[loadError,setLoadError]=useState(''),[notice,setNotice]=useState(''),[busy,setBusy]=useState(false),[generation,setGeneration]=useState(0)\n const [address,setAddress]=useState(''),[token,setToken]=useState(''),[pairing,setPairing]=useState(false),[pairNotice,setPairNotice]=useState(''),[pairError,setPairError]=useState('')\n const [code,setCode]=useState(''),[joining,setJoining]=useState(false),[joinError,setJoinError]=useState(''),[joinNotice,setJoinNotice]=useState('')\n const [peers,setPeers]=useState<Peer[]>(),[peerNote,setPeerNote]=useState(''),[finding,setFinding]=useState(false)\n const [offer,setOffer]=useState<Offer>(),[offerError,setOfferError]=useState(''),[minting,setMinting]=useState(false)\n const [devices,setDevices]=useState<Device[]>(),[deviceNote,setDeviceNote]=useState(''),[revoking,setRevoking]=useState('')\n const [webUi,setWebUi]=useState<{url:string|null;detail:string}>()\n const remote=!!target&&target.address!==''\n // This computer's own engines, not the Host a paired page controls: NInfer\n // routes answer loopback callers only, so the switch exists only here.\n const localHost=location.protocol==='dsh-app:'||['localhost','127.0.0.1','[::1]'].includes(location.hostname)\n const enginesHere=localHost&&!remote\n const [engine,setEngine]=useState<'strata'|'ninfer'>('strata')\n const ninfer=useNInfer({enabled:enginesHere,intervalMs:engine==='ninfer'?5000:20000})\n const strataActive=['running','starting'].includes(state?.phase??'')\n const strataBlocked=['running','starting'].includes(ninfer.state?.phase??'')\n useEffect(()=>{if(!enginesHere)setEngine('strata')},[enginesHere])\n useEffect(()=>{\n const abort=new AbortController()\n void (async()=>{try{setTarget(await responseData(await fetch('/api/aryastrata/connection',{signal:AbortSignal.any([abort.signal,AbortSignal.timeout(15000)])})) as Target)}catch(e){if(!abort.signal.aborted)setLoadError(e instanceof Error?e.message:String(e))}})()\n return()=>abort.abort()\n },[generation])\n useEffect(()=>{\n const abort=new AbortController();let pending=false\n async function refresh(){if(pending)return;pending=true;try{const data=await responseData(await fetch('/api/aryastrata/status',{headers:remote?remoteHeader:{},signal:AbortSignal.any([abort.signal,AbortSignal.timeout(15000)])}));if(!abort.signal.aborted){setState(data);setLoadError('')}}catch(e){if(!abort.signal.aborted)setLoadError(e instanceof Error?e.message:String(e))}finally{pending=false}}\n void refresh();const timer=setInterval(()=>void refresh(),3000)\n return()=>{abort.abort();clearInterval(timer)}\n },[remote])\n // The engine's interface sits on the engine computer's loopback, which a second\n // computer cannot load. Ask this computer's Host whether that port answers on\n // the address it already pairs with, and offer only an address that did.\n useEffect(()=>{\n if(!remote||!state?.port)return\n const abort=new AbortController()\n void (async()=>{try{const data=await responseData(await fetch('/api/aryastrata/webui?port='+String(state.port),{signal:AbortSignal.any([abort.signal,AbortSignal.timeout(20000)])})) as {url:string|null;detail:string};if(!abort.signal.aborted)setWebUi(data)}catch(e){if(!abort.signal.aborted)setWebUi({url:null,detail:e instanceof Error?e.message:String(e)})}})()\n return()=>abort.abort()\n },[remote,state?.port,generation])\n async function action(operation:'start'|'stop'|'restart'){\n if(busy)return;setBusy(true);setError('');setNotice('')\n try{const result=await responseData(await fetch('/api/aryastrata/'+operation,{method:'POST',headers:remote?{...remoteHeader,'x-strata-control':'1'}:{'x-strata-control':'1'},signal:AbortSignal.timeout(240000)}));if(result.state)setState(result.state);if(result.ok===false)throw Error(result.detail);setNotice(result.detail);setGeneration(n=>n+1)}catch(e){setError(e instanceof Error?e.message:String(e))}finally{setBusy(false)}\n }\n async function call(path:'/connection/test'|'/connection/save',draft?:{address:string;token:string}){\n if(pairing)return;setPairing(true);setPairError('');setPairNotice('')\n try{const body=draft??{address:asAddress(address),token};const result=await responseData(await fetch('/api/aryastrata'+path,{method:'POST',headers:{...controlHeader,'content-type':'application/json'},body:JSON.stringify(body),signal:AbortSignal.timeout(30000)}));if(result.ok===false)throw Error(result.detail);setPairNotice(result.detail);if(path==='/connection/save')setGeneration(n=>n+1)}catch(e){setPairError(e instanceof Error?e.message:String(e))}finally{setPairing(false)}\n }\n async function useThisComputer(){setAddress('');setToken('');await call('/connection/save',{address:'',token:''})}\n /** Ask this Host for a code another computer can redeem. */\n async function createCode(){\n if(minting)return;setMinting(true);setOfferError('')\n try{const result=await responseData(await fetch('/api/aryastrata/pair/offer',{signal:AbortSignal.timeout(15000)}));if(result.ok===false)throw Error(result.detail);setOffer(result as Offer)}catch(e){setOfferError(e instanceof Error?e.message:String(e))}finally{setMinting(false)}\n }\n /** Redeem the typed code on the typed address, then start controlling that engine. */\n async function join(){\n if(joining)return;setJoining(true);setJoinError('');setJoinNotice('')\n try{const result=await responseData(await fetch('/api/aryastrata/pair',{method:'POST',headers:{...controlHeader,'content-type':'application/json'},body:JSON.stringify({address:asAddress(address),code:code.replace(/[^a-z0-9]/giu,'').toUpperCase()}),signal:AbortSignal.timeout(30000)}));if(result.ok===false)throw Error(result.detail);setJoinNotice(result.detail);setCode('');setGeneration(n=>n+1)}catch(e){setJoinError(e instanceof Error?e.message:String(e))}finally{setJoining(false)}\n }\n /** List the machines on this computer's tailnet, so pairing needs no address typed. */\n async function findComputers(){\n if(finding)return;setFinding(true);setPeerNote('')\n try{const result=await responseData(await fetch('/api/aryastrata/peers',{signal:AbortSignal.timeout(20000)}));setPeers((result.peers??[]) as Peer[]);if(result.detail)setPeerNote(String(result.detail));else if(!(result.peers??[]).length)setPeerNote('No other machine answered, so type the host address instead.')}catch(e){setPeerNote(e instanceof Error?e.message:String(e))}finally{setFinding(false)}\n }\n async function loadDevices(){\n try{const result=await responseData(await fetch('/api/aryastrata/pair/devices',{signal:AbortSignal.timeout(15000)}));setDevices((result.devices??[]) as Device[]);setDeviceNote('')}catch(e){setDeviceNote(e instanceof Error?e.message:String(e))}\n }\n async function revokeDevice(id:string){\n if(revoking!=='')return;setRevoking(id);setDeviceNote('')\n try{const result=await responseData(await fetch('/api/aryastrata/pair/revoke',{method:'POST',headers:{...controlHeader,'content-type':'application/json'},body:JSON.stringify({id}),signal:AbortSignal.timeout(15000)}));setDevices((result.devices??[]) as Device[]);setDeviceNote(result.ok===false?result.detail:'Unpaired. That computer can no longer control this engine.')}catch(e){setDeviceNote(e instanceof Error?e.message:String(e))}finally{setRevoking('')}\n }\n let url:URL|undefined\n try{if(state){const address=remote&&webUi?.url?webUi.url:state.baseUrl;const candidate=new URL(address);if(['http:','https:'].includes(candidate.protocol)){candidate.hash='monitor';url=candidate}}}catch{/* An invalid configured engine URL is not embedded. */}\n const loopback=url&&['localhost','127.0.0.1','[::1]'].includes(url.hostname)\n // The engine's own web interface listens on the Host's loopback, so a panel\n // driving another computer offers the address this computer just proved it\n // can reach, and never the loopback one.\n const accessible=!!url&&(remote?webUi?.url!=null:(!loopback||localHost))\n const embedded=accessible&&!(location.protocol==='https:'&&url?.protocol==='http:')\n const where=remote?target.address.replace(/^https?:\\/\\//u,''):'This computer'\n const remaining=offer?minutesLeft(offer.expiresAt):0\n return <main className=\"lc\" style={{height:'100%',display:'flex',flexDirection:'column',minHeight:0}}><style>{css}</style>\n <header className=\"lc-header\"><div><h1>AryaStrata Control Center</h1><p className=\"lc-sub\">Run AryaStrata, or the local NInfer Qwen3.8 dense model, on this computer.</p></div><span role=\"status\" className=\"lc-pill\">{engine==='ninfer'?(ninfer.busy?'Working…':ninfer.state?.phase??'Connecting…'):(busy?'Working…':state?.phase??'Connecting…')}</span></header>\n {enginesHere&&<nav className=\"lc-tabs\" aria-label=\"Engines\"><button className={'lc-tab '+(engine==='strata'?'active':'')} aria-pressed={engine==='strata'} onClick={()=>setEngine('strata')}>Strata</button><button className={'lc-tab '+(engine==='ninfer'?'active':'')} aria-pressed={engine==='ninfer'} onClick={()=>setEngine('ninfer')}>NInfer</button></nav>}\n {engine==='ninfer'&&enginesHere?<NInferPanel ninfer={ninfer} strataActive={strataActive} onShowStrata={()=>setEngine('strata')}/>:<>\n <div className=\"lc-actions\" style={{flexWrap:'wrap'}}>\n <button className=\"lc-button primary\" disabled={busy||!state||state.phase!=='stopped'} onClick={()=>void action('start')}>Start engine</button>\n <button className=\"lc-button\" disabled={busy||!state?.owned} onClick={()=>void action('stop')}>Stop engine</button>\n <button className=\"lc-button\" disabled={busy||!state?.owned} onClick={()=>void action('restart')}>Restart engine</button>\n {accessible&&<a className=\"lc-button\" href={url?.href} target=\"_blank\" rel=\"noopener noreferrer\">Open AryaStrata web UI</a>}\n <button className=\"lc-button\" onClick={()=>{setWebUi(undefined);setGeneration(n=>n+1)}}>Reload web UI</button>\n </div>\n {strataBlocked&&<p className=\"lc-sub\">NInfer is running. Starting Strata stops NInfer automatically. <button className=\"lc-button ghost\" disabled={busy} onClick={()=>setEngine('ninfer')}>Open NInfer controls</button></p>}\n {(error||loadError)&&<p className=\"lc-notice error\" role=\"alert\">{error||loadError}</p>}\n {notice&&<p className=\"lc-notice\" role=\"status\">{notice}</p>}\n <div className=\"lc-connection\" style={{marginTop:12}}>\n <span className=\"lc-muted\">Controlling</span><strong>{where}</strong>\n {remote&&target.storage!=='none'&&<span className=\"lc-tag\">{target.storage==='profile'?'saved in this profile':'saved in strata-connection.json'}</span>}\n <details className=\"lc-connection-setup\" style={{marginLeft:'auto'}}><summary>{remote?'Change computer':'Control another computer'}</summary>\n <div className=\"lc-connection-fields\">\n <label className=\"lc-field\"><span>Computer</span>\n <select aria-label=\"Computer\" className=\"lc-input\" value={peers?.some(peer=>asAddress(address)===`http://${peer.address}:${PAGE_PORT}`)?asAddress(address):''} onChange={event=>{if(event.target.value!=='')setAddress(event.target.value)}}>\n <option value=\"\">Choose a computer on your tailnet…</option>\n {(peers??[]).map(peer=><option key={peer.address} value={`http://${peer.address}:${PAGE_PORT}`}>{peer.name} · {peer.address}</option>)}\n </select>\n </label>\n <div className=\"lc-actions\" style={{flexWrap:'wrap'}}><button className=\"lc-button\" disabled={finding} onClick={()=>void findComputers()}>{finding?'Looking…':'Find computers'}</button></div>\n {peerNote!==''&&<p className=\"lc-muted\">{peerNote}</p>}\n <label className=\"lc-field\"><span>Host address</span><input className=\"lc-input\" value={address} placeholder=\"100.x.y.z:45900 (the address shown beside the code)\" onChange={event=>setAddress(event.target.value)}/></label>\n <label className=\"lc-field\"><span>Pairing code</span><input className=\"lc-input\" value={code} maxLength={9} autoComplete=\"off\" spellCheck={false} placeholder=\"ABCD-2345\" onChange={event=>setCode(event.target.value.toUpperCase())}/></label>\n </div>\n <div className=\"lc-actions\" style={{flexWrap:'wrap'}}>\n <button className=\"lc-button primary\" disabled={joining||code.replace(/[^A-Z0-9]/giu,'').length!==8||asAddress(address)===''} onClick={()=>void join()}>{joining?'Pairing…':'Pair and control'}</button>\n {remote&&<button className=\"lc-button\" disabled={joining} onClick={()=>void useThisComputer()}>Use this computer</button>}\n </div>\n {joinError!==''&&<p className=\"lc-notice error\" role=\"alert\">{joinError}</p>}\n {joinNotice!==''&&<p className=\"lc-notice\" role=\"status\">{joinNotice}</p>}\n <p className=\"lc-muted\">On the engine computer open <strong>AryaStrata → Let another computer control this engine</strong>, create a code, then type it here. The code works once and expires after five minutes.</p>\n <details><summary>Use a control token instead</summary>\n <div className=\"lc-connection-fields\">\n <label className=\"lc-field\"><span>Control token</span><input className=\"lc-input\" value={token} autoComplete=\"off\" placeholder=\"the other computer's strata.controlToken\" onChange={event=>setToken(event.target.value)}/></label>\n </div>\n <div className=\"lc-actions\" style={{flexWrap:'wrap'}}>\n <button className=\"lc-button\" disabled={pairing} onClick={()=>void call('/connection/test')}>Test connection</button>\n <button className=\"lc-button\" disabled={pairing} onClick={()=>void call('/connection/save')}>Save and use</button>\n </div>\n {pairError!==''&&<p className=\"lc-notice error\" role=\"alert\">{pairError}</p>}\n {pairNotice!==''&&<p className=\"lc-notice\" role=\"status\">{pairNotice}</p>}\n <p className=\"lc-muted\">Both computers run this plugin. On the other one, set <code>strata.controlToken</code> in its plugin configuration and enter that token here.</p>\n </details>\n {!remote&&target&&!target.acceptsControl&&<p className=\"lc-muted\">This computer has no <code>strata.controlToken</code> and no paired computer yet, so it answers only this computer until one of those is set up.</p>}\n </details>\n <details className=\"lc-connection-setup\"><summary>Let another computer control this engine</summary>\n {offer===undefined\n ?<div className=\"lc-actions\" style={{flexWrap:'wrap'}}><button className=\"lc-button\" disabled={minting} onClick={()=>void createCode()}>{minting?'Creating…':'Create pairing code'}</button></div>\n :<div>\n <p style={{display:'flex',alignItems:'baseline',gap:12,margin:'8px 0'}}><code className=\"lc-code\" style={{fontSize:22,letterSpacing:'0.12em'}}>{offer.display}</code><span className=\"lc-muted\">{remaining===0?'expired':`${remaining} minute${remaining===1?'':'s'} left`} · works once</span></p>\n <ul className=\"lc-facts\">{offer.targets.map(targetAddress=><li key={targetAddress.address}><span className=\"lc-tag\">{targetAddress.kind}</span> <code>{targetAddress.url}</code></li>)}</ul>\n {offer.targets.length===0&&<p className=\"lc-notice\">This computer has no network address another machine can reach, so pair it over Tailscale first.</p>}\n <div className=\"lc-actions\" style={{flexWrap:'wrap'}}><button className=\"lc-button\" disabled={minting} onClick={()=>void createCode()}>{minting?'Creating…':'New code'}</button>{offer.targets[0]!==undefined&&<CopyButton label=\"Copy address\" value={offer.targets[0].url}/>}<CopyButton label=\"Copy code\" value={offer.code}/></div>\n <p className=\"lc-muted\">On the other computer open <strong>AryaStrata → Control another computer</strong>, pick the address above, type the code, then <strong>Pair and control</strong>.</p>\n </div>}\n {offerError!==''&&<p className=\"lc-notice error\" role=\"alert\">{offerError}</p>}\n <details onToggle={event=>{if((event.target as HTMLDetailsElement).open&&devices===undefined)void loadDevices()}}><summary>Paired computers{devices===undefined?'':` (${devices.length})`}</summary>\n <div className=\"lc-actions\" style={{flexWrap:'wrap'}}><button className=\"lc-button\" onClick={()=>void loadDevices()}>Refresh</button></div>\n {devices!==undefined&&devices.length===0&&<p className=\"lc-muted\">No computer is paired with this engine yet.</p>}\n {devices!==undefined&&devices.length>0&&<ul className=\"lc-facts\">{devices.map(device=><li key={device.id}>{device.label} <span className=\"lc-muted\">{new Date(device.created).toLocaleDateString()}</span> <button className=\"lc-button\" disabled={revoking!==''} onClick={()=>void revokeDevice(device.id)}>Unpair</button></li>)}</ul>}\n {deviceNote!==''&&<p className=\"lc-notice\" role=\"status\">{deviceNote}</p>}\n </details>\n </details>\n </div>\n <details style={{marginTop:16}}><summary>Chat output limits</summary><OutputTuning remote={!localHost}/></details>\n {state&&<p className=\"lc-sub\">{state.modelName} · {state.detail}</p>}\n {remote\n ?embedded&&state?.responding?<iframe key={generation} title=\"AryaStrata engine web UI\" src={url?.href} style={{flex:1,width:'100%',minHeight:560,border:'1px solid var(--dsw-alias-border-l1)',borderRadius:12,marginTop:16}}/>:<div className=\"lc-empty\">{!state?'Connecting to '+where+'…':!state.responding?'Start the engine on '+where+' to use its web interface there.':webUi===undefined?'Looking for the engine web interface on '+where+'…':webUi.url===null?webUi.detail:'Open the web UI in a separate tab to use this HTTP engine from a secure page.'}</div>\n :embedded&&state?.responding?<iframe key={generation} title=\"AryaStrata engine web UI\" src={url?.href} style={{flex:1,width:'100%',minHeight:560,border:'1px solid var(--dsw-alias-border-l1)',borderRadius:12,marginTop:16}}/>:<div className=\"lc-empty\">{!state?'Connecting to the engine controller…':!accessible?'Open AryaStrata on the host computer. Its loopback address is unavailable from this device.':!embedded?'Open the web UI in a separate tab to use this HTTP engine from a secure page.':'Start the engine to open its web UI.'}</div>}\n </>}\n </main>\n}\n\n/** Copy one value to the clipboard, saying so only while it happened. */\nfunction CopyButton({label,value}:{label:string;value:string}){\n const [done,setDone]=useState(false)\n return <button className=\"lc-button\" onClick={()=>{void navigator.clipboard.writeText(value).then(()=>{setDone(true);setTimeout(()=>setDone(false),1500)},()=>setDone(false))}}>{done?'Copied':label}</button>\n}\n","import { SidebarIcon } from './Dashboard.tsx'\r\nimport { StrataControlCenter as Dashboard } from './StrataControlCenter.tsx'\r\nexport const inject=['slots']\r\nexport function apply(ctx:{slots:{inject(name:string,cb:()=>unknown):void;register(options:Record<string,unknown>,component:unknown):unknown}}){ctx.slots.inject('main',()=>ctx.slots.register({name:'main',key:'llamacpp'},Dashboard));ctx.slots.inject('sidebar.panellist',()=>ctx.slots.register({name:'sidebar.panellist',id:'llamacpp',order:-7,label:'AryaStrata'},SidebarIcon))}\r\n"],"mappings":";;;;;;;;;EAGA,MAAa,iBAAiB;GAAC;GAAU;GAAY;GAAU;GAAa;EAAQ;;EAKpF,SAAS,WAAW,UAAkB,OAAgC;GACrE,IAAG,eAAe,SAAS,QAAQ,GAAE,OAAO;GAC5C,IAAG,aAAW,YAAU,CAAC,MAAM,SAAQ,OAAO;GAC9C,IAAG;IAAC,OAAO;KAAC;KAAY;KAAY;IAAO,CAAC,CAAC,SAAS,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC,QAAQ;GAAC,QAAM;IAAC,OAAO;GAAK;EAC1G;;EAEA,SAAgB,cAAc,WAAmD;GAChF,OAAO,OAAO,QAAQ,WAAW,MAAM,aAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAS,WAAS,WAAW,UAAS,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,UAAS,YAAU,MAAM,UAAQ,CAAC,EAAA,CAAG,SAAQ,UAAO;IAC1K,IAAG,OAAO,MAAM,kBAAgB,YAAU,CAAC,OAAO,cAAc,MAAM,aAAa,KAAG,MAAM,iBAAe,MAAK,OAAO,CAAC;IACxH,OAAO,CAAC;KAAC,GAAG;KAAM,eAAc,MAAM;KAAc;KAAS,KAAI,WAAS,OAAK,MAAM;KAAG,QAAO,aAAW,WAAS,WAAS;IAAQ,CAAC;GACtI,CAAC,CAAC;EACH;;EAGA,SAAgB,oBAAoB,OAAe,eAA+B;GAChF,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,QAAQ,SAAS,eAAe,MAAM,MAAM,4GAA4G;GACpM,OAAO;EACT;;EAEA,SAAgB,aAAa,WAA4B,UAAkB,IAAY,OAA8B;GACnH,IAAI,CAAC,UAAU,MAAM,UAAU,aAAa,CAAC,WAAW,UAAU,UAAU,MAAM,UAAU,SAAU,GAAG,MAAM,MAAM,gCAAgC;GACrJ,MAAM,SAAS,UAAU,MAAM,UAAU,SAAS,EAAE;GACpD,MAAM,QAAQ,QAAQ,MAAK,UAAS,MAAM,OAAO,EAAE;GACnD,IAAI,CAAC,SAAS,CAAC,MAAM,eAAe,MAAM,MAAM,oDAAoD;GACpG,MAAM,YAAY,oBAAoB,OAAO,MAAM,aAAa;GAChE,OAAO,OAAQ,KAAI,UAAS,MAAM,OAAO,KAAK;IAAE,GAAG;IAAO;GAAU,IAAI,KAAK;EAC/E;;;;EChCA,eAAsB,UAAa,QAAc,OAA4B,CAAC,GAAE,QAA+B;GAC9G,MAAM,WAAS,MAAM,MAAM,UAAQ,QAAO;IAAC,QAAO;IAAO,SAAQ,EAAC,gBAAe,mBAAkB;IAAE,MAAK,KAAK,UAAU;KAAC,MAAK;KAAiB,OAAM;KAAmB;KAAO,SAAQ,EAAC,KAAI;IAAC,CAAC;IAAE,GAAI,SAAO,EAAC,OAAM,IAAE,CAAC;GAAE,CAAC;GACzN,MAAM,OAAK,MAAM,SAAS,KAAK;GAC/B,IAAG,CAAC,SAAS,MAAI,CAAC,KAAK,QAAQ,IAAG,MAAM,MAAM,KAAK,QAAQ,OAAO,WAAS,sCAAsC;GACjH,OAAO,KAAK,OAAO;EACpB;;EAEA,eAAsB,eAAe,QAA6C;GAEjF,MAAM,aAAU,MADK,UAA0C,qBAAoB,CAAC,GAAE,MAAM,EAAA,CACnE,WAAW,MAAK,UAAO,MAAM,OAAK,WAAW;GACtE,IAAG,CAAC,WAAU,MAAM,MAAM,sCAAsC;GAChE,OAAO;EACR;;;;ECRA,eAAsB,aAAa,UAAoB;GACrD,IAAI,CAAC,SAAS,QAAQ,IAAI,cAAc,CAAC,EAAE,SAAS,kBAAkB,GACpE,MAAM,MAAM,SAAS,WAAS,MAAM,wFAAwF,6CAA6C,SAAS,OAAO,qBAAqB;GAEhN,MAAM,SAAS,MAAM,SAAS,KAAK;GACnC,IAAI,CAAC,SAAS,IAAI,MAAM,MAAM,OAAO,UAAU,mBAAmB,SAAS,OAAO,GAAG;GACrF,OAAO;EACT;;;ECXA,MAAM,gBAAc;GAAC;GAAK;GAAK;GAAM;GAAM;GAAM;GAAM;GAAO;GAAO;GAAO;EAAM;EAClF,MAAMA,SAAK;GAAC,QAAO;GAAS,OAAM;GAAc,QAAO;GAAS,aAAY;GAAuF,KAAI;GAAU,MAAK;EAAS;;EAE/L,SAAS,QAAQ,OAAa,SAAgB;GAAC,OAAO,UAAQ,GAAG,QAAQ,QAAM,KAAA,CAAM,QAAQ,CAAC,CAAC,EAAE,KAAG,OAAO,UAAU,KAAK,IAAE,MAAM,eAAe,IAAE,OAAO,KAAK;EAAC;;EAEhK,SAAgB,aAAa,EAAC,OAAM,OAAM,KAAI,KAAI,OAAK,GAAE,UAAS,WAAS,OAAM,UAAQ,OAAM,QAAmJ;GACjP,MAAM,MAAA,GAAGC,MAAAA,MAAAA,CAAM,GAAE,cAAY,SAAO,UAAQD,OAAK,cAAY,KAAA;GAC7D,MAAM,SAAO,UAAQ,cAAc,QAAO,MAAG,KAAG,OAAK,KAAG,GAAG,IAAE,CAAC;GAC9D,MAAM,SAAO,OAAO,SAAS,KAAK,GAAE,OAAK,SAAO,KAAK,IAAI,KAAI,KAAK,IAAI,KAAI,KAAK,CAAC,IAAE;GAClF,MAAM,QAAM,OAAO,QAAQ,MAAK,GAAE,MAAI,KAAK,IAAI,IAAE,IAAI,IAAE,KAAK,IAAI,OAAO,QAAO,IAAI,IAAE,IAAE,MAAK,CAAC;GAC5F,MAAM,QAAM,OAAO,QAAO,MAAG;IAAC;IAAM;IAAM;IAAO;IAAO;GAAM,CAAC,CAAC,SAAS,CAAC,CAAC;GAC3E,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KAAiC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CAAiC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OAAO,SAAS,KAAG;OAAW,UAAA;MAAa,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,SAAS,KAAG;OAAW,UAAA,SAAO,QAAQ,OAAM,OAAO,IAAE;MAAY,CAAA,CAAM;;KACnM,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CAA6B,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OAAO,IAAI,KAAG;OAAU,WAAU;OAAgB,MAAK;OAAQ,cAAY,QAAM,MAAIA,OAAK;OAAQ,oBAAkB,cAAY,KAAG,UAAQ,KAAA;OAAW,kBAAgB,SAAO,QAAQ,OAAM,OAAO,KAAG,UAAQ,MAAIA,OAAK,SAAO,MAAI,KAAA;OAAW,KAAK,UAAQ,IAAE;OAAK,KAAK,UAAQ,OAAO,SAAO,IAAE;OAAK,MAAM,UAAQ,IAAE;OAAM,OAAO,UAAQ,QAAM;OAAgB;OAAU,WAAU,UAAO,SAAS,UAAQ,OAAO,OAAO,MAAM,OAAO,KAAK,KAAI,OAAO,MAAM,OAAO,KAAK,CAAC;MAAG,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OAAO,WAAU;OAAyB,cAAY;OAAO,OAAOA,OAAK;OAAO,MAAK;OAAc;OAAU;OAAW;OAAM,OAAO,SAAO,QAAM;OAAc;OAAU,WAAU,UAAO,SAAS,MAAM,OAAO,UAAQ,KAAG,MAAI,OAAO,MAAM,OAAO,KAAK,CAAC;MAAG,CAAA,CAAM;;KAC3uB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CAA+B,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,QAAQ,KAAI,OAAO,EAAQ,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,QAAQ,KAAI,OAAO,EAAQ,CAAA,CAAM;;KACzG,WAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAU;MAAkB,MAAK;MAAQ,cAAY,QAAM;MAAmB,UAAA,MAAM,KAAI,MAAG,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAgB,MAAK;OAAS,WAAW,gBAAc,UAAQ,IAAE,YAAU;OAAU,cAAY,QAAM,MAAI,QAAQ,GAAE,IAAI;OAAG,gBAAc,UAAQ;OAAa;OAAU,eAAa,SAAS,CAAC;OAAI,UAAA,QAAQ,GAAE,IAAI;MAAU,GAA/M,CAA+M,CAAC;KAAO,CAAA;KAC7U,eAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,IAAI,KAAG;MAAS,WAAU;MAAU,UAAA;KAAe,CAAA;IAChE;;EACN;;;ECfA,MAAME,SAAK;GAAC,OAAM;GAAc,OAAM;GAAa,OAAM;GAA6B,MAAK;GAAoB,QAAO;GAAgB,OAAM;GAAmC,MAAK;GAAoV,OAAM;GAAiH,QAAO;EAAuE;;EAE7sB,SAAgB,aAAa,EAAC,QAAO,eAAa,MAA0C;GAC3F,MAAK,CAAC,WAAU,iBAAA,GAAcC,MAAAA,SAAAA,CAA+B,IAAI,GAAE,CAAC,gBAAe,sBAAA,GAAmBA,MAAAA,SAAAA,CAAS,EAAE,GAAE,CAAC,UAAS,gBAAA,GAAaA,MAAAA,SAAAA,CAAS,EAAE,GAAE,CAAC,OAAM,aAAA,GAAUA,MAAAA,SAAAA,CAAS,KAAK,GAAE,CAAC,MAAK,YAAA,GAASA,MAAAA,SAAAA,CAAS,KAAK,GAAE,CAAC,OAAM,aAAA,GAAUA,MAAAA,SAAAA,CAAS,EAAE,GAAE,CAAC,SAAQ,eAAA,GAAYA,MAAAA,SAAAA,CAAS,EAAE;GACrR,MAAM,SAAO,cAAc,SAAS;GACpC,MAAM,QAAM,OAAO,MAAK,UAAO,MAAM,QAAM,QAAQ,GAAE,MAAI,OAAO,iBAAe,QAAO,UAAQ,KAAK,IAAI,MAAK,MAAI,IAAI,GAAE,cAAY,KAAK,IAAI,MAAK,KAAK,MAAM,MAAI,CAAC,CAAC;GACjK,eAAe,OAAM;IAAC,QAAQ,IAAI;IAAE,SAAS,EAAE;IAAE,IAAG;KAAC,aAAa,MAAMC,eAAS,CAAC;IAAC,SAAO,GAAE;KAAC,SAAS,aAAa,QAAM,EAAE,UAAQ,OAAO,CAAC,CAAC;IAAC,UAAQ;KAAC,QAAQ,KAAK;IAAC;GAAC;GACrK,CAAA,GAAA,MAAA,UAAA,OAAc;IAAC,IAAG,CAAC,QAAO,KAAU;GAAC,GAAE,CAAC,MAAM,CAAC;GAC/C,CAAA,GAAA,MAAA,UAAA,OAAc;IAAC,IAAG,CAAC,gBAAc,CAAC,aAAW,mBAAiB,cAAa;IAAO,MAAM,OAAK,cAAc,SAAS,CAAC,CAAC,MAAK,UAAO,MAAM,QAAM,YAAY;IAAE,IAAG,MAAK;KAAC,kBAAkB,YAAY;KAAE,YAAY,YAAY;KAAE,SAAS,KAAK,aAAW,KAAK,IAAI,OAAM,KAAK,gBAAc,IAAI,CAAC;KAAE,WAAW,EAAE;KAAE,SAAS,EAAE;IAAC;GAAC,GAAE;IAAC;IAAa;IAAU;GAAc,CAAC;GACtW,SAAS,OAAO,KAAW;IAAC,YAAY,GAAG;IAAE,MAAM,OAAK,OAAO,MAAK,UAAO,MAAM,QAAM,GAAG;IAAE,SAAS,MAAM,aAAW,KAAK,IAAI,OAAM,MAAM,iBAAe,KAAK,CAAC;IAAE,WAAW,EAAE;IAAE,SAAS,EAAE;GAAC;GAC7L,eAAe,OAAM;IAAC,IAAG,CAAC,OAAM;IAAO,QAAQ,IAAI;IAAE,SAAS,EAAE;IAAE,WAAW,EAAE;IAAE,IAAG;KAAC,MAAM,QAAM,MAAMA,eAAS;KAAE,MAAM,UAAQ,aAAa,OAAM,MAAM,UAAS,MAAM,IAAG,KAAK;KAAE,MAAMC,UAAI,mBAAkB;MAAC,IAAG,MAAM;MAAG,kBAAiB,MAAM;MAAS,KAAI,CAAC;OAAC,IAAG;OAAM,MAAK;QAAC;QAAY,MAAM;QAAS;OAAQ;OAAE,OAAM;MAAO,CAAC;KAAC,CAAC;KAAE,aAAa,MAAMD,eAAS,CAAC;KAAE,WAAWF,OAAK,KAAK;IAAC,SAAO,GAAE;KAAC,SAAS,aAAa,QAAM,EAAE,UAAQ,OAAO,CAAC,CAAC;IAAC,UAAQ;KAAC,QAAQ,KAAK;IAAC;GAAC;GAC9c,IAAI,UAAQ;GAAM,IAAG;IAAC,oBAAoB,OAAM,GAAG;GAAC,QAAM;IAAC,UAAQ;GAAI;GACvE,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;IAAnB,UAAA,CAA6B,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAKA,OAAK,MAAU,CAAA,GAAE,SAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAU;KAAUA,UAAAA,OAAK;IAAU,CAAA,IAAE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;KAAE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;MAAO,WAAU;MAAjB,UAAA,CAA6BA,OAAK,OAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;OAAQ,WAAU;OAAW,cAAYA,OAAK;OAAO,OAAO;OAAU,UAAU;OAAM,WAAU,UAAO,OAAO,MAAM,OAAO,KAAK;OAAhI,UAAA,CAAmI,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,OAAM;QAAG,UAAA;OAAsB,CAAA,GAAE,OAAO,KAAI,UAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAwB,OAAO,MAAM;QAArC,UAAA;SAA2C,MAAM,QAAM,MAAM;SAAG;SAAI,MAAM;QAAiB;OAA9E,GAAA,MAAM,GAAwE,CAAC,CAAU;MAAQ,CAAA,CAAA;;KAAE,SAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MAAE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;OAAG,WAAU;OAAb,UAAA;QAAsB;SAAW,MAAI,KAAA,CAAM,eAAe;QAAE;QAA0B,MAAM,WAAW,eAAe,KAAG;OAAsB;;MAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;OAAc,OAAOA,OAAK;OAAc;OAAO,KAAK;OAAM,KAAK;OAAS,MAAM;OAAM,UAAU;OAAM,MAAMA,OAAK;OAAM,UAAU;MAAU,CAAA;MAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAc,UAAA;QAAC;QAAK;QAAM;QAAM;OAAK,CAAC,CAAC,QAAO,MAAG,KAAG,WAAW,CAAC,CAAC,KAAI,MAAG,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAgB,WAAW,gBAAc,MAAI,QAAM,YAAU;QAAU,UAAU;QAAM,eAAa,SAAS,CAAC;QAA9G,UAAA,CAAkH,IAAE,MAAK,UAAgB;OAA5H,GAAA,CAA4H,CAAC;MAAO,CAAA;KAAG,EAAA,CAAA;KAAG,CAAC,QAAM,CAAC,OAAO,UAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAU;MAAUA,UAAAA,OAAK;KAAS,CAAA;KAAE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CAA4B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,WAAU;OAAoB,UAAU,QAAM,CAAC,SAAO;OAAS,eAAa,KAAK,KAAK;OAAIA,UAAAA,OAAK;MAAa,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,WAAU;OAAY,UAAU;OAAM,eAAa,KAAK,KAAK;OAAIA,UAAAA,OAAK;MAAe,CAAA,CAAM;;KAAE,SAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAU;MAAkB,MAAK;MAAS,UAAA;KAAS,CAAA;KAAG,WAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAU;MAAY,MAAK;MAAU,UAAA;KAAW,CAAA;IAAI,EAAA,CAAA,CAAW;;EACl5C;;;ECdA,MAAM,OAAK;GAAC,OAAM;GAAgB,SAAQ;GAAiB,SAAQ;GAAsB,WAAU;GAAiB,aAAY;GAAmB,cAAa;GAAyB,OAAM;GAAgB,QAAO;GAAgB,MAAK;GAAuB,MAAK;EAA2Y;;EAElpB,SAAgB,aAAa,EAAC,OAAM,MAAK,QAAkH;GAC1J,MAAM,CAAC,QAAO,cAAA,GAAWI,MAAAA,SAAAA,CAA8B,IAAI;GAC3D,CAAA,GAAA,MAAA,UAAA,OAAc;IAAC,IAAG,OAAO,YAAU,KAAA,KAAW,MAAM,YAAU,KAAA,KAAW,MAAM,cAAY,KAAA,KAAW,MAAM,gBAAc,KAAA,KAAW,MAAM,WAAS,KAAA,KAAW,MAAM,UAAQ,KAAA,KAAW,MAAM,iBAAe,KAAA,GAAU,UAAU;KAAC,SAAQ,MAAM;KAAQ,SAAQ,MAAM;KAAQ,WAAU,MAAM;KAAU,aAAY,MAAM;KAAY,QAAO,MAAM;KAAO,OAAM,MAAM;KAAM,cAAa,MAAM;IAAY,CAAC;GAAC,GAAE;IAAC,OAAO;IAAQ,OAAO;IAAQ,OAAO;IAAU,OAAO;IAAY,OAAO;IAAO,OAAO;IAAM,OAAO;GAAY,CAAC;GACjgB,IAAG,CAAC,QAAO,OAAO;GAClB,MAAM,WAAS,QAAM,OAAO,UAAQ;GACpC,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,OAAO,EAAC,WAAU,GAAE;IAA7B,UAAA;KAAgC,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;MAAS,WAAU;MAAY,UAAA,KAAK;KAAe,CAAA;KAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CAA4B;OAAC;QAAC;QAAU;QAAK;OAAM;OAAE;QAAC;QAAU;QAAI;OAAI;OAAE;QAAC;QAAY;QAAE;OAAK;OAAE;QAAC;QAAc;QAAE;OAAC;MAAC,CAAC,CAAW,KAAK,CAAC,KAAI,KAAI,SAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;OAAwB,OAAO,YAAU,KAAK;OAAM,OAAO,OAAO;OAAW;OAAU;OAAe;OAAU,SAAS,QAAM;OAAW,WAAU,UAAO,WAAU,YAAS;QAAC,IAAG,CAAC,SAAQ,OAAO;QAAQ,MAAM,OAAK;SAAC,GAAG;UAAS,MAAK;QAAK;QAAE,IAAG,KAAK,eAAa,KAAK,UAAQ,MAAK,KAAK,eAAa,KAAK,IAAI,MAAK,KAAK,UAAQ,IAAI;QAAE,OAAO;OAAI,CAAC;MAAG,GAApU,GAAoU,CAAC,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;OAAc,OAAO,YAAU,KAAK;OAAc,OAAO,OAAO;OAAc,KAAK;OAAM,KAAK,KAAK,IAAI,MAAK,OAAO,UAAQ,IAAI;OAAa;OAAU,WAAU,UAAO,WAAU,YAAS;QAAC,GAAG;QAAQ,cAAa;OAAK,EAAE;MAAG,CAAA,CAAM;;KAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;MAAO,WAAU;MAAjB,UAAA,CAA6B,KAAK,OAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;OAAQ,WAAU;OAAqB;OAAU,OAAO,OAAO;OAAO,WAAU,UAAO,UAAU;QAAC,GAAG;QAAO,OAAM,MAAM,OAAO,UAAQ,QAAM,QAAM;OAAO,CAAC;OAA3J,UAAA,CAA8J,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,OAAM;QAAQ,UAAA;OAAa,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,OAAM;QAAM,UAAA;OAAW,CAAA,CAAS;MAAQ,CAAA,CAAA;;KAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;MAAO,WAAU;MAAjB,UAAA,CAA4B,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OAAO,MAAK;OAAqB;OAAU,SAAS,OAAO;OAAQ,WAAU,UAAO,UAAU;QAAC,GAAG;QAAO,QAAO,MAAM,OAAO;OAAO,CAAC;MAAG,CAAA,GAAE,KAAK,MAAc;;KAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,WAAU;MAA8B;MAAU,eAAa,KAAK,MAAM;MAAI,UAAA,KAAK;KAAa,CAAA;KAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAU;MAAU,UAAA,KAAK;KAAQ,CAAA;IAAU;;EAC15C;;;ECXA,MAAa,MAAM;;;ECsBnB,SAAS,KAAK,EAAC,OAAK,QAAO,OAAK,MAAgC;GAAC,MAAM,QAA4B;IAAC,MAAK;IAA+E,OAAM;IAA8B,KAAI;IAA8C,UAAS;IAAqC,QAAO;IAA0C,MAAK;IAAoC,MAAK;GAAiB;GAAE,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,OAAO;IAAM,QAAQ;IAAM,SAAQ;IAAY,MAAK;IAAO,QAAO;IAAe,aAAY;IAAM,eAAc;IAAQ,gBAAe;IAAQ,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,GAAG,MAAM,SAAO,MAAM,KAAM,CAAA;GAAM,CAAA;EAAC;EAoCnnB,MAAa,cAAY;;;ECrCzB,MAAM,UAAU,UAA8B;GAC5C,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;GAChC,MAAM,SAAS,OAAO,MAAM,QAAQ,OAAO,EAAE,CAAC;GAC9C,OAAO,OAAO,SAAS,MAAM,IAAI,SAAS,KAAA;EAC5C;EACA,MAAMC,UAAQ,OAA2B,WAA+B;GACtE,MAAM,SAAS,OAAO,KAAK;GAC3B,IAAI,WAAW,KAAA,GAAW,OAAO,KAAA;GACjC,OAAO,WAAW,MAAM,SAAS,MAAO;EAC1C;;;;;;;;EASA,SAAgB,eAAe,MAAgC;GAC7D,MAAM,QAAQ,KAAK,MAAM,QAAQ;GACjC,IAAI,QAAQ;GACZ,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,IAAI,MAAM,MAAM,CAAE,SAAS,iBAAiB,GAAG,QAAQ;GAC1G,MAAM,MAAM,SAAS,IAAI,MAAM,MAAM,KAAK,IAAI;GAC9C,MAAM,MAAwB,CAAC;GAC/B,KAAK,MAAM,QAAQ,KAAK;IACtB,MAAM,UAAU,KAAK,MAAM,YAAY;IACvC,IAAI,SAAS;KACX,MAAM,OAAO,OAAO,QAAQ,EAAE;KAC9B,IAAI,SAAS,KAAA,GAAW,IAAI,WAAW,KAAK,IAAI,IAAI,YAAY,GAAG,IAAI;IACzE;IACA,IAAI;IACJ,IAAK,QAAQ,KAAK,MAAM,oHAAoH,GAAI;KAC9I,IAAI,gBAAgB,OAAO,MAAM,EAAE;KACnC,IAAI,YAAY,OAAO,MAAM,EAAE;KAC/B,IAAI,iBAAiB,OAAO,MAAM,EAAE;KACpC,IAAI,wBAAwB,OAAO,MAAM,EAAE,KAAK,KAAK,OAAO;KAC5D,IAAI,aAAa,OAAO,MAAM,EAAE;IAClC,OAAO,IAAI,iBAAiB,KAAK,IAAI,GAAG;KACtC,IAAI,gBAAgB;KACpB,IAAI,QAAQ;KACZ,IAAI,aAAa;IACnB,OAAO,IAAI,gBAAgB,KAAK,IAAI,GAClC,IAAI,QAAQ;SACP,IAAI,qBAAqB,KAAK,IAAI,GAAG;KAC1C,IAAI,YAAY;KAChB,IAAI,QAAQ,KAAA;IACd,OAAO,IAAK,QAAQ,KAAK,MAAM,sHAAsH,GAAI;KACvJ,IAAI,sBAAsBA,OAAK,MAAM,IAAI,MAAM,EAAE;KACjD,IAAI,qBAAqBA,OAAK,MAAM,IAAI,MAAM,EAAE;KAChD,IAAI,UAAU,OAAO,MAAM,EAAE;IAC/B,OAAO,IAAK,QAAQ,KAAK,MAAM,oDAAoD,GAAI;KACrF,IAAI,cAAc,OAAO,MAAM,EAAE;KACjC,IAAI,aAAa,OAAO,MAAM,EAAE;KAChC,IAAI,aAAa,OAAO,MAAM,EAAE;IAClC,OAAO,IAAI,oDAAoD,KAAK,IAAI,GAAG;KACzE,IAAI,QAAQ,KAAK,QAAQ,2BAA2B,EAAE,CAAC,CAAC,KAAK;KAC7D,IAAI,YAAY;KAChB,IAAI,QAAQ;IACd,OAAO,IAAI,kBAAkB,KAAK,IAAI,GAAG;KACvC,IAAI,UAAU;KACd,IAAI,qBAAqB,KAAA;KACzB,IAAI,sBAAsB,KAAA;IAC5B;GACF;GACA,IAAI,IAAI,WAAW,IAAI,QAAQ,KAAA;GAC/B,OAAO;EACT;;;;;;;;;;ECzEA,SAAgB,cAAc,EAAE,WAAiC;GAC/D,MAAM,CAAC,WAAW,iBAAA,GAAgBC,MAAAA,SAAAA,CAA0B;GAC5D,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAA2B,CAAC,CAAC;GAC3D,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,EAAE;GACnC,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAyB,CAAC,CAAC;GACzD,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAS,CAAC;GAE9C,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,SAAS;IACd,IAAI,QAAQ;IACZ,eAAe,OAAO;KACpB,IAAI;MACF,MAAM,WAAW,MAAM,MAAM,2BAA2B,EAAE,QAAQ,YAAY,QAAQ,GAAI,EAAE,CAAC;MAC7F,IAAI,SAAS,IAAI;OACf,MAAM,QAAQ,MAAM,SAAS,KAAK;OAClC,IAAI,OAAO,aAAa,KAAK;MAC/B;KACF,QAAQ,CAA+D;KACvE,IAAI;MACF,MAAM,WAAW,MAAM,MAAM,oBAAoB,EAAE,QAAQ,YAAY,QAAQ,IAAK,EAAE,CAAC;MACvF,IAAI,SAAS,IAAI;OACf,MAAM,QAAQ,MAAM,SAAS,KAAK;OAClC,IAAI,SAAS,OAAO,MAAM,SAAS,UAAU;QAC3C,QAAQ,MAAM,IAAI;QAClB,WAAW,eAAe,MAAM,IAAI,CAAC;OACvC;MACF;KACF,QAAQ,CAA8D;IACxE;IACA,KAAU;IACV,MAAM,QAAQ,kBAAkB;KAAE,IAAI,SAAS,oBAAoB,WAAW,KAAU;IAAE,GAAG,GAAI;IACjG,aAAa;KAAE,QAAQ;KAAO,cAAc,KAAK;IAAE;GACrD,GAAG,CAAC,SAAS,UAAU,CAAC;GAExB,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,SAAS;IACd,YAAW,YAAW,CAAC,GAAG,SAAS;KAAE,QAAQ,QAAQ,sBAAsB;KAAM,SAAS,QAAQ,uBAAuB;KAAM,MAAM,WAAW,OAAO,EAAE,EAAE,WAAW;IAAK,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;GAC1L,GAAG;IAAC;IAAS,QAAQ;IAAoB,QAAQ;IAAqB;GAAS,CAAC;GAEhF,OAAO;IAAE;IAAW;IAAS;IAAM;IAAS,eAAe,eAAc,UAAS,QAAQ,CAAC;GAAE;EAC/F;;;;EClDA,eAAe,SAAS,OAAiC;GACvD,IAAI;IACF,IAAI,UAAU,WAAW,WAAW;KAAE,MAAM,UAAU,UAAU,UAAU,KAAK;KAAG,OAAO;IAAK;GAChG,SAAS,OAAO,CAAwE;GACxF,IAAI;IACF,MAAM,OAAO,SAAS,cAAc,UAAU;IAC9C,KAAK,QAAQ;IAAO,KAAK,WAAW;IAAM,KAAK,MAAM,WAAW;IAAS,KAAK,MAAM,MAAM;IAAW,KAAK,MAAM,UAAU;IAC1H,SAAS,KAAK,YAAY,IAAI;IAAG,KAAK,OAAO;IAC7C,MAAM,SAAS,SAAS,YAAY,MAAM;IAC1C,KAAK,OAAO;IAAG,OAAO;GACxB,SAAS,OAAO;IAAE,OAAO;GAAM;EACjC;;EAGA,SAAS,KAAK,EAAE,OAAO,MAAM,QAAQ,MAAuD;GAC1F,MAAM,CAAC,QAAQ,cAAA,GAAaC,MAAAA,SAAAA,CAAS,KAAK;GAC1C,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,QAAQ;IACb,MAAM,QAAQ,iBAAiB,UAAU,KAAK,GAAG,IAAI;IACrD,aAAa,aAAa,KAAK;GACjC,GAAG,CAAC,MAAM,CAAC;GACX,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IAAQ,MAAK;IAAS,WAAW,UAAU,SAAS,YAAY;IAAM,cAAY,QAAQ;IAAQ,eAAe,KAAK,SAAS,KAAK,CAAC,CAAC,MAAK,OAAM;KAAE,IAAI,IAAI,UAAU,IAAI;IAAE,CAAC;IAAI,UAAA,SAAS,WAAW,SAAS;GAAe,CAAA;EACrO;;EAGA,SAAS,QAAQ,EAAE,OAAO,OAAO,MAAM,OAAO,QAAwE;GACpH,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CAA4B,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD,EAAA,UAAA,CAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAY,CAAA,GAAE,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;KAAa;KAAa;IAAO,CAAA,CAAU,EAAA,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAY,CAAA,CAAM;;EAC/I;;EAGA,SAAS,KAAK,EAAE,OAAO,SAA2C;GAChE,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CAAyB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAY,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,MAAc,CAAA,CAAM;;EACnF;EAEA,MAAM,WAAW;GAAC;GAAQ;GAAU;EAAM;;;;;EAO1C,SAAgB,UAAU,EAAE,OAAO,WAAkE;GACnG,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAkB,MAAM;GAEtD,MAAM,QADW,OAAO,WAAW,2BAAA,CACb,QAAQ,aAAa,EAAE;GAC7C,MAAM,QAAQ,OAAO,aAAa;GAClC,MAAM,MAAM,mBAAmB,KAAK,0CAA0C;GAE9E,MAAM,OAAO;IACX,MAAM,QAAQ,KAAK,2EAFR,KAAK,UAAU;KAAE;KAAO,UAAU,CAAC;MAAE,MAAM;MAAQ,SAAS;KAAQ,CAAC;KAAG,YAAY;IAAI,CAEF,EAAE;IACnG,QAAQ,0DAA0D,KAAK,8EAA8E,MAAM;IAC3J,MAAM,wEAAwE,KAAK,4FAA4F,MAAM;GACvL;GACA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;IAAU,cAAW;IAAxC,UAAA;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAa,OAAO,EAAE,WAAW,EAAE;MAAlD,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAI,qBAAsB,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAU;OAAS,UAAA;MAAkG,CAAA,CAAM,EAAA,CAAA,GAC9J,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAa,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;QAAM,OAAM;QAAY,OAAO;QAAK,MAAK;OAAqB,CAAA;MAAM,CAAA,CAC7F;;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAS,OAAM;QAAW,OAAO,GAAG,KAAK;QAAM,MAAK;OAAgB,CAAA;OACpE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAS,OAAM;QAAmB,OAAO,GAAG,KAAK;QAAuB,MAAK;OAA4B,CAAA;OACzG,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAS,OAAM;QAAa,OAAO;QAAO,MAAK;OAAkB,CAAA;OACjE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAS,OAAM;QAAkB,OAAO,GAAG,KAAK;QAAa,MAAK;OAAkB,CAAA;OACpF,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAS,OAAM;QAAU,OAAM;QAAgC,MAAK;QAAc,MAAM;OAAQ,CAAA;MAC7F;;KACJ,CAAC,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAU;MAAqB,UAAA;KAAiF,CAAA;KAChI,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAkB,MAAK;OAAU,cAAW;OACxD,UAAA,SAAS,KAAI,SAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAmB,MAAK;QAAS,MAAK;QAAM,iBAAe,YAAY;QAAM,WAAW,iBAAiB,YAAY,OAAO,YAAY;QAAM,eAAe,WAAW,IAAI;QAAI,UAAA,SAAS,SAAS,SAAS,SAAS,WAAW,WAAW;OAAkB,GAA/O,IAA+O,CAAC;MAChR,CAAA,GACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAM,OAAO,KAAK;OAAU,MAAK;MAAsB,CAAA,CACjD,EAAA,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAA,UAAM,KAAK,SAAc,CAAA,CACtB;;IACE;;EACX;;EAGA,SAAgB,WAAW,EAAE,SAA8C;GACzE,MAAM,UAAU,OAAO,YAAY,QAAQ,aAAa,MAAM,OAAO,QAAQ,OAAO,cAAc,eAAe,MAAM,YAAY,MAAM,GAAG,EAAE,MAAM,OAAO,MAAM,iBAAiB,MAAM,QAAQ;GAChM,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;IAAU,cAAW;IAAxC,UAAA,CACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAU;KAAa,OAAO,EAAE,WAAW,EAAE;KAAlD,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAI,SAAU,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAU;MAAS,UAAA;KAAmD,CAAA,CAAM,EAAA,CAAA,GAClG,OAAO,aAAa,QAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CAA+B,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAG,WAAU,SAAU,CAAA,GAAC,UAAc;KAC/F,CAAA,CAAA;IACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAM,OAAM;OAAQ,OAAO,OAAO,aAAa;MAAgB,CAAA;MAC/D,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAM,OAAM;OAAU,OAAO;MAAU,CAAA;MACvC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAM,OAAM;OAAU,OAAO,OAAO,WAAW,OAAO,MAAM,MAAM,QAAQ,eAAe,IAAI;MAAY,CAAA;MACzG,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAM,OAAM;OAAiB,OAAO,OAAO,gBAAgB,OAAO,MAAM,MAAM,aAAa,eAAe,IAAI;MAAY,CAAA;MAC1H,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAM,OAAM;OAAgB,OAAO,OAAO,WAAW,OAAO,MAAM,MAAM,QAAQ,eAAe;MAAI,CAAA;MACnG,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAM,OAAM;OAAU,OAAO,OAAO,aAAa,OAAO,MAAM,MAAM,UAAU,eAAe,IAAI;MAAS,CAAA;MAC1G,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAM,OAAM;OAAa,OAAO,OAAO,eAAe,OAAO,MAAM,OAAO,MAAM,WAAW;MAAI,CAAA;MAC/F,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAM,OAAM;OAAS,OAAO,OAAO,SAAS,YAAY;MAAc,CAAA;MACtE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAM,OAAM;OAAgB,OAAO,OAAO,SAAS;MAAU,CAAA;MAC7D,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAM,OAAM;OAAS,OAAM;MAAkB,CAAA;KAC1C;IACE,CAAA,CAAA;;EACX;;;ECjGA,MAAM,MAAM,QAAmC,OAAO,OAAO,OAAO,MAAM,KAAA,CAAM,QAAQ,CAAC;EACzF,MAAM,QAAQ,UAA8B,SAAS,OAAO,MAAM,SAAS,OAAQ,QAAQ,IAAA,CAAM,QAAQ,CAAC,IAAI,MAAM,MAAM,QAAQ,CAAC;;EAGnI,SAAS,IAAI,EAAE,OAAO,OAAO,QAAQ,YAA2F;GAC9H,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;IAAnB,UAAA;KAA6B,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAU;MAAc,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAY,CAAA;KAAM,CAAA;KAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAU;MAAY,UAAA;KAAW,CAAA;KAAE;KAAU,WAAW,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAU;MAAU,UAAA;KAAU,CAAA;IAAW;;EACnN;;EAGA,SAAS,UAAU,EAAE,WAAwC;GAC3D,MAAM,SAAS,QAAQ,KAAI,WAAU,OAAO,MAAM,CAAC,CAAC,QAAQ,UAA2B,OAAO,UAAU,YAAY,QAAQ,CAAC;GAC7H,IAAI,OAAO,WAAW,GAAG,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAU;IAAW,OAAO,EAAE,SAAS,SAAS;IAAG,UAAA;GAAgD,CAAA;GACxI,MAAM,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,QAAQ;GAC1C,MAAM,SAAS,OAAO,KAAK,OAAO,UAAU,GAAG,KAAK,QAAQ,MAAM,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,EAAE,GAAG,MAAM,KAAK,IAAI,GAAG,QAAQ,GAAG,IAAI,KAAK,CAAC,CAAC,KAAK,GAAG;GACpJ,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAW,SAAQ;IAAc,MAAK;IAAM,cAAY,4BAA4B,OAAO,OAAO;IAAjH,UAAA;KACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,kBAAD;MAAgB,IAAG;MAAoB,IAAG;MAAI,IAAG;MAAI,IAAG;MAAI,IAAG;MAA/D,UAAA,CAAmE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAU;OAAyC,aAAY;MAAM,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,QAAO;OAAI,WAAU;OAAyC,aAAY;MAAI,CAAA,CAAiB;KAAO,CAAA,EAAA,CAAA;KAChQ;MAAC;MAAG;MAAG;MAAG;KAAC,CAAC,CAAC,KAAI,QAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA,CAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,GAAG,OAAO,KAAK,MAAM,MAAM,EAAE;MAAO,QAAO;MAA6B,iBAAgB;KAAM,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,GAAE;MAAI,GAAG,KAAK,MAAM,MAAM;MAAI,UAAA,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE;KAAQ,CAAA,CAAI,EAAA,GAAxL,GAAwL,CAAC;KACzN,OAAO,SAAS,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;MAAS,QAAQ,UAAU,OAAO;MAAW,MAAK;KAA0B,CAAA;KAClG,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MAAkB;MAAQ,QAAO;MAAyC,aAAY;MAAM,eAAc;MAAQ,MAAK;KAAO,CAAA;KAC7H,OAAO,WAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,IAAI;MAAI,IAAI,MAAM,KAAK,IAAI,GAAG,OAAO,KAAM,GAAG,IAAI;MAAK,GAAG;MAAG,MAAK;KAAyC,CAAA;IACxI;;EACP;;;;;EAMA,SAAgB,YAAY,EAAE,QAAQ,cAAc,gBAA2F;GAC7I,MAAM,EAAE,OAAO,OAAO,aAAa,QAAQ,MAAM,KAAK,MAAM,YAAY;GACxE,MAAM,OAAO,cAAc,EAAE,SAAS,KAAK,CAAC;GAC5C,MAAM,CAAC,gBAAgB,sBAAA,GAAqBC,MAAAA,SAAAA,CAAS,KAAK;GAC1D,MAAM,QAAQ,OAAO;GACrB,MAAM,MAAM,KAAK,WAAW,OAAO;GACnC,MAAM,WAAW,KAAK;GACtB,MAAM,YAAY,KAAK;GACvB,MAAM,cAAc,YAAY,QAAQ,YAAY,WAAW,YAAY,MAAM;GACjF,MAAM,SAAS,OAAO,KAAK,QAAQ,UAAU,YAAY,KAAK,QAAQ,UAAU;GAChF,MAAM,UAAU,UAAU;GAC1B,MAAM,UAAU,UAAU,aAAa,OAAO,YAAY;GAC1D,MAAM,QAAQ,SAAS,WAAW,UAAU,YAAY,UAAU,YAAY,UAAU,cAAc,aAAa,UAAU,YAAY,YAAY;GACrJ,MAAM,OAAO,SAAS,QAAQ,UAAU,SAAS,UAAU,SAAS;GACpE,MAAM,UAAU,OAAO,YAAY,KAAA,IAAY,MAAM,KAAK,MAAM,MAAM,UAAU,IAAI,IAAI;GACxF,MAAM,WAAW,OAAO,YAAY,QAAQ,gBAAgB,MAAM,OAAO,OAAO,OAAO,cAAc,iBAAiB,MAAM,YAAY,MAAM,GAAG,EAAE,IAAI;GACvJ,MAAM,WAAW,OAAO,WAAW;GACnC,MAAM,YAAY,SAAS,QAAQ,aAAa,EAAE,IAAI;GACtD,MAAM,WAAW,UAAU,aAAa,OAAO,aAAa;;GAE5D,MAAM,WAAW,UAAU;GAC3B,MAAM,cAAc,YAAY,OAAO,aAAa;GACpD,MAAM,UAAU,OAAO,UAAU,QAAQ;GACzC,MAAM,WAAW,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,QAAQ,iBAAiB,CAAC,CAAC,IAAI;GACzF,MAAM,cAAc,KAAK,QAAQ,QAAO,WAAU,OAAO,UAAU,IAAI,CAAC,CAAC;GACzE,MAAM,cAAc,YAAY,QAAQ,aAAa;GAErD,eAAe,aAAa;IAC1B,IAAI,gBAAgB;IACpB,kBAAkB,IAAI;IACtB,IAAI;KACF,MAAM,MAAM,wBAAwB;MAAE,QAAQ;MAAQ,SAAS,EAAE,oBAAoB,IAAI;MAAG,QAAQ,YAAY,QAAQ,IAAM;KAAE,CAAC;KACjI,QAAQ;IACV,QAAQ,CAAwD,UAAU;KAAE,kBAAkB,KAAK;IAAE;GACvG;GAEA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA;IACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;KAAS,WAAU;KAAU,OAAO,EAAE,SAAS,YAAY;KACzD,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;QAAa,UAAA;OAA0B,CAAA;OACtD,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;QAAI,OAAO;SAAE,UAAU;SAAI,eAAe;QAAQ;QAAG,UAAA;OAAe,CAAA;OACpE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;QAAG,WAAU;QAAb,UAAA;SAAsB;SAAgB;SAAQ;SAAY,OAAO,SAAS,WAAW;SAAY;SAAI,OAAO,eAAe;SAAE;SAAe;QAAY;;OACxJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAU;QAAa,OAAO,EAAE,WAAW,GAAG;QAAnD,UAAA;SACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;UAAM,WAAW,WAAW;UAA5B,UAAA,CAAoC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAG,WAAU,SAAS,CAAA,GAAE,KAAY;;SACxE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;UAAW,UAAA;SAAe,CAAA;SAC1C,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;UAAW,UAAA,OAAO,OAAO,eAAe;SAAU,CAAA;SACjE,OAAO,WAAW,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAU;UAAU,UAAA;SAAY,CAAA;QAC9D;;MACF,EAAA,CAAA,GACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAoB,UAAU,QAAQ,CAAC;SAAU,eAAe,KAAK,IAAI,OAAO;SAAG,UAAA;QAAoB,CAAA;QACzH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAY,UAAU,QAAQ,CAAC;SAAS,eAAe,KAAK,IAAI,MAAM;SAAG,UAAA;QAAmB,CAAA;QAC9G,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAY,UAAU,QAAQ,CAAC;SAAS,eAAe,KAAK,IAAI,SAAS;SAAG,UAAA;QAAsB,CAAA;QACpH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAkB,UAAU;SAAM,eAAe;UAAE,QAAQ;UAAG,KAAK,QAAQ;SAAE;SAAG,UAAA;QAAe,CAAA;SAC/G,WAAW,YAAY,OAAO,YAAY,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;SAAY,MAAM;SAAW,QAAO;SAAS,KAAI;SAAsB,UAAA;QAAwB,CAAA;OAC9J;MACF,CAAA,CAAA;;IACE,CAAA;IAER,UAAU,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAU;KAAkB,MAAK;KAAS,UAAA;IAAS,CAAA;IACtE,gBAAgB,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAU;KAAkB,MAAK;KAAU,UAAA;IAAe,CAAA;IACnF,WAAW,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAU;KAAY,MAAK;KAAU,UAAA;IAAU,CAAA;IAEnE,YAAY,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;KAAS,WAAU;KAAY,MAAK;KAApC,UAAA;MACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAQ,iDAAsD,CAAA;MAAC;MAAE,OAAO;MACxE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACG,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAoB,UAAU;SAAM,eAAe,KAAK,IAAI,OAAO;SAAG,UAAA;QAAwB,CAAA;QAC/H,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAY,UAAU;SAAM,eAAe,KAAK,IAAI,MAAM;SAAG,UAAA;QAAgC,CAAA;QAC/H,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAkB,UAAU;SAAM,eAAe,QAAQ;SAAG,UAAA;QAAsB,CAAA;OACjG;;KACE;;IAER,UAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;KAAS,WAAU;KAAkB,MAAK;KAA1C,UAAA;MACT,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAQ,0BAA+B,CAAA;MAAC;MAAE,KAAK,QAAQ;MACvD,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;OAAG,WAAU;OAAb,UAAA,CAAuB,cAAc,iBAAiB,GAAG,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,eAAe,4BAA4B,GAAG,MAAM,IAAG,oCAAqC;;MAC/L,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAf,UAAA;QACG,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAY,UAAU;SAAgB,eAAe,KAAK,WAAW;SAAI,UAAA,iBAAiB,qBAAqB;QAAsB,CAAA;QACxK,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAoB,UAAU,QAAQ,CAAC;SAAU,eAAe,KAAK,IAAI,OAAO;SAAG,UAAA;QAAmB,CAAA;QACxH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAkB,SAAS;SAAc,UAAA;QAA4B,CAAA;OACpF;;KACE;;IAER,CAAC,UAAU,gBAAgB,UAAU,aAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;KAAS,WAAU;KAAY,MAAK;KAApC,UAAA;MACjD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAQ,sBAA2B,CAAA;MAAC;MAAE,cAAc,eAAe,GAAG,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS;MAAG;MAChH,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OACb,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,WAAU;QAAkB,SAAS;QAAc,UAAA;OAA4B,CAAA;MACpF,CAAA;KACE;;IAER,WAAW,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;KAAS,WAAU;KAAnB,UAAA;MACV,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAa,OAAO,EAAE,WAAW,EAAE;OAAlD,UAAA,CAAqD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAI,gBAAiB,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAU;QAAS,UAAA;OAAuE,CAAA,CAAM,EAAA,CAAA,GAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,WAAU;QAAhB,UAAA;SAA+B,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAG,WAAU,SAAS,CAAA;SAAE,SAAS,QAAQ,CAAC;SAAE;QAAO;OAAM,CAAA,CAAA;;MAC5Q,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAS,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,OAAO,EAAE,OAAO,WAAW,IAAI,EAAG,CAAA;MAAM,CAAA;MACtE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;OAAG,WAAU;OAAb,UAAA;QAAuB,GAAG,KAAK,QAAQ,SAAS;QAAE;QAAI,GAAG,KAAK,QAAQ,cAAc;QAAE;QAAQ,KAAK,KAAK,QAAQ,uBAAuB,KAAK,QAAQ,uBAAuB,OAAO,OAAO,KAAA,CAAS;QAAE;QAAc,KAAK,QAAQ,cAAc;QAAI;OAAI;;KAC9O;;IAET,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;MAAkB;MAAgB;KAAS,CAAA,GAC3C,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD,EAAmB,MAAO,CAAA,CACvB;;IAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;KAAS,WAAU;KAAU,OAAO,EAAE,WAAW,GAAG;KAApD,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAa,OAAO,EAAE,WAAW,EAAE;MAAlD,UAAA,CAAqD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAI,cAAe,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAU;OAAS,UAAA;MAAyD,CAAA,CAAM,EAAA,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAO,cAAkB,CAAA,CAAM;KACnM,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAK,OAAM;QAAc,OAAO;QAAO,QAAQ,WAAY,KAAK,QAAQ,WAAW,KAAK,IAAI,GAAG,KAAK,QAAQ,QAAQ,cAAc,0BAA2B,UAAU,oBAAoB,SAAS,mBAAmB;OAAc,CAAA;OACrO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAK,OAAM;QAAS,OAAO,UAAU,KAAK,KAAK,QAAQ,kBAAkB,IAAI;QAAK,QAAQ,aAAa,KAAK,KAAK,QAAQ,mBAAmB,IAAI;OAAU,CAAA;OAC1J,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAK,OAAM;QAAiB,OAAO,KAAK,QAAQ,cAAc,OAAO,MAAM,KAAK,QAAQ,WAAW,QAAQ,CAAC,IAAI;QAAK,QAAQ,KAAK,QAAQ,aAAa,GAAG,KAAK,QAAQ,aAAa,eAAe,EAAE,KAAK,KAAK,QAAQ,WAAW,eAAe,EAAE,aAAa;OAA8B,CAAA;OAC9R,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAK,OAAM;QAAO,OAAO,GAAG,GAAG,QAAQ,EAAE,KAAK,GAAG,SAAS,EAAE;QAAM,QAAQ,KAAK,QAAQ;QAAkB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAU;SAAS,OAAO,EAAE,QAAQ,aAAa;SAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,OAAO,EAAE,QAAQ,eAAe,KAAK,IAAI,EAAG,CAAA;QAAM,CAAA;OAAM,CAAA;OAChO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAK,OAAM;QAAW,OAAO,KAAK,eAAe,OAAO,MAAM,KAAK,MAAM,IAAI,WAAW,IAAI;QAAK,QAAQ,KAAK,eAAe,OAAO,mBAAmB,GAAG,KAAK,MAAM,IAAI,WAAW,EAAE,KAAK,IAAI,cAAc,OAAO,KAAK,QAAQ,KAAK,MAAM,IAAI,UAAU,IAAI;OAAQ,CAAA;OACtQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAK,OAAM;QAAU,OAAO;QAAS,QAAQ,GAAG,OAAO,SAAS,WAAW,YAAY,SAAS,OAAO,eAAe;OAAK,CAAA;OAC3H,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAK,OAAM;QAAkB,OAAO,UAAU,OAAO,KAAK,QAAQ,WAAW,CAAC,IAAI;QAAK,QAAQ,GAAG,KAAK,QAAQ,UAAU,eAAe,KAAK,EAAE;OAAmB,CAAA;OAClK,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAK,OAAM;QAAO,OAAO,KAAK,WAAW,UAAU,OAAO,MAAM,KAAK,MAAM,KAAK,UAAU,MAAM,IAAI;QAAK,QAAQ,KAAK,WAAW,cAAc,aAAa,KAAK,UAAU,YAAY,QAAQ,CAAC,EAAE,KAAK,KAAK,UAAU,YAAY,QAAQ,CAAC,EAAE,QAAQ;OAA2B,CAAA;MAC7Q;KACE,CAAA,CAAA;;IAET,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;KAAS,WAAU;KAAnB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAa,OAAO,EAAE,WAAW,EAAE;MAAlD,UAAA,CAAqD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAI,oBAAqB,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAU;OAAS,UAAA;MAAiE,CAAA,CAAM,EAAA,CAAA,GAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA;OAAQ;OAAY;OAAE,gBAAgB,IAAI,WAAW;OAAU;MAAqB,EAAA,CAAA,CAAM;KAC5Q,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAW,SAAS,KAAK,QAAS,CAAA,CAC3B;;IAET,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;KAAqB;KAAa;KAAY;IAAM,CAAA;IACpD,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;KAAS,OAAO,EAAE,WAAW,GAAG;KAAhC,UAAA;MAAmC,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;OAAS,WAAU;OAAW,UAAA;MAAoB,CAAA;MAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAa,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,WAAU;QAAY,eAAe,KAAK,QAAQ;QAAG,UAAA;OAAoB,CAAA;MAAM,CAAA;MAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAe,UAAA,KAAK,SAAS,KAAK,8BAA8B,KAAK;MAAU,CAAA;KAAU;;GAC3S,EAAA,CAAA;EACX;;;;;;;;;;EC3IA,SAAgB,UAAU,EAAE,SAAS,cAAwD;GAC3F,MAAM,CAAC,OAAO,aAAA,GAAYC,MAAAA,SAAAA,CAAuB;GACjD,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,EAAE;GACrC,MAAM,CAAC,aAAa,mBAAA,GAAkBA,MAAAA,SAAAA,CAAS,EAAE;GACjD,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,EAAE;GACvC,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,EAAE;GACnC,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,EAAE;GAC7C,MAAM,YAAA,GAAWC,MAAAA,OAAAA,CAA+B,IAAI;GACpD,MAAM,UAAA,GAASA,MAAAA,OAAAA,CAAO,KAAK;GAE3B,SAAS,aAAa;IACpB,SAAS,SAAS,MAAM;IACxB,MAAM,aAAa,IAAI,gBAAgB;IACvC,SAAS,UAAU;IACnB,CAAM,YAAY;KAChB,IAAI;MACF,MAAM,OAAO,MAAM,aAAa,MAAM,MAAM,sBAAsB,EAAE,QAAQ,YAAY,IAAI,CAAC,WAAW,QAAQ,YAAY,QAAQ,IAAK,CAAC,CAAC,EAAE,CAAC,CAAC;MAC/I,IAAI,WAAW,OAAO,SAAS;MAC/B,SAAS,IAAI;MACb,eAAe,EAAE;KACnB,SAAS,QAAQ;MACf,IAAI,CAAC,WAAW,OAAO,SAAS,eAAe,kBAAkB,QAAQ,OAAO,UAAU,OAAO,MAAM,CAAC;KAC1G;IACF,EAAA,CAAG;GACL;GAEA,eAAe,IAAI,QAAsC;IACvD,IAAI,CAAC,WAAW,OAAO,SAAS;IAChC,OAAO,UAAU;IACjB,QAAQ,IAAI;IACZ,SAAS,EAAE;IACX,UAAU,EAAE;IACZ,IAAI;KACF,MAAM,SAAS,MAAM,aAAa,MAAM,MAAM,iBAAiB,QAAQ;MAAE,QAAQ;MAAQ,SAAS,EAAE,oBAAoB,IAAI;MAAG,QAAQ,YAAY,QAAQ,IAAM;KAAE,CAAC,CAAC;KACrK,UAAU,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS,YAAY,SAAS,aAAa;KAChG,WAAW;IACb,SAAS,QAAQ;KACf,SAAS,kBAAkB,QAAQ,OAAO,UAAU,OAAO,MAAM,CAAC;IACpE,UAAU;KACR,OAAO,UAAU;KACjB,QAAQ,KAAK;IACf;GACF;GAEA,eAAe,KAAK,UAA0B;IAC5C,IAAI,CAAC,WAAW,OAAO,SAAS;IAChC,OAAO,UAAU;IACjB,QAAQ,IAAI;IACZ,SAAS,EAAE;IACX,UAAU,EAAE;IACZ,IAAI;KACF,MAAM,SAAS,MAAM,aAAa,MAAM,MAAM,yBAAyB;MAAE,QAAQ;MAAQ,SAAS;OAAE,oBAAoB;OAAK,gBAAgB;MAAmB;MAAG,MAAM,KAAK,UAAU,QAAQ;MAAG,QAAQ,YAAY,QAAQ,GAAK;KAAE,CAAC,CAAC;KACxO,UAAU,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS,wBAAwB;KACtF,WAAW;IACb,SAAS,QAAQ;KACf,SAAS,kBAAkB,QAAQ,OAAO,UAAU,OAAO,MAAM,CAAC;IACpE,UAAU;KACR,OAAO,UAAU;KACjB,QAAQ,KAAK;IACf;GACF;GAEA,eAAe,WAAW;IACxB,IAAI,CAAC,SAAS;IACd,IAAI;KACF,MAAM,SAAS,MAAM,aAAa,MAAM,MAAM,oBAAoB,EAAE,QAAQ,YAAY,QAAQ,IAAK,EAAE,CAAC,CAAC;KACzG,QAAQ,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO,EAAE;KAC1D,aAAa,EAAE;IACjB,SAAS,QAAQ;KACf,aAAa,kBAAkB,QAAQ,OAAO,UAAU,OAAO,MAAM,CAAC;IACxE;GACF;GAEA,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,SAAS;IACd,WAAW;IACX,IAAI;IACJ,MAAM,iBAAiB;KACrB,QAAQ,iBAAiB;MACvB,IAAI,SAAS,oBAAoB,WAAW,WAAW;MACvD,SAAS;KACX,GAAG,UAAU;IACf;IACA,SAAS;IACT,MAAM,kBAAkB;KAAE,IAAI,SAAS,oBAAoB,WAAW,WAAW;IAAE;IACnF,SAAS,iBAAiB,oBAAoB,SAAS;IACvD,aAAa;KACX,aAAa,KAAK;KAClB,SAAS,oBAAoB,oBAAoB,SAAS;KAC1D,SAAS,SAAS,MAAM;KACxB,SAAS,UAAU;IACrB;GACF,GAAG,CAAC,SAAS,UAAU,CAAC;GAExB,OAAO;IAAE;IAAO;IAAO;IAAa;IAAQ;IAAM;IAAM;IAAW;IAAK;IAAM;IAAU,SAAS;GAAW;EAC9G;;;;EC3FA,MAAM,eAAa,EAAC,mBAAkB,SAAQ;;EAG9C,MAAM,YAAU;;EAGhB,MAAM,gBAAc,EAAC,oBAAmB,IAAG;;EAG3C,SAAS,YAAY,WAAwB;GAC5C,OAAO,KAAK,IAAI,GAAE,KAAK,MAAM,YAAU,KAAK,IAAI,KAAG,GAAK,CAAC;EAC1D;;EAGA,SAAS,UAAU,OAAoB;GACtC,MAAM,UAAQ,MAAM,KAAK;GACzB,IAAG,YAAU,MAAI,QAAQ,WAAW,GAAG,KAAG,4BAA4B,KAAK,OAAO,GAAE,OAAO;GAC3F,OAAO,YAAU;EAClB;;EAGA,SAAgB,sBAAqB;GACpC,MAAM,CAAC,OAAM,aAAA,GAAUC,MAAAA,SAAAA,CAAgB,GAAE,CAAC,QAAO,cAAA,GAAWA,MAAAA,SAAAA,CAAiB,GAAE,CAAC,OAAM,aAAA,GAAUA,MAAAA,SAAAA,CAAS,EAAE,GAAE,CAAC,WAAU,iBAAA,GAAcA,MAAAA,SAAAA,CAAS,EAAE,GAAE,CAAC,QAAO,cAAA,GAAWA,MAAAA,SAAAA,CAAS,EAAE,GAAE,CAAC,MAAK,YAAA,GAASA,MAAAA,SAAAA,CAAS,KAAK,GAAE,CAAC,YAAW,kBAAA,GAAeA,MAAAA,SAAAA,CAAS,CAAC;GACvP,MAAM,CAAC,SAAQ,eAAA,GAAYA,MAAAA,SAAAA,CAAS,EAAE,GAAE,CAAC,OAAM,aAAA,GAAUA,MAAAA,SAAAA,CAAS,EAAE,GAAE,CAAC,SAAQ,eAAA,GAAYA,MAAAA,SAAAA,CAAS,KAAK,GAAE,CAAC,YAAW,kBAAA,GAAeA,MAAAA,SAAAA,CAAS,EAAE,GAAE,CAAC,WAAU,iBAAA,GAAcA,MAAAA,SAAAA,CAAS,EAAE;GACvL,MAAM,CAAC,MAAK,YAAA,GAASA,MAAAA,SAAAA,CAAS,EAAE,GAAE,CAAC,SAAQ,eAAA,GAAYA,MAAAA,SAAAA,CAAS,KAAK,GAAE,CAAC,WAAU,iBAAA,GAAcA,MAAAA,SAAAA,CAAS,EAAE,GAAE,CAAC,YAAW,kBAAA,GAAeA,MAAAA,SAAAA,CAAS,EAAE;GACnJ,MAAM,CAAC,OAAM,aAAA,GAAUA,MAAAA,SAAAA,CAAiB,GAAE,CAAC,UAAS,gBAAA,GAAaA,MAAAA,SAAAA,CAAS,EAAE,GAAE,CAAC,SAAQ,eAAA,GAAYA,MAAAA,SAAAA,CAAS,KAAK;GACjH,MAAM,CAAC,OAAM,aAAA,GAAUA,MAAAA,SAAAA,CAAgB,GAAE,CAAC,YAAW,kBAAA,GAAeA,MAAAA,SAAAA,CAAS,EAAE,GAAE,CAAC,SAAQ,eAAA,GAAYA,MAAAA,SAAAA,CAAS,KAAK;GACpH,MAAM,CAAC,SAAQ,eAAA,GAAYA,MAAAA,SAAAA,CAAmB,GAAE,CAAC,YAAW,kBAAA,GAAeA,MAAAA,SAAAA,CAAS,EAAE,GAAE,CAAC,UAAS,gBAAA,GAAaA,MAAAA,SAAAA,CAAS,EAAE;GAC1H,MAAM,CAAC,OAAM,aAAA,GAAUA,MAAAA,SAAAA,CAA0C;GACjE,MAAM,SAAO,CAAC,CAAC,UAAQ,OAAO,YAAU;GAGxC,MAAM,YAAU,SAAS,aAAW,cAAY;IAAC;IAAY;IAAY;GAAO,CAAC,CAAC,SAAS,SAAS,QAAQ;GAC5G,MAAM,cAAY,aAAW,CAAC;GAC9B,MAAM,CAAC,QAAO,cAAA,GAAWA,MAAAA,SAAAA,CAA4B,QAAQ;GAC7D,MAAM,SAAO,UAAU;IAAC,SAAQ;IAAY,YAAW,WAAS,WAAS,MAAK;GAAK,CAAC;GACpF,MAAM,eAAa,CAAC,WAAU,UAAU,CAAC,CAAC,SAAS,OAAO,SAAO,EAAE;GACnE,MAAM,gBAAc,CAAC,WAAU,UAAU,CAAC,CAAC,SAAS,OAAO,OAAO,SAAO,EAAE;GAC3E,CAAA,GAAA,MAAA,UAAA,OAAc;IAAC,IAAG,CAAC,aAAY,UAAU,QAAQ;GAAC,GAAE,CAAC,WAAW,CAAC;GACjE,CAAA,GAAA,MAAA,UAAA,OAAc;IACb,MAAM,QAAM,IAAI,gBAAgB;IAChC,CAAM,YAAS;KAAC,IAAG;MAAC,UAAU,MAAM,aAAa,MAAM,MAAM,8BAA6B,EAAC,QAAO,YAAY,IAAI,CAAC,MAAM,QAAO,YAAY,QAAQ,IAAK,CAAC,CAAC,EAAC,CAAC,CAAC,CAAW;KAAC,SAAO,GAAE;MAAC,IAAG,CAAC,MAAM,OAAO,SAAQ,aAAa,aAAa,QAAM,EAAE,UAAQ,OAAO,CAAC,CAAC;KAAC;IAAC,EAAA,CAAG;IACrQ,aAAU,MAAM,MAAM;GACvB,GAAE,CAAC,UAAU,CAAC;GACd,CAAA,GAAA,MAAA,UAAA,OAAc;IACb,MAAM,QAAM,IAAI,gBAAgB;IAAE,IAAI,UAAQ;IAC9C,eAAe,UAAS;KAAC,IAAG,SAAQ;KAAO,UAAQ;KAAK,IAAG;MAAC,MAAM,OAAK,MAAM,aAAa,MAAM,MAAM,0BAAyB;OAAC,SAAQ,SAAO,eAAa,CAAC;OAAE,QAAO,YAAY,IAAI,CAAC,MAAM,QAAO,YAAY,QAAQ,IAAK,CAAC,CAAC;MAAC,CAAC,CAAC;MAAE,IAAG,CAAC,MAAM,OAAO,SAAQ;OAAC,SAAS,IAAI;OAAE,aAAa,EAAE;MAAC;KAAC,SAAO,GAAE;MAAC,IAAG,CAAC,MAAM,OAAO,SAAQ,aAAa,aAAa,QAAM,EAAE,UAAQ,OAAO,CAAC,CAAC;KAAC,UAAQ;MAAC,UAAQ;KAAK;IAAC;IAC5Y,QAAa;IAAE,MAAM,QAAM,kBAAgB,KAAK,QAAQ,GAAE,GAAI;IAC9D,aAAU;KAAC,MAAM,MAAM;KAAE,cAAc,KAAK;IAAC;GAC9C,GAAE,CAAC,MAAM,CAAC;GAIV,CAAA,GAAA,MAAA,UAAA,OAAc;IACb,IAAG,CAAC,UAAQ,CAAC,OAAO,MAAK;IACzB,MAAM,QAAM,IAAI,gBAAgB;IAChC,CAAM,YAAS;KAAC,IAAG;MAAC,MAAM,OAAK,MAAM,aAAa,MAAM,MAAM,gCAA8B,OAAO,MAAM,IAAI,GAAE,EAAC,QAAO,YAAY,IAAI,CAAC,MAAM,QAAO,YAAY,QAAQ,GAAK,CAAC,CAAC,EAAC,CAAC,CAAC;MAAqC,IAAG,CAAC,MAAM,OAAO,SAAQ,SAAS,IAAI;KAAC,SAAO,GAAE;MAAC,IAAG,CAAC,MAAM,OAAO,SAAQ,SAAS;OAAC,KAAI;OAAK,QAAO,aAAa,QAAM,EAAE,UAAQ,OAAO,CAAC;MAAC,CAAC;KAAC;IAAC,EAAA,CAAG;IACxW,aAAU,MAAM,MAAM;GACvB,GAAE;IAAC;IAAO,OAAO;IAAK;GAAU,CAAC;GACjC,eAAe,OAAO,WAAmC;IACxD,IAAG,MAAK;IAAO,QAAQ,IAAI;IAAE,SAAS,EAAE;IAAE,UAAU,EAAE;IACtD,IAAG;KAAC,MAAM,SAAO,MAAM,aAAa,MAAM,MAAM,qBAAmB,WAAU;MAAC,QAAO;MAAO,SAAQ,SAAO;OAAC,GAAG;OAAa,oBAAmB;MAAG,IAAE,EAAC,oBAAmB,IAAG;MAAE,QAAO,YAAY,QAAQ,IAAM;KAAC,CAAC,CAAC;KAAE,IAAG,OAAO,OAAM,SAAS,OAAO,KAAK;KAAE,IAAG,OAAO,OAAK,OAAM,MAAM,MAAM,OAAO,MAAM;KAAE,UAAU,OAAO,MAAM;KAAE,eAAc,MAAG,IAAE,CAAC;IAAC,SAAO,GAAE;KAAC,SAAS,aAAa,QAAM,EAAE,UAAQ,OAAO,CAAC,CAAC;IAAC,UAAQ;KAAC,QAAQ,KAAK;IAAC;GAC1a;GACA,eAAe,KAAK,MAA2C,OAAqC;IACnG,IAAG,SAAQ;IAAO,WAAW,IAAI;IAAE,aAAa,EAAE;IAAE,cAAc,EAAE;IACpE,IAAG;KAAC,MAAM,OAAK,SAAO;MAAC,SAAQ,UAAU,OAAO;MAAE;KAAK;KAAE,MAAM,SAAO,MAAM,aAAa,MAAM,MAAM,oBAAkB,MAAK;MAAC,QAAO;MAAO,SAAQ;OAAC,GAAG;OAAc,gBAAe;MAAkB;MAAE,MAAK,KAAK,UAAU,IAAI;MAAE,QAAO,YAAY,QAAQ,GAAK;KAAC,CAAC,CAAC;KAAE,IAAG,OAAO,OAAK,OAAM,MAAM,MAAM,OAAO,MAAM;KAAE,cAAc,OAAO,MAAM;KAAE,IAAG,SAAO,oBAAmB,eAAc,MAAG,IAAE,CAAC;IAAC,SAAO,GAAE;KAAC,aAAa,aAAa,QAAM,EAAE,UAAQ,OAAO,CAAC,CAAC;IAAC,UAAQ;KAAC,WAAW,KAAK;IAAC;GAC/d;GACA,eAAe,kBAAiB;IAAC,WAAW,EAAE;IAAE,SAAS,EAAE;IAAE,MAAM,KAAK,oBAAmB;KAAC,SAAQ;KAAG,OAAM;IAAE,CAAC;GAAC;;GAEjH,eAAe,aAAY;IAC1B,IAAG,SAAQ;IAAO,WAAW,IAAI;IAAE,cAAc,EAAE;IACnD,IAAG;KAAC,MAAM,SAAO,MAAM,aAAa,MAAM,MAAM,8BAA6B,EAAC,QAAO,YAAY,QAAQ,IAAK,EAAC,CAAC,CAAC;KAAE,IAAG,OAAO,OAAK,OAAM,MAAM,MAAM,OAAO,MAAM;KAAE,SAAS,MAAe;IAAC,SAAO,GAAE;KAAC,cAAc,aAAa,QAAM,EAAE,UAAQ,OAAO,CAAC,CAAC;IAAC,UAAQ;KAAC,WAAW,KAAK;IAAC;GACtR;;GAEA,eAAe,OAAM;IACpB,IAAG,SAAQ;IAAO,WAAW,IAAI;IAAE,aAAa,EAAE;IAAE,cAAc,EAAE;IACpE,IAAG;KAAC,MAAM,SAAO,MAAM,aAAa,MAAM,MAAM,wBAAuB;MAAC,QAAO;MAAO,SAAQ;OAAC,GAAG;OAAc,gBAAe;MAAkB;MAAE,MAAK,KAAK,UAAU;OAAC,SAAQ,UAAU,OAAO;OAAE,MAAK,KAAK,QAAQ,gBAAe,EAAE,CAAC,CAAC,YAAY;MAAC,CAAC;MAAE,QAAO,YAAY,QAAQ,GAAK;KAAC,CAAC,CAAC;KAAE,IAAG,OAAO,OAAK,OAAM,MAAM,MAAM,OAAO,MAAM;KAAE,cAAc,OAAO,MAAM;KAAE,QAAQ,EAAE;KAAE,eAAc,MAAG,IAAE,CAAC;IAAC,SAAO,GAAE;KAAC,aAAa,aAAa,QAAM,EAAE,UAAQ,OAAO,CAAC,CAAC;IAAC,UAAQ;KAAC,WAAW,KAAK;IAAC;GACpe;;GAEA,eAAe,gBAAe;IAC7B,IAAG,SAAQ;IAAO,WAAW,IAAI;IAAE,YAAY,EAAE;IACjD,IAAG;KAAC,MAAM,SAAO,MAAM,aAAa,MAAM,MAAM,yBAAwB,EAAC,QAAO,YAAY,QAAQ,GAAK,EAAC,CAAC,CAAC;KAAE,SAAU,OAAO,SAAO,CAAC,CAAY;KAAE,IAAG,OAAO,QAAO,YAAY,OAAO,OAAO,MAAM,CAAC;UAAO,IAAG,EAAE,OAAO,SAAO,CAAC,EAAA,CAAG,QAAO,YAAY,8DAA8D;IAAC,SAAO,GAAE;KAAC,YAAY,aAAa,QAAM,EAAE,UAAQ,OAAO,CAAC,CAAC;IAAC,UAAQ;KAAC,WAAW,KAAK;IAAC;GAC/Y;GACA,eAAe,cAAa;IAC3B,IAAG;KAAC,MAAM,SAAO,MAAM,aAAa,MAAM,MAAM,gCAA+B,EAAC,QAAO,YAAY,QAAQ,IAAK,EAAC,CAAC,CAAC;KAAE,WAAY,OAAO,WAAS,CAAC,CAAc;KAAE,cAAc,EAAE;IAAC,SAAO,GAAE;KAAC,cAAc,aAAa,QAAM,EAAE,UAAQ,OAAO,CAAC,CAAC;IAAC;GACnP;GACA,eAAe,aAAa,IAAU;IACrC,IAAG,aAAW,IAAG;IAAO,YAAY,EAAE;IAAE,cAAc,EAAE;IACxD,IAAG;KAAC,MAAM,SAAO,MAAM,aAAa,MAAM,MAAM,+BAA8B;MAAC,QAAO;MAAO,SAAQ;OAAC,GAAG;OAAc,gBAAe;MAAkB;MAAE,MAAK,KAAK,UAAU,EAAC,GAAE,CAAC;MAAE,QAAO,YAAY,QAAQ,IAAK;KAAC,CAAC,CAAC;KAAE,WAAY,OAAO,WAAS,CAAC,CAAc;KAAE,cAAc,OAAO,OAAK,QAAM,OAAO,SAAO,4DAA4D;IAAC,SAAO,GAAE;KAAC,cAAc,aAAa,QAAM,EAAE,UAAQ,OAAO,CAAC,CAAC;IAAC,UAAQ;KAAC,YAAY,EAAE;IAAC;GACzc;GACA,IAAI;GACJ,IAAG;IAAC,IAAG,OAAM;KAAC,MAAM,UAAQ,UAAQ,OAAO,MAAI,MAAM,MAAI,MAAM;KAAQ,MAAM,YAAU,IAAI,IAAI,OAAO;KAAE,IAAG,CAAC,SAAQ,QAAQ,CAAC,CAAC,SAAS,UAAU,QAAQ,GAAE;MAAC,UAAU,OAAK;MAAU,MAAI;KAAS;IAAC;GAAC,QAAM,CAAwD;GAClQ,MAAM,WAAS,OAAK;IAAC;IAAY;IAAY;GAAO,CAAC,CAAC,SAAS,IAAI,QAAQ;GAI3E,MAAM,aAAW,CAAC,CAAC,QAAM,SAAO,OAAO,OAAK,OAAM,CAAC,YAAU;GAC7D,MAAM,WAAS,cAAY,EAAE,SAAS,aAAW,YAAU,KAAK,aAAW;GAC3E,MAAM,QAAM,SAAO,OAAO,QAAQ,QAAQ,iBAAgB,EAAE,IAAE;GAC9D,MAAM,YAAU,QAAM,YAAY,MAAM,SAAS,IAAE;GACnD,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;IAAM,WAAU;IAAK,OAAO;KAAC,QAAO;KAAO,SAAQ;KAAO,eAAc;KAAS,WAAU;IAAC;IAA5F,UAAA;KAA+F,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,IAAW,CAAA;KACxH,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,WAAU;MAAlB,UAAA,CAA8B,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAI,4BAA6B,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAU;OAAS,UAAA;MAA6E,CAAA,CAAM,EAAA,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,MAAK;OAAS,WAAU;OAAW,UAAA,WAAS,WAAU,OAAO,OAAK,aAAW,OAAO,OAAO,SAAO,gBAAgB,OAAK,aAAW,OAAO,SAAO;MAAqB,CAAA,CAAS;;KAClW,eAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAU,cAAW;MAApC,UAAA,CAA8C,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,WAAW,aAAW,WAAS,WAAS,WAAS;OAAK,gBAAc,WAAS;OAAU,eAAa,UAAU,QAAQ;OAAG,UAAA;MAAc,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,WAAW,aAAW,WAAS,WAAS,WAAS;OAAK,gBAAc,WAAS;OAAU,eAAa,UAAU,QAAQ;OAAG,UAAA;MAAc,CAAA,CAAM;;KAChW,WAAS,YAAU,cAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAqB;MAAsB;MAAc,oBAAkB,UAAU,QAAQ;KAAG,CAAA,IAAE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MAClI,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAa,OAAO,EAAC,UAAS,OAAM;OAAnD,UAAA;QACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAoB,UAAU,QAAM,CAAC,SAAO,MAAM,UAAQ;SAAW,eAAa,KAAK,OAAO,OAAO;SAAG,UAAA;QAAoB,CAAA;QAC9I,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAY,UAAU,QAAM,CAAC,OAAO;SAAO,eAAa,KAAK,OAAO,MAAM;SAAG,UAAA;QAAmB,CAAA;QAClH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAY,UAAU,QAAM,CAAC,OAAO;SAAO,eAAa,KAAK,OAAO,SAAS;SAAG,UAAA;QAAsB,CAAA;QACvH,cAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAU;SAAY,MAAM,KAAK;SAAM,QAAO;SAAS,KAAI;SAAsB,UAAA;QAAyB,CAAA;QAC1H,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAU;SAAY,eAAa;UAAC,SAAS,KAAA,CAAS;UAAE,eAAc,MAAG,IAAE,CAAC;SAAC;SAAG,UAAA;QAAqB,CAAA;OACzG;;MACJ,iBAAe,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;OAAG,WAAU;OAAb,UAAA,CAAsB,mEAA+D,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,WAAU;QAAkB,UAAU;QAAM,eAAa,UAAU,QAAQ;QAAG,UAAA;OAA4B,CAAA,CAAI;;OACzN,SAAO,cAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAU;OAAkB,MAAK;OAAS,UAAA,SAAO;MAAa,CAAA;MACrF,UAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAU;OAAY,MAAK;OAAU,UAAA;MAAU,CAAA;MAC3D,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAgB,OAAO,EAAC,WAAU,GAAE;OAAnD,UAAA;QACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;SAAW,UAAA;QAAiB,CAAA;QAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,MAAc,CAAA;QACnE,UAAQ,OAAO,YAAU,UAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAU;SAAU,UAAA,OAAO,YAAU,YAAU,0BAAwB;QAAwC,CAAA;QACvJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;SAAS,WAAU;SAAsB,OAAO,EAAC,YAAW,OAAM;SAAlE,UAAA;UAAqE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAA,UAAU,SAAO,oBAAkB,2BAAoC,CAAA;UAC3I,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAU;WAAf,UAAA;YACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;aAAO,WAAU;aAAjB,UAAA,CAA4B,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,WAAc,CAAA,GAC/C,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;cAAQ,cAAW;cAAW,WAAU;cAAW,OAAO,OAAO,MAAK,SAAM,UAAU,OAAO,MAAI,UAAU,KAAK,QAAQ,GAAG,WAAW,IAAE,UAAU,OAAO,IAAE;cAAI,WAAU,UAAO;eAAC,IAAG,MAAM,OAAO,UAAQ,IAAG,WAAW,MAAM,OAAO,KAAK;cAAC;cAA1O,UAAA,CACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;eAAQ,OAAM;eAAG,UAAA;cAA0C,CAAA,IACzD,SAAO,CAAC,EAAA,CAAG,KAAI,SAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;eAA2B,OAAO,UAAU,KAAK,QAAQ,GAAG;eAA5D,UAAA;gBAA0E,KAAK;gBAAK;gBAAI,KAAK;eAAgB;cAAhG,GAAA,KAAK,OAA2F,CAAC,CAC9H;aACF,CAAA,CAAA;;YACP,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;aAAK,WAAU;aAAa,OAAO,EAAC,UAAS,OAAM;aAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cAAQ,WAAU;cAAY,UAAU;cAAS,eAAa,KAAK,cAAc;cAAI,UAAA,UAAQ,aAAW;aAAyB,CAAA;YAAM,CAAA;YAC5L,aAAW,MAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;aAAG,WAAU;aAAY,UAAA;YAAY,CAAA;YACrD,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;aAAO,WAAU;aAAjB,UAAA,CAA4B,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,eAAkB,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;cAAO,WAAU;cAAW,OAAO;cAAS,aAAY;cAAsD,WAAU,UAAO,WAAW,MAAM,OAAO,KAAK;aAAG,CAAA,CAAQ;;YAC5N,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;aAAO,WAAU;aAAjB,UAAA,CAA4B,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,eAAkB,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;cAAO,WAAU;cAAW,OAAO;cAAM,WAAW;cAAG,cAAa;cAAM,YAAY;cAAO,aAAY;cAAY,WAAU,UAAO,QAAQ,MAAM,OAAO,MAAM,YAAY,CAAC;aAAG,CAAA,CAAQ;;WAC1O;;UACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAU;WAAa,OAAO,EAAC,UAAS,OAAM;WAAnD,UAAA,CACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,WAAU;YAAoB,UAAU,WAAS,KAAK,QAAQ,gBAAe,EAAE,CAAC,CAAC,WAAS,KAAG,UAAU,OAAO,MAAI;YAAI,eAAa,KAAK,KAAK;YAAI,UAAA,UAAQ,aAAW;WAA2B,CAAA,GACtM,UAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,WAAU;YAAY,UAAU;YAAS,eAAa,KAAK,gBAAgB;YAAG,UAAA;WAAyB,CAAA,CACpH;;UACJ,cAAY,MAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;WAAG,WAAU;WAAkB,MAAK;WAAS,UAAA;UAAa,CAAA;UAC1E,eAAa,MAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;WAAG,WAAU;WAAY,MAAK;WAAU,UAAA;UAAc,CAAA;UACxE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;WAAG,WAAU;WAAb,UAAA;YAAwB;YAA4B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAQ,wDAA6D,CAAA;YAAC;WAA0F;;UACpN,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA;WAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAA,UAAS,8BAAoC,CAAA;WACrD,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;YAAK,WAAU;YACd,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;aAAO,WAAU;aAAjB,UAAA,CAA4B,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,gBAAmB,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;cAAO,WAAU;cAAW,OAAO;cAAO,cAAa;cAAM,aAAY;cAA2C,WAAU,UAAO,SAAS,MAAM,OAAO,KAAK;aAAG,CAAA,CAAQ;;WAC7N,CAAA;WACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;YAAK,WAAU;YAAa,OAAO,EAAC,UAAS,OAAM;YAAnD,UAAA,CACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aAAQ,WAAU;aAAY,UAAU;aAAS,eAAa,KAAK,KAAK,kBAAkB;aAAG,UAAA;YAAuB,CAAA,GACpH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aAAQ,WAAU;aAAY,UAAU;aAAS,eAAa,KAAK,KAAK,kBAAkB;aAAG,UAAA;YAAoB,CAAA,CAC7G;;WACJ,cAAY,MAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;YAAG,WAAU;YAAkB,MAAK;YAAS,UAAA;WAAa,CAAA;WAC1E,eAAa,MAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;YAAG,WAAU;YAAY,MAAK;YAAU,UAAA;WAAc,CAAA;WACxE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;YAAG,WAAU;YAAb,UAAA;aAAwB;aAAsD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,sBAAyB,CAAA;aAAC;YAA0D;;UAChK,EAAA,CAAA;UACR,CAAC,UAAQ,UAAQ,CAAC,OAAO,kBAAgB,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;WAAG,WAAU;WAAb,UAAA;YAAwB;YAAqB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,sBAAyB,CAAA;YAAC;WAA8F;;SAC7M;;QACT,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;SAAS,WAAU;SAAnB,UAAA;UAAyC,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAA,UAAS,2CAAiD,CAAA;UACjG,UAAQ,KAAA,IACP,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;WAAK,WAAU;WAAa,OAAO,EAAC,UAAS,OAAM;WAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,WAAU;YAAY,UAAU;YAAS,eAAa,KAAK,WAAW;YAAI,UAAA,UAAQ,cAAY;WAA8B,CAAA;UAAM,CAAA,IAChM,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA;WACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;YAAG,OAAO;aAAC,SAAQ;aAAO,YAAW;aAAW,KAAI;aAAG,QAAO;YAAO;YAArE,UAAA,CAAwE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,WAAU;aAAU,OAAO;cAAC,UAAS;cAAG,eAAc;aAAQ;aAAI,UAAA,MAAM;YAAc,CAAA,GAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;aAAM,WAAU;aAAhB,UAAA,CAA4B,cAAY,IAAE,YAAU,GAAG,UAAU,SAAS,cAAY,IAAE,KAAG,IAAI,QAAO,eAAmB;YAAI,CAAA,CAAA;;WAClS,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;YAAI,WAAU;YAAY,UAAA,MAAM,QAAQ,KAAI,kBAAe,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;aAAgC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;cAAM,WAAU;cAAU,UAAA,cAAc;aAAW,CAAA;aAAC;aAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,cAAc,IAAU,CAAA;YAAK,EAAA,GAAhH,cAAc,OAAkG,CAAC;WAAM,CAAA;WAC1L,MAAM,QAAQ,WAAS,KAAG,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;YAAG,WAAU;YAAY,UAAA;WAAmG,CAAA;WACvJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;YAAK,WAAU;YAAa,OAAO,EAAC,UAAS,OAAM;YAAnD,UAAA;aAAsD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cAAQ,WAAU;cAAY,UAAU;cAAS,eAAa,KAAK,WAAW;cAAI,UAAA,UAAQ,cAAY;aAAmB,CAAA;aAAE,MAAM,QAAQ,OAAK,KAAA,KAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;cAAY,OAAM;cAAe,OAAO,MAAM,QAAQ,EAAE,CAAC;aAAK,CAAA;aAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;cAAY,OAAM;cAAY,OAAO,MAAM;aAAM,CAAA;YAAM;;WACtU,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;YAAG,WAAU;YAAb,UAAA;aAAwB;aAA2B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAQ,wCAA6C,CAAA;aAAC;aAA8C,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAQ,mBAAwB,CAAA;aAAC;YAAI;;UACxL,EAAA,CAAA;UACN,eAAa,MAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;WAAG,WAAU;WAAkB,MAAK;WAAS,UAAA;UAAc,CAAA;UAC7E,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;WAAS,WAAU,UAAO;YAAC,IAAI,MAAM,OAA8B,QAAM,YAAU,KAAA,GAAU,YAAiB;WAAC;WAA/G,UAAA;YAAkH,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA,CAAS,oBAAiB,YAAU,KAAA,IAAU,KAAG,KAAK,QAAQ,OAAO,EAAY,EAAA,CAAA;YAClM,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;aAAK,WAAU;aAAa,OAAO,EAAC,UAAS,OAAM;aAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cAAQ,WAAU;cAAY,eAAa,KAAK,YAAY;cAAG,UAAA;aAAe,CAAA;YAAM,CAAA;YACzI,YAAU,KAAA,KAAW,QAAQ,WAAS,KAAG,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;aAAG,WAAU;aAAW,UAAA;YAA8C,CAAA;YAC/G,YAAU,KAAA,KAAW,QAAQ,SAAO,KAAG,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;aAAI,WAAU;aAAY,UAAA,QAAQ,KAAI,WAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;cAAqB,OAAO;cAAM;cAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;eAAM,WAAU;eAAY,UAAA,IAAI,KAAK,OAAO,OAAO,CAAC,CAAC,mBAAmB;cAAQ,CAAA;cAAC;cAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;eAAQ,WAAU;eAAY,UAAU,aAAW;eAAI,eAAa,KAAK,aAAa,OAAO,EAAE;eAAG,UAAA;cAAc,CAAA;aAAK,EAAA,GAAjO,OAAO,EAA0N,CAAC;YAAM,CAAA;YACtU,eAAa,MAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;aAAG,WAAU;aAAY,MAAK;aAAU,UAAA;YAAc,CAAA;WAChE;;SACD;;OACL;;MACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;OAAS,OAAO,EAAC,WAAU,GAAE;OAA7B,UAAA,CAAgC,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAA,UAAS,qBAA2B,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD,EAAc,QAAQ,CAAC,UAAW,CAAA,CAAU;;MAChH,SAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;OAAG,WAAU;OAAb,UAAA;QAAuB,MAAM;QAAU;QAAI,MAAM;OAAU;;MAClE,SACC,YAAU,OAAO,aAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAyB,OAAM;OAA2B,KAAK,KAAK;OAAM,OAAO;QAAC,MAAK;QAAE,OAAM;QAAO,WAAU;QAAI,QAAO;QAAuC,cAAa;QAAG,WAAU;OAAE;MAAG,GAApL,UAAoL,IAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAY,UAAA,CAAC,QAAM,mBAAiB,QAAM,MAAI,CAAC,MAAM,aAAW,yBAAuB,QAAM,qCAAmC,UAAQ,KAAA,IAAU,6CAA2C,QAAM,MAAI,MAAM,QAAM,OAAK,MAAM,SAAO;MAAqF,CAAA,IACxiB,YAAU,OAAO,aAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAyB,OAAM;OAA2B,KAAK,KAAK;OAAM,OAAO;QAAC,MAAK;QAAE,OAAM;QAAO,WAAU;QAAI,QAAO;QAAuC,cAAa;QAAG,WAAU;OAAE;MAAG,GAApL,UAAoL,IAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OAAY,UAAA,CAAC,QAAM,yCAAuC,CAAC,aAAW,gGAA8F,CAAC,WAAS,kFAAgF;MAA4C,CAAA;KACxhB,EAAA,CAAA;IACG;;EACP;;EAGA,SAAS,WAAW,EAAC,OAAM,SAAmC;GAC7D,MAAM,CAAC,MAAK,YAAA,GAASA,MAAAA,SAAAA,CAAS,KAAK;GACnC,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IAAQ,WAAU;IAAY,eAAa;KAAC,UAAe,UAAU,UAAU,KAAK,CAAC,CAAC,WAAS;MAAC,QAAQ,IAAI;MAAE,iBAAe,QAAQ,KAAK,GAAE,IAAI;KAAC,SAAM,QAAQ,KAAK,CAAC;IAAC;IAAI,UAAA,OAAK,WAAS;GAAc,CAAA;EAC9M;;;EC3MA,MAAa,SAAO,CAAC,OAAO;EAC5B,SAAgB,MAAM,KAAyH;GAAC,IAAI,MAAM,OAAO,cAAW,IAAI,MAAM,SAAS;IAAC,MAAK;IAAO,KAAI;GAAU,GAAEC,mBAAS,CAAC;GAAE,IAAI,MAAM,OAAO,2BAAwB,IAAI,MAAM,SAAS;IAAC,MAAK;IAAoB,IAAG;IAAW,OAAM;IAAG,OAAM;GAAY,GAAE,WAAW,CAAC;EAAC"}
|