paskia 0.9.1__py3-none-any.whl → 0.10.0__py3-none-any.whl

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.
Files changed (46) hide show
  1. paskia/_version.py +2 -2
  2. paskia/db/jsonl.py +2 -2
  3. paskia/db/logging.py +130 -45
  4. paskia/db/operations.py +8 -4
  5. paskia/fastapi/__main__.py +12 -6
  6. paskia/fastapi/admin.py +2 -2
  7. paskia/fastapi/api.py +7 -3
  8. paskia/fastapi/authz.py +3 -8
  9. paskia/fastapi/logging.py +64 -21
  10. paskia/fastapi/mainapp.py +2 -1
  11. paskia/fastapi/remote.py +11 -37
  12. paskia/fastapi/ws.py +12 -35
  13. paskia/fastapi/wschat.py +55 -2
  14. paskia/fastapi/wsutil.py +2 -7
  15. paskia/frontend-build/auth/admin/index.html +6 -6
  16. paskia/frontend-build/auth/assets/AccessDenied-C29NZI95.css +1 -0
  17. paskia/frontend-build/auth/assets/AccessDenied-DAdzg_MJ.js +12 -0
  18. paskia/frontend-build/auth/assets/{RestrictedAuth-CvR33_Z0.css → RestrictedAuth-BOdNrlQB.css} +1 -1
  19. paskia/frontend-build/auth/assets/{RestrictedAuth-DsJXicIw.js → RestrictedAuth-BSusdAfp.js} +1 -1
  20. paskia/frontend-build/auth/assets/_plugin-vue_export-helper-D2l53SUz.js +49 -0
  21. paskia/frontend-build/auth/assets/_plugin-vue_export-helper-DYJ24FZK.css +1 -0
  22. paskia/frontend-build/auth/assets/admin-BeFvGyD6.js +1 -0
  23. paskia/frontend-build/auth/assets/{admin-DzzjSg72.css → admin-CmNtuH3s.css} +1 -1
  24. paskia/frontend-build/auth/assets/{auth-C7k64Wad.css → auth-BKq4T2K2.css} +1 -1
  25. paskia/frontend-build/auth/assets/auth-DvHf8hgy.js +1 -0
  26. paskia/frontend-build/auth/assets/{forward-DmqVHZ7e.js → forward-C86Jm_Uq.js} +1 -1
  27. paskia/frontend-build/auth/assets/reset-B8PlNXuP.css +1 -0
  28. paskia/frontend-build/auth/assets/reset-D71FG0VL.js +1 -0
  29. paskia/frontend-build/auth/assets/{restricted-D3AJx3_6.js → restricted-CW0drE_k.js} +1 -1
  30. paskia/frontend-build/auth/index.html +6 -6
  31. paskia/frontend-build/auth/restricted/index.html +5 -5
  32. paskia/frontend-build/int/forward/index.html +5 -5
  33. paskia/frontend-build/int/reset/index.html +4 -4
  34. {paskia-0.9.1.dist-info → paskia-0.10.0.dist-info}/METADATA +1 -1
  35. paskia-0.10.0.dist-info/RECORD +60 -0
  36. paskia/frontend-build/auth/assets/AccessDenied-DPkUS8LZ.css +0 -1
  37. paskia/frontend-build/auth/assets/AccessDenied-Fmeb6EtF.js +0 -8
  38. paskia/frontend-build/auth/assets/_plugin-vue_export-helper-BTzJAQlS.css +0 -1
  39. paskia/frontend-build/auth/assets/_plugin-vue_export-helper-nhjnO_bd.js +0 -2
  40. paskia/frontend-build/auth/assets/admin-CPE1pLMm.js +0 -1
  41. paskia/frontend-build/auth/assets/auth-YIZvPlW_.js +0 -1
  42. paskia/frontend-build/auth/assets/reset-Chtv69AT.css +0 -1
  43. paskia/frontend-build/auth/assets/reset-s20PATTN.js +0 -1
  44. paskia-0.9.1.dist-info/RECORD +0 -60
  45. {paskia-0.9.1.dist-info → paskia-0.10.0.dist-info}/WHEEL +0 -0
  46. {paskia-0.9.1.dist-info → paskia-0.10.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,49 @@
1
+ (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const o of i.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function n(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function s(r){if(r.ep)return;r.ep=!0;const i=n(r);fetch(r.href,i)}})();/**
2
+ * @vue/shared v3.5.21
3
+ * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
+ * @license MIT
5
+ **/function Yn(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const j={},ct=[],Te=()=>{},ir=()=>!1,dn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),zn=e=>e.startsWith("onUpdate:"),ie=Object.assign,Xn=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},xi=Object.prototype.hasOwnProperty,U=(e,t)=>xi.call(e,t),R=Array.isArray,at=e=>Ut(e)==="[object Map]",mt=e=>Ut(e)==="[object Set]",Es=e=>Ut(e)==="[object Date]",P=e=>typeof e=="function",q=e=>typeof e=="string",ge=e=>typeof e=="symbol",V=e=>e!==null&&typeof e=="object",or=e=>(V(e)||P(e))&&P(e.then)&&P(e.catch),lr=Object.prototype.toString,Ut=e=>lr.call(e),Ti=e=>Ut(e).slice(8,-1),cr=e=>Ut(e)==="[object Object]",Zn=e=>q(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,xt=Yn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),hn=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},Ai=/-\w/g,Ve=hn(e=>e.replace(Ai,t=>t.slice(1).toUpperCase())),Ri=/\B([A-Z])/g,qe=hn(e=>e.replace(Ri,"-$1").toLowerCase()),ar=hn(e=>e.charAt(0).toUpperCase()+e.slice(1)),xn=hn(e=>e?`on${ar(e)}`:""),ke=(e,t)=>!Object.is(e,t),Yt=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},ur=(e,t,n,s=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},tn=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let xs;const pn=()=>xs||(xs=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Qn(e){if(R(e)){const t={};for(let n=0;n<e.length;n++){const s=e[n],r=q(s)?Pi(s):Qn(s);if(r)for(const i in r)t[i]=r[i]}return t}else if(q(e)||V(e))return e}const Ci=/;(?![^(]*\))/g,Oi=/:([^]+)/,Ii=/\/\*[^]*?\*\//g;function Pi(e){const t={};return e.replace(Ii,"").split(Ci).forEach(n=>{if(n){const s=n.split(Oi);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function es(e){let t="";if(q(e))t=e;else if(R(e))for(let n=0;n<e.length;n++){const s=es(e[n]);s&&(t+=s+" ")}else if(V(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}const Mi="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",Ni=Yn(Mi);function fr(e){return!!e||e===""}function Di(e,t){if(e.length!==t.length)return!1;let n=!0;for(let s=0;n&&s<e.length;s++)n=st(e[s],t[s]);return n}function st(e,t){if(e===t)return!0;let n=Es(e),s=Es(t);if(n||s)return n&&s?e.getTime()===t.getTime():!1;if(n=ge(e),s=ge(t),n||s)return e===t;if(n=R(e),s=R(t),n||s)return n&&s?Di(e,t):!1;if(n=V(e),s=V(t),n||s){if(!n||!s)return!1;const r=Object.keys(e).length,i=Object.keys(t).length;if(r!==i)return!1;for(const o in e){const l=e.hasOwnProperty(o),c=t.hasOwnProperty(o);if(l&&!c||!l&&c||!st(e[o],t[o]))return!1}}return String(e)===String(t)}function ts(e,t){return e.findIndex(n=>st(n,t))}const dr=e=>!!(e&&e.__v_isRef===!0),Fi=e=>q(e)?e:e==null?"":R(e)||V(e)&&(e.toString===lr||!P(e.toString))?dr(e)?Fi(e.value):JSON.stringify(e,hr,2):String(e),hr=(e,t)=>dr(t)?hr(e,t.value):at(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[Tn(s,i)+" =>"]=r,n),{})}:mt(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Tn(n))}:ge(t)?Tn(t):V(t)&&!R(t)&&!cr(t)?String(t):t,Tn=(e,t="")=>{var n;return ge(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/**
6
+ * @vue/reactivity v3.5.21
7
+ * (c) 2018-present Yuxi (Evan) You and Vue contributors
8
+ * @license MIT
9
+ **/let X;class pr{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=X,!t&&X&&(this.index=(X.scopes||(X.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].pause();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].resume();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].resume()}}run(t){if(this._active){const n=X;try{return X=this,t()}finally{X=n}}}on(){++this._on===1&&(this.prevScope=X,X=this)}off(){this._on>0&&--this._on===0&&(X=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n<s;n++)this.effects[n].stop();for(this.effects.length=0,n=0,s=this.cleanups.length;n<s;n++)this.cleanups[n]();if(this.cleanups.length=0,this.scopes){for(n=0,s=this.scopes.length;n<s;n++)this.scopes[n].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const r=this.parent.scopes.pop();r&&r!==this&&(this.parent.scopes[this.index]=r,r.index=this.index)}this.parent=void 0}}}function Uc(e){return new pr(e)}function Ui(){return X}function Lc(e,t=!1){X&&X.cleanups.push(e)}let $;const An=new WeakSet;class gr{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,X&&X.active&&X.effects.push(this)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,An.has(this)&&(An.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||br(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,Ts(this),yr(this);const t=$,n=pe;$=this,pe=!0;try{return this.fn()}finally{_r(this),$=t,pe=n,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)rs(t);this.deps=this.depsTail=void 0,Ts(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?An.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){Ln(this)&&this.run()}get dirty(){return Ln(this)}}let mr=0,Tt,At;function br(e,t=!1){if(e.flags|=8,t){e.next=At,At=e;return}e.next=Tt,Tt=e}function ns(){mr++}function ss(){if(--mr>0)return;if(At){let t=At;for(At=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Tt;){let t=Tt;for(Tt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function yr(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function _r(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),rs(s),Li(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function Ln(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(wr(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function wr(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Pt)||(e.globalVersion=Pt,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Ln(e))))return;e.flags|=2;const t=e.dep,n=$,s=pe;$=e,pe=!0;try{yr(e);const r=e.fn(e._value);(t.version===0||ke(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{$=n,pe=s,_r(e),e.flags&=-3}}function rs(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)rs(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Li(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let pe=!0;const vr=[];function Ne(){vr.push(pe),pe=!1}function De(){const e=vr.pop();pe=e===void 0?!0:e}function Ts(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=$;$=void 0;try{t()}finally{$=n}}}let Pt=0;class ji{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class is{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!$||!pe||$===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==$)n=this.activeLink=new ji($,this),$.deps?(n.prevDep=$.depsTail,$.depsTail.nextDep=n,$.depsTail=n):$.deps=$.depsTail=n,Sr(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=$.depsTail,n.nextDep=void 0,$.depsTail.nextDep=n,$.depsTail=n,$.deps===n&&($.deps=s)}return n}trigger(t){this.version++,Pt++,this.notify(t)}notify(t){ns();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{ss()}}}function Sr(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Sr(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const nn=new WeakMap,tt=Symbol(""),jn=Symbol(""),Mt=Symbol("");function Z(e,t,n){if(pe&&$){let s=nn.get(e);s||nn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new is),r.map=s,r.key=n),r.track()}}function Ie(e,t,n,s,r,i){const o=nn.get(e);if(!o){Pt++;return}const l=c=>{c&&c.trigger()};if(ns(),t==="clear")o.forEach(l);else{const c=R(e),d=c&&Zn(n);if(c&&n==="length"){const f=Number(s);o.forEach((p,S)=>{(S==="length"||S===Mt||!ge(S)&&S>=f)&&l(p)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),d&&l(o.get(Mt)),t){case"add":c?d&&l(o.get("length")):(l(o.get(tt)),at(e)&&l(o.get(jn)));break;case"delete":c||(l(o.get(tt)),at(e)&&l(o.get(jn)));break;case"set":at(e)&&l(o.get(tt));break}}ss()}function Ki(e,t){const n=nn.get(e);return n&&n.get(t)}function rt(e){const t=F(e);return t===e?t:(Z(t,"iterate",Mt),de(e)?t:t.map(Y))}function gn(e){return Z(e=F(e),"iterate",Mt),e}const Hi={__proto__:null,[Symbol.iterator](){return Rn(this,Symbol.iterator,Y)},concat(...e){return rt(this).concat(...e.map(t=>R(t)?rt(t):t))},entries(){return Rn(this,"entries",e=>(e[1]=Y(e[1]),e))},every(e,t){return Ce(this,"every",e,t,void 0,arguments)},filter(e,t){return Ce(this,"filter",e,t,n=>n.map(Y),arguments)},find(e,t){return Ce(this,"find",e,t,Y,arguments)},findIndex(e,t){return Ce(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ce(this,"findLast",e,t,Y,arguments)},findLastIndex(e,t){return Ce(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ce(this,"forEach",e,t,void 0,arguments)},includes(...e){return Cn(this,"includes",e)},indexOf(...e){return Cn(this,"indexOf",e)},join(e){return rt(this).join(e)},lastIndexOf(...e){return Cn(this,"lastIndexOf",e)},map(e,t){return Ce(this,"map",e,t,void 0,arguments)},pop(){return vt(this,"pop")},push(...e){return vt(this,"push",e)},reduce(e,...t){return As(this,"reduce",e,t)},reduceRight(e,...t){return As(this,"reduceRight",e,t)},shift(){return vt(this,"shift")},some(e,t){return Ce(this,"some",e,t,void 0,arguments)},splice(...e){return vt(this,"splice",e)},toReversed(){return rt(this).toReversed()},toSorted(e){return rt(this).toSorted(e)},toSpliced(...e){return rt(this).toSpliced(...e)},unshift(...e){return vt(this,"unshift",e)},values(){return Rn(this,"values",Y)}};function Rn(e,t,n){const s=gn(e),r=s[t]();return s!==e&&!de(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.value&&(i.value=n(i.value)),i}),r}const $i=Array.prototype;function Ce(e,t,n,s,r,i){const o=gn(e),l=o!==e&&!de(e),c=o[t];if(c!==$i[t]){const p=c.apply(e,i);return l?Y(p):p}let d=n;o!==e&&(l?d=function(p,S){return n.call(this,Y(p),S,e)}:n.length>2&&(d=function(p,S){return n.call(this,p,S,e)}));const f=c.call(o,d,s);return l&&r?r(f):f}function As(e,t,n,s){const r=gn(e);let i=n;return r!==e&&(de(e)?n.length>3&&(i=function(o,l,c){return n.call(this,o,l,c,e)}):i=function(o,l,c){return n.call(this,o,Y(l),c,e)}),r[t](i,...s)}function Cn(e,t,n){const s=F(e);Z(s,"iterate",Mt);const r=s[t](...n);return(r===-1||r===!1)&&as(n[0])?(n[0]=F(n[0]),s[t](...n)):r}function vt(e,t,n=[]){Ne(),ns();const s=F(e)[t].apply(e,n);return ss(),De(),s}const ki=Yn("__proto__,__v_isRef,__isVue"),Er=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(ge));function Vi(e){ge(e)||(e=String(e));const t=F(this);return Z(t,"has",e),t.hasOwnProperty(e)}class xr{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Qi:Cr:i?Rr:Ar).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=R(t);if(!r){let c;if(o&&(c=Hi[n]))return c;if(n==="hasOwnProperty")return Vi}const l=Reflect.get(t,n,z(t)?t:s);return(ge(n)?Er.has(n):ki(n))||(r||Z(t,"get",n),i)?l:z(l)?o&&Zn(n)?l:l.value:V(l)?r?Or(l):ls(l):l}}class Tr extends xr{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];if(!this._isShallow){const c=Be(i);if(!de(s)&&!Be(s)&&(i=F(i),s=F(s)),!R(t)&&z(i)&&!z(s))return c||(i.value=s),!0}const o=R(t)&&Zn(n)?Number(n)<t.length:U(t,n),l=Reflect.set(t,n,s,z(t)?t:r);return t===F(r)&&(o?ke(s,i)&&Ie(t,"set",n,s):Ie(t,"add",n,s)),l}deleteProperty(t,n){const s=U(t,n);t[n];const r=Reflect.deleteProperty(t,n);return r&&s&&Ie(t,"delete",n,void 0),r}has(t,n){const s=Reflect.has(t,n);return(!ge(n)||!Er.has(n))&&Z(t,"has",n),s}ownKeys(t){return Z(t,"iterate",R(t)?"length":tt),Reflect.ownKeys(t)}}class Bi extends xr{constructor(t=!1){super(!0,t)}set(t,n){return!0}deleteProperty(t,n){return!0}}const Wi=new Tr,qi=new Bi,Ji=new Tr(!0);const Kn=e=>e,Bt=e=>Reflect.getPrototypeOf(e);function Gi(e,t,n){return function(...s){const r=this.__v_raw,i=F(r),o=at(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,d=r[e](...s),f=n?Kn:t?sn:Y;return!t&&Z(i,"iterate",c?jn:tt),{next(){const{value:p,done:S}=d.next();return S?{value:p,done:S}:{value:l?[f(p[0]),f(p[1])]:f(p),done:S}},[Symbol.iterator](){return this}}}}function Wt(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Yi(e,t){const n={get(r){const i=this.__v_raw,o=F(i),l=F(r);e||(ke(r,l)&&Z(o,"get",r),Z(o,"get",l));const{has:c}=Bt(o),d=t?Kn:e?sn:Y;if(c.call(o,r))return d(i.get(r));if(c.call(o,l))return d(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&Z(F(r),"iterate",tt),r.size},has(r){const i=this.__v_raw,o=F(i),l=F(r);return e||(ke(r,l)&&Z(o,"has",r),Z(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=F(l),d=t?Kn:e?sn:Y;return!e&&Z(c,"iterate",tt),l.forEach((f,p)=>r.call(i,d(f),d(p),o))}};return ie(n,e?{add:Wt("add"),set:Wt("set"),delete:Wt("delete"),clear:Wt("clear")}:{add(r){!t&&!de(r)&&!Be(r)&&(r=F(r));const i=F(this);return Bt(i).has.call(i,r)||(i.add(r),Ie(i,"add",r,r)),this},set(r,i){!t&&!de(i)&&!Be(i)&&(i=F(i));const o=F(this),{has:l,get:c}=Bt(o);let d=l.call(o,r);d||(r=F(r),d=l.call(o,r));const f=c.call(o,r);return o.set(r,i),d?ke(i,f)&&Ie(o,"set",r,i):Ie(o,"add",r,i),this},delete(r){const i=F(this),{has:o,get:l}=Bt(i);let c=o.call(i,r);c||(r=F(r),c=o.call(i,r)),l&&l.call(i,r);const d=i.delete(r);return c&&Ie(i,"delete",r,void 0),d},clear(){const r=F(this),i=r.size!==0,o=r.clear();return i&&Ie(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=Gi(r,e,t)}),n}function os(e,t){const n=Yi(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(U(n,r)&&r in s?n:s,r,i)}const zi={get:os(!1,!1)},Xi={get:os(!1,!0)},Zi={get:os(!0,!1)};const Ar=new WeakMap,Rr=new WeakMap,Cr=new WeakMap,Qi=new WeakMap;function eo(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function to(e){return e.__v_skip||!Object.isExtensible(e)?0:eo(Ti(e))}function ls(e){return Be(e)?e:cs(e,!1,Wi,zi,Ar)}function no(e){return cs(e,!1,Ji,Xi,Rr)}function Or(e){return cs(e,!0,qi,Zi,Cr)}function cs(e,t,n,s,r){if(!V(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=to(e);if(i===0)return e;const o=r.get(e);if(o)return o;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function ut(e){return Be(e)?ut(e.__v_raw):!!(e&&e.__v_isReactive)}function Be(e){return!!(e&&e.__v_isReadonly)}function de(e){return!!(e&&e.__v_isShallow)}function as(e){return e?!!e.__v_raw:!1}function F(e){const t=e&&e.__v_raw;return t?F(t):e}function so(e){return!U(e,"__v_skip")&&Object.isExtensible(e)&&ur(e,"__v_skip",!0),e}const Y=e=>V(e)?ls(e):e,sn=e=>V(e)?Or(e):e;function z(e){return e?e.__v_isRef===!0:!1}function jc(e){return ro(e,!1)}function ro(e,t){return z(e)?e:new io(e,t)}class io{constructor(t,n){this.dep=new is,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:F(t),this._value=n?t:Y(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||de(t)||Be(t);t=s?t:F(t),ke(t,n)&&(this._rawValue=t,this._value=s?t:Y(t),this.dep.trigger())}}function oo(e){return z(e)?e.value:e}const lo={get:(e,t,n)=>t==="__v_raw"?e:oo(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return z(r)&&!z(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Ir(e){return ut(e)?e:new Proxy(e,lo)}function Kc(e){const t=R(e)?new Array(e.length):{};for(const n in e)t[n]=ao(e,n);return t}class co{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Ki(F(this._object),this._key)}}function ao(e,t,n){const s=e[t];return z(s)?s:new co(e,t,n)}class uo{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new is(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Pt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&$!==this)return br(this,!0),!0}get value(){const t=this.dep.track();return wr(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function fo(e,t,n=!1){let s,r;return P(e)?s=e:(s=e.get,r=e.set),new uo(s,r,n)}const qt={},rn=new WeakMap;let Ze;function ho(e,t=!1,n=Ze){if(n){let s=rn.get(n);s||rn.set(n,s=[]),s.push(e)}}function po(e,t,n=j){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,d=O=>r?O:de(O)||r===!1||r===0?Pe(O,1):Pe(O);let f,p,S,x,C=!1,N=!1;if(z(e)?(p=()=>e.value,C=de(e)):ut(e)?(p=()=>d(e),C=!0):R(e)?(N=!0,C=e.some(O=>ut(O)||de(O)),p=()=>e.map(O=>{if(z(O))return O.value;if(ut(O))return d(O);if(P(O))return c?c(O,2):O()})):P(e)?t?p=c?()=>c(e,2):e:p=()=>{if(S){Ne();try{S()}finally{De()}}const O=Ze;Ze=f;try{return c?c(e,3,[x]):e(x)}finally{Ze=O}}:p=Te,t&&r){const O=p,J=r===!0?1/0:r;p=()=>Pe(O(),J)}const ee=Ui(),D=()=>{f.stop(),ee&&ee.active&&Xn(ee.effects,f)};if(i&&t){const O=t;t=(...J)=>{O(...J),D()}}let k=N?new Array(e.length).fill(qt):qt;const W=O=>{if(!(!(f.flags&1)||!f.dirty&&!O))if(t){const J=f.run();if(r||C||(N?J.some((Le,me)=>ke(Le,k[me])):ke(J,k))){S&&S();const Le=Ze;Ze=f;try{const me=[J,k===qt?void 0:N&&k[0]===qt?[]:k,x];k=J,c?c(t,3,me):t(...me)}finally{Ze=Le}}}else f.run()};return l&&l(W),f=new gr(p),f.scheduler=o?()=>o(W,!1):W,x=O=>ho(O,!1,f),S=f.onStop=()=>{const O=rn.get(f);if(O){if(c)c(O,4);else for(const J of O)J();rn.delete(f)}},t?s?W(!0):k=f.run():o?o(W.bind(null,!0),!0):f.run(),D.pause=f.pause.bind(f),D.resume=f.resume.bind(f),D.stop=D,D}function Pe(e,t=1/0,n){if(t<=0||!V(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,z(e))Pe(e.value,t,n);else if(R(e))for(let s=0;s<e.length;s++)Pe(e[s],t,n);else if(mt(e)||at(e))e.forEach(s=>{Pe(s,t,n)});else if(cr(e)){for(const s in e)Pe(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Pe(e[s],t,n)}return e}/**
10
+ * @vue/runtime-core v3.5.21
11
+ * (c) 2018-present Yuxi (Evan) You and Vue contributors
12
+ * @license MIT
13
+ **/function Lt(e,t,n,s){try{return s?e(...s):e()}catch(r){mn(r,t,n)}}function Re(e,t,n,s){if(P(e)){const r=Lt(e,t,n,s);return r&&or(r)&&r.catch(i=>{mn(i,t,n)}),r}if(R(e)){const r=[];for(let i=0;i<e.length;i++)r.push(Re(e[i],t,n,s));return r}}function mn(e,t,n,s=!0){const r=t?t.vnode:null,{errorHandler:i,throwUnhandledErrorInProduction:o}=t&&t.appContext.config||j;if(t){let l=t.parent;const c=t.proxy,d=`https://vuejs.org/error-reference/#runtime-${n}`;for(;l;){const f=l.ec;if(f){for(let p=0;p<f.length;p++)if(f[p](e,c,d)===!1)return}l=l.parent}if(i){Ne(),Lt(i,null,10,[e,c,d]),De();return}}go(e,n,r,s,o)}function go(e,t,n,s=!0,r=!1){if(r)throw e;console.error(e)}const se=[];let Se=-1;const ft=[];let Ke=null,it=0;const Pr=Promise.resolve();let on=null;function Mr(e){const t=on||Pr;return e?t.then(this?e.bind(this):e):t}function mo(e){let t=Se+1,n=se.length;for(;t<n;){const s=t+n>>>1,r=se[s],i=Nt(r);i<e||i===e&&r.flags&2?t=s+1:n=s}return t}function us(e){if(!(e.flags&1)){const t=Nt(e),n=se[se.length-1];!n||!(e.flags&2)&&t>=Nt(n)?se.push(e):se.splice(mo(t),0,e),e.flags|=1,Nr()}}function Nr(){on||(on=Pr.then(Fr))}function bo(e){R(e)?ft.push(...e):Ke&&e.id===-1?Ke.splice(it+1,0,e):e.flags&1||(ft.push(e),e.flags|=1),Nr()}function Rs(e,t,n=Se+1){for(;n<se.length;n++){const s=se[n];if(s&&s.flags&2){if(e&&s.id!==e.uid)continue;se.splice(n,1),n--,s.flags&4&&(s.flags&=-2),s(),s.flags&4||(s.flags&=-2)}}}function Dr(e){if(ft.length){const t=[...new Set(ft)].sort((n,s)=>Nt(n)-Nt(s));if(ft.length=0,Ke){Ke.push(...t);return}for(Ke=t,it=0;it<Ke.length;it++){const n=Ke[it];n.flags&4&&(n.flags&=-2),n.flags&8||n(),n.flags&=-2}Ke=null,it=0}}const Nt=e=>e.id==null?e.flags&2?-1:1/0:e.id;function Fr(e){try{for(Se=0;Se<se.length;Se++){const t=se[Se];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),Lt(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;Se<se.length;Se++){const t=se[Se];t&&(t.flags&=-2)}Se=-1,se.length=0,Dr(),on=null,(se.length||ft.length)&&Fr()}}let Q=null,Ur=null;function ln(e){const t=Q;return Q=e,Ur=e&&e.type.__scopeId||null,t}function yo(e,t=Q,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&Ls(-1);const i=ln(t);let o;try{o=e(...r)}finally{ln(i),s._d&&Ls(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function Hc(e,t){if(Q===null)return e;const n=wn(Q),s=e.dirs||(e.dirs=[]);for(let r=0;r<t.length;r++){let[i,o,l,c=j]=t[r];i&&(P(i)&&(i={mounted:i,updated:i}),i.deep&&Pe(o),s.push({dir:i,instance:n,value:o,oldValue:void 0,arg:l,modifiers:c}))}return e}function ze(e,t,n,s){const r=e.dirs,i=t&&t.dirs;for(let o=0;o<r.length;o++){const l=r[o];i&&(l.oldValue=i[o].value);let c=l.dir[s];c&&(Ne(),Re(c,n,8,[e.el,l,e,t]),De())}}const _o=Symbol("_vte"),wo=e=>e.__isTeleport,vo=Symbol("_leaveCb");function fs(e,t){e.shapeFlag&6&&e.component?(e.transition=t,fs(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Lr(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}const cn=new WeakMap;function Rt(e,t,n,s,r=!1){if(R(e)){e.forEach((C,N)=>Rt(C,t&&(R(t)?t[N]:t),n,s,r));return}if(dt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Rt(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?wn(s.component):s.el,o=r?null:i,{i:l,r:c}=e,d=t&&t.r,f=l.refs===j?l.refs={}:l.refs,p=l.setupState,S=F(p),x=p===j?ir:C=>U(S,C);if(d!=null&&d!==c){if(Cs(t),q(d))f[d]=null,x(d)&&(p[d]=null);else if(z(d)){d.value=null;const C=t;C.k&&(f[C.k]=null)}}if(P(c))Lt(c,l,12,[o,f]);else{const C=q(c),N=z(c);if(C||N){const ee=()=>{if(e.f){const D=C?x(c)?p[c]:f[c]:c.value;if(r)R(D)&&Xn(D,i);else if(R(D))D.includes(i)||D.push(i);else if(C)f[c]=[i],x(c)&&(p[c]=f[c]);else{const k=[i];c.value=k,e.k&&(f[e.k]=k)}}else C?(f[c]=o,x(c)&&(p[c]=o)):N&&(c.value=o,e.k&&(f[e.k]=o))};if(o){const D=()=>{ee(),cn.delete(e)};D.id=-1,cn.set(e,D),ae(D,n)}else Cs(e),ee()}}}function Cs(e){const t=cn.get(e);t&&(t.flags|=8,cn.delete(e))}pn().requestIdleCallback;pn().cancelIdleCallback;const dt=e=>!!e.type.__asyncLoader,jr=e=>e.type.__isKeepAlive;function So(e,t){Kr(e,"a",t)}function Eo(e,t){Kr(e,"da",t)}function Kr(e,t,n=re){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(bn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)jr(r.parent.vnode)&&xo(s,t,n,r),r=r.parent}}function xo(e,t,n,s){const r=bn(t,e,s,!0);Hr(()=>{Xn(s[t],r)},n)}function bn(e,t,n=re,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{Ne();const l=jt(n),c=Re(t,n,e,o);return l(),De(),c});return s?r.unshift(i):r.push(i),i}}const Ue=e=>(t,n=re)=>{(!Ft||e==="sp")&&bn(e,(...s)=>t(...s),n)},To=Ue("bm"),Ao=Ue("m"),Ro=Ue("bu"),Co=Ue("u"),Oo=Ue("bum"),Hr=Ue("um"),Io=Ue("sp"),Po=Ue("rtg"),Mo=Ue("rtc");function No(e,t=re){bn("ec",e,t)}const Do=Symbol.for("v-ndc");function $c(e,t,n,s){let r;const i=n,o=R(e);if(o||q(e)){const l=o&&ut(e);let c=!1,d=!1;l&&(c=!de(e),d=Be(e),e=gn(e)),r=new Array(e.length);for(let f=0,p=e.length;f<p;f++)r[f]=t(c?d?sn(Y(e[f])):Y(e[f]):e[f],f,void 0,i)}else if(typeof e=="number"){r=new Array(e);for(let l=0;l<e;l++)r[l]=t(l+1,l,void 0,i)}else if(V(e))if(e[Symbol.iterator])r=Array.from(e,(l,c)=>t(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,d=l.length;c<d;c++){const f=l[c];r[c]=t(e[f],f,c,i)}}else r=[];return r}function kc(e,t,n={},s,r){if(Q.ce||Q.parent&&dt(Q.parent)&&Q.parent.ce)return t!=="default"&&(n.name=t),Bn(),Wn(fe,null,[Ae("slot",n,s&&s())],64);let i=e[t];i&&i._c&&(i._d=!1),Bn();const o=i&&$r(i(n)),l=n.key||o&&o.key,c=Wn(fe,{key:(l&&!ge(l)?l:`_${t}`)+(!o&&s?"_fb":"")},o||(s?s():[]),o&&e._===1?64:-2);return i&&i._c&&(i._d=!0),c}function $r(e){return e.some(t=>ps(t)?!(t.type===Fe||t.type===fe&&!$r(t.children)):!0)?e:null}const Hn=e=>e?ai(e)?wn(e):Hn(e.parent):null,Ct=ie(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Hn(e.parent),$root:e=>Hn(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Vr(e),$forceUpdate:e=>e.f||(e.f=()=>{us(e.update)}),$nextTick:e=>e.n||(e.n=Mr.bind(e.proxy)),$watch:e=>nl.bind(e)}),On=(e,t)=>e!==j&&!e.__isScriptSetup&&U(e,t),Fo={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let d;if(t[0]!=="$"){const x=o[t];if(x!==void 0)switch(x){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(On(s,t))return o[t]=1,s[t];if(r!==j&&U(r,t))return o[t]=2,r[t];if((d=e.propsOptions[0])&&U(d,t))return o[t]=3,i[t];if(n!==j&&U(n,t))return o[t]=4,n[t];$n&&(o[t]=0)}}const f=Ct[t];let p,S;if(f)return t==="$attrs"&&Z(e.attrs,"get",""),f(e);if((p=l.__cssModules)&&(p=p[t]))return p;if(n!==j&&U(n,t))return o[t]=4,n[t];if(S=c.config.globalProperties,U(S,t))return S[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return On(r,t)?(r[t]=n,!0):s!==j&&U(s,t)?(s[t]=n,!0):U(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i,type:o}},l){let c,d;return!!(n[l]||e!==j&&l[0]!=="$"&&U(e,l)||On(t,l)||(c=i[0])&&U(c,l)||U(s,l)||U(Ct,l)||U(r.config.globalProperties,l)||(d=o.__cssModules)&&d[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:U(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Os(e){return R(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let $n=!0;function Uo(e){const t=Vr(e),n=e.proxy,s=e.ctx;$n=!1,t.beforeCreate&&Is(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:d,created:f,beforeMount:p,mounted:S,beforeUpdate:x,updated:C,activated:N,deactivated:ee,beforeDestroy:D,beforeUnmount:k,destroyed:W,unmounted:O,render:J,renderTracked:Le,renderTriggered:me,errorCaptured:je,serverPrefetch:Kt,expose:Je,inheritAttrs:bt,components:Ht,directives:$t,filters:Sn}=t;if(d&&Lo(d,s,null),o)for(const B in o){const K=o[B];P(K)&&(s[B]=K.bind(n))}if(r){const B=r.call(n,n);V(B)&&(e.data=ls(B))}if($n=!0,i)for(const B in i){const K=i[B],Ge=P(K)?K.bind(n,n):P(K.get)?K.get.bind(n,n):Te,kt=!P(K)&&P(K.set)?K.set.bind(n):Te,Ye=xl({get:Ge,set:kt});Object.defineProperty(s,B,{enumerable:!0,configurable:!0,get:()=>Ye.value,set:be=>Ye.value=be})}if(l)for(const B in l)kr(l[B],s,n,B);if(c){const B=P(c)?c.call(n):c;Reflect.ownKeys(B).forEach(K=>{Vo(K,B[K])})}f&&Is(f,e,"c");function te(B,K){R(K)?K.forEach(Ge=>B(Ge.bind(n))):K&&B(K.bind(n))}if(te(To,p),te(Ao,S),te(Ro,x),te(Co,C),te(So,N),te(Eo,ee),te(No,je),te(Mo,Le),te(Po,me),te(Oo,k),te(Hr,O),te(Io,Kt),R(Je))if(Je.length){const B=e.exposed||(e.exposed={});Je.forEach(K=>{Object.defineProperty(B,K,{get:()=>n[K],set:Ge=>n[K]=Ge,enumerable:!0})})}else e.exposed||(e.exposed={});J&&e.render===Te&&(e.render=J),bt!=null&&(e.inheritAttrs=bt),Ht&&(e.components=Ht),$t&&(e.directives=$t),Kt&&Lr(e)}function Lo(e,t,n=Te){R(e)&&(e=kn(e));for(const s in e){const r=e[s];let i;V(r)?"default"in r?i=zt(r.from||s,r.default,!0):i=zt(r.from||s):i=zt(r),z(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Is(e,t,n){Re(R(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function kr(e,t,n,s){let r=s.includes(".")?ni(n,s):()=>n[s];if(q(e)){const i=t[e];P(i)&&Pn(r,i)}else if(P(e))Pn(r,e.bind(n));else if(V(e))if(R(e))e.forEach(i=>kr(i,t,n,s));else{const i=P(e.handler)?e.handler.bind(n):t[e.handler];P(i)&&Pn(r,i,e)}}function Vr(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(d=>an(c,d,o,!0)),an(c,t,o)),V(t)&&i.set(t,c),c}function an(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&an(e,i,n,!0),r&&r.forEach(o=>an(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=jo[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const jo={data:Ps,props:Ms,emits:Ms,methods:Et,computed:Et,beforeCreate:ne,created:ne,beforeMount:ne,mounted:ne,beforeUpdate:ne,updated:ne,beforeDestroy:ne,beforeUnmount:ne,destroyed:ne,unmounted:ne,activated:ne,deactivated:ne,errorCaptured:ne,serverPrefetch:ne,components:Et,directives:Et,watch:Ho,provide:Ps,inject:Ko};function Ps(e,t){return t?e?function(){return ie(P(e)?e.call(this,this):e,P(t)?t.call(this,this):t)}:t:e}function Ko(e,t){return Et(kn(e),kn(t))}function kn(e){if(R(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function ne(e,t){return e?[...new Set([].concat(e,t))]:t}function Et(e,t){return e?ie(Object.create(null),e,t):t}function Ms(e,t){return e?R(e)&&R(t)?[...new Set([...e,...t])]:ie(Object.create(null),Os(e),Os(t??{})):t}function Ho(e,t){if(!e)return t;if(!t)return e;const n=ie(Object.create(null),e);for(const s in t)n[s]=ne(e[s],t[s]);return n}function Br(){return{app:null,config:{isNativeTag:ir,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let $o=0;function ko(e,t){return function(s,r=null){P(s)||(s=ie({},s)),r!=null&&!V(r)&&(r=null);const i=Br(),o=new WeakSet,l=[];let c=!1;const d=i.app={_uid:$o++,_component:s,_props:r,_container:null,_context:i,_instance:null,version:Tl,get config(){return i.config},set config(f){},use(f,...p){return o.has(f)||(f&&P(f.install)?(o.add(f),f.install(d,...p)):P(f)&&(o.add(f),f(d,...p))),d},mixin(f){return i.mixins.includes(f)||i.mixins.push(f),d},component(f,p){return p?(i.components[f]=p,d):i.components[f]},directive(f,p){return p?(i.directives[f]=p,d):i.directives[f]},mount(f,p,S){if(!c){const x=d._ceVNode||Ae(s,r);return x.appContext=i,S===!0?S="svg":S===!1&&(S=void 0),e(x,f,S),c=!0,d._container=f,f.__vue_app__=d,wn(x.component)}},onUnmount(f){l.push(f)},unmount(){c&&(Re(l,d._instance,16),e(null,d._container),delete d._container.__vue_app__)},provide(f,p){return i.provides[f]=p,d},runWithContext(f){const p=nt;nt=d;try{return f()}finally{nt=p}}};return d}}let nt=null;function Vo(e,t){if(re){let n=re.provides;const s=re.parent&&re.parent.provides;s===n&&(n=re.provides=Object.create(s)),n[e]=t}}function zt(e,t,n=!1){const s=ci();if(s||nt){let r=nt?nt._context.provides:s?s.parent==null||s.ce?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides:void 0;if(r&&e in r)return r[e];if(arguments.length>1)return n&&P(t)?t.call(s&&s.proxy):t}}function Vc(){return!!(ci()||nt)}const Wr={},qr=()=>Object.create(Wr),Jr=e=>Object.getPrototypeOf(e)===Wr;function Bo(e,t,n,s=!1){const r={},i=qr();e.propsDefaults=Object.create(null),Gr(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:no(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Wo(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=F(r),[c]=e.propsOptions;let d=!1;if((s||o>0)&&!(o&16)){if(o&8){const f=e.vnode.dynamicProps;for(let p=0;p<f.length;p++){let S=f[p];if(yn(e.emitsOptions,S))continue;const x=t[S];if(c)if(U(i,S))x!==i[S]&&(i[S]=x,d=!0);else{const C=Ve(S);r[C]=Vn(c,l,C,x,e,!1)}else x!==i[S]&&(i[S]=x,d=!0)}}}else{Gr(e,t,r,i)&&(d=!0);let f;for(const p in l)(!t||!U(t,p)&&((f=qe(p))===p||!U(t,f)))&&(c?n&&(n[p]!==void 0||n[f]!==void 0)&&(r[p]=Vn(c,l,p,void 0,e,!0)):delete r[p]);if(i!==l)for(const p in i)(!t||!U(t,p))&&(delete i[p],d=!0)}d&&Ie(e.attrs,"set","")}function Gr(e,t,n,s){const[r,i]=e.propsOptions;let o=!1,l;if(t)for(let c in t){if(xt(c))continue;const d=t[c];let f;r&&U(r,f=Ve(c))?!i||!i.includes(f)?n[f]=d:(l||(l={}))[f]=d:yn(e.emitsOptions,c)||(!(c in s)||d!==s[c])&&(s[c]=d,o=!0)}if(i){const c=F(n),d=l||j;for(let f=0;f<i.length;f++){const p=i[f];n[p]=Vn(r,c,p,d[p],e,!U(d,p))}}return o}function Vn(e,t,n,s,r,i){const o=e[n];if(o!=null){const l=U(o,"default");if(l&&s===void 0){const c=o.default;if(o.type!==Function&&!o.skipFactory&&P(c)){const{propsDefaults:d}=r;if(n in d)s=d[n];else{const f=jt(r);s=d[n]=c.call(null,t),f()}}else s=c;r.ce&&r.ce._setProp(n,s)}o[0]&&(i&&!l?s=!1:o[1]&&(s===""||s===qe(n))&&(s=!0))}return s}const qo=new WeakMap;function Yr(e,t,n=!1){const s=n?qo:t.propsCache,r=s.get(e);if(r)return r;const i=e.props,o={},l=[];let c=!1;if(!P(e)){const f=p=>{c=!0;const[S,x]=Yr(p,t,!0);ie(o,S),x&&l.push(...x)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!i&&!c)return V(e)&&s.set(e,ct),ct;if(R(i))for(let f=0;f<i.length;f++){const p=Ve(i[f]);Ns(p)&&(o[p]=j)}else if(i)for(const f in i){const p=Ve(f);if(Ns(p)){const S=i[f],x=o[p]=R(S)||P(S)?{type:S}:ie({},S),C=x.type;let N=!1,ee=!0;if(R(C))for(let D=0;D<C.length;++D){const k=C[D],W=P(k)&&k.name;if(W==="Boolean"){N=!0;break}else W==="String"&&(ee=!1)}else N=P(C)&&C.name==="Boolean";x[0]=N,x[1]=ee,(N||U(x,"default"))&&l.push(p)}}const d=[o,l];return V(e)&&s.set(e,d),d}function Ns(e){return e[0]!=="$"&&!xt(e)}const ds=e=>e==="_"||e==="_ctx"||e==="$stable",hs=e=>R(e)?e.map(Ee):[Ee(e)],Jo=(e,t,n)=>{if(t._n)return t;const s=yo((...r)=>hs(t(...r)),n);return s._c=!1,s},zr=(e,t,n)=>{const s=e._ctx;for(const r in e){if(ds(r))continue;const i=e[r];if(P(i))t[r]=Jo(r,i,s);else if(i!=null){const o=hs(i);t[r]=()=>o}}},Xr=(e,t)=>{const n=hs(t);e.slots.default=()=>n},Zr=(e,t,n)=>{for(const s in t)(n||!ds(s))&&(e[s]=t[s])},Go=(e,t,n)=>{const s=e.slots=qr();if(e.vnode.shapeFlag&32){const r=t._;r?(Zr(s,t,n),n&&ur(s,"_",r,!0)):zr(t,s)}else t&&Xr(e,t)},Yo=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=j;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:Zr(r,t,n):(i=!t.$stable,zr(t,r)),o=t}else t&&(Xr(e,t),o={default:1});if(i)for(const l in r)!ds(l)&&o[l]==null&&delete r[l]},ae=ul;function zo(e){return Xo(e)}function Xo(e,t){const n=pn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:d,setElementText:f,parentNode:p,nextSibling:S,setScopeId:x=Te,insertStaticContent:C}=e,N=(a,u,h,b=null,g=null,m=null,v=void 0,w=null,_=!!u.dynamicChildren)=>{if(a===u)return;a&&!St(a,u)&&(b=Vt(a),be(a,g,m,!0),a=null),u.patchFlag===-2&&(_=!1,u.dynamicChildren=null);const{type:y,ref:A,shapeFlag:E}=u;switch(y){case _n:ee(a,u,h,b);break;case Fe:D(a,u,h,b);break;case Mn:a==null&&k(u,h,b,v);break;case fe:Ht(a,u,h,b,g,m,v,w,_);break;default:E&1?J(a,u,h,b,g,m,v,w,_):E&6?$t(a,u,h,b,g,m,v,w,_):(E&64||E&128)&&y.process(a,u,h,b,g,m,v,w,_,_t)}A!=null&&g?Rt(A,a&&a.ref,m,u||a,!u):A==null&&a&&a.ref!=null&&Rt(a.ref,null,m,a,!0)},ee=(a,u,h,b)=>{if(a==null)s(u.el=l(u.children),h,b);else{const g=u.el=a.el;u.children!==a.children&&d(g,u.children)}},D=(a,u,h,b)=>{a==null?s(u.el=c(u.children||""),h,b):u.el=a.el},k=(a,u,h,b)=>{[a.el,a.anchor]=C(a.children,u,h,b,a.el,a.anchor)},W=({el:a,anchor:u},h,b)=>{let g;for(;a&&a!==u;)g=S(a),s(a,h,b),a=g;s(u,h,b)},O=({el:a,anchor:u})=>{let h;for(;a&&a!==u;)h=S(a),r(a),a=h;r(u)},J=(a,u,h,b,g,m,v,w,_)=>{u.type==="svg"?v="svg":u.type==="math"&&(v="mathml"),a==null?Le(u,h,b,g,m,v,w,_):Kt(a,u,g,m,v,w,_)},Le=(a,u,h,b,g,m,v,w)=>{let _,y;const{props:A,shapeFlag:E,transition:T,dirs:I}=a;if(_=a.el=o(a.type,m,A&&A.is,A),E&8?f(_,a.children):E&16&&je(a.children,_,null,b,g,In(a,m),v,w),I&&ze(a,null,b,"created"),me(_,a,a.scopeId,v,b),A){for(const H in A)H!=="value"&&!xt(H)&&i(_,H,null,A[H],m,b);"value"in A&&i(_,"value",null,A.value,m),(y=A.onVnodeBeforeMount)&&ve(y,b,a)}I&&ze(a,null,b,"beforeMount");const M=Zo(g,T);M&&T.beforeEnter(_),s(_,u,h),((y=A&&A.onVnodeMounted)||M||I)&&ae(()=>{y&&ve(y,b,a),M&&T.enter(_),I&&ze(a,null,b,"mounted")},g)},me=(a,u,h,b,g)=>{if(h&&x(a,h),b)for(let m=0;m<b.length;m++)x(a,b[m]);if(g){let m=g.subTree;if(u===m||ri(m.type)&&(m.ssContent===u||m.ssFallback===u)){const v=g.vnode;me(a,v,v.scopeId,v.slotScopeIds,g.parent)}}},je=(a,u,h,b,g,m,v,w,_=0)=>{for(let y=_;y<a.length;y++){const A=a[y]=w?He(a[y]):Ee(a[y]);N(null,A,u,h,b,g,m,v,w)}},Kt=(a,u,h,b,g,m,v)=>{const w=u.el=a.el;let{patchFlag:_,dynamicChildren:y,dirs:A}=u;_|=a.patchFlag&16;const E=a.props||j,T=u.props||j;let I;if(h&&Xe(h,!1),(I=T.onVnodeBeforeUpdate)&&ve(I,h,u,a),A&&ze(u,a,h,"beforeUpdate"),h&&Xe(h,!0),(E.innerHTML&&T.innerHTML==null||E.textContent&&T.textContent==null)&&f(w,""),y?Je(a.dynamicChildren,y,w,h,b,In(u,g),m):v||K(a,u,w,null,h,b,In(u,g),m,!1),_>0){if(_&16)bt(w,E,T,h,g);else if(_&2&&E.class!==T.class&&i(w,"class",null,T.class,g),_&4&&i(w,"style",E.style,T.style,g),_&8){const M=u.dynamicProps;for(let H=0;H<M.length;H++){const L=M[H],oe=E[L],le=T[L];(le!==oe||L==="value")&&i(w,L,oe,le,g,h)}}_&1&&a.children!==u.children&&f(w,u.children)}else!v&&y==null&&bt(w,E,T,h,g);((I=T.onVnodeUpdated)||A)&&ae(()=>{I&&ve(I,h,u,a),A&&ze(u,a,h,"updated")},b)},Je=(a,u,h,b,g,m,v)=>{for(let w=0;w<u.length;w++){const _=a[w],y=u[w],A=_.el&&(_.type===fe||!St(_,y)||_.shapeFlag&198)?p(_.el):h;N(_,y,A,null,b,g,m,v,!0)}},bt=(a,u,h,b,g)=>{if(u!==h){if(u!==j)for(const m in u)!xt(m)&&!(m in h)&&i(a,m,u[m],null,g,b);for(const m in h){if(xt(m))continue;const v=h[m],w=u[m];v!==w&&m!=="value"&&i(a,m,w,v,g,b)}"value"in h&&i(a,"value",u.value,h.value,g)}},Ht=(a,u,h,b,g,m,v,w,_)=>{const y=u.el=a?a.el:l(""),A=u.anchor=a?a.anchor:l("");let{patchFlag:E,dynamicChildren:T,slotScopeIds:I}=u;I&&(w=w?w.concat(I):I),a==null?(s(y,h,b),s(A,h,b),je(u.children||[],h,A,g,m,v,w,_)):E>0&&E&64&&T&&a.dynamicChildren?(Je(a.dynamicChildren,T,h,g,m,v,w),(u.key!=null||g&&u===g.subTree)&&Qr(a,u,!0)):K(a,u,h,A,g,m,v,w,_)},$t=(a,u,h,b,g,m,v,w,_)=>{u.slotScopeIds=w,a==null?u.shapeFlag&512?g.ctx.activate(u,h,b,v,_):Sn(u,h,b,g,m,v,_):bs(a,u,_)},Sn=(a,u,h,b,g,m,v)=>{const w=a.component=yl(a,b,g);if(jr(a)&&(w.ctx.renderer=_t),_l(w,!1,v),w.asyncDep){if(g&&g.registerDep(w,te,v),!a.el){const _=w.subTree=Ae(Fe);D(null,_,u,h),a.placeholder=_.el}}else te(w,a,u,h,g,m,v)},bs=(a,u,h)=>{const b=u.component=a.component;if(cl(a,u,h))if(b.asyncDep&&!b.asyncResolved){B(b,u,h);return}else b.next=u,b.update();else u.el=a.el,b.vnode=u},te=(a,u,h,b,g,m,v)=>{const w=()=>{if(a.isMounted){let{next:E,bu:T,u:I,parent:M,vnode:H}=a;{const _e=ei(a);if(_e){E&&(E.el=H.el,B(a,E,v)),_e.asyncDep.then(()=>{a.isUnmounted||w()});return}}let L=E,oe;Xe(a,!1),E?(E.el=H.el,B(a,E,v)):E=H,T&&Yt(T),(oe=E.props&&E.props.onVnodeBeforeUpdate)&&ve(oe,M,E,H),Xe(a,!0);const le=Fs(a),ye=a.subTree;a.subTree=le,N(ye,le,p(ye.el),Vt(ye),a,g,m),E.el=le.el,L===null&&al(a,le.el),I&&ae(I,g),(oe=E.props&&E.props.onVnodeUpdated)&&ae(()=>ve(oe,M,E,H),g)}else{let E;const{el:T,props:I}=u,{bm:M,m:H,parent:L,root:oe,type:le}=a,ye=dt(u);Xe(a,!1),M&&Yt(M),!ye&&(E=I&&I.onVnodeBeforeMount)&&ve(E,L,u),Xe(a,!0);{oe.ce&&oe.ce._def.shadowRoot!==!1&&oe.ce._injectChildStyle(le);const _e=a.subTree=Fs(a);N(null,_e,h,b,a,g,m),u.el=_e.el}if(H&&ae(H,g),!ye&&(E=I&&I.onVnodeMounted)){const _e=u;ae(()=>ve(E,L,_e),g)}(u.shapeFlag&256||L&&dt(L.vnode)&&L.vnode.shapeFlag&256)&&a.a&&ae(a.a,g),a.isMounted=!0,u=h=b=null}};a.scope.on();const _=a.effect=new gr(w);a.scope.off();const y=a.update=_.run.bind(_),A=a.job=_.runIfDirty.bind(_);A.i=a,A.id=a.uid,_.scheduler=()=>us(A),Xe(a,!0),y()},B=(a,u,h)=>{u.component=a;const b=a.vnode.props;a.vnode=u,a.next=null,Wo(a,u.props,b,h),Yo(a,u.children,h),Ne(),Rs(a),De()},K=(a,u,h,b,g,m,v,w,_=!1)=>{const y=a&&a.children,A=a?a.shapeFlag:0,E=u.children,{patchFlag:T,shapeFlag:I}=u;if(T>0){if(T&128){kt(y,E,h,b,g,m,v,w,_);return}else if(T&256){Ge(y,E,h,b,g,m,v,w,_);return}}I&8?(A&16&&yt(y,g,m),E!==y&&f(h,E)):A&16?I&16?kt(y,E,h,b,g,m,v,w,_):yt(y,g,m,!0):(A&8&&f(h,""),I&16&&je(E,h,b,g,m,v,w,_))},Ge=(a,u,h,b,g,m,v,w,_)=>{a=a||ct,u=u||ct;const y=a.length,A=u.length,E=Math.min(y,A);let T;for(T=0;T<E;T++){const I=u[T]=_?He(u[T]):Ee(u[T]);N(a[T],I,h,null,g,m,v,w,_)}y>A?yt(a,g,m,!0,!1,E):je(u,h,b,g,m,v,w,_,E)},kt=(a,u,h,b,g,m,v,w,_)=>{let y=0;const A=u.length;let E=a.length-1,T=A-1;for(;y<=E&&y<=T;){const I=a[y],M=u[y]=_?He(u[y]):Ee(u[y]);if(St(I,M))N(I,M,h,null,g,m,v,w,_);else break;y++}for(;y<=E&&y<=T;){const I=a[E],M=u[T]=_?He(u[T]):Ee(u[T]);if(St(I,M))N(I,M,h,null,g,m,v,w,_);else break;E--,T--}if(y>E){if(y<=T){const I=T+1,M=I<A?u[I].el:b;for(;y<=T;)N(null,u[y]=_?He(u[y]):Ee(u[y]),h,M,g,m,v,w,_),y++}}else if(y>T)for(;y<=E;)be(a[y],g,m,!0),y++;else{const I=y,M=y,H=new Map;for(y=M;y<=T;y++){const ce=u[y]=_?He(u[y]):Ee(u[y]);ce.key!=null&&H.set(ce.key,y)}let L,oe=0;const le=T-M+1;let ye=!1,_e=0;const wt=new Array(le);for(y=0;y<le;y++)wt[y]=0;for(y=I;y<=E;y++){const ce=a[y];if(oe>=le){be(ce,g,m,!0);continue}let we;if(ce.key!=null)we=H.get(ce.key);else for(L=M;L<=T;L++)if(wt[L-M]===0&&St(ce,u[L])){we=L;break}we===void 0?be(ce,g,m,!0):(wt[we-M]=y+1,we>=_e?_e=we:ye=!0,N(ce,u[we],h,null,g,m,v,w,_),oe++)}const ws=ye?Qo(wt):ct;for(L=ws.length-1,y=le-1;y>=0;y--){const ce=M+y,we=u[ce],vs=u[ce+1],Ss=ce+1<A?vs.el||vs.placeholder:b;wt[y]===0?N(null,we,h,Ss,g,m,v,w,_):ye&&(L<0||y!==ws[L]?Ye(we,h,Ss,2):L--)}}},Ye=(a,u,h,b,g=null)=>{const{el:m,type:v,transition:w,children:_,shapeFlag:y}=a;if(y&6){Ye(a.component.subTree,u,h,b);return}if(y&128){a.suspense.move(u,h,b);return}if(y&64){v.move(a,u,h,_t);return}if(v===fe){s(m,u,h);for(let E=0;E<_.length;E++)Ye(_[E],u,h,b);s(a.anchor,u,h);return}if(v===Mn){W(a,u,h);return}if(b!==2&&y&1&&w)if(b===0)w.beforeEnter(m),s(m,u,h),ae(()=>w.enter(m),g);else{const{leave:E,delayLeave:T,afterLeave:I}=w,M=()=>{a.ctx.isUnmounted?r(m):s(m,u,h)},H=()=>{m._isLeaving&&m[vo](!0),E(m,()=>{M(),I&&I()})};T?T(m,M,H):H()}else s(m,u,h)},be=(a,u,h,b=!1,g=!1)=>{const{type:m,props:v,ref:w,children:_,dynamicChildren:y,shapeFlag:A,patchFlag:E,dirs:T,cacheIndex:I}=a;if(E===-2&&(g=!1),w!=null&&(Ne(),Rt(w,null,h,a,!0),De()),I!=null&&(u.renderCache[I]=void 0),A&256){u.ctx.deactivate(a);return}const M=A&1&&T,H=!dt(a);let L;if(H&&(L=v&&v.onVnodeBeforeUnmount)&&ve(L,u,a),A&6)Ei(a.component,h,b);else{if(A&128){a.suspense.unmount(h,b);return}M&&ze(a,null,u,"beforeUnmount"),A&64?a.type.remove(a,u,h,_t,b):y&&!y.hasOnce&&(m!==fe||E>0&&E&64)?yt(y,u,h,!1,!0):(m===fe&&E&384||!g&&A&16)&&yt(_,u,h),b&&ys(a)}(H&&(L=v&&v.onVnodeUnmounted)||M)&&ae(()=>{L&&ve(L,u,a),M&&ze(a,null,u,"unmounted")},h)},ys=a=>{const{type:u,el:h,anchor:b,transition:g}=a;if(u===fe){Si(h,b);return}if(u===Mn){O(a);return}const m=()=>{r(h),g&&!g.persisted&&g.afterLeave&&g.afterLeave()};if(a.shapeFlag&1&&g&&!g.persisted){const{leave:v,delayLeave:w}=g,_=()=>v(h,m);w?w(a.el,m,_):_()}else m()},Si=(a,u)=>{let h;for(;a!==u;)h=S(a),r(a),a=h;r(u)},Ei=(a,u,h)=>{const{bum:b,scope:g,job:m,subTree:v,um:w,m:_,a:y}=a;Ds(_),Ds(y),b&&Yt(b),g.stop(),m&&(m.flags|=8,be(v,a,u,h)),w&&ae(w,u),ae(()=>{a.isUnmounted=!0},u)},yt=(a,u,h,b=!1,g=!1,m=0)=>{for(let v=m;v<a.length;v++)be(a[v],u,h,b,g)},Vt=a=>{if(a.shapeFlag&6)return Vt(a.component.subTree);if(a.shapeFlag&128)return a.suspense.next();const u=S(a.anchor||a.el),h=u&&u[_o];return h?S(h):u};let En=!1;const _s=(a,u,h)=>{a==null?u._vnode&&be(u._vnode,null,null,!0):N(u._vnode||null,a,u,null,null,null,h),u._vnode=a,En||(En=!0,Rs(),Dr(),En=!1)},_t={p:N,um:be,m:Ye,r:ys,mt:Sn,mc:je,pc:K,pbc:Je,n:Vt,o:e};return{render:_s,hydrate:void 0,createApp:ko(_s)}}function In({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Xe({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Zo(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Qr(e,t,n=!1){const s=e.children,r=t.children;if(R(s)&&R(r))for(let i=0;i<s.length;i++){const o=s[i];let l=r[i];l.shapeFlag&1&&!l.dynamicChildren&&((l.patchFlag<=0||l.patchFlag===32)&&(l=r[i]=He(r[i]),l.el=o.el),!n&&l.patchFlag!==-2&&Qr(o,l)),l.type===_n&&l.patchFlag!==-1&&(l.el=o.el),l.type===Fe&&!l.el&&(l.el=o.el)}}function Qo(e){const t=e.slice(),n=[0];let s,r,i,o,l;const c=e.length;for(s=0;s<c;s++){const d=e[s];if(d!==0){if(r=n[n.length-1],e[r]<d){t[s]=r,n.push(s);continue}for(i=0,o=n.length-1;i<o;)l=i+o>>1,e[n[l]]<d?i=l+1:o=l;d<e[n[i]]&&(i>0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function ei(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:ei(t)}function Ds(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}const el=Symbol.for("v-scx"),tl=()=>zt(el);function Pn(e,t,n){return ti(e,t,n)}function ti(e,t,n=j){const{immediate:s,deep:r,flush:i,once:o}=n,l=ie({},n),c=t&&s||!t&&i!=="post";let d;if(Ft){if(i==="sync"){const x=tl();d=x.__watcherHandles||(x.__watcherHandles=[])}else if(!c){const x=()=>{};return x.stop=Te,x.resume=Te,x.pause=Te,x}}const f=re;l.call=(x,C,N)=>Re(x,f,C,N);let p=!1;i==="post"?l.scheduler=x=>{ae(x,f&&f.suspense)}:i!=="sync"&&(p=!0,l.scheduler=(x,C)=>{C?x():us(x)}),l.augmentJob=x=>{t&&(x.flags|=4),p&&(x.flags|=2,f&&(x.id=f.uid,x.i=f))};const S=po(e,t,l);return Ft&&(d?d.push(S):c&&S()),S}function nl(e,t,n){const s=this.proxy,r=q(e)?e.includes(".")?ni(s,e):()=>s[e]:e.bind(s,s);let i;P(t)?i=t:(i=t.handler,n=t);const o=jt(this),l=ti(r,i.bind(s),n);return o(),l}function ni(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r<n.length&&s;r++)s=s[n[r]];return s}}const sl=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ve(t)}Modifiers`]||e[`${qe(t)}Modifiers`];function rl(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||j;let r=n;const i=t.startsWith("update:"),o=i&&sl(s,t.slice(7));o&&(o.trim&&(r=n.map(f=>q(f)?f.trim():f)),o.number&&(r=n.map(tn)));let l,c=s[l=xn(t)]||s[l=xn(Ve(t))];!c&&i&&(c=s[l=xn(qe(t))]),c&&Re(c,e,6,r);const d=s[l+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Re(d,e,6,r)}}const il=new WeakMap;function si(e,t,n=!1){const s=n?il:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!P(e)){const c=d=>{const f=si(d,t,!0);f&&(l=!0,ie(o,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(V(e)&&s.set(e,null),null):(R(i)?i.forEach(c=>o[c]=null):ie(o,i),V(e)&&s.set(e,o),o)}function yn(e,t){return!e||!dn(t)?!1:(t=t.slice(2).replace(/Once$/,""),U(e,t[0].toLowerCase()+t.slice(1))||U(e,qe(t))||U(e,t))}function Fs(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:d,renderCache:f,props:p,data:S,setupState:x,ctx:C,inheritAttrs:N}=e,ee=ln(e);let D,k;try{if(n.shapeFlag&4){const O=r||s,J=O;D=Ee(d.call(J,O,f,p,x,S,C)),k=l}else{const O=t;D=Ee(O.length>1?O(p,{attrs:l,slots:o,emit:c}):O(p,null)),k=t.props?l:ol(l)}}catch(O){Ot.length=0,mn(O,e,1),D=Ae(Fe)}let W=D;if(k&&N!==!1){const O=Object.keys(k),{shapeFlag:J}=W;O.length&&J&7&&(i&&O.some(zn)&&(k=ll(k,i)),W=ht(W,k,!1,!0))}return n.dirs&&(W=ht(W,null,!1,!0),W.dirs=W.dirs?W.dirs.concat(n.dirs):n.dirs),n.transition&&fs(W,n.transition),D=W,ln(ee),D}const ol=e=>{let t;for(const n in e)(n==="class"||n==="style"||dn(n))&&((t||(t={}))[n]=e[n]);return t},ll=(e,t)=>{const n={};for(const s in e)(!zn(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function cl(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,d=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Us(s,o,d):!!o;if(c&8){const f=t.dynamicProps;for(let p=0;p<f.length;p++){const S=f[p];if(o[S]!==s[S]&&!yn(d,S))return!0}}}else return(r||l)&&(!l||!l.$stable)?!0:s===o?!1:s?o?Us(s,o,d):!0:!!o;return!1}function Us(e,t,n){const s=Object.keys(t);if(s.length!==Object.keys(e).length)return!0;for(let r=0;r<s.length;r++){const i=s[r];if(t[i]!==e[i]&&!yn(n,i))return!0}return!1}function al({vnode:e,parent:t},n){for(;t;){const s=t.subTree;if(s.suspense&&s.suspense.activeBranch===e&&(s.el=e.el),s===e)(e=t.vnode).el=n,t=t.parent;else break}}const ri=e=>e.__isSuspense;function ul(e,t){t&&t.pendingBranch?R(e)?t.effects.push(...e):t.effects.push(e):bo(e)}const fe=Symbol.for("v-fgt"),_n=Symbol.for("v-txt"),Fe=Symbol.for("v-cmt"),Mn=Symbol.for("v-stc"),Ot=[];let ue=null;function Bn(e=!1){Ot.push(ue=e?null:[])}function fl(){Ot.pop(),ue=Ot[Ot.length-1]||null}let Dt=1;function Ls(e,t=!1){Dt+=e,e<0&&ue&&t&&(ue.hasOnce=!0)}function ii(e){return e.dynamicChildren=Dt>0?ue||ct:null,fl(),Dt>0&&ue&&ue.push(e),e}function Bc(e,t,n,s,r,i){return ii(li(e,t,n,s,r,i,!0))}function Wn(e,t,n,s,r){return ii(Ae(e,t,n,s,r,!0))}function ps(e){return e?e.__v_isVNode===!0:!1}function St(e,t){return e.type===t.type&&e.key===t.key}const oi=({key:e})=>e??null,Xt=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?q(e)||z(e)||P(e)?{i:Q,r:e,k:t,f:!!n}:e:null);function li(e,t=null,n=null,s=0,r=null,i=e===fe?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&oi(t),ref:t&&Xt(t),scopeId:Ur,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:Q};return l?(gs(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=q(n)?8:16),Dt>0&&!o&&ue&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&ue.push(c),c}const Ae=dl;function dl(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Do)&&(e=Fe),ps(e)){const l=ht(e,t,!0);return n&&gs(l,n),Dt>0&&!i&&ue&&(l.shapeFlag&6?ue[ue.indexOf(e)]=l:ue.push(l)),l.patchFlag=-2,l}if(El(e)&&(e=e.__vccOpts),t){t=hl(t);let{class:l,style:c}=t;l&&!q(l)&&(t.class=es(l)),V(c)&&(as(c)&&!R(c)&&(c=ie({},c)),t.style=Qn(c))}const o=q(e)?1:ri(e)?128:wo(e)?64:V(e)?4:P(e)?2:0;return li(e,t,n,s,r,o,i,!0)}function hl(e){return e?as(e)||Jr(e)?ie({},e):e:null}function ht(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,d=t?gl(r||{},t):r,f={__v_isVNode:!0,__v_skip:!0,type:e.type,props:d,key:d&&oi(d),ref:t&&t.ref?n&&i?R(i)?i.concat(Xt(t)):[i,Xt(t)]:Xt(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==fe?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ht(e.ssContent),ssFallback:e.ssFallback&&ht(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&fs(f,c.clone(f)),f}function pl(e=" ",t=0){return Ae(_n,null,e,t)}function Wc(e="",t=!1){return t?(Bn(),Wn(Fe,null,e)):Ae(Fe,null,e)}function Ee(e){return e==null||typeof e=="boolean"?Ae(Fe):R(e)?Ae(fe,null,e.slice()):ps(e)?He(e):Ae(_n,null,String(e))}function He(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ht(e)}function gs(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(R(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),gs(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!Jr(t)?t._ctx=Q:r===3&&Q&&(Q.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else P(t)?(t={default:t,_ctx:Q},n=32):(t=String(t),s&64?(n=16,t=[pl(t)]):n=8);e.children=t,e.shapeFlag|=n}function gl(...e){const t={};for(let n=0;n<e.length;n++){const s=e[n];for(const r in s)if(r==="class")t.class!==s.class&&(t.class=es([t.class,s.class]));else if(r==="style")t.style=Qn([t.style,s.style]);else if(dn(r)){const i=t[r],o=s[r];o&&i!==o&&!(R(i)&&i.includes(o))&&(t[r]=i?[].concat(i,o):o)}else r!==""&&(t[r]=s[r])}return t}function ve(e,t,n,s=null){Re(e,t,7,[n,s])}const ml=Br();let bl=0;function yl(e,t,n){const s=e.type,r=(t?t.appContext:e.appContext)||ml,i={uid:bl++,vnode:e,type:s,parent:t,appContext:r,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new pr(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(r.provides),ids:t?t.ids:["",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:Yr(s,r),emitsOptions:si(s,r),emit:null,emitted:null,propsDefaults:j,inheritAttrs:s.inheritAttrs,ctx:j,data:j,props:j,attrs:j,slots:j,refs:j,setupState:j,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return i.ctx={_:i},i.root=t?t.root:i,i.emit=rl.bind(null,i),e.ce&&e.ce(i),i}let re=null;const ci=()=>re||Q;let un,qn;{const e=pn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};un=t("__VUE_INSTANCE_SETTERS__",n=>re=n),qn=t("__VUE_SSR_SETTERS__",n=>Ft=n)}const jt=e=>{const t=re;return un(e),e.scope.on(),()=>{e.scope.off(),un(t)}},js=()=>{re&&re.scope.off(),un(null)};function ai(e){return e.vnode.shapeFlag&4}let Ft=!1;function _l(e,t=!1,n=!1){t&&qn(t);const{props:s,children:r}=e.vnode,i=ai(e);Bo(e,s,i,t),Go(e,r,n||t);const o=i?wl(e,t):void 0;return t&&qn(!1),o}function wl(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Fo);const{setup:s}=n;if(s){Ne();const r=e.setupContext=s.length>1?Sl(e):null,i=jt(e),o=Lt(s,e,0,[e.props,r]),l=or(o);if(De(),i(),(l||e.sp)&&!dt(e)&&Lr(e),l){if(o.then(js,js),t)return o.then(c=>{Ks(e,c)}).catch(c=>{mn(c,e,0)});e.asyncDep=o}else Ks(e,o)}else ui(e)}function Ks(e,t,n){P(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:V(t)&&(e.setupState=Ir(t)),ui(e)}function ui(e,t,n){const s=e.type;e.render||(e.render=s.render||Te);{const r=jt(e);Ne();try{Uo(e)}finally{De(),r()}}}const vl={get(e,t){return Z(e,"get",""),e[t]}};function Sl(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,vl),slots:e.slots,emit:e.emit,expose:t}}function wn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ir(so(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ct)return Ct[n](e)},has(t,n){return n in t||n in Ct}})):e.proxy}function El(e){return P(e)&&"__vccOpts"in e}const xl=(e,t)=>fo(e,t,Ft),Tl="3.5.21";/**
14
+ * @vue/runtime-dom v3.5.21
15
+ * (c) 2018-present Yuxi (Evan) You and Vue contributors
16
+ * @license MIT
17
+ **/let Jn;const Hs=typeof window<"u"&&window.trustedTypes;if(Hs)try{Jn=Hs.createPolicy("vue",{createHTML:e=>e})}catch{}const fi=Jn?e=>Jn.createHTML(e):e=>e,Al="http://www.w3.org/2000/svg",Rl="http://www.w3.org/1998/Math/MathML",Oe=typeof document<"u"?document:null,$s=Oe&&Oe.createElement("template"),Cl={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?Oe.createElementNS(Al,e):t==="mathml"?Oe.createElementNS(Rl,e):n?Oe.createElement(e,{is:n}):Oe.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>Oe.createTextNode(e),createComment:e=>Oe.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Oe.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{$s.innerHTML=fi(s==="svg"?`<svg>${e}</svg>`:s==="mathml"?`<math>${e}</math>`:e);const l=$s.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ol=Symbol("_vtc");function Il(e,t,n){const s=e[Ol];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const ks=Symbol("_vod"),Pl=Symbol("_vsh"),Ml=Symbol(""),Nl=/(?:^|;)\s*display\s*:/;function Dl(e,t,n){const s=e.style,r=q(n);let i=!1;if(n&&!r){if(t)if(q(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&Zt(s,l,"")}else for(const o in t)n[o]==null&&Zt(s,o,"");for(const o in n)o==="display"&&(i=!0),Zt(s,o,n[o])}else if(r){if(t!==n){const o=s[Ml];o&&(n+=";"+o),s.cssText=n,i=Nl.test(n)}}else t&&e.removeAttribute("style");ks in e&&(e[ks]=i?s.display:"",e[Pl]&&(s.display="none"))}const Vs=/\s*!important$/;function Zt(e,t,n){if(R(n))n.forEach(s=>Zt(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Fl(e,t);Vs.test(n)?e.setProperty(qe(s),n.replace(Vs,""),"important"):e[s]=n}}const Bs=["Webkit","Moz","ms"],Nn={};function Fl(e,t){const n=Nn[t];if(n)return n;let s=Ve(t);if(s!=="filter"&&s in e)return Nn[t]=s;s=ar(s);for(let r=0;r<Bs.length;r++){const i=Bs[r]+s;if(i in e)return Nn[t]=i}return t}const Ws="http://www.w3.org/1999/xlink";function qs(e,t,n,s,r,i=Ni(t)){s&&t.startsWith("xlink:")?n==null?e.removeAttributeNS(Ws,t.slice(6,t.length)):e.setAttributeNS(Ws,t,n):n==null||i&&!fr(n)?e.removeAttribute(t):e.setAttribute(t,i?"":ge(n)?String(n):n)}function Js(e,t,n,s,r){if(t==="innerHTML"||t==="textContent"){n!=null&&(e[t]=t==="innerHTML"?fi(n):n);return}const i=e.tagName;if(t==="value"&&i!=="PROGRESS"&&!i.includes("-")){const l=i==="OPTION"?e.getAttribute("value")||"":e.value,c=n==null?e.type==="checkbox"?"on":"":String(n);(l!==c||!("_value"in e))&&(e.value=c),n==null&&e.removeAttribute(t),e._value=n;return}let o=!1;if(n===""||n==null){const l=typeof e[t];l==="boolean"?n=fr(n):n==null&&l==="string"?(n="",o=!0):l==="number"&&(n=0,o=!0)}try{e[t]=n}catch{}o&&e.removeAttribute(r||t)}function Me(e,t,n,s){e.addEventListener(t,n,s)}function Ul(e,t,n,s){e.removeEventListener(t,n,s)}const Gs=Symbol("_vei");function Ll(e,t,n,s,r=null){const i=e[Gs]||(e[Gs]={}),o=i[t];if(s&&o)o.value=s;else{const[l,c]=jl(t);if(s){const d=i[t]=$l(s,r);Me(e,l,d,c)}else o&&(Ul(e,l,o,c),i[t]=void 0)}}const Ys=/(?:Once|Passive|Capture)$/;function jl(e){let t;if(Ys.test(e)){t={};let s;for(;s=e.match(Ys);)e=e.slice(0,e.length-s[0].length),t[s[0].toLowerCase()]=!0}return[e[2]===":"?e.slice(3):qe(e.slice(2)),t]}let Dn=0;const Kl=Promise.resolve(),Hl=()=>Dn||(Kl.then(()=>Dn=0),Dn=Date.now());function $l(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Re(kl(s,n.value),t,5,[s])};return n.value=e,n.attached=Hl(),n}function kl(e,t){if(R(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const zs=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Vl=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?Il(e,s,o):t==="style"?Dl(e,n,s):dn(t)?zn(t)||Ll(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Bl(e,t,s,o))?(Js(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&qs(e,t,s,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!q(s))?Js(e,Ve(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),qs(e,t,s,o))};function Bl(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&zs(t)&&P(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return zs(t)&&q(n)?!1:t in e}const We=e=>{const t=e.props["onUpdate:modelValue"]||!1;return R(t)?n=>Yt(t,n):t};function Wl(e){e.target.composing=!0}function Xs(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const he=Symbol("_assign"),Zs={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[he]=We(r);const i=s||r.props&&r.props.type==="number";Me(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=tn(l)),e[he](l)}),n&&Me(e,"change",()=>{e.value=e.value.trim()}),t||(Me(e,"compositionstart",Wl),Me(e,"compositionend",Xs),Me(e,"change",Xs))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[he]=We(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?tn(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c))}},ql={deep:!0,created(e,t,n){e[he]=We(n),Me(e,"change",()=>{const s=e._modelValue,r=pt(e),i=e.checked,o=e[he];if(R(s)){const l=ts(s,r),c=l!==-1;if(i&&!c)o(s.concat(r));else if(!i&&c){const d=[...s];d.splice(l,1),o(d)}}else if(mt(s)){const l=new Set(s);i?l.add(r):l.delete(r),o(l)}else o(di(e,i))})},mounted:Qs,beforeUpdate(e,t,n){e[he]=We(n),Qs(e,t,n)}};function Qs(e,{value:t,oldValue:n},s){e._modelValue=t;let r;if(R(t))r=ts(t,s.props.value)>-1;else if(mt(t))r=t.has(s.props.value);else{if(t===n)return;r=st(t,di(e,!0))}e.checked!==r&&(e.checked=r)}const Jl={created(e,{value:t},n){e.checked=st(t,n.props.value),e[he]=We(n),Me(e,"change",()=>{e[he](pt(e))})},beforeUpdate(e,{value:t,oldValue:n},s){e[he]=We(s),t!==n&&(e.checked=st(t,s.props.value))}},Gl={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const r=mt(t);Me(e,"change",()=>{const i=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>n?tn(pt(o)):pt(o));e[he](e.multiple?r?new Set(i):i:i[0]),e._assigning=!0,Mr(()=>{e._assigning=!1})}),e[he]=We(s)},mounted(e,{value:t}){er(e,t)},beforeUpdate(e,t,n){e[he]=We(n)},updated(e,{value:t}){e._assigning||er(e,t)}};function er(e,t){const n=e.multiple,s=R(t);if(!(n&&!s&&!mt(t))){for(let r=0,i=e.options.length;r<i;r++){const o=e.options[r],l=pt(o);if(n)if(s){const c=typeof l;c==="string"||c==="number"?o.selected=t.some(d=>String(d)===String(l)):o.selected=ts(t,l)>-1}else o.selected=t.has(l);else if(st(pt(o),t)){e.selectedIndex!==r&&(e.selectedIndex=r);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function pt(e){return"_value"in e?e._value:e.value}function di(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const qc={created(e,t,n){Jt(e,t,n,null,"created")},mounted(e,t,n){Jt(e,t,n,null,"mounted")},beforeUpdate(e,t,n,s){Jt(e,t,n,s,"beforeUpdate")},updated(e,t,n,s){Jt(e,t,n,s,"updated")}};function Yl(e,t){switch(e){case"SELECT":return Gl;case"TEXTAREA":return Zs;default:switch(t){case"checkbox":return ql;case"radio":return Jl;default:return Zs}}}function Jt(e,t,n,s,r){const o=Yl(e.tagName,n.props&&n.props.type)[r];o&&o(e,t,n,s)}const zl=["ctrl","shift","alt","meta"],Xl={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>zl.some(n=>e[`${n}Key`]&&!t.includes(n))},Jc=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=((r,...i)=>{for(let o=0;o<t.length;o++){const l=Xl[t[o]];if(l&&l(r,t))return}return e(r,...i)}))},Zl={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Gc=(e,t)=>{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=(r=>{if(!("key"in r))return;const i=qe(r.key);if(t.some(o=>o===i||Zl[o]===i))return e(r)}))},Ql=ie({patchProp:Vl},Cl);let tr;function ec(){return tr||(tr=zo(Ql))}const Yc=((...e)=>{const t=ec().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=nc(s);if(!r)return;const i=t._component;!P(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,tc(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t});function tc(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function nc(e){return q(e)?document.querySelector(e):e}function xe(e){const t=new Uint8Array(e);let n="";for(const r of t)n+=String.fromCharCode(r);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function fn(e){const t=e.replace(/-/g,"+").replace(/_/g,"/"),n=(4-t.length%4)%4,s=t.padEnd(t.length+n,"="),r=atob(s),i=new ArrayBuffer(r.length),o=new Uint8Array(i);for(let l=0;l<r.length;l++)o[l]=r.charCodeAt(l);return i}function ms(){return sc.stubThis(globalThis?.PublicKeyCredential!==void 0&&typeof globalThis.PublicKeyCredential=="function")}const sc={stubThis:e=>e};function hi(e){const{id:t}=e;return{...e,id:fn(t),transports:e.transports}}function pi(e){return e==="localhost"||/^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/i.test(e)}class G extends Error{constructor({message:t,code:n,cause:s,name:r}){super(t,{cause:s}),Object.defineProperty(this,"code",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.name=r??s.name,this.code=n}}function rc({error:e,options:t}){const{publicKey:n}=t;if(!n)throw Error("options was missing required publicKey property");if(e.name==="AbortError"){if(t.signal instanceof AbortSignal)return new G({message:"Registration ceremony was sent an abort signal",code:"ERROR_CEREMONY_ABORTED",cause:e})}else if(e.name==="ConstraintError"){if(n.authenticatorSelection?.requireResidentKey===!0)return new G({message:"Discoverable credentials were required but no available authenticator supported it",code:"ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT",cause:e});if(t.mediation==="conditional"&&n.authenticatorSelection?.userVerification==="required")return new G({message:"User verification was required during automatic registration but it could not be performed",code:"ERROR_AUTO_REGISTER_USER_VERIFICATION_FAILURE",cause:e});if(n.authenticatorSelection?.userVerification==="required")return new G({message:"User verification was required but no available authenticator supported it",code:"ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT",cause:e})}else{if(e.name==="InvalidStateError")return new G({message:"The authenticator was previously registered",code:"ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED",cause:e});if(e.name==="NotAllowedError")return new G({message:e.message,code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:e});if(e.name==="NotSupportedError")return n.pubKeyCredParams.filter(r=>r.type==="public-key").length===0?new G({message:'No entry in pubKeyCredParams was of type "public-key"',code:"ERROR_MALFORMED_PUBKEYCREDPARAMS",cause:e}):new G({message:"No available authenticator supported any of the specified pubKeyCredParams algorithms",code:"ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG",cause:e});if(e.name==="SecurityError"){const s=globalThis.location.hostname;if(pi(s)){if(n.rp.id!==s)return new G({message:`The RP ID "${n.rp.id}" is invalid for this domain`,code:"ERROR_INVALID_RP_ID",cause:e})}else return new G({message:`${globalThis.location.hostname} is an invalid domain`,code:"ERROR_INVALID_DOMAIN",cause:e})}else if(e.name==="TypeError"){if(n.user.id.byteLength<1||n.user.id.byteLength>64)return new G({message:"User ID was not between 1 and 64 characters",code:"ERROR_INVALID_USER_ID_LENGTH",cause:e})}else if(e.name==="UnknownError")return new G({message:"The authenticator was unable to process the specified options, or could not create a new credential",code:"ERROR_AUTHENTICATOR_GENERAL_ERROR",cause:e})}return e}class ic{constructor(){Object.defineProperty(this,"controller",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}createNewAbortSignal(){if(this.controller){const n=new Error("Cancelling existing WebAuthn API call for new one");n.name="AbortError",this.controller.abort(n)}const t=new AbortController;return this.controller=t,t.signal}cancelCeremony(){if(this.controller){const t=new Error("Manually cancelling existing WebAuthn API call");t.name="AbortError",this.controller.abort(t),this.controller=void 0}}}const gi=new ic,oc=["cross-platform","platform"];function mi(e){if(e&&!(oc.indexOf(e)<0))return e}async function lc(e){!e.optionsJSON&&e.challenge&&(console.warn("startRegistration() was not called correctly. It will try to continue with the provided options, but this call should be refactored to use the expected call structure instead. See https://simplewebauthn.dev/docs/packages/browser#typeerror-cannot-read-properties-of-undefined-reading-challenge for more information."),e={optionsJSON:e});const{optionsJSON:t,useAutoRegister:n=!1}=e;if(!ms())throw new Error("WebAuthn is not supported in this browser");const s={...t,challenge:fn(t.challenge),user:{...t.user,id:fn(t.user.id)},excludeCredentials:t.excludeCredentials?.map(hi)},r={};n&&(r.mediation="conditional"),r.publicKey=s,r.signal=gi.createNewAbortSignal();let i;try{i=await navigator.credentials.create(r)}catch(C){throw rc({error:C,options:r})}if(!i)throw new Error("Registration was not completed");const{id:o,rawId:l,response:c,type:d}=i;let f;typeof c.getTransports=="function"&&(f=c.getTransports());let p;if(typeof c.getPublicKeyAlgorithm=="function")try{p=c.getPublicKeyAlgorithm()}catch(C){Fn("getPublicKeyAlgorithm()",C)}let S;if(typeof c.getPublicKey=="function")try{const C=c.getPublicKey();C!==null&&(S=xe(C))}catch(C){Fn("getPublicKey()",C)}let x;if(typeof c.getAuthenticatorData=="function")try{x=xe(c.getAuthenticatorData())}catch(C){Fn("getAuthenticatorData()",C)}return{id:o,rawId:xe(l),response:{attestationObject:xe(c.attestationObject),clientDataJSON:xe(c.clientDataJSON),transports:f,publicKeyAlgorithm:p,publicKey:S,authenticatorData:x},type:d,clientExtensionResults:i.getClientExtensionResults(),authenticatorAttachment:mi(i.authenticatorAttachment)}}function Fn(e,t){console.warn(`The browser extension that intercepted this WebAuthn API call incorrectly implemented ${e}. You should report this error to them.
18
+ `,t)}function cc(){if(!ms())return Un.stubThis(new Promise(t=>t(!1)));const e=globalThis.PublicKeyCredential;return e?.isConditionalMediationAvailable===void 0?Un.stubThis(new Promise(t=>t(!1))):Un.stubThis(e.isConditionalMediationAvailable())}const Un={stubThis:e=>e};function ac({error:e,options:t}){const{publicKey:n}=t;if(!n)throw Error("options was missing required publicKey property");if(e.name==="AbortError"){if(t.signal instanceof AbortSignal)return new G({message:"Authentication ceremony was sent an abort signal",code:"ERROR_CEREMONY_ABORTED",cause:e})}else{if(e.name==="NotAllowedError")return new G({message:e.message,code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:e});if(e.name==="SecurityError"){const s=globalThis.location.hostname;if(pi(s)){if(n.rpId!==s)return new G({message:`The RP ID "${n.rpId}" is invalid for this domain`,code:"ERROR_INVALID_RP_ID",cause:e})}else return new G({message:`${globalThis.location.hostname} is an invalid domain`,code:"ERROR_INVALID_DOMAIN",cause:e})}else if(e.name==="UnknownError")return new G({message:"The authenticator was unable to process the specified options, or could not create a new assertion signature",code:"ERROR_AUTHENTICATOR_GENERAL_ERROR",cause:e})}return e}async function uc(e){!e.optionsJSON&&e.challenge&&(console.warn("startAuthentication() was not called correctly. It will try to continue with the provided options, but this call should be refactored to use the expected call structure instead. See https://simplewebauthn.dev/docs/packages/browser#typeerror-cannot-read-properties-of-undefined-reading-challenge for more information."),e={optionsJSON:e});const{optionsJSON:t,useBrowserAutofill:n=!1,verifyBrowserAutofillInput:s=!0}=e;if(!ms())throw new Error("WebAuthn is not supported in this browser");let r;t.allowCredentials?.length!==0&&(r=t.allowCredentials?.map(hi));const i={...t,challenge:fn(t.challenge),allowCredentials:r},o={};if(n){if(!await cc())throw Error("Browser does not support WebAuthn autofill");if(document.querySelectorAll("input[autocomplete$='webauthn']").length<1&&s)throw Error('No <input> with "webauthn" as the only or last value in its `autocomplete` attribute was detected');o.mediation="conditional",i.allowCredentials=[]}o.publicKey=i,o.signal=gi.createNewAbortSignal();let l;try{l=await navigator.credentials.get(o)}catch(x){throw ac({error:x,options:o})}if(!l)throw new Error("Authentication was not completed");const{id:c,rawId:d,response:f,type:p}=l;let S;return f.userHandle&&(S=xe(f.userHandle)),{id:c,rawId:xe(d),response:{authenticatorData:xe(f.authenticatorData),clientDataJSON:xe(f.clientDataJSON),signature:xe(f.signature),userHandle:S},type:p,clientExtensionResults:l.getClientExtensionResults(),authenticatorAttachment:mi(l.authenticatorAttachment)}}class fc extends WebSocket{#n=[];#e=[];#t=null;#s=!1;constructor(t,n,s,r,i){super(new URL(s,document.baseURI.replace(/^http/,"ws")),r),this.binaryType=i||"blob",this.onopen=()=>{this.#s=!0,t(this)},this.onmessage=o=>{this.#e.length?this.#e.shift().resolve(o.data):this.#n.push(o.data)},this.onclose=o=>{if(!this.#s){n(new Error(`Failed to connect to server (code ${o.code})`));return}let l;if(o.wasClean)switch(o.code){case 1e3:l="Connection closed normally";break;case 1001:l="Server is going away";break;case 1002:l="Protocol error";break;case 1003:l="Unsupported data received";break;case 1006:l="Connection lost unexpectedly";break;case 1007:l="Invalid data received";break;case 1008:l="Policy violation";break;case 1009:l="Message too large";break;case 1010:l="Extension negotiation failed";break;case 1011:l="Server encountered an error";break;case 1012:l="Server is restarting";break;case 1013:l="Server is overloaded, try again later";break;case 1014:l="Bad gateway";break;case 1015:l="TLS handshake failed";break;default:l=`Connection closed (code ${o.code})`}else l=o.code===1006?"Connection lost unexpectedly":`Connection closed with error (code ${o.code})`;this.#t=new Error(l),this.#e.splice(0).forEach(c=>c.reject(this.#t))}}receive(){return this.#n.length?Promise.resolve(this.#n.shift()):this.#t?Promise.reject(this.#t):new Promise((t,n)=>this.#e.push({resolve:t,reject:n}))}async receive_bytes(){const t=await this.receive();if(typeof t=="string")throw console.error("WebSocket received text data, expected a binary message",t),new Error("WebSocket received text data, expected a binary message");return t instanceof Blob?t.bytes():new Uint8Array(t)}async receive_json(){const t=await this.receive();if(typeof t!="string")throw console.error("WebSocket received binary data, expected JSON string",t),new Error("WebSocket received binary data, expected JSON string");try{return JSON.parse(t)}catch(n){throw console.error("Failed to parse JSON from WebSocket message",t,n),new Error("Failed to parse JSON from WebSocket message")}}send_json(t){let n;try{n=JSON.stringify(t)}catch(s){throw new Error(`Failed to stringify data for WebSocket: ${s.message}`)}this.send(n)}}function bi(e,t={}){const{protocols:n,binaryType:s}=t;return new Promise((r,i)=>{new fc(r,i,e,n,s)})}let Gt=null,Qe=null;async function dc(){return Qe||Gt||(Gt=fetch("/auth/api/settings").then(e=>e.ok?e.json():{}).then(e=>(Qe=e||{},Qe)).catch(()=>(Qe={},Qe)),Gt)}function It(){const e=Qe?.ui_base_path||"/auth/";return e==="/"?"/":e.endsWith("/")?e:e+"/"}function zc(){return It()==="/"?"/admin/":It()+"admin/"}function Xc(e=""){const t=e.startsWith("/")?e.slice(1):e;return t?It()==="/"?"/"+t:It()+t:It()}const gt="paskia-iframe",nr="paskia-dialog",hc=`body::before {
19
+ content: '';
20
+ position: fixed;
21
+ inset: 0;
22
+ z-index: 1099;
23
+ background: transparent;
24
+ backdrop-filter: blur(0) brightness(1);
25
+ -webkit-backdrop-filter: blur(0) brightness(1);
26
+ pointer-events: none;
27
+ visibility: hidden;
28
+ transition: all 0.2s ease-out;
29
+ }
30
+ body.paskia-backdrop::before {
31
+ -webkit-backdrop-filter: blur(.2rem) brightness(0.5);
32
+ backdrop-filter: blur(.2rem) brightness(0.5);
33
+ visibility: visible;
34
+ }
35
+ body.paskia-backdrop {
36
+ overflow: auto;
37
+ }
38
+ #${gt} {
39
+ border: none;
40
+ position: fixed;
41
+ top: 0;
42
+ left: 0;
43
+ width: 100%;
44
+ height: 100%;
45
+ z-index: 9999;
46
+ color-scheme: auto;
47
+ background: transparent;
48
+ }
49
+ `;let $e=null,et=null,ot=null,lt=null,sr=!1,Qt=0;function yi(){if(document.getElementById(nr))return;const e=document.createElement("style");e.id=nr,e.textContent=hc,document.head.insertBefore(e,document.head.firstChild)}class pc extends Error{constructor(){super("Authentication cancelled"),this.name="AuthCancelledError"}}function gc(){Qt++,document.body.classList.add("paskia-backdrop")}function mc(){Qt=Math.max(0,Qt-1),Qt===0&&document.body.classList.remove("paskia-backdrop")}function Gn(){$e&&($e.remove(),$e=null,mc())}function bc(e){const t=e.data;if(t?.type)switch(t.type){case"auth-success":Gn(),ot&&(ot(),et=null,ot=null,lt=null);break;case"auth-back":Gn(),lt&&(lt(new pc),et=null,ot=null,lt=null);break}}function yc(){sr||typeof window<"u"&&(window.addEventListener("message",bc),sr=!0)}function _i(e,t="Authentication"){return yi(),yc(),et||(document.getElementById(gt)?(et=new Promise((n,s)=>{ot=n,lt=s}),et):(et=new Promise((n,s)=>{ot=n,lt=s}),Gn(),gc(),$e=document.createElement("iframe"),$e.id=gt,$e.title=t,$e.src=e,document.body.appendChild($e),et))}function Zc(e,t="Authentication"){yi();const n=document.getElementById(gt);n&&n.remove();const s=document.createElement("iframe");return s.id=gt,s.title=t,s.src=e,document.body.appendChild(s),s}function Qc(){const e=document.getElementById(gt);e&&e.remove()}const _c=1e3;class wi extends Error{constructor(t,n,s){super(s?.detail||`Request failed: ${n.status}`),this.name="ApiError",this.url=t,this.status=n.status,this.statusText=n.statusText,this.data=s}}class en extends Error{constructor(t,n=null){super(t),this.name="NetworkError",this.originalError=n}}async function wc(e,t={}){const{timeout:n=_c,...s}=t;for(s.credentials=s.credentials||"include";;){let r;try{r=await fetch(e,{...s,signal:n?AbortSignal.timeout(n):void 0})}catch(i){const o=i;throw o.name==="TimeoutError"?new en("Request timed out",o):o.name==="AbortError"?i:o.name==="TypeError"&&o.message==="Failed to fetch"?new en("Unable to connect to server",o):new en(o.message||"Network error",o)}if(r.status===401||r.status===403){let i=null;try{i=await r.clone().json()}catch{}if(i?.auth?.iframe&&window===window.top){await _i(i.auth.iframe);continue}}return r}}async function vc(e,t={}){return Sc(e,t,wc)}async function Sc(e,t={},n=fetch){const s={Accept:"application/json",...t.headers};let r;t.body&&typeof t.body=="object"&&!(t.body instanceof FormData)?(s["Content-Type"]="application/json",r=JSON.stringify(t.body)):r=t.body;const i={...t,headers:s,body:r},o=await n(e,i),l=await o.json();if(!o.ok)throw new wi(e,o,l);return l}function ea(e){return e instanceof en||e instanceof wi?e.message:e.name==="TimeoutError"?"Request timed out":e.name==="TypeError"&&e.message==="Failed to fetch"?"Unable to connect to server":e.message||"An error occurred"}const Ec=60*1e3,xc=300*1e3;class ta{constructor(t,n){this.pollTimer=null,this.idleTimer=null,this.active=!1,this.userUuidGetter=t,this.onSessionLost=n,this.resetIdleTimer=this.resetIdleTimer.bind(this)}resetIdleTimer(){this.idleTimer&&clearTimeout(this.idleTimer),this.active||this.startPolling(),this.idleTimer=setTimeout(()=>this.stopPolling(),xc)}async validate(){try{(await vc("/auth/api/validate",{method:"POST"})).ctx?.user?.uuid!==this.userUuidGetter()&&window.location.reload()}catch(t){t.name!=="NetworkError"&&(this.stopPolling(),this.onSessionLost(t))}}startPolling(){this.active||(this.active=!0,this.pollTimer=setInterval(()=>this.validate(),Ec))}stopPolling(){this.active=!1,this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null)}start(){window.addEventListener("pointermove",this.resetIdleTimer),window.addEventListener("pointerdown",this.resetIdleTimer),this.resetIdleTimer()}stop(){window.removeEventListener("pointermove",this.resetIdleTimer),window.removeEventListener("pointerdown",this.resetIdleTimer),this.idleTimer&&clearTimeout(this.idleTimer),this.stopPolling()}}async function vi(e){const n=(await dc())?.auth_host;return n&&location.host!==n?`//${n}${e}`:e}async function Tc(e=null,t=null,n=null){let s=[];e&&s.push(`reset=${encodeURIComponent(e)}`),t&&s.push(`name=${encodeURIComponent(t)}`);const r=s.length?`?${s.join("&")}`:"";for(;;){const i=await bi(await vi(`/auth/ws/register${r}`));try{const o=await i.receive_json();if((o.status===401||o.status===403)&&o.auth?.iframe){i.close(),await _i(o.auth.iframe);continue}if(o.status)throw new Error(o.detail||`Registration failed: ${o.status}`);n&&n();const l=await lc(o);i.send_json(l);const c=await i.receive_json();if(c.status)throw new Error(c.detail||`Registration failed: ${c.status}`);return c}catch(o){throw i.close(),console.error("Registration error:",o),Error(o.name==="NotAllowedError"?"Passkey registration cancelled":o.message)}}}async function Ac(){const e=await bi(await vi("/auth/ws/authenticate"));try{let t=await e.receive_json();if(t.status>=400)throw new Error(t.detail||`Authentication failed: ${t.status}`);const n=await uc(t);if(e.send_json(n),t=await e.receive_json(),t.status>=400)throw new Error(t.detail||`Authentication failed: ${t.status}`);return t}catch(t){throw console.error("Authentication error:",t),Error(t.name==="NotAllowedError"?"Passkey authentication cancelled":t.message)}finally{e.close()}}const na={authenticate:Ac,register:Tc},Rc={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"},Cc=new Set(["text","email","password","search","tel","url","number"]),Oc=e=>{const t=Rc[e.key];if(!t)return null;const n=e.target;return(n.tagName==="INPUT"&&Cc.has(n.type)||n.tagName==="TEXTAREA")&&(t==="left"||t==="right")&&n.value!==""?null:t},vn=(e,t=null)=>{if(!e)return[];const n=t||e.dataset?.navItems||'button:not([disabled]), a, [tabindex="0"], [tabindex="-1"]:not([disabled])';return Array.from(e.querySelectorAll(n))},Ic=(e,t)=>{const n=vn(e,t);if(n.length===0)return null;const s=n[0].getBoundingClientRect().top;let r=0;for(const i of n)if(Math.abs(i.getBoundingClientRect().top-s)<5)r++;else break;return{items:n,cols:Math.max(1,r)}},Pc=(e,t,n,s={})=>{const r=vn(e,s.itemSelector);if(r.length===0)return"none";const i=r.indexOf(t);return i===-1?"none":n==="left"?i>0?(r[i-1].focus(),"moved"):"boundary":n==="right"&&i<r.length-1?(r[i+1].focus(),"moved"):"boundary"},sa=(e,t,n,s={})=>{const r=Ic(e,s.itemSelector);if(!r)return"none";const{items:i,cols:o}=r,l=i.indexOf(t);if(l===-1)return"none";const c=Math.floor(l/o),d=l%o;let f=l;switch(n){case"left":if(d===0)return"boundary";f=l-1;break;case"right":if(l>=i.length-1)return"boundary";f=l+1;break;case"up":if(c===0)return"boundary";f=l-o;break;case"down":if(l+o>=i.length)return"boundary";f=l+o;break;default:return"none"}return f!==l?(i[f].focus(),"moved"):"none"},ra=(e,t={})=>{if(!e)return null;const n=e.querySelector("[data-nav-primary]")||t.primarySelector&&e.querySelector(t.primarySelector);if(n)return n.focus(),n;const s=vn(e,t.itemSelector);return s.length>0?(s[0].focus(),s[0]):null},ia=(e,t,n={})=>{if(!e)return null;const s=vn(e,n.itemSelector);if(s.length===0)return null;const r=t<0?s.length+t:t;return r>=0&&r<s.length?(s[r].focus(),s[r]):null},oa=(e,t,n)=>e.key!=="Escape"?!1:(e.preventDefault(),t?.("up"),!0),la=(e,t)=>{const n=navigator.userAgent.includes("Mac OS");return e.key==="Delete"||n&&e.key==="Backspace"?(e.preventDefault(),t?.(),!0):!1},Mc=e=>{if(!e)return null;const t=[".btn-primary:not([disabled])",".btn-secondary:not([disabled])","button:not([disabled])"];for(const n of t){const s=e.querySelector(n);if(s)return s.focus(),s}return null},ca=e=>{if(!e)return null;const t=e.querySelector('input:not([disabled]):not([type="hidden"]), textarea:not([disabled])');return t?(t.focus(),typeof t.select=="function"&&t.select(),t):Mc(e)},Nc=".button-row, .modal-actions, .actions, .role-actions, .ancillary-actions",Dc=e=>{const t=Oc(e);if(!t)return;const n=e.target;if(n.tagName!=="BUTTON"&&n.tagName!=="A")return;const s=n.closest(Nc);s&&(t==="left"||t==="right")&&(e.preventDefault(),Pc(s,n,t,{itemSelector:"button:not([disabled]), a"}))};let rr=!1;const aa=()=>{rr||typeof document>"u"||(document.addEventListener("keydown",Dc),rr=!0)},ua=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n};export{Tc as $,yo as A,Oc as B,ra as C,Pc as D,ia as E,fe as F,na as G,vc as H,Zc as I,Yc as J,aa as K,Gc as L,Uc as M,ta as N,Qc as O,so as P,ls as Q,z as R,ut as S,F as T,Ui as U,Lc as V,Kc as W,zt as X,Vc as Y,Ac as Z,ua as _,Hr as a,sa as a0,la as a1,oa as a2,kc as a3,ca as a4,qc as a5,It as a6,wi as a7,ea as a8,Sc as a9,Mc as aa,Bc as b,xl as c,Bn as d,li as e,Wc as f,es as g,Hc as h,$c as i,Qn as j,pl as k,Jc as l,dc as m,Mr as n,Ao as o,bi as p,Xc as q,jc as r,uc as s,Fi as t,zc as u,Zs as v,Pn as w,Ae as x,Wn as y,oo as z};
@@ -0,0 +1 @@
1
+ :root{--font-sans: "Inter", "Inter var", "Segoe UI", system-ui, -apple-system, "Helvetica Neue", sans-serif;--font-mono: "DM Mono", "JetBrains Mono", "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", monospace;--color-canvas: #ffffff;--color-surface: #eff6ff;--color-surface-subtle: #dbeafe;--color-border: #2563eb;--color-border-strong: #1e40af;--color-heading: #1e3a8a;--color-text: #1e293b;--color-text-muted: #475569;--color-link: #1d4ed8;--color-link-hover: #1e40af;--color-accent: #2563eb;--color-accent-strong: #1e40af;--color-accent-contrast: #ffffff;--color-success-text: #166534;--color-success-bg: #dcfce7;--color-error-text: #b91c1c;--color-error-bg: #fee2e2;--color-info-text: #1e40af;--color-info-bg: #dbeafe;--color-danger: #dc2626;--shadow-soft: 0 10px 30px rgba(30, 64, 175, .15);--radius-none: 0;--radius-sm: 4px;--radius-md: 6px;--radius-lg: 10px;--space-xxs: .25rem;--space-xs: .5rem;--space-sm: .75rem;--space-md: 1rem;--space-lg: 1.5rem;--space-xl: 2.25rem;--space-xxl: 3.5rem;--layout-padding: clamp(1.5rem, 3vw + 1rem, 3.25rem);--transition-base: .16s ease;--focus-ring: 0 0 0 2px var(--color-accent)}@media (prefers-color-scheme: dark){:root{--color-canvas: #0f172a;--color-surface: #141b2f;--color-surface-subtle: #1b243b;--color-border: #25304a;--color-border-strong: #3d4d6b;--color-heading: #fff;--color-text: #e2e8f0;--color-text-muted: #94a3b8;--color-link: #60a5fa;--color-link-hover: #93c5fd;--color-accent: #60a5fa;--color-accent-strong: #3b82f6;--color-accent-contrast: #0b1120;--color-success-text: #34d399;--color-success-bg: #1a4d2e;--color-error-text: #fca5a5;--color-error-bg: #4a1f1f;--color-info-text: #bae6fd;--color-info-bg: #1e3a5f;--color-danger: #f87171;--shadow-soft: 0 0 0 #000000}}*,*:before,*:after{box-sizing:border-box}html{overflow:clip;height:100%;background:var(--color-canvas)}body{color-scheme:light dark;overflow:auto;scrollbar-gutter:stable;height:100%;margin:0;font-family:var(--font-sans);background:none;color:var(--color-text);line-height:1.55;-webkit-font-smoothing:antialiased;text-align:justify;hyphens:auto;-webkit-hyphens:auto;-moz-hyphens:auto}body,#app,#admin-app{display:flex;flex-direction:column;min-height:100vh}#app,#admin-app{flex:1}a,a:visited{color:var(--color-link);text-decoration:none}a:hover,a:focus-visible{color:var(--color-link-hover)}.app-shell{flex:1;display:flex;flex-direction:column;min-height:100vh}.app-main{flex:1;display:flex;flex-direction:column}.view-root{flex:1;width:100%;display:flex;flex-direction:column;gap:2rem;padding:var(--layout-padding);box-sizing:border-box;margin:0 auto}.view-root--wide{width:min(100%,1200px)}.view-root--narrow{max-width:540px}.view-header{display:flex;flex-direction:column;gap:.75rem}.view-header h1{margin:0;font-weight:600;color:var(--color-heading)}.view-lede{margin:0;color:var(--color-text-muted);font-size:1rem}.section-block{display:flex;flex-direction:column;gap:1rem}.section-block h2{margin:0;font-size:clamp(1.25rem,1.5vw + 1rem,1.65rem);font-weight:600;color:var(--color-heading)}.section-body{display:flex;flex-direction:column;gap:1rem}.section-description{margin:0;color:var(--color-text-muted)}.button-row{display:flex;flex-wrap:nowrap;gap:.75rem;justify-content:flex-start}.button-row button{min-width:0}.surface{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-lg);box-shadow:var(--shadow-soft)}.surface--tight{padding:var(--space-md)}button{font-family:inherit;font-size:1rem;font-weight:500;border-radius:var(--radius-sm);border:1px solid transparent;padding:.65rem 1.1rem;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:.4rem;background:var(--color-surface);color:var(--color-text)}button:disabled{cursor:not-allowed;filter:opacity(.6)}.btn-primary{background:var(--color-accent);color:var(--color-accent-contrast);border-color:var(--color-accent);box-shadow:var(--shadow-soft)}.btn-primary:hover:not(:disabled){background:var(--color-accent-strong);border-color:var(--color-accent-strong)}.btn-secondary{background:transparent;color:var(--color-text);border-color:var(--color-border)}.btn-secondary:hover:not(:disabled){border-color:var(--color-border-strong);background:var(--color-surface-subtle)}.btn-danger{background:var(--color-danger);color:var(--color-accent-contrast);border-color:transparent}.btn-danger:hover:not(:disabled){filter:brightness(.92)}.btn-primary:focus-visible,.btn-secondary:focus-visible,.btn-danger:focus-visible{outline:1px solid var(-webkit-focus-ring-color)}input[type=text],input[type=search],input[type=email],textarea,select{font:inherit;width:100%;padding:.65rem .75rem;border-radius:var(--radius-sm);border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-text);transition:border-color var(--transition-base),box-shadow var(--transition-base)}label{display:flex;flex-direction:column;gap:.5rem;color:var(--color-text)}p{margin:0;color:var(--color-text)}small{color:var(--color-text-muted)}.table-wrapper{overflow-x:auto;background:var(--color-surface);border:1px solid var(--color-border)}table{width:100%;border-collapse:collapse;font-size:.95rem}thead tr{background:var(--color-surface-subtle);color:var(--color-text-muted)}td,th{padding:.65rem .75rem;border-bottom:1px solid var(--color-border);text-align:left}.center{text-align:center}.badge{display:inline-flex;align-items:center;gap:.35rem;padding:.2rem .6rem;border-radius:var(--radius-sm);background:var(--color-surface-subtle);border:1px solid var(--color-border);color:var(--color-text-muted);font-size:.75rem}.global-status{position:fixed;top:1.5rem;left:0;right:0;margin:0 auto;z-index:1200;width:fit-content;min-width:min(520px,calc(100% - 2rem));max-width:calc(100% - 2rem);display:none}.global-status .status{display:flex;align-items:center;justify-content:center;padding:.85rem 1.25rem;border-radius:var(--radius-sm);border-width:1px;border-style:solid;background:var(--color-surface);box-shadow:var(--shadow-soft);font-weight:550}.status.info{border-color:#3b82f6;color:var(--color-info-text);background:var(--color-info-bg)}.status.success{border-color:#16a34a;color:var(--color-success-text);background:var(--color-success-bg)}.status.error{border-color:#dc2626;color:var(--color-error-text);background:var(--color-error-bg)}.dialog-overlay{position:fixed;inset:0;background:transparent;z-index:1100;display:flex;align-items:center;justify-content:center;padding:1.5rem}.device-dialog,.modal{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);width:min(520px,100%);max-height:calc(100vh - 3rem);overflow-y:auto;padding:1.75rem;box-shadow:var(--shadow-soft);color:var(--color-text)}.qr-container{display:flex;flex-direction:column;align-items:center;gap:.75rem;text-align:center;color:var(--color-text-muted)}.qr-code{padding:1rem;background:#fff;box-shadow:var(--shadow-soft)}.link-container,.token-display,.token-info{background:var(--color-surface-subtle);border:1px solid var(--color-border);border-radius:var(--radius-sm);padding:.75rem;color:var(--color-text)}:root{--card-width: 16rem}.record-list,.credential-list,.session-list{width:100%;display:grid;grid-auto-flow:row;grid-template-columns:repeat(auto-fill,minmax(var(--card-width),1fr));justify-content:start;gap:.5rem;align-items:stretch;margin:0 auto;outline:none}@media (max-width: 720px){.record-list{display:flex;flex-direction:column;max-width:100%}}.record-item,.credential-item,.session-item{display:flex;flex-direction:column;padding:.5rem;border-radius:var(--radius-md);background:var(--color-surface);height:100%;transition:border-color .2s ease,box-shadow .2s ease,transform .2s ease;position:relative;cursor:pointer}.record-item:hover,.credential-item:hover,.session-item:hover{border-color:var(--color-border-strong);box-shadow:0 10px 24px #0f172a1f;transform:translateY(-1px)}.record-item.is-current,.credential-item.current-session,.credential-item.is-hovered,.session-item.is-current,.session-item.is-hovered,.credential-item.is-linked-session,.session-item.is-linked-credential{border-color:var(--color-accent);background-color:var(--color-surface-subtle)}.credential-item:focus,.session-item:focus{outline:1px solid var(-webkit-focus-ring-color)}.item-top{display:flex;align-items:center;height:2.5rem}.item-icon{width:40px;height:40px;display:grid;place-items:center;flex-shrink:0}.auth-icon{border-radius:var(--radius-sm)}.icon{flex:0 0 auto;font-size:1.5em;width:40px}.item-title{flex:1;margin:0;font-size:1rem;font-weight:600;color:var(--color-heading);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.item-actions{flex-shrink:0;display:flex;align-items:center}.item-actions .badge+.btn-card-delete{margin-left:.25rem}.item-actions .badge+.badge{margin-left:.25rem}.item-details{margin-left:40px}.credential-dates,.session-dates{display:grid;grid-auto-flow:row;grid-template-columns:8em 1fr;font-size:.75rem;align-items:center}.date-label{font-weight:500;color:var(--color-text-muted);overflow:hidden;text-overflow:ellipsis}.date-value{color:var(--color-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-card-delete{background:transparent;border:none;color:var(--color-danger);padding:.35rem .5rem;font-size:1.05rem;line-height:1;border-radius:var(--radius-sm);cursor:pointer;display:inline-flex;align-items:center;justify-content:center}.btn-card-delete:hover:not(:disabled){background:#fee}.btn-card-delete:disabled{filter:opacity(.4);cursor:not-allowed}.session-emoji{font-size:1.2rem}.session-group{position:relative}.session-group:focus-visible{outline:1px solid var(-webkit-focus-ring-color)}.session-group-host{display:flex;align-items:center;font-size:1.5rem;font-weight:600;margin:.5rem 0}.session-group-icon{margin-left:-1.5rem}.session-group-host a{color:var(--color-text);text-decoration:none}.session-group:focus-visible .session-group-host,.session-group:focus-visible .session-group-host a{color:var(--color-heading)}.btn-card-delete{display:none}.session-item:focus .btn-card-delete{display:block}.badge{padding:.2rem .5rem;border-radius:var(--radius-sm);font-size:.8rem;font-weight:500;white-space:nowrap}.badge-current{background:var(--color-accent);color:var(--color-accent-contrast);box-shadow:0 0 0 1px var(--color-accent) inset}.badge:not(.badge-current){background:var(--color-surface-subtle);color:var(--color-text-muted);border:1px solid var(--color-border)}.session-meta-info{font-size:.75rem;color:var(--color-text-muted);font-family:monospace}.empty-state{text-align:center;padding:var(--space-lg);color:var(--color-text-muted)}.empty-state p{margin:0}.user-info{display:grid;border-radius:var(--radius-md);background:var(--color-surface);padding:1.1rem 1.25rem}.user-details{display:grid;grid-template-columns:7em 1fr;gap:0 .5rem;padding-left:40px;font-size:.75rem}.toggle-link{color:var(--color-link);cursor:pointer}.toggle-link:hover{color:var(--color-link-hover)}.token-info code{font-family:var(--font-mono)}@media (max-width: 720px){.view-root{padding:clamp(1rem,3vw + .75rem,2rem);gap:1.75rem}.global-status{top:1rem}}.dialog-backdrop{position:fixed;top:0;left:0;width:100vw;height:100vh;background:transparent;backdrop-filter:blur(.1rem) brightness(.7);-webkit-backdrop-filter:blur(.1rem) brightness(.7);display:flex;align-items:center;justify-content:center;z-index:1000}.dialog-container{max-width:90vw;max-height:90vh;overflow-y:auto}.dialog-content{flex:none;width:100%;max-width:480px;padding:2rem;background:var(--color-surface);border-radius:var(--radius-lg);box-shadow:0 20px 60px #1e293b;border:1px solid var(--color-border)}.dialog-content--wide{max-width:540px}.dialog-content--narrow{max-width:420px}@media (max-width: 720px){.dialog-content{padding:1.5rem}}.slot-machine{padding:.875rem 1rem;background:var(--color-surface-hover, rgba(0, 0, 0, .03));border:1px solid var(--color-border);border-radius:var(--radius-sm);font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;display:flex;align-items:center;-webkit-user-select:none;user-select:none;pointer-events:none;white-space:nowrap;overflow:hidden}.slot-reel{display:inline-flex;align-items:center;justify-content:center;flex:1;min-width:0;height:1.8em;position:relative}
@@ -0,0 +1 @@
1
+ import{_ as re,r as k,c as I,b as p,d as m,e as o,f as T,t as A,F as C,i as X,j as Re,C as te,B as J,D as ie,l as Ce,L as De,y as G,x as ae,E as ke,H as P,A as _e,k as z,h as ne,v as oe,z as ge,o as Se,a as Oe,N as et,q as tt,u as st,w as nt,J as ot,K as at}from"./_plugin-vue_export-helper-D2l53SUz.js";import{u as Ae,U as it,_ as rt,a as lt,R as ut,N as me,M as dt,b as ct,L as mt,A as fe,B as ft,c as gt}from"./AccessDenied-DAdzg_MJ.js";import"./helpers-DzjFIx78.js";const vt={key:0},yt=["onClick"],pt=["onClick"],ht={class:"role-names"},bt={class:"center"},wt={key:0,class:"center"},$t=["onClick"],Dt={key:0,class:"permissions-section"},kt={class:"matrix-scroll"},St=["title"],Ot=["title"],Rt={class:"display-text"},Ct=["checked","onChange"],At={class:"perm-name-cell"},Ut={class:"perm-title"},Et={class:"display-text"},Mt=["onClick"],Pt={class:"perm-id-info"},xt={class:"id-text"},qt={class:"perm-domain"},Nt={class:"perm-members center"},Tt={class:"perm-actions center"},Lt=["onClick"],Ft={__name:"AdminOverview",props:{info:Object,orgs:Array,permissions:Array,permissionSummary:Object,navigationDisabled:{type:Boolean,default:!1}},emits:["createOrg","openOrg","updateOrg","deleteOrg","toggleOrgPermission","openDialog","deletePermission","renamePermissionDisplay","navigateOut"],setup(n,{expose:V,emit:Y}){const S=n,L=Y,E=k(null),c=k(null),y=k(null),x=k(null),N=k(null),B=k(null),q=I(()=>[...S.orgs].sort((r,t)=>{const s=r.display_name.localeCompare(t.display_name);return s!==0?s:r.uuid.localeCompare(t.uuid)})),w=I(()=>[...S.permissions].sort((r,t)=>r.scope.localeCompare(t.scope))),F=I(()=>S.info?.ctx.permissions.includes("auth:admin")),$=I(()=>S.info?.ctx.permissions.includes("auth:org:admin"));function _(r){return r.roles.slice().sort((t,s)=>t.display_name.localeCompare(s.display_name)).map(t=>t.display_name).join(", ")}function Z(r,t){if(S.navigationDisabled)return;const s=J(r);if(!s)return;const D=r.target,l=D.closest("tr");if(!l)return;const d=l.closest("tbody");if(!d)return;const h=Array.from(d.querySelectorAll("tr")),R=h.indexOf(l);if(R===-1)return;if(s==="left"||s==="right"){r.preventDefault();const M=Array.from(l.querySelectorAll("a, button:not([disabled])")),K=M.indexOf(D);if(K===-1)return;s==="left"&&K>0?M[K-1].focus():s==="right"&&K<M.length-1&&M[K+1].focus();return}let j=R;if(s==="up"&&R>0)j=R-1;else if(s==="down"&&R<h.length-1)j=R+1;else if(s==="up"&&R===0){r.preventDefault(),t==="org"?te(c.value,{itemSelector:"button"}):t==="perm"&&te(N.value,{itemSelector:"button"});return}else if(s==="down"&&R===h.length-1){if(r.preventDefault(),t==="org"&&F.value&&x.value){const M=x.value.querySelector('input[type="checkbox"]');M?M.focus():te(N.value,{itemSelector:"button"})}return}if(j!==R){r.preventDefault();const K=h[j].querySelector("a, button:not([disabled])");K&&K.focus()}}function ee(r){if(S.navigationDisabled)return;const t=J(r);if(t){if(r.preventDefault(),t==="left"||t==="right")ie(c.value,r.target,t,{itemSelector:"button"});else if(t==="up")L("navigateOut","up");else if(t==="down"){const s=y.value?.querySelector("tbody tr a, tbody tr button:not([disabled])");s&&s.focus()}}}function g(r){if(S.navigationDisabled)return;const t=J(r);if(!t)return;const s=r.target;if(s.tagName!=="INPUT")return;r.preventDefault();const D=Array.from(x.value.querySelectorAll('input[type="checkbox"]')),l=D.indexOf(s);if(l===-1)return;const d=q.value.length,h=w.value.length;if(d===0||h===0)return;const R=Math.floor(l/d),j=l%d;let M=l;if(t==="left")j>0&&(M=l-1);else if(t==="right")j<d-1&&(M=l+1);else if(t==="up")if(R>0)M=l-d;else{const le=y.value?.querySelector("tbody tr:last-child")?.querySelector("a, button:not([disabled])");le&&le.focus();return}else if(t==="down")if(R<h-1)M=l+d;else{te(N.value,{itemSelector:"button"});return}M!==l&&D[M]&&D[M].focus()}function u(r){if(S.navigationDisabled)return;const t=J(r);if(t){if(r.preventDefault(),t==="left"||t==="right")ie(N.value,r.target,t,{itemSelector:"button"});else if(t==="up"){const s=x.value?.querySelectorAll('input[type="checkbox"]');if(s?.length){const D=q.value.length,d=(w.value.length-1)*D;s[d]?s[d].focus():s[0].focus()}else{const l=y.value?.querySelector("tbody tr:last-child")?.querySelector("a, button:not([disabled])");l&&l.focus()}}else if(t==="down"){const s=B.value?.querySelector("tbody tr button:not([disabled])");s&&s.focus()}}}function f(){if(F.value)te(c.value,{itemSelector:"button"});else{const r=y.value?.querySelector("tbody tr a, tbody tr button:not([disabled])");r&&r.focus()}}return V({focusFirstElement:f}),(r,t)=>(m(),p(C,null,[o("div",{class:"permissions-section",ref_key:"orgSection",ref:E},[o("h2",null,A(F.value?"Organizations":"Your Organizations"),1),o("div",{class:"actions",ref_key:"orgActionsRef",ref:c,onKeydown:ee},[F.value?(m(),p("button",{key:0,onClick:t[0]||(t[0]=s=>r.$emit("createOrg"))},"+ Create Org")):T("",!0)],544),o("table",{class:"org-table",ref_key:"orgTableRef",ref:y,onKeydown:t[1]||(t[1]=s=>Z(s,"org"))},[o("thead",null,[o("tr",null,[t[4]||(t[4]=o("th",null,"Name",-1)),t[5]||(t[5]=o("th",null,"Roles",-1)),t[6]||(t[6]=o("th",null,"Members",-1)),F.value?(m(),p("th",vt,"Actions")):T("",!0)])]),o("tbody",null,[(m(!0),p(C,null,X(q.value,s=>(m(),p("tr",{key:s.uuid},[o("td",null,[o("a",{href:"#org/{{o.uuid}}",onClick:Ce(D=>r.$emit("openOrg",s),["prevent"])},A(s.display_name),9,yt),F.value||$.value?(m(),p("button",{key:0,onClick:D=>r.$emit("updateOrg",s),class:"icon-btn edit-org-btn","aria-label":"Rename organization",title:"Rename organization"},"✏️",8,pt)):T("",!0)]),o("td",ht,A(_(s)),1),o("td",bt,A(s.roles.reduce((D,l)=>D+l.users.length,0)),1),F.value?(m(),p("td",wt,[o("button",{onClick:D=>r.$emit("deleteOrg",s),class:"icon-btn delete-icon","aria-label":"Delete organization",title:"Delete organization"},"❌",8,$t)])):T("",!0)]))),128))])],544)],512),F.value?(m(),p("div",Dt,[t[10]||(t[10]=o("h2",null,"Permissions",-1)),o("div",{class:"matrix-wrapper",ref_key:"permMatrixRef",ref:x,onKeydown:g},[o("div",kt,[o("div",{class:"perm-matrix-grid",style:Re({gridTemplateColumns:"minmax(180px, 1fr) "+q.value.map(()=>"2.2rem").join(" ")})},[t[7]||(t[7]=o("div",{class:"grid-head perm-head"},"Permission",-1)),(m(!0),p(C,null,X(q.value,s=>(m(),p("div",{key:"head-"+s.uuid,class:"grid-head org-head",title:s.display_name},[o("span",null,A(s.display_name),1)],8,St))),128)),(m(!0),p(C,null,X(w.value,s=>(m(),p(C,{key:s.uuid},[o("div",{class:"perm-name",title:s.scope},[o("span",Rt,A(s.display_name),1)],8,Ot),(m(!0),p(C,null,X(q.value,D=>(m(),p("div",{key:D.uuid+"-"+s.uuid,class:"matrix-cell"},[o("input",{type:"checkbox",checked:D.permissions.includes(s.uuid),onChange:l=>r.$emit("toggleOrgPermission",D,s.uuid,l.target.checked)},null,40,Ct)]))),128))],64))),128))],4)]),t[8]||(t[8]=o("p",{class:"matrix-hint muted"},"Toggle which permissions each organization can grant to its members.",-1))],544),o("div",{class:"actions",ref_key:"permActionsRef",ref:N,onKeydown:u},[F.value?(m(),p("button",{key:0,onClick:t[2]||(t[2]=s=>r.$emit("openDialog","perm-create",{display_name:"",scope:"",domain:""}))},"+ Create Permission")):T("",!0)],544),o("table",{class:"org-table",ref_key:"permTableRef",ref:B,onKeydown:t[3]||(t[3]=s=>Z(s,"perm"))},[t[9]||(t[9]=o("thead",null,[o("tr",null,[o("th",{scope:"col"},"Permission"),o("th",{scope:"col"},"Domain"),o("th",{scope:"col",class:"center"},"Members"),o("th",{scope:"col",class:"center"},"Actions")])],-1)),o("tbody",null,[(m(!0),p(C,null,X(w.value,s=>(m(),p("tr",{key:s.uuid},[o("td",At,[o("div",Ut,[o("span",Et,A(s.display_name),1),o("button",{onClick:D=>r.$emit("renamePermissionDisplay",s),class:"icon-btn edit-display-btn","aria-label":"Edit permission",title:"Edit permission"},"✏️",8,Mt)]),o("div",Pt,[o("span",xt,A(s.scope),1)])]),o("td",qt,A(s.domain||"—"),1),o("td",Nt,A(n.permissionSummary[s.uuid]?.userCount||0),1),o("td",Tt,[o("button",{onClick:D=>r.$emit("deletePermission",s),class:"icon-btn delete-icon","aria-label":"Delete permission",title:"Delete permission"},"❌",8,Lt)])]))),128))])],544)])):T("",!0)],64))}},It=re(Ft,[["__scopeId","data-v-56228c4a"]]),Kt=["title"],Bt={class:"org-name"},zt={class:"matrix-scroll"},Vt=["title"],jt=["title"],Ht=["checked","onChange"],Gt=["onDrop"],Jt=["onKeydown"],Yt=["title"],Wt=["onClick"],Zt={class:"role-actions"},Qt=["onClick"],Xt=["onDragstart","onClick","onKeydown","title"],_t={class:"name"},es={class:"meta"},ts=["onKeydown"],ss=["onClick"],ns={__name:"AdminOrgDetail",props:{selectedOrg:Object,permissions:Array,navigationDisabled:{type:Boolean,default:!1}},emits:["updateOrg","createRole","updateRole","deleteRole","createUserInRole","openUser","toggleRolePermission","onRoleDragOver","onRoleDrop","onUserDragStart","navigateOut"],setup(n,{expose:V,emit:Y}){const S=n,L=Y,E=k(null),c=k(null),y=k(null),x=I(()=>[...S.selectedOrg.roles].sort((g,u)=>{const f=g.display_name.toLowerCase(),r=u.display_name.toLowerCase();return f!==r?f.localeCompare(r):g.uuid.localeCompare(u.uuid)})),N=I(()=>{const g=new Set(S.selectedOrg.permissions||[]);return S.permissions.filter(u=>g.has(u.uuid))});function B(g,u,f){L("toggleRolePermission",g,u,f)}function q(g){if(S.navigationDisabled)return;const u=J(g);if(u){if(g.preventDefault(),u==="left"||u==="right")ie(E.value,g.target,u,{itemSelector:"button"});else if(u==="up")L("navigateOut","up");else if(u==="down"){const f=c.value?.querySelector('input[type="checkbox"]');f?f.focus():Z()}}}function w(g){if(S.navigationDisabled)return;const u=J(g);if(!u)return;const f=g.target;if(f.tagName!=="INPUT")return;g.preventDefault();const r=Array.from(c.value.querySelectorAll('input[type="checkbox"]')),t=r.indexOf(f);if(t===-1)return;const s=x.value.length,D=S.selectedOrg.permissions.length,l=Math.floor(t/s),d=t%s;let h=t;if(u==="left"&&d>0)h=t-1;else if(u==="right"&&d<s-1)h=t+1;else if(u==="up"&&l>0)h=t-s;else if(u==="down"&&l<D-1)h=t+s;else if(u==="up"&&l===0){const R=E.value?.querySelector("button");R&&R.focus();return}else if(u==="down"&&l===D-1){Z();return}h!==t&&r[h]&&r[h].focus()}function F(g){if(S.navigationDisabled)return;const u=J(g);if(!u)return;const f=g.target;if(!f.classList.contains("user-chip"))return;const r=f.closest(".user-list");if(!r)return;const t=Array.from(r.querySelectorAll(".user-chip")),s=t.indexOf(f);if(s!==-1){if(u==="up"&&s>0){g.preventDefault(),t[s-1].focus();return}else if(u==="down"&&s<t.length-1){g.preventDefault(),t[s+1].focus();return}if(u==="up"&&s===0){g.preventDefault();const l=r.closest(".role-column")?.querySelector(".role-header button");l&&l.focus();return}if(!(u==="down"&&s===t.length-1)&&(u==="left"||u==="right")){g.preventDefault();const D=Array.from(y.value?.querySelectorAll(".role-column")||[]),l=r.closest(".role-column"),d=D.indexOf(l);let h=u==="left"?d-1:d+1;if(h>=0&&h<D.length){const R=D[h],j=R.querySelectorAll(".user-chip"),M=Math.min(s,j.length-1);if(j[M])j[M].focus();else{const K=R.querySelector(".plus-btn");K&&K.focus()}}else if(u==="left"&&d===0){const R=c.value?.querySelector('input[type="checkbox"]:last-of-type');R&&R.focus()}}}}function $(g,u){if(S.navigationDisabled)return;const f=J(g);if(!f)return;const r=Array.from(y.value?.querySelectorAll(".role-column")||[]);if(f==="left"||f==="right"){g.preventDefault();const t=g.currentTarget.querySelectorAll("button:not([disabled])"),s=Array.from(t).indexOf(g.target);if(f==="left"&&s>0)t[s-1].focus();else if(f==="right"&&s<t.length-1)t[s+1].focus();else if(f==="left"&&s===0&&u>0){const l=r[u-1]?.querySelectorAll(".role-header button");l?.length&&l[l.length-1].focus()}else if(f==="right"&&s===t.length-1&&u<r.length-1){const l=r[u+1]?.querySelector(".role-header button");l&&l.focus()}}else if(f==="up"){g.preventDefault();const t=c.value?.querySelectorAll('input[type="checkbox"]');if(t?.length){const s=x.value.length,l=(S.selectedOrg.permissions.length-1)*s+u;t[l]?t[l].focus():t[t.length-1].focus()}else{const s=E.value?.querySelector("button");s&&s.focus()}}else if(f==="down"){g.preventDefault();const s=r[u]?.querySelector(".user-chip");s&&s.focus()}}function _(g,u){if(S.navigationDisabled)return;const f=J(g);if(!f)return;const r=Array.from(y.value?.querySelectorAll(".role-column")||[]);if(f==="up"){g.preventDefault();const s=r[u]?.querySelector(".role-header button");s&&s.focus()}else if(f==="left"&&u>0){g.preventDefault();const t=r[u-1],s=t?.querySelector(".empty-role button"),D=t?.querySelector(".user-chip:last-child");s?s.focus():D&&D.focus()}else if(f==="right"&&u<r.length-1){g.preventDefault();const t=r[u+1],s=t?.querySelector(".empty-role button"),D=t?.querySelector(".user-chip");s?s.focus():D&&D.focus()}}function Z(){const u=y.value?.querySelector(".role-column")?.querySelector(".role-header button");u&&u.focus()}function ee(){const g=E.value?.querySelector("button");g&&g.focus()}return V({focusFirstElement:ee}),(g,u)=>(m(),p(C,null,[o("h2",{class:"org-title",ref_key:"orgTitleRef",ref:E,onKeydown:q,title:n.selectedOrg.uuid},[o("span",Bt,A(n.selectedOrg.display_name),1),o("button",{onClick:u[0]||(u[0]=f=>g.$emit("updateOrg",n.selectedOrg)),class:"icon-btn","aria-label":"Rename organization",title:"Rename organization"},"✏️")],40,Kt),o("div",{class:"matrix-wrapper",ref_key:"permMatrixRef",ref:c,onKeydown:w},[o("div",zt,[o("div",{class:"perm-matrix-grid",style:Re({gridTemplateColumns:"minmax(180px, 1fr) "+x.value.map(()=>"2.2rem").join(" ")+" 2.2rem"})},[u[5]||(u[5]=o("div",{class:"grid-head perm-head"},"Permission",-1)),(m(!0),p(C,null,X(x.value,f=>(m(),p("div",{key:"head-"+f.uuid,class:"grid-head role-head",title:f.display_name},[o("span",null,A(f.display_name),1)],8,Vt))),128)),o("div",{class:"grid-head role-head add-role-head",title:"Add role",onClick:u[1]||(u[1]=f=>g.$emit("createRole",n.selectedOrg)),role:"button",tabindex:"0",onKeydown:u[2]||(u[2]=De(f=>g.$emit("createRole",n.selectedOrg),["enter"]))},"➕",32),(m(!0),p(C,null,X(N.value,f=>(m(),p(C,{key:f.uuid},[o("div",{class:"perm-name",title:f.scope},A(f.display_name),9,jt),(m(!0),p(C,null,X(x.value,r=>(m(),p("div",{key:r.uuid+"-"+f.uuid,class:"matrix-cell"},[o("input",{type:"checkbox",checked:r.permissions.includes(f.uuid),onChange:t=>B(r,f.uuid,t.target.checked)},null,40,Ht)]))),128)),u[4]||(u[4]=o("div",{class:"matrix-cell add-role-cell"},null,-1))],64))),128))],4)]),u[6]||(u[6]=o("p",{class:"matrix-hint muted"},"Toggle which permissions each role grants.",-1))],544),o("div",{class:"roles-grid",ref_key:"rolesGridRef",ref:y},[(m(!0),p(C,null,X(x.value,(f,r)=>(m(),p("div",{key:f.uuid,class:"role-column",onDragover:u[3]||(u[3]=t=>g.$emit("onRoleDragOver",t)),onDrop:t=>g.$emit("onRoleDrop",t,n.selectedOrg,f)},[o("div",{class:"role-header",onKeydown:t=>$(t,r)},[o("strong",{class:"role-name",title:f.uuid},[o("span",null,A(f.display_name),1),o("button",{onClick:t=>g.$emit("updateRole",f),class:"icon-btn","aria-label":"Edit role",title:"Edit role"},"✏️",8,Wt)],8,Yt),o("div",Zt,[o("button",{onClick:t=>g.$emit("createUserInRole",n.selectedOrg,f),class:"plus-btn","aria-label":"Add user",title:"Add user"},"➕",8,Qt)])],40,Jt),f.users.length>0?(m(),p("ul",{key:0,class:"user-list",onKeydown:F},[(m(!0),p(C,null,X(f.users.slice().sort((t,s)=>{const D=t.display_name.toLowerCase(),l=s.display_name.toLowerCase();return D!==l?D.localeCompare(l):t.uuid.localeCompare(s.uuid)}),t=>(m(),p("li",{key:t.uuid,class:"user-chip",tabindex:"0",draggable:"true",onDragstart:s=>g.$emit("onUserDragStart",s,t,n.selectedOrg.uuid),onClick:s=>g.$emit("openUser",t),onKeydown:De(s=>g.$emit("openUser",t),["enter"]),title:t.uuid},[o("span",_t,A(t.display_name),1),o("span",es,A(t.last_seen?new Date(t.last_seen).toLocaleDateString():"—"),1)],40,Xt))),128))],32)):(m(),p("div",{key:1,class:"empty-role",onKeydown:t=>_(t,r)},[u[7]||(u[7]=o("p",{class:"empty-text muted"},"No members",-1)),o("button",{onClick:t=>g.$emit("deleteRole",f),class:"icon-btn delete-icon","aria-label":"Delete empty role",title:"Delete role"},"❌",8,ss)],40,ts))],40,Gt))),128))],512)],64))}},os=re(ns,[["__scopeId","data-v-f76fbbc3"]]),as={class:"user-detail"},is={key:0,class:"error small"},rs=["disabled"],ls={class:"section-block","data-section":"registered-passkeys"},us={class:"section-body"},ds={__name:"AdminUserDetail",props:{selectedUser:Object,userDetail:Object,selectedOrg:Object,loading:Boolean,showRegModal:Boolean,navigationDisabled:{type:Boolean,default:!1}},emits:["generateUserRegistrationLink","goOverview","openOrg","onUserNameSaved","closeRegModal","editUserName","refreshUserDetail","navigateOut"],setup(n,{expose:V,emit:Y}){const S=n,L=Y,E=Ae(),c=k({}),y=k(null),x=k(null),N=k(null),B=k(null),q=k(null),w=k(null),F=k(null),$=I(()=>S.showRegModal);function _(){E.showMessage(`📋 Link copied! Send it to ${S.selectedUser.display_name}.`),L("closeRegModal")}function Z(){L("editUserName",S.selectedUser)}async function ee(l){try{const d=await P(`/auth/api/admin/orgs/${S.selectedUser.org}/users/${S.selectedUser.uuid}/credentials/${l.credential}`,{method:"DELETE"});d.status==="ok"?L("onUserNameSaved"):console.error("Failed to delete credential",d)}catch(d){console.error("Delete credential error",d)}}async function g(l){const d=l?.id;if(d){c.value={...c.value,[d]:!0};try{const h=await P(`/auth/api/admin/orgs/${S.selectedUser.org}/users/${S.selectedUser.uuid}/sessions/${d}`,{method:"DELETE"});if(h.status==="ok"){if(h.current_session_terminated){sessionStorage.clear(),location.reload();return}L("refreshUserDetail"),E.showMessage("Session terminated","success",2500)}else E.showMessage(h.detail||"Failed to terminate session","error")}catch(h){console.error("Terminate session error",h),E.showMessage(h.message||"Failed to terminate session","error")}finally{const h={...c.value};delete h[d],c.value=h}}}function u(l){if($.value||S.navigationDisabled)return;const d=J(l);d&&(l.preventDefault(),d==="left"||d==="right"?ie(N.value,l.target,d,{itemSelector:".mini-btn"}):d==="up"?L("navigateOut","up"):d==="down"&&te(B.value,{itemSelector:"button"}))}function f(l){if($.value||S.navigationDisabled)return;const d=J(l);d&&(l.preventDefault(),d==="left"||d==="right"?ie(B.value,l.target,d,{itemSelector:"button"}):d==="up"?te(N.value,{itemSelector:".mini-btn"}):d==="down"&&q.value?.$el?.focus())}function r(l){$.value||S.navigationDisabled||(l==="up"?te(B.value,{itemSelector:"button"}):l==="down"&&ke(w.value?.$el,0,{itemSelector:".session-group"}))}function t(l){if(!($.value||S.navigationDisabled)){if(l==="up")q.value?.$el?.focus();else if(l==="down"){const d=F.value?.querySelector("button");d&&d.focus()}}}function s(l){if($.value||S.navigationDisabled)return;const d=J(l);d&&(l.preventDefault(),d==="up"&&ke(w.value?.$el,-1,{itemSelector:".session-group"}))}function D(){te(N.value,{itemSelector:".mini-btn"})}return V({focusFirstElement:D}),(l,d)=>(m(),p("div",as,[o("div",{ref_key:"userInfoRef",ref:N,onKeydown:u},[n.userDetail&&!n.userDetail.error?(m(),G(it,{key:0,name:n.userDetail.display_name||n.selectedUser.display_name,visits:n.userDetail.visits,"created-at":n.userDetail.created_at,"last-seen":n.userDetail.last_seen,loading:n.loading,"org-display-name":n.userDetail.org.display_name,"role-name":n.userDetail.role,"update-endpoint":`/auth/api/admin/orgs/${n.selectedUser.org}/users/${n.selectedUser.uuid}/display-name`,onSaved:d[0]||(d[0]=h=>l.$emit("onUserNameSaved")),onEditName:Z},null,8,["name","visits","created-at","last-seen","loading","org-display-name","role-name","update-endpoint"])):T("",!0)],544),n.userDetail?.error?(m(),p("div",is,A(n.userDetail.error),1)):T("",!0),n.userDetail&&!n.userDetail.error?(m(),p(C,{key:1},[o("div",{class:"registration-actions",ref_key:"regActionsRef",ref:B,onKeydown:f},[o("button",{class:"btn-secondary reg-token-btn",onClick:d[1]||(d[1]=h=>l.$emit("generateUserRegistrationLink",n.selectedUser)),disabled:n.loading},"Generate Registration Token",8,rs),d[6]||(d[6]=o("p",{class:"matrix-hint muted"}," Generate a one-time registration link so this user can register or add another passkey. Copy the link from the dialog and send it to the user, or have the user scan the QR code on their device. ",-1))],544),o("section",ls,[d[7]||(d[7]=o("div",{class:"section-header"},[o("h2",null,"Registered Passkeys")],-1)),o("div",us,[ae(rt,{ref_key:"credentialListRef",ref:q,credentials:n.userDetail.credentials,"aaguid-info":n.userDetail.aaguid_info,"allow-delete":!0,"hovered-credential-uuid":y.value,"hovered-session-credential-uuid":x.value?.credential,"navigation-disabled":$.value,onDelete:ee,onCredentialHover:d[2]||(d[2]=h=>y.value=h),onNavigateOut:r},null,8,["credentials","aaguid-info","hovered-credential-uuid","hovered-session-credential-uuid","navigation-disabled"])])]),ae(lt,{ref_key:"sessionListRef",ref:w,sessions:n.userDetail.sessions||[],"terminating-sessions":c.value,"hovered-credential-uuid":y.value,"navigation-disabled":$.value,"empty-message":"This user has no active sessions.","section-description":"View and manage the active sessions for this user.",onTerminate:g,onSessionHover:d[3]||(d[3]=h=>x.value=h),onNavigateOut:t},null,8,["sessions","terminating-sessions","hovered-credential-uuid","navigation-disabled"])],64)):T("",!0),o("div",{class:"actions ancillary-actions",ref_key:"backButtonRef",ref:F,onKeydown:s},[n.selectedOrg?(m(),p("button",{key:0,onClick:d[4]||(d[4]=h=>l.$emit("openOrg",n.selectedOrg)),class:"icon-btn",title:"Back to Org"},"↩️")):T("",!0)],544),n.showRegModal?(m(),G(ut,{key:2,endpoint:`/auth/api/admin/orgs/${n.selectedUser.org}/users/${n.selectedUser.uuid}/create-link`,"user-name":n.userDetail?.display_name||n.selectedUser.display_name,onClose:d[5]||(d[5]=h=>l.$emit("closeRegModal")),onCopied:_},null,8,["endpoint","user-name"])):T("",!0)]))}},cs=re(ds,[["__scopeId","data-v-738bccea"]]),ms={class:"modal-title"},fs={key:0},gs={key:2},vs={class:"small muted"},ys=["placeholder","pattern"],ps={class:"small muted"},hs={key:7},bs={key:8,class:"error small"},ws={key:9,class:"modal-actions"},$s=["disabled"],Ds=["disabled"],ks={__name:"AdminDialogs",props:{dialog:Object,PERMISSION_ID_PATTERN:String,settings:Object},emits:["submitDialog","closeDialog"],setup(n,{emit:V}){const Y=n,S=new Set(["org-update","role-update","user-update-name"]),L=I(()=>Y.settings?.rp_id||"the configured domain");return(E,c)=>n.dialog.type?(m(),G(dt,{key:0,onClose:c[14]||(c[14]=y=>E.$emit("closeDialog"))},{default:_e(()=>[o("h3",ms,[n.dialog.type==="org-create"?(m(),p(C,{key:0},[z("Create Organization")],64)):n.dialog.type==="org-update"?(m(),p(C,{key:1},[z("Rename Organization")],64)):n.dialog.type==="role-create"?(m(),p(C,{key:2},[z("Create Role")],64)):n.dialog.type==="role-update"?(m(),p(C,{key:3},[z("Edit Role")],64)):n.dialog.type==="user-create"?(m(),p(C,{key:4},[z("Add User To Role")],64)):n.dialog.type==="user-update-name"?(m(),p(C,{key:5},[z("Edit User Name")],64)):n.dialog.type==="perm-create"||n.dialog.type==="perm-display"?(m(),p(C,{key:6},[z(A(n.dialog.type==="perm-create"?"Create Permission":"Edit Permission"),1)],64)):n.dialog.type==="confirm"?(m(),p(C,{key:7},[z("Confirm")],64)):T("",!0)]),o("form",{onSubmit:c[13]||(c[13]=Ce(y=>E.$emit("submitDialog"),["prevent"])),class:"modal-form"},[n.dialog.type==="org-create"?(m(),p("label",fs,[c[15]||(c[15]=z("Name ",-1)),ne(o("input",{ref:"nameInput","onUpdate:modelValue":c[0]||(c[0]=y=>n.dialog.data.name=y),required:""},null,512),[[oe,n.dialog.data.name]])])):n.dialog.type==="org-update"?(m(),G(me,{key:1,label:"Organization Name",modelValue:n.dialog.data.name,"onUpdate:modelValue":c[1]||(c[1]=y=>n.dialog.data.name=y),busy:n.dialog.busy,error:n.dialog.error,onCancel:c[2]||(c[2]=y=>E.$emit("closeDialog"))},null,8,["modelValue","busy","error"])):n.dialog.type==="role-create"?(m(),p("label",gs,[c[16]||(c[16]=z("Role Name ",-1)),ne(o("input",{"onUpdate:modelValue":c[3]||(c[3]=y=>n.dialog.data.name=y),placeholder:"Role name",required:""},null,512),[[oe,n.dialog.data.name]])])):n.dialog.type==="role-update"?(m(),G(me,{key:3,label:"Role Name",modelValue:n.dialog.data.name,"onUpdate:modelValue":c[4]||(c[4]=y=>n.dialog.data.name=y),busy:n.dialog.busy,error:n.dialog.error,onCancel:c[5]||(c[5]=y=>E.$emit("closeDialog"))},null,8,["modelValue","busy","error"])):n.dialog.type==="user-create"?(m(),p(C,{key:4},[o("p",vs,"Role: "+A(n.dialog.data.role.display_name),1),o("label",null,[c[17]||(c[17]=z("Display Name ",-1)),ne(o("input",{"onUpdate:modelValue":c[6]||(c[6]=y=>n.dialog.data.name=y),placeholder:"User display name",required:""},null,512),[[oe,n.dialog.data.name]])])],64)):n.dialog.type==="user-update-name"?(m(),G(me,{key:5,label:"Display Name",modelValue:n.dialog.data.name,"onUpdate:modelValue":c[7]||(c[7]=y=>n.dialog.data.name=y),busy:n.dialog.busy,error:n.dialog.error,onCancel:c[8]||(c[8]=y=>E.$emit("closeDialog"))},null,8,["modelValue","busy","error"])):n.dialog.type==="perm-create"||n.dialog.type==="perm-display"?(m(),p(C,{key:6},[o("label",null,[c[18]||(c[18]=z("Display Name ",-1)),ne(o("input",{ref:"displayNameInput","onUpdate:modelValue":c[9]||(c[9]=y=>n.dialog.data.display_name=y),required:""},null,512),[[oe,n.dialog.data.display_name]])]),o("label",null,[c[19]||(c[19]=z("Permission Scope ",-1)),ne(o("input",{"onUpdate:modelValue":c[10]||(c[10]=y=>n.dialog.data.scope=y),placeholder:n.dialog.type==="perm-create"?"yourapp:permission":n.dialog.data.permission.scope,required:"",pattern:n.PERMISSION_ID_PATTERN,title:"Allowed: A-Za-z0-9:._~-","data-form-type":"other"},null,8,ys),[[oe,n.dialog.data.scope]])]),c[21]||(c[21]=o("p",{class:"small muted"},"E.g. yourapp:reports. Changing the scope name may break deployed applications.",-1)),o("label",null,[c[20]||(c[20]=z("Domain Scope ",-1)),ne(o("input",{"onUpdate:modelValue":c[11]||(c[11]=y=>n.dialog.data.domain=y),placeholder:"e.g. app.example.com","data-form-type":"other"},null,512),[[oe,n.dialog.data.domain]])]),o("p",ps,"If set, this permission is effective only on the specified domain, which can be "+A(L.value)+" or its subdomain.",1)],64)):n.dialog.type==="confirm"?(m(),p("p",hs,A(n.dialog.data.message),1)):T("",!0),n.dialog.error&&!ge(S).has(n.dialog.type)?(m(),p("div",bs,A(n.dialog.error),1)):T("",!0),ge(S).has(n.dialog.type)?T("",!0):(m(),p("div",ws,[o("button",{type:"button",class:"btn-secondary",onClick:c[12]||(c[12]=y=>E.$emit("closeDialog")),disabled:n.dialog.busy}," Cancel ",8,$s),o("button",{type:"submit",class:"btn-primary",disabled:n.dialog.busy},A(n.dialog.type==="confirm"?"OK":"Save"),9,Ds)]))],32)]),_:1})):T("",!0)}},Ss=re(ks,[["__scopeId","data-v-8d16c6cc"]]),Os={class:"app-shell admin-shell"},Rs={class:"app-main"},Cs={key:4,class:"view-root view-root--wide view-admin"},As={class:"view-header"},Us={class:"section-block admin-section"},Es={class:"section-body admin-section-body"},Ms={class:"admin-panels"},Ps="^[A-Za-z0-9:._~-]+$",xs={__name:"AdminApp",setup(n){const V=k(null),Y=k(!0),S=k("Loading..."),L=k(!1),E=k(!1),c=k(null),y=k([]),x=k([]),N=k(null),B=k(null),q=k(null),w=Ae(),F=k(null);k(null),k(""),k(null),k("");const $=k({type:null,data:null,busy:!1,error:""}),_=k(null),Z=k(null),ee=k(null),g=k(null),u=k(null),f=I(()=>$.value.type!==null||ue.value),r=I(()=>V.value?.ctx.permissions.includes("auth:admin")),t=I(()=>V.value?.ctx.permissions.includes("auth:org:admin"));function s(e){if(!F.value)return;const a=e.target.closest(".org-add-menu"),i=e.target.closest(".add-org-btn");!a&&!i&&(F.value=null)}Se(async()=>{document.addEventListener("click",s),window.addEventListener("hashchange",d),await w.loadSettings(),w.settings?.rp_name&&(document.title=w.settings.rp_name+" Admin"),await Ee()}),Oe(()=>{document.removeEventListener("click",s),window.removeEventListener("hashchange",d)});const D=I(()=>{const e={};for(const i of y.value){const v={uuid:i.uuid,display_name:i.display_name},b=new Set(i.permissions||[]);for(const O of i.permissions||[])e[O]||(e[O]={orgs:[],orgSet:new Set,userCount:0}),e[O].orgSet.has(i.uuid)||(e[O].orgs.push(v),e[O].orgSet.add(i.uuid));for(const O of i.roles)for(const U of O.permissions)b.has(U)&&(e[U]||(e[U]={orgs:[],orgSet:new Set,userCount:0}),e[U].orgSet.has(i.uuid)||(e[U].orgs.push(v),e[U].orgSet.add(i.uuid)),e[U].userCount+=O.users.length)}const a={};for(const[i,v]of Object.entries(e))a[i]={orgs:v.orgs.sort((b,O)=>b.display_name.localeCompare(O.display_name)),userCount:v.userCount};return a});function l(e){Q("perm-display",{permission:e,scope:e.scope,display_name:e.display_name,domain:e.domain||""})}function d(){const e=window.location.hash||"";N.value=null,B.value=null,e.startsWith("#org/")?N.value=e.slice(5):e.startsWith("#user/")&&(B.value=e.slice(6))}async function h(){const e=await P("/auth/api/admin/orgs");y.value=e.map(a=>{const i=a.roles.map(b=>({...b,org:a.uuid,users:[]})),v=Object.fromEntries(i.map(b=>[b.display_name,b]));for(const b of a.users||[])v[b.role]&&v[b.role].users.push(b);return{...a,roles:i}})}async function R(){x.value=await P("/auth/api/admin/permissions")}async function j(){const e=await P("/auth/api/validate",{method:"POST"});V.value=e,L.value=!0}function M(){V.value=null,y.value=[],x.value=[],q.value=null,L.value=!1}function K(e){M(),e.name==="AuthCancelledError"?E.value=!0:c.value=e.message}const le=()=>V.value?.ctx.user.uuid,ve=new et(le,K);Se(()=>ve.start()),Oe(()=>ve.stop());async function Ee(){Y.value=!0,S.value="Loading...",c.value=null;try{await Promise.all([h(),R()]),await j(),!r.value&&t.value&&y.value.length===1&&(!window.location.hash||window.location.hash==="#overview")?(N.value=y.value[0].uuid,window.location.hash=`#org/${N.value}`,w.showMessage(`Navigating to ${y.value[0].display_name} Administration`,"info",3e3)):d()}catch(e){K(e)}finally{Y.value=!1}}function Me(){Q("org-create",{})}function ye(e){Q("org-update",{org:e,name:e.display_name})}function Pe(e){Q("user-update-name",{user:e,name:e.display_name})}async function pe(e){await P(`/auth/api/admin/orgs/${e}`,{method:"DELETE"}),await Promise.all([h(),R()])}function xe(e){if(e.roles.reduce((b,O)=>b+O.users.length,0)===0){pe(e.uuid).then(()=>{w.showMessage(`Organization "${e.display_name}" deleted.`,"success",2500)}).catch(b=>{w.showMessage(b.message||"Failed to delete organization","error")});return}const v=e.roles.filter(b=>b.users.length>0).map(b=>`${b.users.length} ${b.display_name}`).join(", ");Q("confirm",{message:`Delete organization "${e.display_name}", including accounts of ${v})?`,action:async()=>{await pe(e.uuid)}})}function qe(e,a){Q("user-create",{org:e,role:a})}async function Ne(e,a,i){if(a.role!==i)try{await P(`/auth/api/admin/orgs/${e.uuid}/users/${a.uuid}/role`,{method:"PATCH",body:{role:i}}),await h()}catch(v){w.showMessage(v.message||"Failed to update user role")}}function Te(e,a,i){e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",JSON.stringify({user_uuid:a.uuid,org:i}))}function Le(e){e.preventDefault(),e.dataTransfer.dropEffect="move"}function Fe(e,a,i){e.preventDefault();try{const v=JSON.parse(e.dataTransfer.getData("text/plain"));if(v.org!==a.uuid)return;const b=a.roles.flatMap(O=>O.users).find(O=>O.uuid===v.user_uuid);b&&Ne(a,b,i.display_name)}catch{}}function Ie(e){Q("role-create",{org:e})}function Ke(e){Q("role-update",{role:e,name:e.display_name})}function Be(e){P(`/auth/api/admin/orgs/${e.org}/roles/${e.uuid}`,{method:"DELETE"}).then(()=>{w.showMessage(`Role "${e.display_name}" deleted.`,"success",2500),h()}).catch(a=>{w.showMessage(a.message||"Failed to delete role","error")})}async function ze(e,a,i){const v=[...e.permissions],b=i?[...e.permissions,a]:e.permissions.filter(O=>O!==a);e.permissions=b;try{const O=i?"POST":"DELETE";await P(`/auth/api/admin/orgs/${e.org}/roles/${e.uuid}/permissions/${a}`,{method:O}),await h()}catch(O){w.showMessage(O.message||"Failed to update role permission"),e.permissions=v}}async function he(e){const a=new URLSearchParams({permission_uuid:e});await P(`/auth/api/admin/permission?${a.toString()}`,{method:"DELETE"}),await R()}function Ve(e){const a=D.value[e.uuid]?.userCount||0;let i=0;for(const O of y.value)for(const U of O.roles)U.permissions.includes(e.uuid)&&i++;if(i===0){he(e.uuid).then(()=>{w.showMessage(`Permission "${e.display_name}" deleted.`,"success",2500)}).catch(O=>{w.showMessage(O.message||"Failed to delete permission","error")});return}const v=[];i>0&&v.push(`${i} role${i!==1?"s":""}`),a>0&&v.push(`${a} user${a!==1?"s":""}`);const b=v.join(", ");Q("confirm",{message:`Delete permission "${e.display_name}" (${b})?`,action:async()=>{await he(e.uuid)}})}const se=I(()=>y.value.find(e=>e.uuid===N.value)||null);function be(e){window.location.hash=`#org/${e.uuid}`}function je(){window.location.hash="#overview"}function He(e){window.location.hash=`#user/${e.uuid}`}const H=I(()=>{if(!B.value)return null;for(const e of y.value)for(const a of e.roles){const i=a.users.find(v=>v.uuid===B.value);if(i)return{...i,org:e.uuid,role_display_name:a.display_name}}return null}),Ge=I(()=>H.value?"Admin: User":se.value?"Admin: Org":(w.settings?.rp_name||"Master")+" Admin"),Je=I(()=>{const e=[{label:"Auth",href:tt()},{label:"Admin",href:st()}];let a=null;H.value&&(a=y.value.find(v=>v.uuid===H.value.org)||null);const i=se.value||a;return i&&e.push({label:i.display_name,href:`#org/${i.uuid}`}),H.value&&e.push({label:H.value.display_name,href:`#user/${H.value.uuid}`}),e});nt(H,async e=>{if(!e){q.value=null;return}try{q.value=await P(`/auth/api/admin/orgs/${e.org}/users/${e.uuid}`)}catch(a){q.value={error:a.message}}});const ue=k(!1);function Ye(e){ue.value=!0}async function We(e,a,i){const v=e.permissions.includes(a);if(i&&v||!i&&!v)return;const b=i?[...e.permissions,a]:e.permissions.filter(U=>U!==a),O=[...e.permissions];e.permissions=b;try{const U=new URLSearchParams({permission_uuid:a});await P(`/auth/api/admin/orgs/${e.uuid}/permission?${U.toString()}`,{method:i?"POST":"DELETE"}),await h()}catch(U){w.showMessage(U.message||"Failed to update organization permission","error"),e.permissions=O}}function Q(e,a){const i=document.activeElement;if(_.value=i,e==="confirm"&&i){const v=i.closest("tr");if(v){const b=v.closest("tbody");if(b){const O=Array.from(b.querySelectorAll("tr")),U=O.indexOf(v);$.value.focusContext={tbody:b,index:U,total:O.length,selector:"button:not([disabled]), a"}}}}$.value={...$.value,type:e,data:a,busy:!1,error:""}}function W(){const e=_.value,a=$.value.focusContext;$.value={type:null,data:null,busy:!1,error:""},Ze(e,a),_.value=null}function Ze(e,a){if(!e)return;if(document.body.contains(e)&&!e.disabled){e.focus();return}if(a?.tbody&&a.selector){const b=Array.from(a.tbody.querySelectorAll("tr"));if(b.length>0){const O=Math.min(a.index,b.length-1),de=b[O]?.querySelector(a.selector);if(de){de.focus();return}}}const i=document.querySelector(".admin-panels");if(!i)return;const v=i.querySelector('button:not([disabled]), a, input:not([disabled]), [tabindex="0"]');v&&v.focus()}function Qe(e){if(f.value)return;const a=J(e);a&&a==="down"&&(e.preventDefault(),ee.value?ee.value.focusFirstElement?.():g.value?g.value.focusFirstElement?.():u.value&&u.value.focusFirstElement?.())}function ce(e){f.value||e==="up"&&Z.value?.focusCurrent?.()}async function we(){if(await h(),H.value)try{q.value=await P(`/auth/api/admin/orgs/${H.value.org}/users/${H.value.uuid}`)}catch(e){w.showMessage(e.message||"Failed to reload user","error")}}async function $e(){await we(),w.showMessage("User renamed","success",1500)}async function Xe(){if(!(!$.value.type||$.value.busy)){$.value.busy=!0,$.value.error="";try{const e=$.value.type;if(e==="org-create"){const a=$.value.data.name?.trim();if(!a)throw new Error("Name required");W(),P("/auth/api/admin/orgs",{method:"POST",body:{display_name:a,permissions:[]}}).then(()=>{w.showMessage(`Organization "${a}" created.`,"success",2500),Promise.all([h(),R()])}).catch(i=>{w.showMessage(i.message||"Failed to create organization","error")});return}else if(e==="org-update"){const{org:a}=$.value.data,i=$.value.data.name?.trim();if(!i)throw new Error("Name required");W(),P(`/auth/api/admin/orgs/${a.uuid}`,{method:"PATCH",body:{display_name:i}}).then(()=>{w.showMessage(`Organization renamed to "${i}".`,"success",2500),h()}).catch(v=>{w.showMessage(v.message||"Failed to update organization","error")});return}else if(e==="role-create"){const{org:a}=$.value.data,i=$.value.data.name?.trim();if(!i)throw new Error("Name required");W(),P(`/auth/api/admin/orgs/${a.uuid}/roles`,{method:"POST",body:{display_name:i,permissions:[]}}).then(()=>{w.showMessage(`Role "${i}" created.`,"success",2500),h()}).catch(v=>{w.showMessage(v.message||"Failed to create role","error")});return}else if(e==="role-update"){const{role:a}=$.value.data,i=$.value.data.name?.trim();if(!i)throw new Error("Name required");W(),P(`/auth/api/admin/orgs/${a.org}/roles/${a.uuid}`,{method:"PATCH",body:{display_name:i}}).then(()=>{w.showMessage(`Role renamed to "${i}".`,"success",2500),h()}).catch(v=>{w.showMessage(v.message||"Failed to update role","error")});return}else if(e==="user-create"){const{org:a,role:i}=$.value.data,v=$.value.data.name?.trim();if(!v)throw new Error("Name required");W(),P(`/auth/api/admin/orgs/${a.uuid}/users`,{method:"POST",body:{display_name:v,role:i.display_name}}).then(()=>{w.showMessage(`User "${v}" added to ${i.display_name} role.`,"success",2500),h()}).catch(b=>{w.showMessage(b.message||"Failed to add user","error")});return}else if(e==="user-update-name"){const{user:a}=$.value.data,i=$.value.data.name?.trim();if(!i)throw new Error("Name required");W(),P(`/auth/api/admin/orgs/${a.org}/users/${a.uuid}/display-name`,{method:"PATCH",body:{display_name:i}}).then(()=>{w.showMessage(`User renamed to "${i}".`,"success",2500),$e()}).catch(v=>{w.showMessage(v.message||"Failed to update user name","error")});return}else if(e==="perm-display"){const{permission:a}=$.value.data,i=$.value.data.scope?.trim(),v=$.value.data.display_name?.trim(),b=$.value.data.domain?.trim()||"";if(!v)throw new Error("Display name required");if(!i)throw new Error("Scope required");W();const O=a.domain||"";if(i===a.scope&&v===a.display_name&&b===O)return;const U=new URLSearchParams({permission_uuid:a.uuid});i!==a.scope&&U.set("scope",i),v!==a.display_name&&U.set("display_name",v),b!==O&&U.set("domain",b||""),P(`/auth/api/admin/permission?${U.toString()}`,{method:"PATCH"}).then(()=>{w.showMessage(`Permission "${v}" updated.`,"success",2500),R()}).catch(de=>{w.showMessage(de.message||"Failed to update permission","error")});return}else if(e==="perm-create"){const a=$.value.data.scope?.trim();if(!a)throw new Error("Scope required");const i=$.value.data.display_name?.trim();if(!i)throw new Error("Display name required");const v=$.value.data.domain?.trim()||"";W(),P("/auth/api/admin/permissions",{method:"POST",body:{scope:a,display_name:i,domain:v||void 0}}).then(()=>{w.showMessage(`Permission "${i}" created.`,"success",2500),R()}).catch(b=>{w.showMessage(b.message||"Failed to create permission","error")});return}else if(e==="confirm"){const a=$.value.data.action;if(W(),a)try{await a()}catch(i){w.showMessage(i.message||"Action failed","error")}return}W()}catch(e){$.value.error=e.message||"Error"}finally{$.value.busy=!1}}}return(e,a)=>(m(),p("div",Os,[ae(ct),o("main",Rs,[Y.value?(m(),G(mt,{key:0,message:S.value},null,8,["message"])):E.value?(m(),G(fe,{key:1})):c.value?(m(),G(fe,{key:2,icon:"⚠️",title:"Error",message:c.value},null,8,["message"])):L.value&&!r.value&&!t.value?(m(),G(fe,{key:3,icon:"⛔",message:"You do not have admin permissions for this application."})):L.value&&(r.value||t.value)?(m(),p("section",Cs,[o("header",As,[o("h1",null,A(Ge.value),1),ae(ft,{ref_key:"breadcrumbsRef",ref:Z,entries:Je.value,onKeydown:Qe},null,8,["entries"])]),o("section",Us,[o("div",Es,[o("div",Ms,[!H.value&&!se.value&&(r.value||t.value)?(m(),G(It,{key:0,ref_key:"adminOverviewRef",ref:ee,info:V.value,orgs:y.value,permissions:x.value,"navigation-disabled":f.value,"permission-summary":D.value,onCreateOrg:Me,onOpenOrg:be,onUpdateOrg:ye,onDeleteOrg:xe,onToggleOrgPermission:We,onOpenDialog:Q,onDeletePermission:Ve,onRenamePermissionDisplay:l,onNavigateOut:ce},null,8,["info","orgs","permissions","navigation-disabled","permission-summary"])):H.value?(m(),G(cs,{key:1,ref_key:"adminUserDetailRef",ref:u,"selected-user":H.value,"user-detail":q.value,"selected-org":se.value,loading:Y.value,"show-reg-modal":ue.value,"navigation-disabled":f.value,onGenerateUserRegistrationLink:Ye,onGoOverview:je,onOpenOrg:be,onOnUserNameSaved:$e,onRefreshUserDetail:we,onEditUserName:Pe,onCloseRegModal:a[0]||(a[0]=i=>ue.value=!1),onNavigateOut:ce},null,8,["selected-user","user-detail","selected-org","loading","show-reg-modal","navigation-disabled"])):se.value?(m(),G(os,{key:2,ref_key:"adminOrgDetailRef",ref:g,"selected-org":se.value,permissions:x.value,"navigation-disabled":f.value,onUpdateOrg:ye,onCreateRole:Ie,onUpdateRole:Ke,onDeleteRole:Be,onCreateUserInRole:qe,onOpenUser:He,onToggleRolePermission:ze,onOnRoleDragOver:Le,onNavigateOut:ce,onOnRoleDrop:Fe,onOnUserDragStart:Te},null,8,["selected-org","permissions","navigation-disabled"])):T("",!0)])])])])):T("",!0)]),ae(Ss,{dialog:$.value,"permission-id-pattern":Ps,settings:ge(w).settings,onSubmitDialog:Xe,onCloseDialog:W},null,8,["dialog","settings"])]))}},qs=re(xs,[["__scopeId","data-v-6d820553"]]),Ue=ot(qs);Ue.use(gt());Ue.mount("#admin-app");at();
@@ -1 +1 @@
1
- .permissions-section[data-v-56228c4a]{margin-bottom:var(--space-xl)}.permissions-section h2[data-v-56228c4a]{margin-bottom:var(--space-md)}.actions[data-v-56228c4a]{display:flex;flex-wrap:wrap;gap:var(--space-sm);align-items:center}.actions button[data-v-56228c4a]{width:auto}.org-table a[data-v-56228c4a]{text-decoration:none;color:var(--color-link)}.org-table a[data-v-56228c4a]:hover{text-decoration:underline}.org-table .center[data-v-56228c4a]{width:6rem;min-width:6rem}.org-table .role-names[data-v-56228c4a]{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.perm-name-cell[data-v-56228c4a]{display:flex;flex-direction:column;gap:.3rem}.perm-title[data-v-56228c4a]{font-weight:600;color:var(--color-heading)}.perm-id-info[data-v-56228c4a]{font-size:.8rem;color:var(--color-text-muted);display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.perm-domain[data-v-56228c4a]{color:var(--color-text-muted);font-size:.9rem}.icon-btn[data-v-56228c4a]{background:none;border:none;color:var(--color-text-muted);padding:.2rem;border-radius:var(--radius-sm);cursor:pointer;transition:background .2s ease,color .2s ease}.icon-btn[data-v-56228c4a]:hover{color:var(--color-heading);background:var(--color-surface-muted)}.delete-icon[data-v-56228c4a]{color:var(--color-danger)}.delete-icon[data-v-56228c4a]:hover{background:var(--color-danger-bg);color:var(--color-danger-text)}.matrix-wrapper[data-v-56228c4a]{margin:var(--space-md) 0;padding:var(--space-lg)}.matrix-scroll[data-v-56228c4a]{overflow-x:auto}.matrix-hint[data-v-56228c4a]{font-size:.8rem;color:var(--color-text-muted)}.perm-matrix-grid[data-v-56228c4a]{display:inline-grid;gap:.25rem;align-items:stretch}.perm-matrix-grid[data-v-56228c4a]>*{padding:.35rem .45rem;font-size:.75rem}.perm-matrix-grid .grid-head[data-v-56228c4a]{color:var(--color-text-muted);text-transform:uppercase;font-weight:600;letter-spacing:.05em}.perm-matrix-grid .perm-head[data-v-56228c4a]{display:flex;align-items:flex-end;justify-content:flex-start;padding:.35rem .45rem;font-size:.75rem}.perm-matrix-grid .org-head[data-v-56228c4a]{display:flex;align-items:flex-end;justify-content:center}.perm-matrix-grid .org-head span[data-v-56228c4a]{writing-mode:vertical-rl;transform:rotate(180deg);font-size:.65rem}.perm-name[data-v-56228c4a]{font-weight:600;color:var(--color-heading);padding:.35rem .45rem;font-size:.75rem}.display-text[data-v-56228c4a]{margin-right:var(--space-xs)}.edit-display-btn[data-v-56228c4a]{padding:.1rem .2rem;font-size:.8rem}.edit-org-btn[data-v-56228c4a]{padding:.1rem .2rem;font-size:.8rem;margin-left:var(--space-xs)}.perm-actions[data-v-56228c4a],.center[data-v-56228c4a]{text-align:center}.muted[data-v-56228c4a]{color:var(--color-text-muted)}.card.surface[data-v-f76fbbc3]{padding:var(--space-lg)}.org-title[data-v-f76fbbc3]{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-lg)}.org-name[data-v-f76fbbc3]{font-size:1.5rem;font-weight:600;color:var(--color-heading)}.icon-btn[data-v-f76fbbc3]{background:none;border:none;color:var(--color-text-muted);padding:.2rem;border-radius:var(--radius-sm);cursor:pointer;transition:background .2s ease,color .2s ease}.icon-btn[data-v-f76fbbc3]:hover{color:var(--color-heading);background:var(--color-surface-muted)}.matrix-wrapper[data-v-f76fbbc3]{margin:var(--space-md) 0;padding:var(--space-lg)}.matrix-scroll[data-v-f76fbbc3]{overflow-x:auto}.matrix-hint[data-v-f76fbbc3]{font-size:.8rem;color:var(--color-text-muted)}.perm-matrix-grid[data-v-f76fbbc3]{display:inline-grid;gap:.25rem;align-items:stretch}.perm-matrix-grid[data-v-f76fbbc3]>*{padding:.35rem .45rem;font-size:.75rem}.perm-matrix-grid .grid-head[data-v-f76fbbc3]{color:var(--color-text-muted);text-transform:uppercase;font-weight:600;letter-spacing:.05em}.perm-matrix-grid .perm-head[data-v-f76fbbc3]{display:flex;align-items:flex-end;justify-content:flex-start;padding:.35rem .45rem;font-size:.75rem}.perm-matrix-grid .role-head[data-v-f76fbbc3]{display:flex;align-items:flex-end;justify-content:center}.perm-matrix-grid .role-head span[data-v-f76fbbc3]{writing-mode:vertical-rl;transform:rotate(180deg);font-size:.65rem}.perm-matrix-grid .add-role-head[data-v-f76fbbc3]{cursor:pointer}.perm-name[data-v-f76fbbc3]{font-weight:600;color:var(--color-heading);padding:.35rem .45rem;font-size:.75rem}.roles-grid[data-v-f76fbbc3]{display:flex;gap:var(--space-lg);margin-top:var(--space-lg)}.role-column[data-v-f76fbbc3]{flex:1;min-width:200px;border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-md)}.role-header[data-v-f76fbbc3]{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-md)}.role-name[data-v-f76fbbc3]{display:flex;align-items:center;gap:var(--space-xs);font-size:1.1rem;color:var(--color-heading)}.role-actions[data-v-f76fbbc3]{display:flex;gap:var(--space-xs)}.plus-btn[data-v-f76fbbc3]{background:var(--color-accent-soft);color:var(--color-accent);border:none;border-radius:var(--radius-sm);padding:.25rem .45rem;font-size:1.1rem;cursor:pointer}.plus-btn[data-v-f76fbbc3]:hover{background:#2563eb2e}.user-list[data-v-f76fbbc3]{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:var(--space-xs)}.user-chip[data-v-f76fbbc3]{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:.45rem .6rem;display:flex;justify-content:space-between;gap:var(--space-sm);cursor:grab}.user-chip[data-v-f76fbbc3]:focus{outline:2px solid var(--color-accent);outline-offset:1px}.user-chip .meta[data-v-f76fbbc3]{font-size:.7rem;color:var(--color-text-muted)}.empty-role[data-v-f76fbbc3]{border:1px dashed var(--color-border-strong);border-radius:var(--radius-md);padding:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-xs);align-items:flex-start}.empty-text[data-v-f76fbbc3]{margin:0}.delete-icon[data-v-f76fbbc3]{color:var(--color-danger)}.delete-icon[data-v-f76fbbc3]:hover{background:var(--color-danger-bg);color:var(--color-danger-text)}.muted[data-v-f76fbbc3]{color:var(--color-text-muted)}@media(max-width:720px){.roles-grid[data-v-f76fbbc3]{flex-direction:column}}.user-detail[data-v-0b259926]{display:flex;flex-direction:column;gap:var(--space-lg)}.actions[data-v-0b259926]{display:flex;flex-wrap:wrap;gap:var(--space-sm);align-items:center}.ancillary-actions[data-v-0b259926]{margin-top:-.5rem}.reg-token-btn[data-v-0b259926]{align-self:flex-start}.registration-actions[data-v-0b259926]{display:flex;flex-direction:column;gap:.5rem}.icon-btn[data-v-0b259926]{background:none;border:none;color:var(--color-text-muted);padding:.2rem;border-radius:var(--radius-sm);cursor:pointer;transition:background .2s ease,color .2s ease}.icon-btn[data-v-0b259926]:hover{color:var(--color-heading);background:var(--color-surface-muted)}.matrix-hint[data-v-0b259926]{font-size:.8rem;color:var(--color-text-muted)}.error[data-v-0b259926]{color:var(--color-danger-text)}.small[data-v-0b259926]{font-size:.9rem}.muted[data-v-0b259926]{color:var(--color-text-muted)}.error[data-v-8d16c6cc]{color:var(--color-danger-text)}.small[data-v-8d16c6cc]{font-size:.9rem}.muted[data-v-8d16c6cc]{color:var(--color-text-muted)}.optional[data-v-8d16c6cc]{font-weight:400;color:var(--color-text-muted);font-size:.85em}.view-admin[data-v-1d1c1f6a]{padding-bottom:var(--space-3xl)}.view-header[data-v-1d1c1f6a]{display:flex;flex-direction:column;gap:var(--space-sm)}.admin-section[data-v-1d1c1f6a]{margin-top:var(--space-xl)}.admin-section-body[data-v-1d1c1f6a],.admin-panels[data-v-1d1c1f6a]{display:flex;flex-direction:column;gap:var(--space-xl)}
1
+ .permissions-section[data-v-56228c4a]{margin-bottom:var(--space-xl)}.permissions-section h2[data-v-56228c4a]{margin-bottom:var(--space-md)}.actions[data-v-56228c4a]{display:flex;flex-wrap:wrap;gap:var(--space-sm);align-items:center}.actions button[data-v-56228c4a]{width:auto}.org-table a[data-v-56228c4a]{text-decoration:none;color:var(--color-link)}.org-table a[data-v-56228c4a]:hover{text-decoration:underline}.org-table .center[data-v-56228c4a]{width:6rem;min-width:6rem}.org-table .role-names[data-v-56228c4a]{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.perm-name-cell[data-v-56228c4a]{display:flex;flex-direction:column;gap:.3rem}.perm-title[data-v-56228c4a]{font-weight:600;color:var(--color-heading)}.perm-id-info[data-v-56228c4a]{font-size:.8rem;color:var(--color-text-muted);display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.perm-domain[data-v-56228c4a]{color:var(--color-text-muted);font-size:.9rem}.icon-btn[data-v-56228c4a]{background:none;border:none;color:var(--color-text-muted);padding:.2rem;border-radius:var(--radius-sm);cursor:pointer;transition:background .2s ease,color .2s ease}.icon-btn[data-v-56228c4a]:hover{color:var(--color-heading);background:var(--color-surface-muted)}.delete-icon[data-v-56228c4a]{color:var(--color-danger)}.delete-icon[data-v-56228c4a]:hover{background:var(--color-danger-bg);color:var(--color-danger-text)}.matrix-wrapper[data-v-56228c4a]{margin:var(--space-md) 0;padding:var(--space-lg)}.matrix-scroll[data-v-56228c4a]{overflow-x:auto}.matrix-hint[data-v-56228c4a]{font-size:.8rem;color:var(--color-text-muted)}.perm-matrix-grid[data-v-56228c4a]{display:inline-grid;gap:.25rem;align-items:stretch}.perm-matrix-grid[data-v-56228c4a]>*{padding:.35rem .45rem;font-size:.75rem}.perm-matrix-grid .grid-head[data-v-56228c4a]{color:var(--color-text-muted);text-transform:uppercase;font-weight:600;letter-spacing:.05em}.perm-matrix-grid .perm-head[data-v-56228c4a]{display:flex;align-items:flex-end;justify-content:flex-start;padding:.35rem .45rem;font-size:.75rem}.perm-matrix-grid .org-head[data-v-56228c4a]{display:flex;align-items:flex-end;justify-content:center}.perm-matrix-grid .org-head span[data-v-56228c4a]{writing-mode:vertical-rl;transform:rotate(180deg);font-size:.65rem}.perm-name[data-v-56228c4a]{font-weight:600;color:var(--color-heading);padding:.35rem .45rem;font-size:.75rem}.display-text[data-v-56228c4a]{margin-right:var(--space-xs)}.edit-display-btn[data-v-56228c4a]{padding:.1rem .2rem;font-size:.8rem}.edit-org-btn[data-v-56228c4a]{padding:.1rem .2rem;font-size:.8rem;margin-left:var(--space-xs)}.perm-actions[data-v-56228c4a],.center[data-v-56228c4a]{text-align:center}.muted[data-v-56228c4a]{color:var(--color-text-muted)}.card.surface[data-v-f76fbbc3]{padding:var(--space-lg)}.org-title[data-v-f76fbbc3]{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-lg)}.org-name[data-v-f76fbbc3]{font-size:1.5rem;font-weight:600;color:var(--color-heading)}.icon-btn[data-v-f76fbbc3]{background:none;border:none;color:var(--color-text-muted);padding:.2rem;border-radius:var(--radius-sm);cursor:pointer;transition:background .2s ease,color .2s ease}.icon-btn[data-v-f76fbbc3]:hover{color:var(--color-heading);background:var(--color-surface-muted)}.matrix-wrapper[data-v-f76fbbc3]{margin:var(--space-md) 0;padding:var(--space-lg)}.matrix-scroll[data-v-f76fbbc3]{overflow-x:auto}.matrix-hint[data-v-f76fbbc3]{font-size:.8rem;color:var(--color-text-muted)}.perm-matrix-grid[data-v-f76fbbc3]{display:inline-grid;gap:.25rem;align-items:stretch}.perm-matrix-grid[data-v-f76fbbc3]>*{padding:.35rem .45rem;font-size:.75rem}.perm-matrix-grid .grid-head[data-v-f76fbbc3]{color:var(--color-text-muted);text-transform:uppercase;font-weight:600;letter-spacing:.05em}.perm-matrix-grid .perm-head[data-v-f76fbbc3]{display:flex;align-items:flex-end;justify-content:flex-start;padding:.35rem .45rem;font-size:.75rem}.perm-matrix-grid .role-head[data-v-f76fbbc3]{display:flex;align-items:flex-end;justify-content:center}.perm-matrix-grid .role-head span[data-v-f76fbbc3]{writing-mode:vertical-rl;transform:rotate(180deg);font-size:.65rem}.perm-matrix-grid .add-role-head[data-v-f76fbbc3]{cursor:pointer}.perm-name[data-v-f76fbbc3]{font-weight:600;color:var(--color-heading);padding:.35rem .45rem;font-size:.75rem}.roles-grid[data-v-f76fbbc3]{display:flex;gap:var(--space-lg);margin-top:var(--space-lg)}.role-column[data-v-f76fbbc3]{flex:1;min-width:200px;border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-md)}.role-header[data-v-f76fbbc3]{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-md)}.role-name[data-v-f76fbbc3]{display:flex;align-items:center;gap:var(--space-xs);font-size:1.1rem;color:var(--color-heading)}.role-actions[data-v-f76fbbc3]{display:flex;gap:var(--space-xs)}.plus-btn[data-v-f76fbbc3]{background:var(--color-accent-soft);color:var(--color-accent);border:none;border-radius:var(--radius-sm);padding:.25rem .45rem;font-size:1.1rem;cursor:pointer}.plus-btn[data-v-f76fbbc3]:hover{background:#2563eb2e}.user-list[data-v-f76fbbc3]{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:var(--space-xs)}.user-chip[data-v-f76fbbc3]{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:.45rem .6rem;display:flex;justify-content:space-between;gap:var(--space-sm);cursor:grab}.user-chip[data-v-f76fbbc3]:focus{outline:2px solid var(--color-accent);outline-offset:1px}.user-chip .meta[data-v-f76fbbc3]{font-size:.7rem;color:var(--color-text-muted)}.empty-role[data-v-f76fbbc3]{border:1px dashed var(--color-border-strong);border-radius:var(--radius-md);padding:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-xs);align-items:flex-start}.empty-text[data-v-f76fbbc3]{margin:0}.delete-icon[data-v-f76fbbc3]{color:var(--color-danger)}.delete-icon[data-v-f76fbbc3]:hover{background:var(--color-danger-bg);color:var(--color-danger-text)}.muted[data-v-f76fbbc3]{color:var(--color-text-muted)}@media (max-width: 720px){.roles-grid[data-v-f76fbbc3]{flex-direction:column}}.user-detail[data-v-738bccea]{display:flex;flex-direction:column;gap:var(--space-lg)}.actions[data-v-738bccea]{display:flex;flex-wrap:wrap;gap:var(--space-sm);align-items:center}.ancillary-actions[data-v-738bccea]{margin-top:-.5rem}.reg-token-btn[data-v-738bccea]{align-self:flex-start}.registration-actions[data-v-738bccea]{display:flex;flex-direction:column;gap:.5rem}.icon-btn[data-v-738bccea]{background:none;border:none;color:var(--color-text-muted);padding:.2rem;border-radius:var(--radius-sm);cursor:pointer;transition:background .2s ease,color .2s ease}.icon-btn[data-v-738bccea]:hover{color:var(--color-heading);background:var(--color-surface-muted)}.matrix-hint[data-v-738bccea]{font-size:.8rem;color:var(--color-text-muted)}.error[data-v-738bccea]{color:var(--color-danger-text)}.small[data-v-738bccea]{font-size:.9rem}.muted[data-v-738bccea]{color:var(--color-text-muted)}.error[data-v-8d16c6cc]{color:var(--color-danger-text)}.small[data-v-8d16c6cc]{font-size:.9rem}.muted[data-v-8d16c6cc]{color:var(--color-text-muted)}.optional[data-v-8d16c6cc]{font-weight:400;color:var(--color-text-muted);font-size:.85em}.view-admin[data-v-6d820553]{padding-bottom:var(--space-3xl)}.view-header[data-v-6d820553]{display:flex;flex-direction:column;gap:var(--space-sm)}.admin-section[data-v-6d820553]{margin-top:var(--space-xl)}.admin-section-body[data-v-6d820553],.admin-panels[data-v-6d820553]{display:flex;flex-direction:column;gap:var(--space-xl)}
@@ -1 +1 @@
1
- .pairing-entry[data-v-77a073d9]{display:flex;flex-direction:column;gap:1rem}.pairing-form[data-v-77a073d9]{display:flex;flex-direction:column;gap:.5rem}.input-row[data-v-77a073d9]{display:flex;align-items:center;gap:.5rem}.input-wrapper[data-v-77a073d9]{position:relative;display:flex;width:280px;max-width:100%}.slot-machine[data-v-77a073d9]{position:absolute;left:0;top:0;width:100%;height:100%;gap:0;box-sizing:border-box;z-index:1;pointer-events:none}.input-wrapper.focused.has-error .slot-machine[data-v-77a073d9]{background:var(--color-error-bg, rgba(239, 68, 68, .05))}.slot-reel[data-v-77a073d9]{flex:1 1 33.333%;overflow:visible}.slot-reel[data-v-77a073d9]:not(:last-child){margin-right:.5rem}.slot-word[data-v-77a073d9]{font-weight:600;letter-spacing:.05em;text-align:center;width:100%;color:var(--color-text);display:flex;align-items:center;justify-content:center;position:relative}.slot-word .typed-prefix[data-v-77a073d9]{color:var(--color-text)}.slot-word .hint-suffix[data-v-77a073d9]{color:var(--color-text-muted);opacity:.6}.cursor-overlay[data-v-77a073d9]{position:absolute;width:2px;height:1.2em;background:var(--color-text);animation:none;pointer-events:none;left:calc(50% + (var(--cursor-pos) - var(--word-len, 0) / 2) * .65em);transform:translate(-1px);opacity:0}.input-wrapper.focused .cursor-overlay[data-v-77a073d9]{opacity:1;animation:cursorBlink-77a073d9 .25s alternate infinite}.input-wrapper.focused.has-selection .cursor-overlay[data-v-77a073d9]{animation:none}.selection-overlay[data-v-77a073d9]{position:absolute;height:1.2em;background:var(--color-primary, #3b82f6);opacity:.3;pointer-events:none;left:calc(50% + (var(--sel-start) - var(--word-len, 0) / 2) * .65em);width:calc((var(--sel-end) - var(--sel-start)) * .65em)}@keyframes cursorBlink-77a073d9{0%,50%{opacity:1}80%,to{opacity:0}}.slot-reel.invalid-word .slot-word[data-v-77a073d9],.slot-reel.invalid-word .slot-word .typed-prefix[data-v-77a073d9]{color:var(--color-error, #ef4444)}.slot-reel.invalid-word .cursor-overlay[data-v-77a073d9]{background:var(--color-error, #ef4444)}.slot-reel.empty .slot-word[data-v-77a073d9]{color:var(--color-text-muted)}.pairing-input[data-v-77a073d9]{flex:1;width:100%;height:100%;border-radius:var(--radius-sm, 6px);position:relative;z-index:0}.pairing-input.hidden-input[data-v-77a073d9]{opacity:0}.pairing-input[data-v-77a073d9]:disabled{cursor:not-allowed}.pairing-input[data-v-77a073d9]::placeholder{color:transparent}.processing-status[data-v-77a073d9]{display:flex;align-items:center;gap:.25rem;font-size:.875rem;color:var(--color-text-muted)}.processing-icon[data-v-77a073d9]{font-size:.875rem}.processing-spinner-small[data-v-77a073d9]{width:12px;height:12px;border:2px solid var(--color-border);border-top-color:var(--color-primary);border-radius:50%;animation:spin-77a073d9 .8s linear infinite}@keyframes spin-77a073d9{to{transform:rotate(360deg)}}.device-info[data-v-77a073d9]{display:flex;flex-direction:column;gap:.5rem}.device-permit-text[data-v-77a073d9]{margin:0;font-size:.95rem;color:var(--color-text)}.device-meta[data-v-77a073d9]{margin:0;font-size:.8rem;color:var(--color-text-muted);font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace}.error-message[data-v-77a073d9]{margin:0;font-size:.875rem;color:var(--color-error, #ef4444);margin-bottom:1rem}.view-lede[data-v-89d5d936]{margin:0;color:var(--color-text-muted);font-size:1rem}.section-header[data-v-89d5d936]{display:flex;flex-direction:column;gap:.4rem}.empty-state[data-v-89d5d936]{margin:0;color:var(--color-text-muted);text-align:center;padding:1rem 0}.logout-note[data-v-89d5d936]{margin:.75rem 0 0;color:var(--color-text-muted);font-size:.875rem}.remote-auth-inline[data-v-89d5d936]{display:flex;flex-direction:column;gap:.5rem}.remote-auth-label[data-v-89d5d936]{display:block;margin:0;font-size:.875rem;color:var(--color-text-muted);font-weight:500}.remote-auth-description[data-v-89d5d936]{font-size:.75rem;color:var(--color-text-muted)}.host-view[data-v-237999a2]{padding:3rem 1.5rem 4rem}.host-actions[data-v-237999a2]{display:flex;flex-direction:column;gap:.75rem}.host-actions .button-row[data-v-237999a2]{gap:.75rem;flex-wrap:wrap}.host-actions .button-row button[data-v-237999a2]{flex:1 1 0}.note[data-v-237999a2],.empty-state[data-v-237999a2]{margin:0;color:var(--color-text-muted)}
1
+ .pairing-entry[data-v-77a073d9]{display:flex;flex-direction:column;gap:1rem}.pairing-form[data-v-77a073d9]{display:flex;flex-direction:column;gap:.5rem}.input-row[data-v-77a073d9]{display:flex;align-items:center;gap:.5rem}.input-wrapper[data-v-77a073d9]{position:relative;display:flex;width:280px;max-width:100%}.slot-machine[data-v-77a073d9]{position:absolute;left:0;top:0;width:100%;height:100%;gap:0;box-sizing:border-box;z-index:1;pointer-events:none}.input-wrapper.focused.has-error .slot-machine[data-v-77a073d9]{background:var(--color-error-bg, rgba(239, 68, 68, .05))}.slot-reel[data-v-77a073d9]{flex:1 1 33.333%;overflow:visible}.slot-reel[data-v-77a073d9]:not(:last-child){margin-right:.5rem}.slot-word[data-v-77a073d9]{font-weight:600;letter-spacing:.05em;text-align:center;width:100%;color:var(--color-text);display:flex;align-items:center;justify-content:center;position:relative}.slot-word .typed-prefix[data-v-77a073d9]{color:var(--color-text)}.slot-word .hint-suffix[data-v-77a073d9]{color:var(--color-text-muted);opacity:.6}.cursor-overlay[data-v-77a073d9]{position:absolute;width:2px;height:1.2em;background:var(--color-text);animation:none;pointer-events:none;left:calc(50% + (var(--cursor-pos) - var(--word-len, 0) / 2) * .65em);transform:translate(-1px);opacity:0}.input-wrapper.focused .cursor-overlay[data-v-77a073d9]{opacity:1;animation:cursorBlink-77a073d9 .25s alternate infinite}.input-wrapper.focused.has-selection .cursor-overlay[data-v-77a073d9]{animation:none}.selection-overlay[data-v-77a073d9]{position:absolute;height:1.2em;background:var(--color-primary, #3b82f6);opacity:.3;pointer-events:none;left:calc(50% + (var(--sel-start) - var(--word-len, 0) / 2) * .65em);width:calc((var(--sel-end) - var(--sel-start)) * .65em)}@keyframes cursorBlink-77a073d9{0%,50%{opacity:1}80%,to{opacity:0}}.slot-reel.invalid-word .slot-word[data-v-77a073d9],.slot-reel.invalid-word .slot-word .typed-prefix[data-v-77a073d9]{color:var(--color-error, #ef4444)}.slot-reel.invalid-word .cursor-overlay[data-v-77a073d9]{background:var(--color-error, #ef4444)}.slot-reel.empty .slot-word[data-v-77a073d9]{color:var(--color-text-muted)}.pairing-input[data-v-77a073d9]{flex:1;width:100%;height:100%;border-radius:var(--radius-sm, 6px);position:relative;z-index:0}.pairing-input.hidden-input[data-v-77a073d9]{opacity:0}.pairing-input[data-v-77a073d9]:disabled{cursor:not-allowed}.pairing-input[data-v-77a073d9]::placeholder{color:transparent}.processing-status[data-v-77a073d9]{display:flex;align-items:center;gap:.25rem;font-size:.875rem;color:var(--color-text-muted)}.processing-icon[data-v-77a073d9]{font-size:.875rem}.processing-spinner-small[data-v-77a073d9]{width:12px;height:12px;border:2px solid var(--color-border);border-top-color:var(--color-primary);border-radius:50%;animation:spin-77a073d9 .8s linear infinite}@keyframes spin-77a073d9{to{transform:rotate(360deg)}}.device-info[data-v-77a073d9]{display:flex;flex-direction:column;gap:.5rem}.device-permit-text[data-v-77a073d9]{margin:0;font-size:.95rem;color:var(--color-text)}.device-meta[data-v-77a073d9]{margin:0;font-size:.8rem;color:var(--color-text-muted);font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace}.error-message[data-v-77a073d9]{margin:0;font-size:.875rem;color:var(--color-error, #ef4444);margin-bottom:1rem}.view-lede[data-v-70360523]{margin:0;color:var(--color-text-muted);font-size:1rem}.section-header[data-v-70360523]{display:flex;flex-direction:column;gap:.4rem}.empty-state[data-v-70360523]{margin:0;color:var(--color-text-muted);text-align:center;padding:1rem 0}.logout-note[data-v-70360523]{margin:.75rem 0 0;color:var(--color-text-muted);font-size:.875rem}.remote-auth-inline[data-v-70360523]{display:flex;flex-direction:column;gap:.5rem}.remote-auth-label[data-v-70360523]{display:block;margin:0;font-size:.875rem;color:var(--color-text-muted);font-weight:500}.remote-auth-description[data-v-70360523]{font-size:.75rem;color:var(--color-text-muted)}.host-view[data-v-237999a2]{padding:3rem 1.5rem 4rem}.host-actions[data-v-237999a2]{display:flex;flex-direction:column;gap:.75rem}.host-actions .button-row[data-v-237999a2]{gap:.75rem;flex-wrap:wrap}.host-actions .button-row button[data-v-237999a2]{flex:1 1 0}.note[data-v-237999a2],.empty-state[data-v-237999a2]{margin:0;color:var(--color-text-muted)}
@@ -0,0 +1 @@
1
+ import{_ as De,r as d,w as Ge,c as W,o as _e,n as ye,a as ke,b as _,d as f,e as a,f as D,g as Ae,h as it,F as de,i as ut,j as Pe,t as P,k as K,v as ct,l as Je,m as dt,s as ft,p as vt,q as ht,u as pt,x as ae,y as G,z as b,A as Fe,B as fe,C as Me,D as be,E as Ee,G as gt,H as Qe,N as mt,O as we,I as yt,J as wt,K as bt}from"./_plugin-vue_export-helper-D2l53SUz.js";import{u as xe,B as _t,U as Xe,_ as kt,a as It,N as xt,M as St,R as Ct,L as $t,b as Lt,A as Wt,c as At}from"./AccessDenied-DAdzg_MJ.js";import{i as je,a as ee,g as Oe,b as qe,c as Ye,s as Ze}from"./pow-2N9bxgAo.js";import{g as Ie}from"./helpers-DzjFIx78.js";const Be={};async function Pt(U="login"){if(Be[U])return Be[U];const o=await fetch("/auth/api/forward");if(o.status===401||o.status===403){const L=await o.json();if(L.auth?.iframe){let k=L.auth.iframe;return U!==L.auth.mode&&(k=k.replace(/mode=[^&]*/,`mode=${U}`)),Be[U]=k,k}}throw new Error("Unable to fetch auth iframe URL")}const Mt={class:"pairing-entry"},Et={key:0,class:"input-row"},Bt={class:"slot-word"},Dt={class:"typed-prefix"},Nt={class:"hint-suffix"},Ut={key:0,class:"cursor-overlay",style:{"--cursor-pos":0,"--word-len":0}},Tt=["placeholder"],Vt={key:0,class:"processing-status"},Ht={class:"processing-icon"},Rt={key:1,class:"device-info"},Kt={class:"device-permit-text"},zt={class:"device-meta"},Ft={key:0,class:"error-message",style:{"margin-top":"0.5rem"}},jt={class:"button-row",style:{"margin-top":"0.75rem",display:"flex",gap:"0.5rem"}},Ot=["disabled"],qt=["disabled"],Yt={__name:"RemoteAuthPermit",props:{title:{type:String,default:"Help Another Device Sign In"},description:{type:String,default:"Enter the code shown on the device that needs to sign in."},placeholder:{type:String,default:"Enter three words"},action:{type:String,default:"login"}},emits:["completed","error","cancelled","back","register","deviceInfoVisible"],setup(U,{expose:o,emit:L}){const k=L,I=d(!1),S=d(null),T=d(null);let c=null,V=null;try{V=xe()}catch{}const E=d(null),z=d(null),u=d(""),p=d(!1),m=d(""),v=d(null),h=d("");Ge(v,e=>{k("deviceInfoVisible",!!e)});const y=d(!1),A=d(!1),C=d(0),J=d(0),Q=d(0),re=d(!1),ve=d(!1);let te=0,se=!1,Y=null,ne=null,F=null,j=null,N=null,Z=null;function oe(e,s="info",t=3e3){V&&V.showMessage(e,s,t)}async function le(){try{const e=await dt();T.value=e}catch(e){console.warn("Unable to load settings",e)}}function ie(e,s){if(!e||s<0)return{word:"",start:0,end:0};let t=s,i=s;for(;t>0&&/[a-zA-Z]/.test(e[t-1]);)t--;for(;i<e.length&&/[a-zA-Z]/.test(e[i]);)i++;return{word:e.slice(t,i),start:t,end:i}}function X(e){return e.trim().split(/[.\s]+/).filter(s=>s.length>0)}function B(e){const s=X(e),t=[];for(const i of s){let l=i.toLowerCase();for(;l.length>0&&t.length<3;){let $=null;for(let w=Math.min(l.length,6);w>=3;w--){const x=l.slice(0,w);if(ee(x)){$=x;break}}if($)t.push($),l=l.slice($.length);else{t.push(l);break}}if(t.length>=3)break}return t}function he(e){const s=/[.\s]$/.test(e),t=B(e);return s?t.length:Math.max(0,t.length-1)}function pe(e){if(!e)return{valid:!0,segments:[]};const s=[],t=/[.\s]$/.test(e);let i,l=/([a-zA-Z]+)|([.\s]+)/g;for(;(i=l.exec(e))!==null;)i[1]?s.push({text:i[1],isWord:!0,start:i.index}):i[2]&&s.push({text:i[2],isWord:!1,start:i.index});const $=s.filter(x=>x.isWord);let w=!0;return $.forEach((x,H)=>{const M=H===$.length-1,q=x.text.toLowerCase();M&&!t?x.invalid=!je(q):x.invalid=!ee(q),x.invalid&&(w=!1)}),{valid:w,segments:s}}W(()=>{const{segments:e}=pe(u.value);return e.map(s=>({text:s.text,invalid:s.invalid||!1}))});function Se(e){return pe(e).valid}function Ce(e){return B(e).length>0&&B(e).every(s=>ee(s))}function ge(e){if(/[.\s]$/.test(e))return"";const t=e.match(/[a-zA-Z]+$/);return t?t[0].toLowerCase():""}function $e(e,s){if(!e||s===0)return{wordIndex:0,charIndex:0};const t=e.slice(0,s),i=/[.\s]$/.test(t),l=B(t);if(l.length===0)return{wordIndex:0,charIndex:0};if(i)return{wordIndex:Math.min(l.length,2),charIndex:0};const $=l[l.length-1],w=l.length-1;B(e);const x=$.length;return w<2&&!ve.value&&ee($)?{wordIndex:w+1,charIndex:0}:{wordIndex:Math.min(w,2),charIndex:x}}function ue(e,s){if(!e||s===0)return{wordIndex:0,charIndex:0};const t=e.slice(0,s),i=/[.\s]$/.test(t),l=B(t);if(l.length===0)return{wordIndex:0,charIndex:0};if(i)return{wordIndex:Math.min(l.length,2),charIndex:0};const $=l[l.length-1],w=l.length-1;return{wordIndex:Math.min(w,2),charIndex:$.length}}const r=W(()=>{const e=B(u.value),s=[],t=ge(u.value),i=h.value,l=/[.\s]$/.test(u.value),$=J.value!==Q.value,w=ue(u.value,Math.min(J.value,Q.value)),x=ue(u.value,Math.max(J.value,Q.value)),H=$?ue(u.value,C.value):$e(u.value,C.value);for(let M=0;M<3;M++){const q=H.wordIndex===M;let O=-1,R=-1;if($&&(M>w.wordIndex&&M<x.wordIndex?(O=0,R=e[M]?.length??0):M===w.wordIndex&&M===x.wordIndex?(O=w.charIndex,R=x.charIndex):M===w.wordIndex?(O=w.charIndex,R=e[M]?.length??0):M===x.wordIndex&&(O=0,R=x.charIndex)),M<e.length){const me=e[M].toLowerCase(),Ke=M===e.length-1,ze=Ke&&!l?!je(me):!ee(me);if(Ke&&!l&&i&&t){const lt=i.length;s.push({text:"",typedPrefix:t,hintSuffix:i.slice(t.length),invalid:ze,hasCursor:q,cursorCharIndex:q?H.charIndex:-1,wordLen:lt,selectionStartChar:O,selectionEndChar:R})}else s.push({text:me,invalid:ze,hasCursor:q,cursorCharIndex:q?H.charIndex:-1,wordLen:me.length,selectionStartChar:O,selectionEndChar:R})}else s.push({text:"",invalid:!1,hasCursor:q,cursorCharIndex:0,wordLen:0,selectionStartChar:O,selectionEndChar:R})}return s}),n=W(()=>J.value!==Q.value),g=W(()=>{const e=B(u.value);return e.length===3&&e.every(s=>ee(s))});function Ne(e){return B(e).join(".")}function tt(){if(!Y||F)return;const e=Ye(Y);F=Ze(e,ne).then(s=>{j=s,F=null})}async function Ue(){if(j){const s=j;return j=null,s}if(F){await F;const s=j;return j=null,s}if(!Y)throw new Error("No PoW challenge available");const e=Ye(Y);return await Ze(e,ne)}function Te(e){e?.challenge&&(Y=e.challenge,ne=e.work,j=null,F=null,tt())}async function Le(){if(!(c||se)){se=!0;try{const e=T.value?.auth_host,s="/auth/ws/remote-auth/permit",t=e&&location.host!==e?`//${e}${s}`:s;c=await vt(t);const i=await c.receive_json();if(i.status&&i.detail)throw new Error(i.detail);if(!i.pow?.challenge)throw new Error("Server did not send PoW challenge");Te(i.pow)}catch(e){throw console.error("WebSocket connection error:",e),c=null,e}finally{se=!1}}}function st(e){if(e.key==="Tab"||e.key===" "||e.key==="Escape"){at(e);return}setTimeout(Ve,0)}function Ve(){const e=E.value,s=e?.selectionStart??u.value.length,t=e?.selectionEnd??s,l=(e?.selectionDirection??"none")==="backward"?s:t;ve.value=l<te,te=l,C.value=l,Q.value=t,J.value=s}function nt(){C.value=E.value?.selectionStart??u.value.length;const{word:e,end:s}=ie(u.value,C.value);if(he(u.value)>=3||!e||e.length<1||C.value!==s){h.value="";return}const i=Oe(e.toLowerCase());i&&i!==e.toLowerCase()?h.value=i:h.value=""}function He(){if(!h.value)return!1;const{word:e,start:s,end:t}=ie(u.value,C.value);if(!e)return!1;const i=u.value.slice(0,s),w=B(i).length===2?"":" ",x=u.value.slice(t);u.value=i+h.value+w+x.trimStart();const H=s+h.value.length+w.length;return ye(()=>{E.value?.setSelectionRange(H,H),C.value=H}),h.value="",!0}function ce(){C.value=E.value?.selectionStart??u.value.length;const e=C.value,t=u.value.slice(0,e).match(/([a-zA-Z]+) $/);if(t){const l=t[1].toLowerCase(),$=Oe(l);if($&&$!==l&&!ee(l)){const w=e-t[0].length,x=u.value.slice(0,w),H=u.value.slice(e),O=B(x).length===2?"":" ";u.value=x+$+O+H;const R=w+$.length+O.length;ye(()=>{E.value?.setSelectionRange(R,R),C.value=R})}}nt(),N&&(clearTimeout(N),N=null),v.value=null,S.value=null,A.value=!1,y.value=!Se(u.value);const i=B(u.value);if(i.length>=1&&!c&&!se&&Le(),i.length===3){if(!Ce(u.value))return;N=setTimeout(()=>{ot()},150)}}async function ot(){if(!(p.value||I.value||!g.value||Ne(u.value)===Z&&v.value)){p.value=!0,m.value="pow",S.value=null,A.value=!1;try{if(await Le(),!c)throw new Error("Failed to connect");const s=await Ue(),t=qe(s),i=Ne(u.value);if(!g.value)return;m.value="server",c.send_json({code:i,pow:t});const l=await c.receive_json();if(Te(l.pow),typeof l.status=="number"&&l.status>=400){oe(l.detail||"Request failed","error"),A.value=!0,v.value=null,Z=null;return}l.status==="found"&&l.host?(v.value={host:l.host,user_agent_pretty:l.user_agent_pretty,client_ip:l.client_ip,action:l.action||"login"},Z=i,ye(()=>{z.value?.focus()})):(oe("Unexpected response from server","error"),A.value=!0,v.value=null,Z=null)}catch(s){console.error("Lookup error:",s),oe(s.message||"Lookup failed","error"),A.value=!0,v.value=null,Z=null,c&&(c.close(),c=null)}finally{p.value=!1,m.value=""}}}function at(e){if(e.key==="Escape"){u.value="",ce(),e.preventDefault();return}if(e.key==="Tab"){if(h.value&&He()){e.preventDefault(),ce();return}u.value.trim()&&e.preventDefault();return}e.key===" "&&h.value&&He()&&(e.preventDefault(),ce())}async function rt(){if(!(!v.value||I.value)){I.value=!0,S.value=null;try{if(c||await Le(),!c)throw new Error("Failed to connect");const e=await Ue(),s=qe(e);c.send_json({authenticate:!0,pow:s});const t=await c.receive_json();if(typeof t.status=="number"&&t.status>=400)throw new Error(t.detail||"Authentication failed");if(!t.optionsJSON)throw new Error(t.detail||"Failed to get authentication options");const i=await ft(t);c.send_json(i);const l=await c.receive_json();if(typeof l.status=="number"&&l.status>=400)throw new Error(l.detail||"Authentication failed");if(l.status==="success")oe("Device authenticated successfully!","success",3e3),k("completed"),We();else throw new Error(l.detail||"Authentication failed")}catch(e){console.error("Pairing error:",e);const s=e.name==="NotAllowedError"?"Passkey authentication was cancelled":e.message||"Authentication failed";S.value=s,k("error",s)}finally{I.value=!1,c&&(c.close(),c=null)}}}async function Re(){if(c){try{c.send_json({deny:!0}),await new Promise(e=>setTimeout(e,100))}catch(e){console.error("Error sending deny message:",e)}c.close(),c=null}We()}function We(){u.value="",S.value=null,A.value=!1,v.value=null,p.value=!1,m.value="",h.value="",y.value=!1,Z=null,c&&(c.close(),c=null),Y=null,ne=null,F=null,j=null}return _e(async()=>{await le(),ye(()=>{C.value=E.value?.selectionStart??0})}),ke(()=>{N&&(clearTimeout(N),N=null),c&&(c.close(),c=null)}),o({reset:We,deny:Re,code:u,handleInput:ce,loading:I,error:S}),(e,s)=>(f(),_("div",Mt,[a("form",{onSubmit:Je(rt,["prevent"]),class:"pairing-form"},[v.value?v.value?(f(),_("div",Rt,[a("p",Kt,[K("Permit "+P(v.value.action==="register"?"registration":"login")+" to ",1),a("strong",null,P(v.value.host),1)]),a("p",zt,P(v.value.user_agent_pretty),1),S.value?(f(),_("p",Ft,P(S.value),1)):D("",!0),a("div",jt,[a("button",{type:"button",class:"btn-secondary",disabled:I.value,onClick:Re,style:{flex:"1"}}," Deny ",8,Ot),a("button",{ref_key:"submitBtnRef",ref:z,type:"submit",disabled:I.value,class:"btn-primary",style:{flex:"1"}},P(I.value?"Authenticating…":"Authorize"),9,qt)])])):D("",!0):(f(),_("div",Et,[a("div",{class:Ae(["input-wrapper",{"has-error":A.value,"is-complete":v.value&&!A.value,focused:re.value,"has-selection":n.value}])},[a("div",{class:Ae(["slot-machine",{"has-error":A.value,"is-complete":v.value&&!A.value}]),"aria-hidden":"true"},[(f(!0),_(de,null,ut(r.value,(t,i)=>(f(),_("div",{key:i,class:Ae(["slot-reel",{"invalid-word":t.invalid,empty:!t.text&&!t.typedPrefix}])},[a("div",Bt,[t.selectionStartChar>=0&&t.selectionEndChar>t.selectionStartChar?(f(),_("span",{key:0,class:"selection-overlay",style:Pe({"--sel-start":t.selectionStartChar,"--sel-end":t.selectionEndChar,"--word-len":t.wordLen})},null,4)):D("",!0),t.typedPrefix?(f(),_(de,{key:1},[a("span",Dt,P(t.typedPrefix),1),a("span",Nt,P(t.hintSuffix),1),t.hasCursor?(f(),_("span",{key:0,class:"cursor-overlay",style:Pe({"--cursor-pos":t.cursorCharIndex,"--word-len":t.wordLen})},null,4)):D("",!0)],64)):t.text?(f(),_(de,{key:2},[K(P(t.text)+" ",1),t.hasCursor?(f(),_("span",{key:0,class:"cursor-overlay",style:Pe({"--cursor-pos":t.cursorCharIndex,"--word-len":t.wordLen})},null,4)):D("",!0)],64)):(f(),_(de,{key:3},[t.hasCursor?(f(),_("span",Ut)):D("",!0)],64))])],2))),128))],2),it(a("input",{ref_key:"inputRef",ref:E,"onUpdate:modelValue":s[0]||(s[0]=t=>u.value=t),type:"text",placeholder:U.placeholder,autocomplete:"off",autocapitalize:"none",autocorrect:"off",spellcheck:"false",class:"pairing-input hidden-input",onInput:ce,onKeydown:st,onMouseup:Ve,onFocus:s[1]||(s[1]=t=>re.value=!0),onBlur:s[2]||(s[2]=t=>re.value=!1)},null,40,Tt),[[ct,u.value]])],2),m.value?(f(),_("div",Vt,[a("span",Ht,P(m.value==="pow"?"🔐":"📡"),1),s[3]||(s[3]=a("span",{class:"processing-spinner-small"},null,-1))])):D("",!0)]))],32)]))}},Zt=De(Yt,[["__scopeId","data-v-77a073d9"]]),Gt={class:"view-root","data-view":"profile"},Jt={class:"view-header"},Qt={class:"remote-auth-inline"},Xt={key:0,class:"remote-auth-label"},es={class:"section-block"},ts={class:"section-body"},ss={class:"section-block"},ns=["disabled"],os=["disabled"],as=["disabled"],rs={key:0,class:"logout-note"},ls={key:1,class:"logout-note"},is={__name:"ProfileView",setup(U){const o=xe(),L=d(null),k=d(!1),I=d(!1),S=d(""),T=d(!1),c=d(null),V=d(null),E=d(!1),z=d(null),u=d(null),p=d(null),m=d(null),v=d(null),h=d(null),y=d(null),A=d(null),C=W(()=>k.value||I.value);Ge(k,r=>{r&&(S.value=o.userInfo?.ctx.user.display_name??"")}),_e(()=>{L.value=setInterval(()=>{o.userInfo&&(o.userInfo={...o.userInfo})},6e4)}),ke(()=>{L.value&&clearInterval(L.value)});const J=async()=>{try{await gt.register(null,null,()=>{o.showMessage("Adding new passkey...","info")}),await o.loadUserInfo(),o.showMessage("New passkey added successfully!","success",3e3)}catch(r){console.error("Failed to add new passkey:",r),o.showMessage(r.message,"error")}},Q=()=>{o.showMessage("The other device is now signed in!","success",4e3),setTimeout(()=>z.value?.reset(),3e3)},re=r=>{r.includes("cancelled")||o.showMessage(r,"error",4e3)},ve=()=>{o.showMessage("📋 Link copied! Send it to your other device."),I.value=!1},te=r=>{Me(r,{primarySelector:".btn-primary",itemSelector:"button"})},se=r=>{if(C.value)return;const n=fe(r);n&&n==="down"&&(r.preventDefault(),Me(A.value,{primarySelector:".mini-btn",itemSelector:".mini-btn, .pairing-input"}))},Y=r=>{if(C.value)return;const n=fe(r);if(!n)return;r.preventDefault(),n==="left"||n==="right"?be(A.value,r.target,n,{itemSelector:".mini-btn, .pairing-input"}):n==="up"?h.value?.focusCurrent?.():n==="down"&&u.value?.$el?.focus()},ne=r=>{C.value||(r==="down"||r==="right"?te(p.value):(r==="up"||r==="left")&&Me(A.value,{primarySelector:".mini-btn",itemSelector:".mini-btn, .pairing-input"}))},F=r=>{if(C.value)return;const n=fe(r);n&&(r.preventDefault(),n==="left"||n==="right"?be(p.value,r.target,n,{itemSelector:"button"}):n==="up"?Ee(u.value?.$el,0,{itemSelector:".credential-item"}):n==="down"&&Ee(m.value?.$el,0,{itemSelector:".session-group"}))},j=r=>{C.value||(r==="up"?te(p.value):r==="down"&&te(v.value))},N=r=>{if(C.value)return;const n=fe(r);n&&(r.preventDefault(),n==="left"||n==="right"?be(v.value,r.target,n,{itemSelector:"button"}):n==="up"&&Ee(m.value?.$el,-1,{itemSelector:".session-group"}))},Z=async r=>{const n=r?.credential;if(n)try{await o.deleteCredential(n),o.showMessage("Passkey deleted! You should also remove it from your password manager or device.","success",3e3)}catch(g){o.showMessage(`Failed to delete passkey: ${g.message}`,"error")}},oe=W(()=>o.settings?.rp_name||"this service"),le=W(()=>o.userInfo?.sessions||[]),ie=W(()=>le.value.find(n=>n.is_current)?.host||"this host"),X=d({}),B=async r=>{const n=r?.id;if(n){X.value={...X.value,[n]:!0};try{await o.terminateSession(n)}catch(g){o.showMessage(g.message||"Failed to terminate session","error",5e3)}finally{const g={...X.value};delete g[n],X.value=g}}},he=async()=>{await o.logoutEverywhere()},pe=async()=>{await o.logout()},Se=()=>{S.value=o.userInfo?.ctx.user.display_name??"",k.value=!0},Ce=W(()=>{const r=o.userInfo?.ctx.permissions;return r.includes("auth:admin")||r.includes("auth:org:admin")}),ge=W(()=>le.value.length>1),$e=W(()=>{const r=[{label:"Auth",href:ht()}];return Ce.value&&r.push({label:"Admin",href:pt()}),r}),ue=async()=>{const r=S.value.trim();if(!r){o.showMessage("Name cannot be empty","error");return}try{T.value=!0,await Qe("/auth/api/user/display-name",{method:"PATCH",body:{display_name:r}}),k.value=!1,await o.loadUserInfo(),o.showMessage("Name updated successfully!","success",3e3)}catch(n){o.showMessage(n.message||"Failed to update name","error")}finally{T.value=!1}};return(r,n)=>(f(),_("section",Gt,[a("header",Jt,[n[10]||(n[10]=a("h1",null,"User Profile",-1)),ae(_t,{ref_key:"breadcrumbs",ref:h,entries:$e.value,onKeydown:se},null,8,["entries"]),n[11]||(n[11]=a("p",{class:"view-lede"},"Account dashboard for managing credentials and authenticating with other devices.",-1))]),a("section",{class:"section-block",ref_key:"userInfoSection",ref:A},[b(o).userInfo?.ctx?(f(),G(Xe,{key:0,ref_key:"userBasicInfo",ref:y,name:b(o).userInfo.ctx.user.display_name,visits:b(o).userInfo.visits,"created-at":b(o).userInfo.created_at,"last-seen":b(o).userInfo.last_seen,loading:b(o).isLoading,"update-endpoint":"/auth/api/user/display-name",onSaved:n[1]||(n[1]=g=>b(o).loadUserInfo()),onEditName:Se,onKeydown:Y},{default:Fe(()=>[a("div",Qt,[E.value?D("",!0):(f(),_("label",Xt,"Code words:")),ae(Zt,{ref_key:"pairingEntry",ref:z,title:"",description:"",onCompleted:Q,onError:re,onDeviceInfoVisible:n[0]||(n[0]=g=>E.value=g)},null,512)]),n[12]||(n[12]=a("p",{class:"remote-auth-description"},"Provided by another device requesting remote auth.",-1))]),_:1},8,["name","visits","created-at","last-seen","loading"])):D("",!0)],512),a("section",es,[n[13]||(n[13]=a("div",{class:"section-header"},[a("h2",null,"Your Passkeys"),a("p",{class:"section-description"},[K("Ideally have at least two passkeys in case you lose one. More than one user can be registered on the same device, giving you a choice at login. "),a("a",{href:"https://bitwarden.com/pricing/",target:"_blank",rel:"noopener noreferrer"},"Bitwarden"),K(" can sync one passkey to all your devices. Other secure options include "),a("b",null,"local passkeys"),K(", as well as hardware keys such as "),a("a",{href:"https://www.yubico.com",target:"_blank",rel:"noopener noreferrer"},"YubiKey"),K(". Cloud sync via Google, Microsoft or iCloud is discouraged.")])],-1)),a("div",ts,[ae(kt,{ref_key:"credentialList",ref:u,credentials:b(o).userInfo?.credentials||[],"aaguid-info":b(o).userInfo?.aaguid_info||{},loading:b(o).isLoading,"hovered-credential-uuid":c.value,"hovered-session-credential-uuid":V.value?.credential,"navigation-disabled":C.value,"allow-delete":"",onDelete:Z,onCredentialHover:n[2]||(n[2]=g=>c.value=g),onNavigateOut:ne},null,8,["credentials","aaguid-info","loading","hovered-credential-uuid","hovered-session-credential-uuid","navigation-disabled"]),a("div",{class:"button-row",ref_key:"credentialButtons",ref:p},[a("button",{onClick:J,class:"btn-primary",onKeydown:F},"Register New",32),a("button",{onClick:n[3]||(n[3]=g=>I.value=!0),class:"btn-secondary",onKeydown:F},"Another Device",32)],512)])]),ae(It,{ref_key:"sessionList",ref:m,sessions:le.value,"terminating-sessions":X.value,"hovered-credential-uuid":c.value,"navigation-disabled":C.value,onTerminate:B,onSessionHover:n[4]||(n[4]=g=>V.value=g),onNavigateOut:j,"section-description":"You are currently signed in to the following sessions. If you don't recognize something, consider deleting not only the session but the associated passkey you suspect is compromised, as only this terminates all linked sessions and prevents logging in again."},null,8,["sessions","terminating-sessions","hovered-credential-uuid","navigation-disabled"]),k.value?(f(),G(St,{key:0,onClose:n[7]||(n[7]=g=>k.value=!1)},{default:Fe(()=>[n[14]||(n[14]=a("h3",null,"Edit Display Name",-1)),a("form",{onSubmit:Je(ue,["prevent"]),class:"modal-form"},[ae(xt,{label:"Display Name",modelValue:S.value,"onUpdate:modelValue":n[5]||(n[5]=g=>S.value=g),busy:T.value,onCancel:n[6]||(n[6]=g=>k.value=!1)},null,8,["modelValue","busy"])],32)]),_:1})):D("",!0),a("section",ss,[a("div",{class:"button-row",ref_key:"logoutButtons",ref:v},[a("button",{type:"button",class:"btn-secondary",onClick:n[8]||(n[8]=(...g)=>b(Ie)&&b(Ie)(...g)),onKeydown:N}," Back ",32),ge.value?(f(),_(de,{key:1},[a("button",{onClick:pe,class:"btn-danger",disabled:b(o).isLoading,onKeydown:N},"Logout",40,os),a("button",{onClick:he,class:"btn-danger",disabled:b(o).isLoading,onKeydown:N},"All",40,as)],64)):(f(),_("button",{key:0,onClick:he,class:"btn-danger",disabled:b(o).isLoading,onKeydown:N},"Logout",40,ns))],512),ge.value?(f(),_("p",ls,[n[16]||(n[16]=a("strong",null,"Logout",-1)),K(" this session on "+P(ie.value)+", or ",1),n[17]||(n[17]=a("strong",null,"All",-1)),K(" sessions across all sites and devices for "+P(oe.value)+". You'll need to log in again with your passkey afterwards.",1)])):(f(),_("p",rs,[n[15]||(n[15]=a("strong",null,"Logout",-1)),K(" from "+P(ie.value)+".",1)]))]),I.value?(f(),G(Ct,{key:1,endpoint:"/auth/api/user/create-link",onClose:n[9]||(n[9]=g=>I.value=!1),onCopied:ve})):D("",!0)]))}},us=De(is,[["__scopeId","data-v-70360523"]]),cs={class:"view-root host-view","data-view":"host-profile"},ds={class:"view-header"},fs={class:"view-lede"},vs={class:"section-body"},hs={key:1,class:"empty-state"},ps={class:"section-block"},gs={class:"section-body host-actions"},ms=["disabled"],ys=["disabled"],ws={class:"note"},bs={__name:"HostProfileView",props:{initializing:{type:Boolean,default:!1}},setup(U){const o=xe(),L=window.location.host,k=d(null),I=d(null),S=W(()=>o.userInfo?.ctx||null),T=W(()=>S.value?.org.display_name??""),c=W(()=>S.value?.role.display_name??""),V=W(()=>{const h=o.settings?.rp_name;return h?`${h} account`:"Account overview"}),E=W(()=>`You're signed in to ${L}.`),z=W(()=>o.settings?.auth_host||""),u=W(()=>{const h=z.value;if(!h)return"";let y=o.settings?.ui_base_path??"/auth/";return y.startsWith("/")||(y=`/${y}`),y.endsWith("/")||(y=`${y}/`),`${window.location.protocol||"https:"}//${h}${y}`}),p=()=>{u.value&&(window.location.href=u.value)},m=async()=>{await o.logout()},v=h=>{const y=fe(h);y&&(h.preventDefault(),(y==="left"||y==="right")&&be(I.value,h.target,y,{itemSelector:"button"}))};return(h,y)=>(f(),_("section",cs,[a("header",ds,[a("h1",null,P(V.value),1),a("p",fs,P(E.value),1)]),a("section",{class:"section-block",ref_key:"userInfoSection",ref:k},[a("div",vs,[S.value?(f(),G(Xe,{key:0,name:S.value.user.display_name,visits:b(o).userInfo?.visits||0,"created-at":b(o).userInfo?.created_at,"last-seen":b(o).userInfo?.last_seen,"org-display-name":T.value,"role-name":c.value,"can-edit":!1},null,8,["name","visits","created-at","last-seen","org-display-name","role-name"])):(f(),_("p",hs,P(U.initializing?"Loading your account…":"No active session found."),1))])],512),a("section",ps,[a("div",gs,[a("div",{class:"button-row",ref_key:"buttonRow",ref:I,onKeydown:v},[a("button",{type:"button",class:"btn-secondary",onClick:y[0]||(y[0]=(...A)=>b(Ie)&&b(Ie)(...A))}," Back "),a("button",{type:"button",class:"btn-danger",disabled:b(o).isLoading,onClick:m},P(b(o).isLoading?"Signing out…":"Logout"),9,ms),u.value?(f(),_("button",{key:0,type:"button",class:"btn-primary",disabled:b(o).isLoading,onClick:p}," Full Profile ",8,ys)):D("",!0)],544),a("p",ws,[y[1]||(y[1]=a("strong",null,"Logout",-1)),K(" from "+P(b(L))+", or access your ",1),y[2]||(y[2]=a("strong",null,"Full Profile",-1)),K(" at "+P(z.value)+" (you may need to sign in again).",1)])])])]))}},_s=De(bs,[["__scopeId","data-v-237999a2"]]),ks={class:"app-shell"},Is={class:"app-main"},xs={__name:"App",setup(U){const o=xe(),L=d("loading"),k=d("Loading...");function I(p){if(!p)return null;const m=p.trim().toLowerCase();return m?m.replace(/:80$/,"").replace(/:443$/,""):null}const S=W(()=>{const p=o.settings?.auth_host;if(!p)return!1;const m=I(window.location.host),v=I(p);return m!==v});W(()=>o.userInfo?.ctx.user.uuid);function T(){o.userInfo=null,L.value="terminal"}const c=()=>o.userInfo?.ctx.user.uuid,V=new mt(c,T);_e(()=>V.start()),ke(()=>V.stop());async function E(){try{return o.userInfo=await Qe("/auth/api/user-info",{method:"POST"}),L.value="profile",!0}catch{return o.userInfo=null,!1}}async function z(){const p=await Pt("login");yt(p),k.value="Authentication required..."}function u(p){const m=p.data;if(m?.type)switch(m.type){case"auth-success":we(),L.value="loading",k.value="Loading user profile...",E();break;case"auth-error":m.cancelled?console.log("Authentication cancelled by user"):o.showMessage(m.message||"Authentication failed","error",5e3);break;case"auth-cancelled":console.log("Authentication cancelled");break;case"auth-back":we(),T();break;case"auth-close-request":we();break}}return _e(async()=>{window.addEventListener("message",u),await o.loadSettings();const p=o.settings?.rp_name;if(p){const v=o.settings?.auth_host,h=v&&I(window.location.host)!==I(v);document.title=h?`${p} · Account summary`:p}await E()||z()}),ke(()=>{window.removeEventListener("message",u),we()}),(p,m)=>(f(),_("div",ks,[ae(Lt),a("main",Is,[L.value==="profile"&&S.value?(f(),G(_s,{key:0})):L.value==="profile"?(f(),G(us,{key:1})):L.value==="loading"?(f(),G($t,{key:2,message:k.value},null,8,["message"])):L.value==="terminal"?(f(),G(Wt,{key:3})):D("",!0)])]))}},et=wt(xs);et.use(At());et.mount("#app");bt();
@@ -1 +1 @@
1
- import{c as o,a4 as d,o as u,y as s,d as m,z as l,J as h,K as p}from"./_plugin-vue_export-helper-nhjnO_bd.js";import{R as f}from"./RestrictedAuth-DsJXicIw.js";import{g as a}from"./helpers-DzjFIx78.js";import"./pow-2N9bxgAo.js";const w={__name:"RestrictedForward",setup(_){const n=o(()=>d()),r=o(()=>{const e=document.documentElement.getAttribute("data-mode");return e==="reauth"?"reauth":e==="forbidden"?"forbidden":"login"});function c(){location.reload()}function i(){const t=n.value||"/auth/";window.location.pathname!==t&&history.replaceState(null,"",t),window.location.href=t}return u(()=>{window.addEventListener("keydown",t=>{t.key==="Escape"&&a()})}),(t,e)=>(m(),s(f,{mode:r.value,onAuthenticated:c,onBack:l(a),onHome:i},null,8,["mode","onBack"]))}};h(w).mount("#app");p();
1
+ import{c as o,a6 as d,o as u,y as s,d as m,z as l,J as h,K as p}from"./_plugin-vue_export-helper-D2l53SUz.js";import{R as f}from"./RestrictedAuth-BSusdAfp.js";import{g as a}from"./helpers-DzjFIx78.js";import"./pow-2N9bxgAo.js";const w={__name:"RestrictedForward",setup(_){const n=o(()=>d()),r=o(()=>{const e=document.documentElement.getAttribute("data-mode");return e==="reauth"?"reauth":e==="forbidden"?"forbidden":"login"});function c(){location.reload()}function i(){const t=n.value||"/auth/";window.location.pathname!==t&&history.replaceState(null,"",t),window.location.href=t}return u(()=>{window.addEventListener("keydown",t=>{t.key==="Escape"&&a()})}),(t,e)=>(m(),s(f,{mode:r.value,onAuthenticated:c,onBack:l(a),onHome:i},null,8,["mode","onBack"]))}};h(w).mount("#app");p();
@@ -0,0 +1 @@
1
+ .center[data-v-4830d223]{text-align:center}.button-row.center[data-v-4830d223]{display:flex;justify-content:center}.section-body[data-v-4830d223]{gap:1.25rem}.name-edit span[data-v-4830d223]{color:var(--color-text-muted);font-size:.9rem}
@@ -0,0 +1 @@
1
+ import{_ as M,Q as N,r as i,c as m,a6 as b,o as $,b as c,d as u,f as z,e as t,t as p,g as F,h as K,v as V,L as D,m as E,H as x,a7 as I,a8 as G,G as H,J as L,K as U}from"./_plugin-vue_export-helper-D2l53SUz.js";const j={class:"app-shell"},J={key:0,class:"global-status",style:{display:"block"}},O={class:"view-root"},Q={class:"surface surface--tight",style:{"max-width":"560px",margin:"0 auto",width:"100%"}},Y={class:"view-header",style:{"text-align":"center"}},q={class:"view-lede"},W={key:0,class:"section-block"},X={key:1,class:"section-block"},Z={key:2,class:"section-block"},ee={class:"section-body"},se={class:"name-edit"},te=["disabled"],ae=["disabled"],ne={__name:"ResetApp",setup(ie){const o=N({show:!1,message:"",type:"info"}),d=i(!0),n=i(!1),l=i(""),T=i(null),g=i(null),h=i(""),y=i("");let v=null;const P=m(()=>g.value?.token_type||"your enrollment"),R=m(()=>d.value?"Preparing your secure enrollment…":f.value?`Finish up ${P.value}. You may edit the name below if needed, and it will be saved to your passkey.`:"This authentication link is no longer valid.");m(()=>b());const f=m(()=>!!(l.value&&g.value));function r(e,s="info",a=3e3){o.show=!0,o.message=e,o.type=s,v&&clearTimeout(v),a>0&&(v=setTimeout(()=>{o.show=!1},a))}async function S(){try{const e=await E();T.value=e,e?.rp_name&&(document.title=`${e.rp_name} · Passkey Setup`)}catch(e){console.warn("Unable to load settings",e)}}async function B(){if(l.value)try{g.value=await x("/auth/api/token-info",{method:"GET",headers:{Authorization:`Bearer ${l.value}`}}),h.value=g.value.display_name}catch(e){console.error("Failed to load token info",e);const s=e instanceof I?e.data?.detail||"The authentication link is invalid or expired.":G(e);y.value=s}}async function _(){if(!f.value||n.value)return;n.value=!0,r("Starting passkey registration…","info");let e;try{const s=h.value.trim()||null;e=await H.register(l.value,s)}catch(s){n.value=!1;const a=s?.message||"Passkey registration cancelled",w=a==="Passkey registration cancelled";r(w?a:`Registration failed: ${a}`,w?"info":"error",4e3);return}try{await C(e)}catch(s){n.value=!1;const a=s?.message||"Failed to establish session";r(a,"error",4e3);return}r("Passkey registered successfully!","success",800),setTimeout(()=>{n.value=!1,k()},800)}async function C(e){if(!e?.session_token)throw new Error("Registration response missing session_token");return await x("/auth/api/set-session",{method:"POST",headers:{Authorization:`Bearer ${e.session_token}`}})}function k(){const e=b.value||"/auth/";window.location.pathname!==e&&history.replaceState(null,"",e),window.location.reload()}function A(){const e=window.location.pathname.split("/").filter(Boolean);if(!e.length)return"";const s=e[e.length-1],a=e.slice(0,-1);return a.length>1||a.length===1&&a[0]!=="auth"||!s.includes(".")?"":s}return $(async()=>{if(l.value=A(),await S(),!l.value){const e="Reset link is missing or malformed.";y.value=e,r(e,"error",0),d.value=!1;return}await B(),d.value=!1}),(e,s)=>(u(),c("div",j,[o.show?(u(),c("div",J,[t("div",{class:F(["status",o.type])},p(o.message),3)])):z("",!0),t("main",O,[t("div",Q,[t("header",Y,[s[1]||(s[1]=t("h1",null,"🔑 Registration",-1)),t("p",q,p(R.value),1)]),d.value?(u(),c("section",W,[...s[2]||(s[2]=[t("div",{class:"section-body center"},[t("p",null,"Loading reset details…")],-1)])])):f.value?(u(),c("section",Z,[t("div",ee,[t("label",se,[s[3]||(s[3]=t("span",null,"👤 Name",-1)),K(t("input",{type:"text","onUpdate:modelValue":s[0]||(s[0]=a=>h.value=a),disabled:n.value,maxlength:"64",onKeyup:D(_,["enter"])},null,40,te),[[V,h.value]])]),t("button",{class:"btn-primary",disabled:n.value,onClick:_},p(n.value?"Registering…":"Register Passkey"),9,ae)])])):(u(),c("section",X,[t("div",{class:"section-body center"},[t("div",{class:"button-row center",style:{"justify-content":"center"}},[t("button",{class:"btn-secondary",onClick:k},"Return to sign-in")])])]))])])]))}},oe=M(ne,[["__scopeId","data-v-4830d223"]]);L(oe).mount("#app");U();