"\u003C!DOCTYPE html\u003E\n\u003Chtml lang=\u0022en\u0022\u003E\n\u003Chead\u003E\n\u003Cmeta charset=\u0022UTF-8\u0022\u003E\n\u003Cmeta name=\u0022viewport\u0022 content=\u0022width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no,viewport-fit=cover\u0022\u003E\n\u003Cmeta name=\u0022apple-mobile-web-app-capable\u0022 content=\u0022yes\u0022\u003E\n\u003Cmeta name=\u0022apple-mobile-web-app-status-bar-style\u0022 content=\u0022black-translucent\u0022\u003E\n\u003Ctitle\u003E1OVR1\u003C/title\u003E\n\u003Cstyle\u003E\n*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}\nhtml,body{width:100%;height:100%;overflow:hidden;position:fixed;inset:0;touch-action:none;font-family:-apple-system,BlinkMacSystemFont,\u0027SF Pro Display\u0027,\u0027Segoe UI\u0027,sans-serif;background:#000;color:#fff}\n:root{--safe-top:env(safe-area-inset-top,0px);--safe-bottom:env(safe-area-inset-bottom,0px);--bar-h:52px;--drag-h:8px}\n#app{position:fixed;inset:0;display:flex}\n.panel-side{position:relative;flex-shrink:0;width:0;transition:width .3s cubic-bezier(.4,0,.2,1);overflow:hidden;background:#0a0a0a}\n.panel-close{position:absolute;z-index:50;bottom:8px;width:36px;height:36px;border-radius:50%;background:rgba(0,0,0,.7);border:1px solid rgba(255,255,255,.1);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s}\n.panel-close:hover{background:rgba(255,255,255,.1)}\n#leftPanel .panel-close{left:8px}#rightPanel .panel-close{right:8px}\n#mainContent{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0;width:100vw;transition:width .3s cubic-bezier(.4,0,.2,1)}\n#mainView{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;background:#000;position:relative;scrollbar-width:none}\n#mainView::-webkit-scrollbar{display:none}\n#mainView\u003E*{min-height:0}\n.view-spinner{width:24px;height:24px;border:2.5px solid rgba(255,255,255,.1);border-top-color:var(--color-primary);border-radius:50%;animation:spin .6s linear infinite;margin:auto}\n@keyframes spin{to{transform:rotate(360deg)}}\n.view-loading{display:flex;align-items:center;justify-content:center;height:200px}\n.drag-bar{height:var(--drag-h);background:#000;display:flex;align-items:center;justify-content:center;cursor:row-resize;touch-action:none;user-select:none;flex-shrink:0}\n.drag-bar-inner{width:48px;height:4px;border-radius:2px;background:#333;transition:all .2s}\n.drag-bar:hover .drag-bar-inner{background:#555;width:56px}\n#bottomExpanded{display:none;overflow-y:auto;background:#0a0a0a}\n#bottomExpanded.open{display:block;flex:0 0 50vh;max-height:50vh}\n#bottomExpanded.full{position:fixed;inset:0;z-index:400;display:block;background:#0a0a0a}\n#bottomBar{height:calc(var(--bar-h) + var(--safe-bottom));padding:0 8px var(--safe-bottom);background:#000;border-top:1px solid rgba(255,255,255,.06);display:flex;align-items:center;gap:2px;flex-shrink:0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}\n#bottomBar::-webkit-scrollbar{display:none}\n.bar-avatar{width:34px;height:34px;border-radius:50%;background:linear-gradient(135deg,var(--color-primary),var(--color-accent));display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:all .2s;border:2px solid transparent;position:relative}\n.bar-avatar.authed{border-color:rgba(255,255,255,.3)}\n.bar-avatar-text{font-size:11px;font-weight:700;color:var(--rule-text-on-primary);text-transform:uppercase}\n.bar-avatar-dot{position:absolute;bottom:0;right:0;width:8px;height:8px;background:var(--color-success);border:2px solid #000;border-radius:50%;display:none}\n.bar-avatar.authed .bar-avatar-dot{display:block}\n.bar-icon{width:34px;height:34px;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;border-radius:8px;position:relative;transition:all .15s}\n.bar-icon:hover{background:rgba(255,255,255,.06);transform:scale(1.05)}\n.bar-icon:active{transform:scale(.92)}\n.bar-icon svg{width:18px;height:18px}\n.bar-dot{position:absolute;bottom:2px;left:50%;transform:translateX(-50%);width:4px;height:4px;border-radius:50%;opacity:0;transition:opacity .2s}\n.bar-icon.active .bar-dot{opacity:1}\n.bar-sep{width:1px;height:20px;background:rgba(255,255,255,.08);margin:0 4px;flex-shrink:0}\n#mediaPlayerLayer{position:fixed;z-index:500;pointer-events:none}\n#mediaPlayerLayer.has-mini{bottom:calc(var(--bar-h) + var(--drag-h) + var(--safe-bottom));left:0;right:0;height:56px;pointer-events:auto}\n#miniPlayer{display:none;height:56px;background:rgba(10,10,10,.95);border-top:1px solid rgba(255,255,255,.08);align-items:center;padding:0 12px;gap:10px}\n#miniPlayer.active{display:flex}\n.mini-thumb{width:40px;height:40px;border-radius:8px;background:linear-gradient(135deg,var(--color-primary),var(--color-accent));flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:16px}\n.mini-info{flex:1;min-width:0}\n.mini-title{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.mini-artist{font-size:11px;color:var(--color-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.mini-controls{display:flex;align-items:center;gap:8px}\n.mini-btn{width:32px;height:32px;border:none;background:transparent;color:var(--color-text);display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:50%;transition:background .2s}\n.mini-btn:hover{background:rgba(255,255,255,.1)}\n.mini-progress{position:absolute;bottom:0;left:0;height:2px;background:linear-gradient(90deg,var(--color-primary),var(--color-accent));transition:width .3s linear}\n.ctx-menu{position:fixed;background:var(--color-surface);border:1px solid var(--color-border);border-radius:12px;padding:4px;min-width:160px;z-index:1000;box-shadow:var(--shadow-lg);display:none}\n.ctx-menu.open{display:block}\n.ctx-item{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:8px;font-size:13px;color:var(--color-text);cursor:pointer;background:transparent;border:none;width:100%;text-align:left;transition:background .15s}\n.ctx-item:hover{background:rgba(255,255,255,.08)}\n.ctx-item svg{width:14px;height:14px;flex-shrink:0;opacity:.6}\n.ctx-sep{height:1px;background:var(--color-border);margin:4px 0}\nbody.full-mode #bottomBar,body.full-mode .drag-bar,body.full-mode #bottomExpanded,body.full-mode #mediaPlayerLayer,body.full-mode .panel-side{display:none!important}\nbody.full-mode #mainContent{width:100vw!important}\nbody.full-mode #mainView{height:100vh}\n\u003C/style\u003E\n\u003Cscript src=\u0022https://cdn.jsdelivr.net/npm/@xano/js-sdk@latest/dist/xano.min.js\u0022 defer\u003E\u003C/script\u003E\n\u003C/head\u003E\n\u003Cbody\u003E\n\u003Cdiv id=\u0022app\u0022\u003E\n\u003Cdiv id=\u0022leftPanel\u0022 class=\u0022panel-side\u0022\u003E\n  \u003Cbutton class=\u0022panel-close\u0022 onclick=\u0022Shell.closeLeft()\u0022\u003E\u003Csvg width=\u002216\u0022 height=\u002216\u0022 viewBox=\u00220 0 24 24\u0022 fill=\u0022none\u0022 stroke=\u0022currentColor\u0022 stroke-width=\u00222\u0022\u003E\u003Cpath d=\u0022M18 6L6 18M6 6l12 12\u0022/\u003E\u003C/svg\u003E\u003C/button\u003E\n  \u003Cdiv id=\u0022leftSlot\u0022 style=\u0022position:absolute;inset:0;overflow:auto\u0022\u003E\u003C/div\u003E\n\u003C/div\u003E\n\u003Cdiv id=\u0022mainContent\u0022\u003E\n  \u003Cdiv id=\u0022mainView\u0022\u003E\u003C/div\u003E\n  \u003Cdiv class=\u0022drag-bar\u0022 id=\u0022bottomDrag\u0022 onpointerdown=\u0022Shell.onDragStart(event)\u0022\u003E\u003Cdiv class=\u0022drag-bar-inner\u0022 id=\u0022dragInner\u0022\u003E\u003C/div\u003E\u003C/div\u003E\n  \u003Cdiv id=\u0022bottomExpanded\u0022\u003E\u003C/div\u003E\n  \u003Cdiv id=\u0022bottomBar\u0022\u003E\n    \u003Cdiv class=\u0022bar-avatar\u0022 id=\u0022barAvatar\u0022 onclick=\u0022Shell.toggleLeft()\u0022\u003E\n      \u003Cspan class=\u0022bar-avatar-text\u0022 id=\u0022barAvatarText\u0022\u003E?\u003C/span\u003E\n      \u003Cdiv class=\u0022bar-avatar-dot\u0022\u003E\u003C/div\u003E\n    \u003C/div\u003E\n    \u003Cdiv class=\u0022bar-sep\u0022\u003E\u003C/div\u003E\n    \u003Cdiv id=\u0022barTabs\u0022 style=\u0022display:flex;align-items:center;gap:2px\u0022\u003E\u003C/div\u003E\n  \u003C/div\u003E\n\u003C/div\u003E\n\u003Cdiv id=\u0022rightPanel\u0022 class=\u0022panel-side\u0022\u003E\n  \u003Cbutton class=\u0022panel-close\u0022 onclick=\u0022Shell.closeRight()\u0022\u003E\u003Csvg width=\u002216\u0022 height=\u002216\u0022 viewBox=\u00220 0 24 24\u0022 fill=\u0022none\u0022 stroke=\u0022currentColor\u0022 stroke-width=\u00222\u0022\u003E\u003Cpath d=\u0022M18 6L6 18M6 6l12 12\u0022/\u003E\u003C/svg\u003E\u003C/button\u003E\n  \u003Cdiv id=\u0022rightSlot\u0022 style=\u0022position:absolute;inset:0;overflow:auto\u0022\u003E\u003C/div\u003E\n\u003C/div\u003E\n\u003C/div\u003E\n\u003Cdiv id=\u0022mediaPlayerLayer\u0022\u003E\n  \u003Cdiv id=\u0022miniPlayer\u0022\u003E\n    \u003Cdiv class=\u0022mini-thumb\u0022 id=\u0022miniThumb\u0022\u003E\u0026#9835;\u003C/div\u003E\n    \u003Cdiv class=\u0022mini-info\u0022\u003E\u003Cdiv class=\u0022mini-title\u0022 id=\u0022miniTitle\u0022\u003ENo track\u003C/div\u003E\u003Cdiv class=\u0022mini-artist\u0022 id=\u0022miniArtist\u0022\u003E-\u003C/div\u003E\u003C/div\u003E\n    \u003Cdiv class=\u0022mini-controls\u0022\u003E\n      \u003Cbutton class=\u0022mini-btn\u0022 onclick=\u0022MediaPlayer.prev()\u0022\u003E\u003Csvg width=\u002216\u0022 height=\u002216\u0022 viewBox=\u00220 0 24 24\u0022 fill=\u0022currentColor\u0022\u003E\u003Cpath d=\u0022M6 6h2v12H6zm3.5 6l8.5 6V6z\u0022/\u003E\u003C/svg\u003E\u003C/button\u003E\n      \u003Cbutton class=\u0022mini-btn\u0022 id=\u0022miniPlayBtn\u0022 onclick=\u0022MediaPlayer.toggle()\u0022\u003E\u003Csvg width=\u002218\u0022 height=\u002218\u0022 viewBox=\u00220 0 24 24\u0022 fill=\u0022currentColor\u0022\u003E\u003Cpath d=\u0022M8 5v14l11-7z\u0022/\u003E\u003C/svg\u003E\u003C/button\u003E\n      \u003Cbutton class=\u0022mini-btn\u0022 onclick=\u0022MediaPlayer.next()\u0022\u003E\u003Csvg width=\u002216\u0022 height=\u002216\u0022 viewBox=\u00220 0 24 24\u0022 fill=\u0022currentColor\u0022\u003E\u003Cpath d=\u0022M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z\u0022/\u003E\u003C/svg\u003E\u003C/button\u003E\n    \u003C/div\u003E\n    \u003Cdiv class=\u0022mini-progress\u0022 id=\u0022miniProgress\u0022 style=\u0022width:0%\u0022\u003E\u003C/div\u003E\n  \u003C/div\u003E\n\u003C/div\u003E\n\u003Caudio id=\u0022persistentAudio\u0022 preload=\u0022auto\u0022\u003E\u003C/audio\u003E\n\u003Cdiv class=\u0022ctx-menu\u0022 id=\u0022ctxMenu\u0022\u003E\n  \u003Cbutton class=\u0022ctx-item\u0022 onclick=\u0022Shell.ctxAction(\u0027open\u0027)\u0022\u003E\u003Csvg viewBox=\u00220 0 24 24\u0022 fill=\u0022none\u0022 stroke=\u0022currentColor\u0022 stroke-width=\u00222\u0022\u003E\u003Cpath d=\u0022M15 12a3 3 0 11-6 0 3 3 0 016 0z\u0022/\u003E\u003Cpath d=\u0022M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\u0022/\u003E\u003C/svg\u003EOpen\u003C/button\u003E\n  \u003Cdiv class=\u0022ctx-sep\u0022\u003E\u003C/div\u003E\n  \u003Cbutton class=\u0022ctx-item\u0022 onclick=\u0022Shell.ctxAction(\u0027close\u0027)\u0022 style=\u0022color:var(--color-danger)\u0022\u003E\u003Csvg viewBox=\u00220 0 24 24\u0022 fill=\u0022none\u0022 stroke=\u0022currentColor\u0022 stroke-width=\u00222\u0022\u003E\u003Cpath d=\u0022M18 6L6 18M6 6l12 12\u0022/\u003E\u003C/svg\u003EClose\u003C/button\u003E\n\u003C/div\u003E\n\u003Cscript\u003E\nvar componentProps = {};\n\u003C/script\u003E\n\u003Cscript\u003E\n// UCA 3.0 Sovereign Component -- 1OVR1 App Shell\n// Boot: applyCSSProps -\u003E buildLUT -\u003E Shell.init (sync, no async gate)\n// Zero-fallback: no || defaults, no hardcoded values. Inert without props = correct.\n\nvar _THEME_MAP=[[\u0027color_bg\u0027,\u0027--color-bg\u0027],[\u0027color_surface\u0027,\u0027--color-surface\u0027],[\u0027color_surface2\u0027,\u0027--color-surface2\u0027],[\u0027color_border\u0027,\u0027--color-border\u0027],[\u0027color_text\u0027,\u0027--color-text\u0027],[\u0027color_muted\u0027,\u0027--color-muted\u0027],[\u0027color_primary\u0027,\u0027--color-primary\u0027],[\u0027color_accent\u0027,\u0027--color-accent\u0027],[\u0027color_highlight\u0027,\u0027--color-highlight\u0027],[\u0027color_success\u0027,\u0027--color-success\u0027],[\u0027color_warning\u0027,\u0027--color-warning\u0027],[\u0027color_danger\u0027,\u0027--color-danger\u0027],[\u0027color_info\u0027,\u0027--color-info\u0027],[\u0027font_ui\u0027,\u0027--font-ui\u0027],[\u0027font_head\u0027,\u0027--font-head\u0027],[\u0027font_mono\u0027,\u0027--font-mono\u0027],[\u0027font_size_base\u0027,\u0027--font-size-base\u0027],[\u0027font_size_sm\u0027,\u0027--font-size-sm\u0027],[\u0027line_height\u0027,\u0027--line-height\u0027],[\u0027radius_sm\u0027,\u0027--radius-sm\u0027],[\u0027radius_md\u0027,\u0027--radius-md\u0027],[\u0027radius_lg\u0027,\u0027--radius-lg\u0027],[\u0027radius_pill\u0027,\u0027--radius-pill\u0027],[\u0027shadow_sm\u0027,\u0027--shadow-sm\u0027],[\u0027shadow_md\u0027,\u0027--shadow-md\u0027],[\u0027shadow_lg\u0027,\u0027--shadow-lg\u0027],[\u0027transition_speed\u0027,\u0027--transition-speed\u0027],[\u0027transition_easing\u0027,\u0027--transition-easing\u0027],[\u0027rule_text_on_primary\u0027,\u0027--rule-text-on-primary\u0027],[\u0027rule_text_on_accent\u0027,\u0027--rule-text-on-accent\u0027],[\u0027rule_sidebar_bg\u0027,\u0027--rule-sidebar-bg\u0027],[\u0027rule_overlay_bg\u0027,\u0027--rule-overlay-bg\u0027],[\u0027rule_focus_ring\u0027,\u0027--rule-focus-ring\u0027]]\n\nfunction applyCSSProps(theme){\n  var t=theme||componentProps.theme||{},r=document.documentElement\n  _THEME_MAP.forEach(function(p){if(t[p[0]]!=null\u0026\u0026t[p[0]]!==\u0027\u0027)r.style.setProperty(p[1],t[p[0]])})\n  if(t.scheme){document.body.classList.remove(\u0027scheme-dark\u0027,\u0027scheme-light\u0027);document.body.classList.add(\u0027scheme-\u0027+t.scheme)}\n}\n\nvar LUT={}\nfunction buildLUT(){\n  var c=componentProps.config,u=componentProps.user\n  LUT.apiBase=c.api_base\n  LUT.ginBase=c.gin_base\n  LUT.themeEndpoint=c.theme_endpoint\n  LUT.viewEndpoint=c.view_endpoint\n  LUT.authEndpoint=c.auth_endpoint\n  LUT.realtimeCh=c.realtime_channel\n  LUT.realtimeCanonical=c.realtime_canonical\n  LUT.elevenLabsId=c.elevenlabs_agent_id\n  LUT.fullMode=c.full_mode\n  LUT.cacheMax=c.cache_max\n  LUT.tabs=componentProps.tabs\n  LUT.merchantId=componentProps.merchant_id\n  LUT.isAuthed=u.is_authed\n  LUT.role=u.role\n  LUT.userId=u.user_id\n  LUT.username=u.username\n}\n\nvar _cache={_store:{},_order:[],max:12,\n  get:function(k){return this._store[k]||null},\n  set:function(k,v){\n    if(this._store[k]){this._order=this._order.filter(function(x){return x!==k})}\n    else if(this._order.length\u003E=this.max){delete this._store[this._order.shift()]}\n    this._store[k]=v;this._order.push(k)\n  }\n}\n\nvar _bus=new EventTarget()\nfunction emit(ev,d){_bus.dispatchEvent(new CustomEvent(\u0027bus\u0027,{detail:Object.assign({event:ev,ts:Date.now()},d||{})}))}\nfunction on(ev,fn){_bus.addEventListener(\u0027bus\u0027,function(e){if(e.detail.event===ev)fn(e.detail)})}\n\nvar Shell=(function(){\n  var _lo=false,_ro=false,_bo=false,_bf=false,_dr=false,_dy=0,_dw=false\n  var _u=null,_cx=null,_lt=null,_at=0\n\n  function init(){\n    _cache.max=LUT.cacheMax\n    if(LUT.fullMode)document.body.classList.add(\u0027full-mode\u0027)\n    if(LUT.isAuthed\u0026\u0026LUT.username){\n      document.getElementById(\u0027barAvatar\u0027).classList.add(\u0027authed\u0027)\n      document.getElementById(\u0027barAvatarText\u0027).textContent=LUT.username.substring(0,2).toUpperCase()\n    }\n    _buildTabs()\n    if(LUT.authEndpoint){var s=document.createElement(\u0027script\u0027);s.src=LUT.authEndpoint;document.head.appendChild(s)}\n    if(LUT.tabs\u0026\u0026LUT.tabs.length)_lv(LUT.tabs[0].view_id,LUT.tabs[0].slot)\n    on(\u0027view:load\u0027,function(d){_lv(d.view_id,d.slot)})\n    on(\u0027panel:left\u0027,function(d){d.open?openLeft(d.url):closeLeft()})\n    on(\u0027panel:right\u0027,function(d){d.open?openRight(d.url):closeRight()})\n    on(\u0027shell:full\u0027,function(d){setFullMode(d.full)})\n    on(\u0027agent:render\u0027,function(d){_rui(d)})\n    on(\u0027theme:apply\u0027,function(d){if(d.theme){applyCSSProps(d.theme);componentProps.theme=d.theme;emit(\u0027theme:updated\u0027,{theme:d.theme})}})\n    window.addEventListener(\u0027auth:login\u0027,function(e){_oa(e.detail)})\n    window.addEventListener(\u0027auth:logout\u0027,function(){_ol()})\n    document.addEventListener(\u0027click\u0027,function(){document.getElementById(\u0027ctxMenu\u0027).classList.remove(\u0027open\u0027)})\n    window.addEventListener(\u0027keydown\u0027,function(e){\n      if(e.target.tagName===\u0027INPUT\u0027||e.target.tagName===\u0027TEXTAREA\u0027)return\n      if(e.key===\u0027Escape\u0027){closeLeft();closeRight()}\n      if((e.key===\u0027 \u0027||e.key===\u0027k\u0027)\u0026\u0026!e.target.isContentEditable){e.preventDefault();MediaPlayer.toggle()}\n    })\n    _cr()\n  }\n\n  function _buildTabs(){\n    var c=document.getElementById(\u0027barTabs\u0027);c.innerHTML=\u0027\u0027\n    if(!LUT.tabs)return\n    LUT.tabs.forEach(function(tab,i){\n      var el=document.createElement(\u0027div\u0027)\n      el.className=\u0027bar-icon\u0027+(i===0?\u0027 active\u0027:\u0027\u0027)\n      el.title=tab.name;el.dataset.idx=i\n      el.innerHTML=\u0027\u003Csvg fill=\u0022none\u0022 stroke=\u0022\u0027+tab.color+\u0027\u0022 viewBox=\u00220 0 24 24\u0022 stroke-width=\u00221.5\u0022\u003E\u003Cpath stroke-linecap=\u0022round\u0022 stroke-linejoin=\u0022round\u0022 d=\u0022\u0027+tab.icon+\u0027\u0022/\u003E\u003C/svg\u003E\u003Cdiv class=\u0022bar-dot\u0022 style=\u0022background:\u0027+tab.color+\u0027\u0022\u003E\u003C/div\u003E\u0027\n      el.onpointerdown=function(e){_td(e,i)};el.onpointerup=function(){_tu(i)};el.onpointercancel=_cl\n      c.appendChild(el)\n    })\n  }\n\n  function _td(e,i){_cl();_lt=setTimeout(function(){_cx={idx:i};var r=e.target.closest(\u0027.bar-icon\u0027).getBoundingClientRect(),m=document.getElementById(\u0027ctxMenu\u0027);m.style.left=r.left+\u0027px\u0027;m.style.bottom=(window.innerHeight-r.top+8)+\u0027px\u0027;m.style.top=\u0027auto\u0027;m.classList.add(\u0027open\u0027)},500)}\n  function _tu(i){_cl();if(_cx){_cx=null;return}_st(i)}\n  function _cl(){clearTimeout(_lt);_lt=null}\n  function _st(i){_at=i;document.querySelectorAll(\u0027#barTabs .bar-icon\u0027).forEach(function(el,j){el.classList.toggle(\u0027active\u0027,i===j)});var tab=LUT.tabs[i];if(tab)_lv(tab.view_id,tab.slot);emit(\u0027tab:change\u0027,{idx:i,tab:tab})}\n\n  function _lv(id,slot){\n    if(!id)return;var t=document.getElementById(slot||\u0027mainView\u0027);if(!t)return\n    var c=_cache.get(id);if(c){_inj(t,c);return}\n    t.innerHTML=\u0027\u003Cdiv class=\u0022view-loading\u0022\u003E\u003Cdiv class=\u0022view-spinner\u0022\u003E\u003C/div\u003E\u003C/div\u003E\u0027\n    fetch(LUT.viewEndpoint+\u0027?view=\u0027+id,{credentials:\u0027include\u0027})\n      .then(function(r){if(!r.ok)throw new Error(\u0027HTTP \u0027+r.status);return r.text()})\n      .then(function(h){_cache.set(id,h);_inj(t,h);emit(\u0027view:loaded\u0027,{view_id:id,slot:slot})})\n      .catch(function(e){t.innerHTML=\u0027\u003Cdiv style=\u0022padding:40px;text-align:center;color:#555;font-size:13px\u0022\u003EFailed\u003Cbr\u003E\u003Csmall\u003E\u0027+e.message+\u0027\u003C/small\u003E\u003C/div\u003E\u0027;emit(\u0027view:error\u0027,{view_id:id,error:e.message})})\n  }\n\n  function mountComponent(aid,sid,po){\n    var s=document.getElementById(sid);if(!s)return\n    s.innerHTML=\u0027\u003Cdiv class=\u0022view-loading\u0022\u003E\u003Cdiv class=\u0022view-spinner\u0022\u003E\u003C/div\u003E\u003C/div\u003E\u0027\n    var ck=\u0027app:\u0027+aid+\u0027:\u0027+JSON.stringify(po||{}),ca=_cache.get(ck);if(ca){_inj(s,ca);return}\n    fetch(LUT.viewEndpoint+\u0027?view=\u0027+aid,{credentials:\u0027include\u0027})\n      .then(function(r){return r.text()})\n      .then(function(h){\n        var p=Object.assign({},po||{})\n        if(!p.theme\u0026\u0026componentProps.theme)p.theme=componentProps.theme\n        if(Object.keys(p).length)h=h.replace(/var\\s+componentProps\\s*=\\s*\\{\\s*\\}\\s*;/,\u0027var componentProps = \u0027+JSON.stringify(p)+\u0027;\u0027)\n        _cache.set(ck,h);_inj(s,h);emit(\u0027component:mounted\u0027,{app_id:aid,slot:sid})\n      })\n      .catch(function(e){s.innerHTML=\u0027\u003Cdiv style=\u0022padding:20px;color:#555;font-size:12px\u0022\u003EMount failed: \u0027+e.message+\u0027\u003C/div\u003E\u0027;emit(\u0027component:error\u0027,{app_id:aid,error:e.message})})\n  }\n\n  function _inj(c,h){\n    var b=h.match(/\u003Cbody[^\u003E]*\u003E([\\s\\S]*?)\u003C\\/body\u003E/i);c.innerHTML=b?b[1]:h\n    c.querySelectorAll(\u0027script\u0027).forEach(function(o){var n=document.createElement(\u0027script\u0027);if(o.src){n.src=o.src;n.defer=true}else{n.textContent=o.textContent}o.parentNode.replaceChild(n,o)})\n    c.querySelectorAll(\u0027a[href]\u0027).forEach(function(a){a.addEventListener(\u0027click\u0027,function(e){var h=a.getAttribute(\u0027href\u0027);if(h\u0026\u0026!h.startsWith(\u0027http\u0027)\u0026\u0026!h.startsWith(\u0027#\u0027)){e.preventDefault();navigateTo(h)}})})\n  }\n\n  function navigateTo(url){\n    var mv=document.getElementById(\u0027mainView\u0027)\n    mv.innerHTML=\u0027\u003Cdiv class=\u0022view-loading\u0022\u003E\u003Cdiv class=\u0022view-spinner\u0022\u003E\u003C/div\u003E\u003C/div\u003E\u0027\n    fetch(url,{credentials:\u0027include\u0027}).then(function(r){return r.text()}).then(function(h){_inj(mv,h);history.pushState({url:url},\u0027\u0027,url)}).catch(function(){mv.innerHTML=\u0027\u0027})\n  }\n  window.addEventListener(\u0027popstate\u0027,function(e){if(e.state\u0026\u0026e.state.url)navigateTo(e.state.url)})\n\n  function openLeft(url){_lo=true;document.getElementById(\u0027leftPanel\u0027).style.width=\u0027100vw\u0027;document.getElementById(\u0027mainContent\u0027).style.width=\u00270\u0027;if(url)_ls(\u0027leftSlot\u0027,url);emit(\u0027panel:opened\u0027,{side:\u0027left\u0027})}\n  function closeLeft(){_lo=false;document.getElementById(\u0027leftPanel\u0027).style.width=\u00270\u0027;document.getElementById(\u0027mainContent\u0027).style.width=\u0027100vw\u0027;emit(\u0027panel:closed\u0027,{side:\u0027left\u0027})}\n  function toggleLeft(){if(_lo)closeLeft();else openLeft(LUT.apiBase+\u0027/profile/\u0027+(LUT.username||\u0027\u0027))}\n  function openRight(url){_ro=true;document.getElementById(\u0027rightPanel\u0027).style.width=\u0027100vw\u0027;document.getElementById(\u0027mainContent\u0027).style.width=\u00270\u0027;if(url)_ls(\u0027rightSlot\u0027,url);emit(\u0027panel:opened\u0027,{side:\u0027right\u0027})}\n  function closeRight(){_ro=false;document.getElementById(\u0027rightPanel\u0027).style.width=\u00270\u0027;document.getElementById(\u0027mainContent\u0027).style.width=\u0027100vw\u0027;emit(\u0027panel:closed\u0027,{side:\u0027right\u0027})}\n  function _ls(sid,url){var s=document.getElementById(sid);if(!s)return;s.innerHTML=\u0027\u003Cdiv class=\u0022view-loading\u0022\u003E\u003Cdiv class=\u0022view-spinner\u0022\u003E\u003C/div\u003E\u003C/div\u003E\u0027;fetch(url,{credentials:\u0027include\u0027}).then(function(r){return r.text()}).then(function(h){_inj(s,h)}).catch(function(){s.innerHTML=\u0027\u0027})}\n\n  function setFullMode(f){document.body.classList.toggle(\u0027full-mode\u0027,!!f);LUT.fullMode=!!f;emit(\u0027shell:mode\u0027,{full:!!f})}\n\n  function onDragStart(e){e.preventDefault();_dr=true;_dy=e.clientY;_dw=_bo;document.addEventListener(\u0027pointermove\u0027,_dm);document.addEventListener(\u0027pointerup\u0027,_de);document.getElementById(\u0027dragInner\u0027).style.transition=\u0027none\u0027}\n  function _dm(e){if(!_dr)return;var d=_dy-e.clientY;if(_dw\u0026\u0026d\u003C-50\u0026\u0026_bo)collapseBottom();if(!_dw\u0026\u0026d\u003E50\u0026\u0026!_bo)expandBottom()}\n  function _de(e){if(!_dr)return;_dr=false;document.removeEventListener(\u0027pointermove\u0027,_dm);document.removeEventListener(\u0027pointerup\u0027,_de);document.getElementById(\u0027dragInner\u0027).style.transition=\u0027all .2s\u0027;if(Math.abs(_dy-(e?e.clientY:_dy))\u003C10)expandBottom(true)}\n  function expandBottom(f){_bo=true;_bf=!!f;var el=document.getElementById(\u0027bottomExpanded\u0027),di=document.getElementById(\u0027dragInner\u0027);el.className=\u0027open\u0027+(f?\u0027 full\u0027:\u0027\u0027);di.style.background=\u0027var(--color-primary)\u0027;di.style.boxShadow=\u00270 0 12px rgba(0,0,0,.4)\u0027;emit(\u0027bottom:expanded\u0027,{full:f})}\n  function collapseBottom(){_bo=false;_bf=false;var el=document.getElementById(\u0027bottomExpanded\u0027),di=document.getElementById(\u0027dragInner\u0027);el.className=\u0027\u0027;di.style.background=\u0027#333\u0027;di.style.boxShadow=\u0027none\u0027;emit(\u0027bottom:collapsed\u0027,{})}\n\n  function _oa(u){\n    _u=u;LUT.isAuthed=true;LUT.userId=u.user_id||u.id;LUT.username=u.username\n    document.getElementById(\u0027barAvatar\u0027).classList.add(\u0027authed\u0027)\n    document.getElementById(\u0027barAvatarText\u0027).textContent=(u.username||\u0027?\u0027).substring(0,2).toUpperCase()\n    emit(\u0027auth:user\u0027,{user:u})\n    if(LUT.themeEndpoint){fetch(LUT.themeEndpoint+\u0027?user_id=\u0027+LUT.userId+\u0027\u0026context_type=merchant\u0026context_id=\u0027+LUT.merchantId+\u0027\u0026fallback_id=1\u0027,{credentials:\u0027include\u0027}).then(function(r){return r.ok?r.json():null}).then(function(t){if(t)emit(\u0027theme:apply\u0027,{theme:t,source:\u0027auth\u0027})}).catch(function(){})}\n  }\n  function _ol(){\n    _u=null;LUT.isAuthed=false;LUT.userId=null;LUT.username=null\n    document.getElementById(\u0027barAvatar\u0027).classList.remove(\u0027authed\u0027)\n    document.getElementById(\u0027barAvatarText\u0027).textContent=\u0027?\u0027\n    emit(\u0027auth:logout\u0027,{})\n    if(LUT.themeEndpoint){fetch(LUT.themeEndpoint+\u0027?context_type=merchant\u0026context_id=\u0027+LUT.merchantId+\u0027\u0026fallback_id=1\u0027,{credentials:\u0027include\u0027}).then(function(r){return r.ok?r.json():null}).then(function(t){if(t)emit(\u0027theme:apply\u0027,{theme:t,source:\u0027logout\u0027})}).catch(function(){})}\n  }\n\n  var _xc=null,_ch={}\n  function _cr(){\n    if(!LUT.realtimeCanonical)return\n    function _tc(){if(typeof XanoClient===\u0027undefined\u0027){setTimeout(_tc,100);return}\n      _xc=new XanoClient({instanceBaseUrl:LUT.apiBase+\u0027/\u0027,realtimeCanonical:LUT.realtimeCanonical})\n      _jc(LUT.realtimeCh)\n      on(\u0027auth:user\u0027,function(d){if(d.user\u0026\u0026d.user.id)_jc(\u0027gin/session_\u0027+d.user.id)})\n      emit(\u0027realtime:ready\u0027,{channel:LUT.realtimeCh})\n    }_tc()\n  }\n  function _jc(n){\n    if(!_xc||_ch[n])return;var ch=_xc.channel(n);_ch[n]=ch\n    ch.on(function(m){var p=m.payload||{}\n      switch(m.action){\n        case \u0027render_ui\u0027:if(p.app_id\u0026\u0026p.slot)mountComponent(p.app_id,p.slot,p.props);emit(\u0027agent:render\u0027,p);break\n        case \u0027shell_event\u0027:if(p.event)emit(p.event,p.data||{});break\n        case \u0027full_mode\u0027:setFullMode(!!p.full);break\n        case \u0027agent_push\u0027:emit(\u0027agent:response\u0027,p);break\n        case \u0027theme_update\u0027:if(p.theme)emit(\u0027theme:apply\u0027,{theme:p.theme,source:\u0027realtime\u0027});break\n        case \u0027notification\u0027:emit(\u0027notification\u0027,p);break\n        default:emit(\u0027realtime:message\u0027,{channel:n,action:m.action,payload:p})\n      }\n    })\n    emit(\u0027realtime:joined\u0027,{channel:n});return ch\n  }\n  function joinChannel(n){return _jc(n)}\n  function sendToChannel(n,a,p){var ch=_ch[n];if(ch)ch.message({action:a,payload:p})}\n  function _rui(d){if(d.app_id\u0026\u0026d.slot)mountComponent(d.app_id,d.slot,d.props);else if(d.view_id)_lv(d.view_id,d.slot||\u0027mainView\u0027)}\n  function ctxAction(a){document.getElementById(\u0027ctxMenu\u0027).classList.remove(\u0027open\u0027);if(!_cx)return;if(a===\u0027open\u0027)_st(_cx.idx);emit(\u0027ctx:action\u0027,{action:a,tab:LUT.tabs[_cx.idx]});_cx=null}\n\n  return{init:init,openLeft:openLeft,closeLeft:closeLeft,toggleLeft:toggleLeft,openRight:openRight,closeRight:closeRight,navigateTo:navigateTo,mountComponent:mountComponent,setFullMode:setFullMode,expandBottom:expandBottom,collapseBottom:collapseBottom,onDragStart:onDragStart,ctxAction:ctxAction,injectHTML:_inj,joinChannel:joinChannel,send:sendToChannel,getUser:function(){return _u},getChannels:function(){return _ch}}\n})()\n\nvar MediaPlayer=(function(){\n  var a=document.getElementById(\u0027persistentAudio\u0027),pl=false,tr=null,ls=[],ix=0\n  a.addEventListener(\u0027timeupdate\u0027,function(){if(!a.duration)return;var p=a.currentTime/a.duration*100;document.getElementById(\u0027miniProgress\u0027).style.width=p+\u0027%\u0027;emit(\u0027media:progress\u0027,{pct:p,current:a.currentTime,duration:a.duration})})\n  a.addEventListener(\u0027ended\u0027,function(){next()})\n  function load(t){tr=t;a.src=t.url||\u0027\u0027;document.getElementById(\u0027miniTitle\u0027).textContent=t.title||\u0027Unknown\u0027;document.getElementById(\u0027miniArtist\u0027).textContent=t.artist||\u0027-\u0027;if(t.thumb)document.getElementById(\u0027miniThumb\u0027).innerHTML=\u0027\u003Cimg src=\u0022\u0027+t.thumb+\u0027\u0022 style=\u0022width:100%;height:100%;object-fit:cover;border-radius:8px\u0022\u003E\u0027;document.getElementById(\u0027miniPlayer\u0027).classList.add(\u0027active\u0027);document.getElementById(\u0027mediaPlayerLayer\u0027).classList.add(\u0027has-mini\u0027);document.getElementById(\u0027mainView\u0027).style.paddingBottom=\u002756px\u0027;play();emit(\u0027media:load\u0027,{track:t})}\n  function play(){a.play().then(function(){pl=true;_ub(true)}).catch(function(){})}\n  function pause(){a.pause();pl=false;_ub(false)}\n  function toggle(){pl?pause():play()}\n  function next(){if(!ls.length)return;ix=(ix+1)%ls.length;load(ls[ix])}\n  function prev(){if(a.currentTime\u003E3){a.currentTime=0;return}if(!ls.length)return;ix=(ix-1+ls.length)%ls.length;load(ls[ix])}\n  function seek(e){if(!a.duration)return;var r=e.currentTarget.getBoundingClientRect();a.currentTime=(e.clientX-r.left)/r.width*a.duration}\n  function setPlaylist(t,s){ls=t||[];ix=s||0;if(ls.length)load(ls[ix])}\n  function _ub(p){var ic=p?\u0027\u003Cpath d=\u0022M6 4h4v16H6V4zm8 0h4v16h-4V4z\u0022/\u003E\u0027:\u0027\u003Cpath d=\u0022M8 5v14l11-7z\u0022/\u003E\u0027;document.getElementById(\u0027miniPlayBtn\u0027).innerHTML=\u0027\u003Csvg width=\u002218\u0022 height=\u002218\u0022 viewBox=\u00220 0 24 24\u0022 fill=\u0022currentColor\u0022\u003E\u0027+ic+\u0027\u003C/svg\u003E\u0027;emit(\u0027media:\u0027+(p?\u0027play\u0027:\u0027pause\u0027),{track:tr})}\n  return{load:load,play:play,pause:pause,toggle:toggle,next:next,prev:prev,seek:seek,setPlaylist:setPlaylist,getAudio:function(){return a},isPlaying:function(){return pl},getTrack:function(){return tr}}\n})()\n\nfunction init(){applyCSSProps();buildLUT();Shell.init()}\nif(document.readyState===\u0027loading\u0027)document.addEventListener(\u0027DOMContentLoaded\u0027,init)\nelse init()\n\u003C/script\u003E\n\u003Cscript\u003Ewindow.__MERCHANT_SLUG__=\u0022\u0022;window.__MERCHANT_ID__=0;\u003C/script\u003E\u003C/body\u003E\n\u003C/html\u003E"