xe(E,e&&(M(e)?e[A]:e),s,n,r));return}if(ve(n)&&!r){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&xe(t,e,s,n.component.subTree);return}const i=n.shapeFlag&4?fs(n.component):n.el,o=r?null:i,{i:l,r:f}=t,h=e&&e.r,a=l.refs===B?l.refs={}:l.refs,p=l.setupState,y=$(p),S=p===B?()=>!1:E=>K(y,E);if(h!=null&&h!==f&&(k(h)?(a[h]=null,S(h)&&(p[h]=null)):Q(h)&&(h.value=null)),D(f))Re(f,l,12,[o,a]);else{const E=k(f),A=Q(f);if(E||A){const tt=()=>{if(t.f){const N=E?S(f)?p[f]:a[f]:f.value;r?M(N)&&Ks(N,i):M(N)?N.includes(i)||N.push(i):E?(a[f]=[i],S(f)&&(p[f]=a[f])):(f.value=[i],t.k&&(a[t.k]=f.value))}else E?(a[f]=o,S(f)&&(p[f]=o)):A&&(f.value=o,t.k&&(a[t.k]=o))};o?(tt.id=-1,ct(tt,s)):tt()}}}ss().requestIdleCallback;ss().cancelIdleCallback;const ve=t=>!!t.type.__asyncLoader,Rr=t=>t.type.__isKeepAlive;function no(t,e){Ir(t,"a",e)}function ro(t,e){Ir(t,"da",e)}function Ir(t,e,s=ut){const n=t.__wdc||(t.__wdc=()=>{let r=s;for(;r;){if(r.isDeactivated)return;r=r.parent}return t()});if(os(e,n,s),s){let r=s.parent;for(;r&&r.parent;)Rr(r.parent.vnode)&&io(n,e,s,r),r=r.parent}}function io(t,e,s,n){const r=os(e,t,n,!0);Fr(()=>{Ks(n[e],r)},s)}function os(t,e,s=ut,n=!1){if(s){const r=s[t]||(s[t]=[]),i=e.__weh||(e.__weh=(...o)=>{Dt();const l=Ie(s),f=Ot(e,s,t,o);return l(),jt(),f});return n?r.unshift(i):r.push(i),i}}const Ht=t=>(e,s=ut)=>{(!Me||t==="sp")&&os(t,(...n)=>e(...n),s)},oo=Ht("bm"),lo=Ht("m"),co=Ht("bu"),fo=Ht("u"),uo=Ht("bum"),Fr=Ht("um"),ao=Ht("sp"),ho=Ht("rtg"),po=Ht("rtc");function go(t,e=ut){os("ec",t,e)}const _o=Symbol.for("v-ndc");function Jl(t,e,s,n){let r;const i=s,o=M(t);if(o||k(t)){const l=o&&Ut(t);let f=!1,h=!1;l&&(f=!mt(t),h=Wt(t),t=ns(t)),r=new Array(t.length);for(let a=0,p=t.length;ae(l,f,void 0,i));else{const l=Object.keys(t);r=new Array(l.length);for(let f=0,h=l.length;ft?Qr(t)?fs(t):Ms(t.parent):null,Se=it(Object.create(null),{$:t=>t,$el:t=>t.vnode.el,$data:t=>t.data,$props:t=>t.props,$attrs:t=>t.attrs,$slots:t=>t.slots,$refs:t=>t.refs,$parent:t=>Ms(t.parent),$root:t=>Ms(t.root),$host:t=>t.ce,$emit:t=>t.emit,$options:t=>jr(t),$forceUpdate:t=>t.f||(t.f=()=>{Qs(t.update)}),$nextTick:t=>t.n||(t.n=Sr.bind(t.proxy)),$watch:t=>$o.bind(t)}),ms=(t,e)=>t!==B&&!t.__isScriptSetup&&K(t,e),mo={get({_:t},e){if(e==="__v_skip")return!0;const{ctx:s,setupState:n,data:r,props:i,accessCache:o,type:l,appContext:f}=t;let h;if(e[0]!=="$"){const S=o[e];if(S!==void 0)switch(S){case 1:return n[e];case 2:return r[e];case 4:return s[e];case 3:return i[e]}else{if(ms(n,e))return o[e]=1,n[e];if(r!==B&&K(r,e))return o[e]=2,r[e];if((h=t.propsOptions[0])&&K(h,e))return o[e]=3,i[e];if(s!==B&&K(s,e))return o[e]=4,s[e];Rs&&(o[e]=0)}}const a=Se[e];let p,y;if(a)return e==="$attrs"&&rt(t.attrs,"get",""),a(t);if((p=l.__cssModules)&&(p=p[e]))return p;if(s!==B&&K(s,e))return o[e]=4,s[e];if(y=f.config.globalProperties,K(y,e))return y[e]},set({_:t},e,s){const{data:n,setupState:r,ctx:i}=t;return ms(r,e)?(r[e]=s,!0):n!==B&&K(n,e)?(n[e]=s,!0):K(t.props,e)||e[0]==="$"&&e.slice(1)in t?!1:(i[e]=s,!0)},has({_:{data:t,setupState:e,accessCache:s,ctx:n,appContext:r,propsOptions:i}},o){let l;return!!s[o]||t!==B&&K(t,o)||ms(e,o)||(l=i[0])&&K(l,o)||K(n,o)||K(Se,o)||K(r.config.globalProperties,o)},defineProperty(t,e,s){return s.get!=null?t._.accessCache[e]=0:K(s,"value")&&this.set(t,e,s.value,null),Reflect.defineProperty(t,e,s)}};function yn(t){return M(t)?t.reduce((e,s)=>(e[s]=null,e),{}):t}let Rs=!0;function bo(t){const e=jr(t),s=t.proxy,n=t.ctx;Rs=!1,e.beforeCreate&&xn(e.beforeCreate,t,"bc");const{data:r,computed:i,methods:o,watch:l,provide:f,inject:h,created:a,beforeMount:p,mounted:y,beforeUpdate:S,updated:E,activated:A,deactivated:tt,beforeDestroy:N,beforeUnmount:W,destroyed:U,unmounted:P,render:H,renderTracked:et,renderTriggered:X,errorCaptured:F,serverPrefetch:I,expose:G,inheritAttrs:ot,components:yt,directives:Nt,filters:fe}=e;if(h&&yo(h,n,null),o)for(const j in o){const q=o[j];D(q)&&(n[j]=q.bind(s))}if(r){const j=r.call(s,s);z(j)&&(t.data=rs(j))}if(Rs=!0,i)for(const j in i){const q=i[j],Yt=D(q)?q.bind(s,s):D(q.get)?q.get.bind(s,s):At,De=!D(q)&&D(q.set)?q.set.bind(s):At,zt=ti({get:Yt,set:De});Object.defineProperty(n,j,{enumerable:!0,configurable:!0,get:()=>zt.value,set:xt=>zt.value=xt})}if(l)for(const j in l)Dr(l[j],n,s,j);if(f){const j=D(f)?f.call(s):f;Reflect.ownKeys(j).forEach(q=>{Co(q,j[q])})}a&&xn(a,t,"c");function Z(j,q){M(q)?q.forEach(Yt=>j(Yt.bind(s))):q&&j(q.bind(s))}if(Z(oo,p),Z(lo,y),Z(co,S),Z(fo,E),Z(no,A),Z(ro,tt),Z(go,F),Z(po,et),Z(ho,X),Z(uo,W),Z(Fr,P),Z(ao,I),M(G))if(G.length){const j=t.exposed||(t.exposed={});G.forEach(q=>{Object.defineProperty(j,q,{get:()=>s[q],set:Yt=>s[q]=Yt,enumerable:!0})})}else t.exposed||(t.exposed={});H&&t.render===At&&(t.render=H),ot!=null&&(t.inheritAttrs=ot),yt&&(t.components=yt),Nt&&(t.directives=Nt),I&&Mr(t)}function yo(t,e,s=At){M(t)&&(t=Is(t));for(const n in t){const r=t[n];let i;z(r)?"default"in r?i=we(r.from||n,r.default,!0):i=we(r.from||n):i=we(r),Q(i)?Object.defineProperty(e,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):e[n]=i}}function xn(t,e,s){Ot(M(t)?t.map(n=>n.bind(e.proxy)):t.bind(e.proxy),e,s)}function Dr(t,e,s,n){let r=n.includes(".")?qr(s,n):()=>s[n];if(k(t)){const i=e[t];D(i)&&Ue(r,i)}else if(D(t))Ue(r,t.bind(s));else if(z(t))if(M(t))t.forEach(i=>Dr(i,e,s,n));else{const i=D(t.handler)?t.handler.bind(s):e[t.handler];D(i)&&Ue(r,i,t)}}function jr(t){const e=t.type,{mixins:s,extends:n}=e,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=t.appContext,l=i.get(e);let f;return l?f=l:!r.length&&!s&&!n?f=e:(f={},r.length&&r.forEach(h=>Xe(f,h,o,!0)),Xe(f,e,o)),z(e)&&i.set(e,f),f}function Xe(t,e,s,n=!1){const{mixins:r,extends:i}=e;i&&Xe(t,i,s,!0),r&&r.forEach(o=>Xe(t,o,s,!0));for(const o in e)if(!(n&&o==="expose")){const l=xo[o]||s&&s[o];t[o]=l?l(t[o],e[o]):e[o]}return t}const xo={data:vn,props:Sn,emits:Sn,methods:ge,computed:ge,beforeCreate:lt,created:lt,beforeMount:lt,mounted:lt,beforeUpdate:lt,updated:lt,beforeDestroy:lt,beforeUnmount:lt,destroyed:lt,unmounted:lt,activated:lt,deactivated:lt,errorCaptured:lt,serverPrefetch:lt,components:ge,directives:ge,watch:So,provide:vn,inject:vo};function vn(t,e){return e?t?function(){return it(D(t)?t.call(this,this):t,D(e)?e.call(this,this):e)}:e:t}function vo(t,e){return ge(Is(t),Is(e))}function Is(t){if(M(t)){const e={};for(let s=0;s1)return s&&D(e)?e.call(n&&n.proxy):e}}function Eo(){return!!(on()||te)}const Nr={},Lr=()=>Object.create(Nr),$r=t=>Object.getPrototypeOf(t)===Nr;function Ao(t,e,s,n=!1){const r={},i=Lr();t.propsDefaults=Object.create(null),Kr(t,e,r,i);for(const o in t.propsOptions[0])o in r||(r[o]=void 0);s?t.props=n?r:Ki(r):t.type.props?t.props=r:t.props=i,t.attrs=i}function Oo(t,e,s,n){const{props:r,attrs:i,vnode:{patchFlag:o}}=t,l=$(r),[f]=t.propsOptions;let h=!1;if((n||o>0)&&!(o&16)){if(o&8){const a=t.vnode.dynamicProps;for(let p=0;p{f=!0;const[y,S]=Vr(p,e,!0);it(o,y),S&&l.push(...S)};!s&&e.mixins.length&&e.mixins.forEach(a),t.extends&&a(t.extends),t.mixins&&t.mixins.forEach(a)}if(!i&&!f)return z(t)&&n.set(t,ie),ie;if(M(i))for(let a=0;at==="_"||t==="__"||t==="_ctx"||t==="$stable",en=t=>M(t)?t.map(Et):[Et(t)],Mo=(t,e,s)=>{if(e._n)return e;const n=to((...r)=>en(e(...r)),s);return n._c=!1,n},Ur=(t,e,s)=>{const n=t._ctx;for(const r in t){if(tn(r))continue;const i=t[r];if(D(i))e[r]=Mo(r,i,n);else if(i!=null){const o=en(i);e[r]=()=>o}}},Br=(t,e)=>{const s=en(e);t.slots.default=()=>s},Wr=(t,e,s)=>{for(const n in e)(s||!tn(n))&&(t[n]=e[n])},Ro=(t,e,s)=>{const n=t.slots=Lr();if(t.vnode.shapeFlag&32){const r=e.__;r&&Ts(n,"__",r,!0);const i=e._;i?(Wr(n,e,s),s&&Ts(n,"_",i,!0)):Ur(e,n)}else e&&Br(t,e)},Io=(t,e,s)=>{const{vnode:n,slots:r}=t;let i=!0,o=B;if(n.shapeFlag&32){const l=e._;l?s&&l===1?i=!1:Wr(r,e,s):(i=!e.$stable,Ur(e,r)),o=e}else e&&(Br(t,e),o={default:1});if(i)for(const l in r)!tn(l)&&o[l]==null&&delete r[l]},ct=qo;function Fo(t){return Do(t)}function Do(t,e){const s=ss();s.__VUE__=!0;const{insert:n,remove:r,patchProp:i,createElement:o,createText:l,createComment:f,setText:h,setElementText:a,parentNode:p,nextSibling:y,setScopeId:S=At,insertStaticContent:E}=t,A=(c,u,d,m=null,g=null,_=null,w=void 0,v=null,x=!!u.dynamicChildren)=>{if(c===u)return;c&&!pe(c,u)&&(m=je(c),xt(c,g,_,!0),c=null),u.patchFlag===-2&&(x=!1,u.dynamicChildren=null);const{type:b,ref:O,shapeFlag:T}=u;switch(b){case cs:tt(c,u,d,m);break;case Gt:N(c,u,d,m);break;case ys:c==null&&W(u,d,m,w);break;case Rt:yt(c,u,d,m,g,_,w,v,x);break;default:T&1?H(c,u,d,m,g,_,w,v,x):T&6?Nt(c,u,d,m,g,_,w,v,x):(T&64||T&128)&&b.process(c,u,d,m,g,_,w,v,x,ae)}O!=null&&g?xe(O,c&&c.ref,_,u||c,!u):O==null&&c&&c.ref!=null&&xe(c.ref,null,_,c,!0)},tt=(c,u,d,m)=>{if(c==null)n(u.el=l(u.children),d,m);else{const g=u.el=c.el;u.children!==c.children&&h(g,u.children)}},N=(c,u,d,m)=>{c==null?n(u.el=f(u.children||""),d,m):u.el=c.el},W=(c,u,d,m)=>{[c.el,c.anchor]=E(c.children,u,d,m,c.el,c.anchor)},U=({el:c,anchor:u},d,m)=>{let g;for(;c&&c!==u;)g=y(c),n(c,d,m),c=g;n(u,d,m)},P=({el:c,anchor:u})=>{let d;for(;c&&c!==u;)d=y(c),r(c),c=d;r(u)},H=(c,u,d,m,g,_,w,v,x)=>{u.type==="svg"?w="svg":u.type==="math"&&(w="mathml"),c==null?et(u,d,m,g,_,w,v,x):I(c,u,g,_,w,v,x)},et=(c,u,d,m,g,_,w,v)=>{let x,b;const{props:O,shapeFlag:T,transition:C,dirs:R}=c;if(x=c.el=o(c.type,_,O&&O.is,O),T&8?a(x,c.children):T&16&&F(c.children,x,null,m,g,bs(c,_),w,v),R&&Xt(c,null,m,"created"),X(x,c,c.scopeId,w,m),O){for(const J in O)J!=="value"&&!_e(J)&&i(x,J,null,O[J],_,m);"value"in O&&i(x,"value",null,O.value,_),(b=O.onVnodeBeforeMount)&&Tt(b,m,c)}R&&Xt(c,null,m,"beforeMount");const L=jo(g,C);L&&C.beforeEnter(x),n(x,u,d),((b=O&&O.onVnodeMounted)||L||R)&&ct(()=>{b&&Tt(b,m,c),L&&C.enter(x),R&&Xt(c,null,m,"mounted")},g)},X=(c,u,d,m,g)=>{if(d&&S(c,d),m)for(let _=0;_{for(let b=x;b{const v=u.el=c.el;let{patchFlag:x,dynamicChildren:b,dirs:O}=u;x|=c.patchFlag&16;const T=c.props||B,C=u.props||B;let R;if(d&&Zt(d,!1),(R=C.onVnodeBeforeUpdate)&&Tt(R,d,u,c),O&&Xt(u,c,d,"beforeUpdate"),d&&Zt(d,!0),(T.innerHTML&&C.innerHTML==null||T.textContent&&C.textContent==null)&&a(v,""),b?G(c.dynamicChildren,b,v,d,m,bs(u,g),_):w||q(c,u,v,null,d,m,bs(u,g),_,!1),x>0){if(x&16)ot(v,T,C,d,g);else if(x&2&&T.class!==C.class&&i(v,"class",null,C.class,g),x&4&&i(v,"style",T.style,C.style,g),x&8){const L=u.dynamicProps;for(let J=0;J{R&&Tt(R,d,u,c),O&&Xt(u,c,d,"updated")},m)},G=(c,u,d,m,g,_,w)=>{for(let v=0;v{if(u!==d){if(u!==B)for(const _ in u)!_e(_)&&!(_ in d)&&i(c,_,u[_],null,g,m);for(const _ in d){if(_e(_))continue;const w=d[_],v=u[_];w!==v&&_!=="value"&&i(c,_,v,w,g,m)}"value"in d&&i(c,"value",u.value,d.value,g)}},yt=(c,u,d,m,g,_,w,v,x)=>{const b=u.el=c?c.el:l(""),O=u.anchor=c?c.anchor:l("");let{patchFlag:T,dynamicChildren:C,slotScopeIds:R}=u;R&&(v=v?v.concat(R):R),c==null?(n(b,d,m),n(O,d,m),F(u.children||[],d,O,g,_,w,v,x)):T>0&&T&64&&C&&c.dynamicChildren?(G(c.dynamicChildren,C,d,g,_,w,v),(u.key!=null||g&&u===g.subTree)&&sn(c,u,!0)):q(c,u,d,O,g,_,w,v,x)},Nt=(c,u,d,m,g,_,w,v,x)=>{u.slotScopeIds=v,c==null?u.shapeFlag&512?g.ctx.activate(u,d,m,w,x):fe(u,d,m,g,_,w,x):Fe(c,u,x)},fe=(c,u,d,m,g,_,w)=>{const v=c.component=sl(c,m,g);if(Rr(c)&&(v.ctx.renderer=ae),nl(v,!1,w),v.asyncDep){if(g&&g.registerDep(v,Z,w),!c.el){const x=v.subTree=gt(Gt);N(null,x,u,d),c.placeholder=x.el}}else Z(v,c,u,d,g,_,w)},Fe=(c,u,d)=>{const m=u.component=c.component;if(Wo(c,u,d))if(m.asyncDep&&!m.asyncResolved){j(m,u,d);return}else m.next=u,m.update();else u.el=c.el,m.vnode=u},Z=(c,u,d,m,g,_,w)=>{const v=()=>{if(c.isMounted){let{next:T,bu:C,u:R,parent:L,vnode:J}=c;{const St=Gr(c);if(St){T&&(T.el=J.el,j(c,T,w)),St.asyncDep.then(()=>{c.isUnmounted||v()});return}}let V=T,at;Zt(c,!1),T?(T.el=J.el,j(c,T,w)):T=J,C&&Ke(C),(at=T.props&&T.props.onVnodeBeforeUpdate)&&Tt(at,L,T,J),Zt(c,!0);const ht=Cn(c),vt=c.subTree;c.subTree=ht,A(vt,ht,p(vt.el),je(vt),c,g,_),T.el=ht.el,V===null&&Go(c,ht.el),R&&ct(R,g),(at=T.props&&T.props.onVnodeUpdated)&&ct(()=>Tt(at,L,T,J),g)}else{let T;const{el:C,props:R}=u,{bm:L,m:J,parent:V,root:at,type:ht}=c,vt=ve(u);Zt(c,!1),L&&Ke(L),!vt&&(T=R&&R.onVnodeBeforeMount)&&Tt(T,V,u),Zt(c,!0);{at.ce&&at.ce._def.shadowRoot!==!1&&at.ce._injectChildStyle(ht);const St=c.subTree=Cn(c);A(null,St,d,m,c,g,_),u.el=St.el}if(J&&ct(J,g),!vt&&(T=R&&R.onVnodeMounted)){const St=u;ct(()=>Tt(T,V,St),g)}(u.shapeFlag&256||V&&ve(V.vnode)&&V.vnode.shapeFlag&256)&&c.a&&ct(c.a,g),c.isMounted=!0,u=d=m=null}};c.scope.on();const x=c.effect=new nr(v);c.scope.off();const b=c.update=x.run.bind(x),O=c.job=x.runIfDirty.bind(x);O.i=c,O.id=c.uid,x.scheduler=()=>Qs(O),Zt(c,!0),b()},j=(c,u,d)=>{u.component=c;const m=c.vnode.props;c.vnode=u,c.next=null,Oo(c,u.props,m,d),Io(c,u.children,d),Dt(),gn(c),jt()},q=(c,u,d,m,g,_,w,v,x=!1)=>{const b=c&&c.children,O=c?c.shapeFlag:0,T=u.children,{patchFlag:C,shapeFlag:R}=u;if(C>0){if(C&128){De(b,T,d,m,g,_,w,v,x);return}else if(C&256){Yt(b,T,d,m,g,_,w,v,x);return}}R&8?(O&16&&ue(b,g,_),T!==b&&a(d,T)):O&16?R&16?De(b,T,d,m,g,_,w,v,x):ue(b,g,_,!0):(O&8&&a(d,""),R&16&&F(T,d,m,g,_,w,v,x))},Yt=(c,u,d,m,g,_,w,v,x)=>{c=c||ie,u=u||ie;const b=c.length,O=u.length,T=Math.min(b,O);let C;for(C=0;CO?ue(c,g,_,!0,!1,T):F(u,d,m,g,_,w,v,x,T)},De=(c,u,d,m,g,_,w,v,x)=>{let b=0;const O=u.length;let T=c.length-1,C=O-1;for(;b<=T&&b<=C;){const R=c[b],L=u[b]=x?Kt(u[b]):Et(u[b]);if(pe(R,L))A(R,L,d,null,g,_,w,v,x);else break;b++}for(;b<=T&&b<=C;){const R=c[T],L=u[C]=x?Kt(u[C]):Et(u[C]);if(pe(R,L))A(R,L,d,null,g,_,w,v,x);else break;T--,C--}if(b>T){if(b<=C){const R=C+1,L=RC)for(;b<=T;)xt(c[b],g,_,!0),b++;else{const R=b,L=b,J=new Map;for(b=L;b<=C;b++){const dt=u[b]=x?Kt(u[b]):Et(u[b]);dt.key!=null&&J.set(dt.key,b)}let V,at=0;const ht=C-L+1;let vt=!1,St=0;const he=new Array(ht);for(b=0;b=ht){xt(dt,g,_,!0);continue}let wt;if(dt.key!=null)wt=J.get(dt.key);else for(V=L;V<=C;V++)if(he[V-L]===0&&pe(dt,u[V])){wt=V;break}wt===void 0?xt(dt,g,_,!0):(he[wt-L]=b+1,wt>=St?St=wt:vt=!0,A(dt,u[wt],d,null,g,_,w,v,x),at++)}const fn=vt?Ho(he):ie;for(V=fn.length-1,b=ht-1;b>=0;b--){const dt=L+b,wt=u[dt],un=u[dt+1],an=dt+1{const{el:_,type:w,transition:v,children:x,shapeFlag:b}=c;if(b&6){zt(c.component.subTree,u,d,m);return}if(b&128){c.suspense.move(u,d,m);return}if(b&64){w.move(c,u,d,ae);return}if(w===Rt){n(_,u,d);for(let T=0;Tv.enter(_),g);else{const{leave:T,delayLeave:C,afterLeave:R}=v,L=()=>{c.ctx.isUnmounted?r(_):n(_,u,d)},J=()=>{T(_,()=>{L(),R&&R()})};C?C(_,L,J):J()}else n(_,u,d)},xt=(c,u,d,m=!1,g=!1)=>{const{type:_,props:w,ref:v,children:x,dynamicChildren:b,shapeFlag:O,patchFlag:T,dirs:C,cacheIndex:R}=c;if(T===-2&&(g=!1),v!=null&&(Dt(),xe(v,null,d,c,!0),jt()),R!=null&&(u.renderCache[R]=void 0),O&256){u.ctx.deactivate(c);return}const L=O&1&&C,J=!ve(c);let V;if(J&&(V=w&&w.onVnodeBeforeUnmount)&&Tt(V,u,c),O&6)li(c.component,d,m);else{if(O&128){c.suspense.unmount(d,m);return}L&&Xt(c,null,u,"beforeUnmount"),O&64?c.type.remove(c,u,d,ae,m):b&&!b.hasOnce&&(_!==Rt||T>0&&T&64)?ue(b,u,d,!1,!0):(_===Rt&&T&384||!g&&O&16)&&ue(x,u,d),m&&ln(c)}(J&&(V=w&&w.onVnodeUnmounted)||L)&&ct(()=>{V&&Tt(V,u,c),L&&Xt(c,null,u,"unmounted")},d)},ln=c=>{const{type:u,el:d,anchor:m,transition:g}=c;if(u===Rt){oi(d,m);return}if(u===ys){P(c);return}const _=()=>{r(d),g&&!g.persisted&&g.afterLeave&&g.afterLeave()};if(c.shapeFlag&1&&g&&!g.persisted){const{leave:w,delayLeave:v}=g,x=()=>w(d,_);v?v(c.el,_,x):x()}else _()},oi=(c,u)=>{let d;for(;c!==u;)d=y(c),r(c),c=d;r(u)},li=(c,u,d)=>{const{bum:m,scope:g,job:_,subTree:w,um:v,m:x,a:b,parent:O,slots:{__:T}}=c;Tn(x),Tn(b),m&&Ke(m),O&&M(T)&&T.forEach(C=>{O.renderCache[C]=void 0}),g.stop(),_&&(_.flags|=8,xt(w,c,u,d)),v&&ct(v,u),ct(()=>{c.isUnmounted=!0},u),u&&u.pendingBranch&&!u.isUnmounted&&c.asyncDep&&!c.asyncResolved&&c.suspenseId===u.pendingId&&(u.deps--,u.deps===0&&u.resolve())},ue=(c,u,d,m=!1,g=!1,_=0)=>{for(let w=_;w{if(c.shapeFlag&6)return je(c.component.subTree);if(c.shapeFlag&128)return c.suspense.next();const u=y(c.anchor||c.el),d=u&&u[Ar];return d?y(d):u};let as=!1;const cn=(c,u,d)=>{c==null?u._vnode&&xt(u._vnode,null,null,!0):A(u._vnode||null,c,u,null,null,null,d),u._vnode=c,as||(as=!0,gn(),Tr(),as=!1)},ae={p:A,um:xt,m:zt,r:ln,mt:fe,mc:F,pc:q,pbc:G,n:je,o:t};return{render:cn,hydrate:void 0,createApp:To(cn)}}function bs({type:t,props:e},s){return s==="svg"&&t==="foreignObject"||s==="mathml"&&t==="annotation-xml"&&e&&e.encoding&&e.encoding.includes("html")?void 0:s}function Zt({effect:t,job:e},s){s?(t.flags|=32,e.flags|=4):(t.flags&=-33,e.flags&=-5)}function jo(t,e){return(!t||t&&!t.pendingBranch)&&e&&!e.persisted}function sn(t,e,s=!1){const n=t.children,r=e.children;if(M(n)&&M(r))for(let i=0;i>1,t[s[l]]0&&(e[n]=s[i-1]),s[i]=n)}}for(i=s.length,o=s[i-1];i-- >0;)s[i]=o,o=e[o];return s}function Gr(t){const e=t.subTree.component;if(e)return e.asyncDep&&!e.asyncResolved?e:Gr(e)}function Tn(t){if(t)for(let e=0;ewe(No);function Yl(t,e){return nn(t,null,e)}function Ue(t,e,s){return nn(t,e,s)}function nn(t,e,s=B){const{immediate:n,deep:r,flush:i,once:o}=s,l=it({},s),f=e&&n||!e&&i!=="post";let h;if(Me){if(i==="sync"){const S=Lo();h=S.__watcherHandles||(S.__watcherHandles=[])}else if(!f){const S=()=>{};return S.stop=At,S.resume=At,S.pause=At,S}}const a=ut;l.call=(S,E,A)=>Ot(S,a,E,A);let p=!1;i==="post"?l.scheduler=S=>{ct(S,a&&a.suspense)}:i!=="sync"&&(p=!0,l.scheduler=(S,E)=>{E?S():Qs(S)}),l.augmentJob=S=>{e&&(S.flags|=4),p&&(S.flags|=2,a&&(S.id=a.uid,S.i=a))};const y=Xi(t,e,l);return Me&&(h?h.push(y):f&&y()),y}function $o(t,e,s){const n=this.proxy,r=k(t)?t.includes(".")?qr(n,t):()=>n[t]:t.bind(n,n);let i;D(e)?i=e:(i=e.handler,s=e);const o=Ie(this),l=nn(r,i.bind(n),s);return o(),l}function qr(t,e){const s=e.split(".");return()=>{let n=t;for(let r=0;re==="modelValue"||e==="model-value"?t.modelModifiers:t[`${e}Modifiers`]||t[`${Bt(e)}Modifiers`]||t[`${Jt(e)}Modifiers`];function Vo(t,e,...s){if(t.isUnmounted)return;const n=t.vnode.props||B;let r=s;const i=e.startsWith("update:"),o=i&&Ko(n,e.slice(7));o&&(o.trim&&(r=s.map(a=>k(a)?a.trim():a)),o.number&&(r=s.map(Cs)));let l,f=n[l=hs(e)]||n[l=hs(Bt(e))];!f&&i&&(f=n[l=hs(Jt(e))]),f&&Ot(f,t,6,r);const h=n[l+"Once"];if(h){if(!t.emitted)t.emitted={};else if(t.emitted[l])return;t.emitted[l]=!0,Ot(h,t,6,r)}}function Jr(t,e,s=!1){const n=e.emitsCache,r=n.get(t);if(r!==void 0)return r;const i=t.emits;let o={},l=!1;if(!D(t)){const f=h=>{const a=Jr(h,e,!0);a&&(l=!0,it(o,a))};!s&&e.mixins.length&&e.mixins.forEach(f),t.extends&&f(t.extends),t.mixins&&t.mixins.forEach(f)}return!i&&!l?(z(t)&&n.set(t,null),null):(M(i)?i.forEach(f=>o[f]=null):it(o,i),z(t)&&n.set(t,o),o)}function ls(t,e){return!t||!ke(e)?!1:(e=e.slice(2).replace(/Once$/,""),K(t,e[0].toLowerCase()+e.slice(1))||K(t,Jt(e))||K(t,e))}function Cn(t){const{type:e,vnode:s,proxy:n,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:f,render:h,renderCache:a,props:p,data:y,setupState:S,ctx:E,inheritAttrs:A}=t,tt=ze(t);let N,W;try{if(s.shapeFlag&4){const P=r||n,H=P;N=Et(h.call(H,P,a,p,S,y,E)),W=l}else{const P=e;N=Et(P.length>1?P(p,{attrs:l,slots:o,emit:f}):P(p,null)),W=e.props?l:Uo(l)}}catch(P){Te.length=0,is(P,t,1),N=gt(Gt)}let U=N;if(W&&A!==!1){const P=Object.keys(W),{shapeFlag:H}=U;P.length&&H&7&&(i&&P.some($s)&&(W=Bo(W,i)),U=ce(U,W,!1,!0))}return s.dirs&&(U=ce(U,null,!1,!0),U.dirs=U.dirs?U.dirs.concat(s.dirs):s.dirs),s.transition&&ks(U,s.transition),N=U,ze(tt),N}const Uo=t=>{let e;for(const s in t)(s==="class"||s==="style"||ke(s))&&((e||(e={}))[s]=t[s]);return e},Bo=(t,e)=>{const s={};for(const n in t)(!$s(n)||!(n.slice(9)in e))&&(s[n]=t[n]);return s};function Wo(t,e,s){const{props:n,children:r,component:i}=t,{props:o,children:l,patchFlag:f}=e,h=i.emitsOptions;if(e.dirs||e.transition)return!0;if(s&&f>=0){if(f&1024)return!0;if(f&16)return n?En(n,o,h):!!o;if(f&8){const a=e.dynamicProps;for(let p=0;pt.__isSuspense;function qo(t,e){e&&e.pendingBranch?M(t)?e.effects.push(...t):e.effects.push(t):ki(t)}const Rt=Symbol.for("v-fgt"),cs=Symbol.for("v-txt"),Gt=Symbol.for("v-cmt"),ys=Symbol.for("v-stc"),Te=[];let pt=null;function Jo(t=!1){Te.push(pt=t?null:[])}function Yo(){Te.pop(),pt=Te[Te.length-1]||null}let Pe=1;function An(t,e=!1){Pe+=t,t<0&&pt&&e&&(pt.hasOnce=!0)}function zr(t){return t.dynamicChildren=Pe>0?pt||ie:null,Yo(),Pe>0&&pt&&pt.push(t),t}function zl(t,e,s,n,r,i){return zr(Zr(t,e,s,n,r,i,!0))}function zo(t,e,s,n,r){return zr(gt(t,e,s,n,r,!0))}function Ze(t){return t?t.__v_isVNode===!0:!1}function pe(t,e){return t.type===e.type&&t.key===e.key}const Xr=({key:t})=>t??null,Be=({ref:t,ref_key:e,ref_for:s})=>(typeof t=="number"&&(t=""+t),t!=null?k(t)||Q(t)||D(t)?{i:_t,r:t,k:e,f:!!s}:t:null);function Zr(t,e=null,s=null,n=0,r=null,i=t===Rt?0:1,o=!1,l=!1){const f={__v_isVNode:!0,__v_skip:!0,type:t,props:e,key:e&&Xr(e),ref:e&&Be(e),scopeId:Er,slotScopeIds:null,children:s,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:n,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:_t};return l?(rn(f,s),i&128&&t.normalize(f)):s&&(f.shapeFlag|=k(s)?8:16),Pe>0&&!o&&pt&&(f.patchFlag>0||i&6)&&f.patchFlag!==32&&pt.push(f),f}const gt=Xo;function Xo(t,e=null,s=null,n=0,r=null,i=!1){if((!t||t===_o)&&(t=Gt),Ze(t)){const l=ce(t,e,!0);return s&&rn(l,s),Pe>0&&!i&&pt&&(l.shapeFlag&6?pt[pt.indexOf(t)]=l:pt.push(l)),l.patchFlag=-2,l}if(ll(t)&&(t=t.__vccOpts),e){e=Zo(e);let{class:l,style:f}=e;l&&!k(l)&&(e.class=Bs(l)),z(f)&&(Xs(f)&&!M(f)&&(f=it({},f)),e.style=Us(f))}const o=k(t)?1:Yr(t)?128:eo(t)?64:z(t)?4:D(t)?2:0;return Zr(t,e,s,n,r,o,i,!0)}function Zo(t){return t?Xs(t)||$r(t)?it({},t):t:null}function ce(t,e,s=!1,n=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:f}=t,h=e?ko(r||{},e):r,a={__v_isVNode:!0,__v_skip:!0,type:t.type,props:h,key:h&&Xr(h),ref:e&&e.ref?s&&i?M(i)?i.concat(Be(e)):[i,Be(e)]:Be(e):i,scopeId:t.scopeId,slotScopeIds:t.slotScopeIds,children:l,target:t.target,targetStart:t.targetStart,targetAnchor:t.targetAnchor,staticCount:t.staticCount,shapeFlag:t.shapeFlag,patchFlag:e&&t.type!==Rt?o===-1?16:o|16:o,dynamicProps:t.dynamicProps,dynamicChildren:t.dynamicChildren,appContext:t.appContext,dirs:t.dirs,transition:f,component:t.component,suspense:t.suspense,ssContent:t.ssContent&&ce(t.ssContent),ssFallback:t.ssFallback&&ce(t.ssFallback),placeholder:t.placeholder,el:t.el,anchor:t.anchor,ctx:t.ctx,ce:t.ce};return f&&n&&ks(a,f.clone(a)),a}function Qo(t=" ",e=0){return gt(cs,null,t,e)}function Xl(t="",e=!1){return e?(Jo(),zo(Gt,null,t)):gt(Gt,null,t)}function Et(t){return t==null||typeof t=="boolean"?gt(Gt):M(t)?gt(Rt,null,t.slice()):Ze(t)?Kt(t):gt(cs,null,String(t))}function Kt(t){return t.el===null&&t.patchFlag!==-1||t.memo?t:ce(t)}function rn(t,e){let s=0;const{shapeFlag:n}=t;if(e==null)e=null;else if(M(e))s=16;else if(typeof e=="object")if(n&65){const r=e.default;r&&(r._c&&(r._d=!1),rn(t,r()),r._c&&(r._d=!0));return}else{s=32;const r=e._;!r&&!$r(e)?e._ctx=_t:r===3&&_t&&(_t.slots._===1?e._=1:(e._=2,t.patchFlag|=1024))}else D(e)?(e={default:e,_ctx:_t},s=32):(e=String(e),n&64?(s=16,e=[Qo(e)]):s=8);t.children=e,t.shapeFlag|=s}function ko(...t){const e={};for(let s=0;sut||_t;let Qe,Ds;{const t=ss(),e=(s,n)=>{let r;return(r=t[s])||(r=t[s]=[]),r.push(n),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Qe=e("__VUE_INSTANCE_SETTERS__",s=>ut=s),Ds=e("__VUE_SSR_SETTERS__",s=>Me=s)}const Ie=t=>{const e=ut;return Qe(t),t.scope.on(),()=>{t.scope.off(),Qe(e)}},On=()=>{ut&&ut.scope.off(),Qe(null)};function Qr(t){return t.vnode.shapeFlag&4}let Me=!1;function nl(t,e=!1,s=!1){e&&Ds(e);const{props:n,children:r}=t.vnode,i=Qr(t);Ao(t,n,i,e),Ro(t,r,s||e);const o=i?rl(t,e):void 0;return e&&Ds(!1),o}function rl(t,e){const s=t.type;t.accessCache=Object.create(null),t.proxy=new Proxy(t.ctx,mo);const{setup:n}=s;if(n){Dt();const r=t.setupContext=n.length>1?ol(t):null,i=Ie(t),o=Re(n,t,0,[t.props,r]),l=Jn(o);if(jt(),i(),(l||t.sp)&&!ve(t)&&Mr(t),l){if(o.then(On,On),e)return o.then(f=>{Pn(t,f)}).catch(f=>{is(f,t,0)});t.asyncDep=o}else Pn(t,o)}else kr(t)}function Pn(t,e,s){D(e)?t.type.__ssrInlineRender?t.ssrRender=e:t.render=e:z(e)&&(t.setupState=xr(e)),kr(t)}function kr(t,e,s){const n=t.type;t.render||(t.render=n.render||At);{const r=Ie(t);Dt();try{bo(t)}finally{jt(),r()}}}const il={get(t,e){return rt(t,"get",""),t[e]}};function ol(t){const e=s=>{t.exposed=s||{}};return{attrs:new Proxy(t.attrs,il),slots:t.slots,emit:t.emit,expose:e}}function fs(t){return t.exposed?t.exposeProxy||(t.exposeProxy=new Proxy(xr(Zs(t.exposed)),{get(e,s){if(s in e)return e[s];if(s in Se)return Se[s](t)},has(e,s){return s in e||s in Se}})):t.proxy}function ll(t){return D(t)&&"__vccOpts"in t}const ti=(t,e)=>Yi(t,e,Me);function Zl(t,e,s){const n=arguments.length;return n===2?z(e)&&!M(e)?Ze(e)?gt(t,null,[e]):gt(t,e):gt(t,null,e):(n>3?s=Array.prototype.slice.call(arguments,2):n===3&&Ze(s)&&(s=[s]),gt(t,e,s))}const cl="3.5.18";/**
+* @vue/runtime-dom v3.5.18
+* (c) 2018-present Yuxi (Evan) You and Vue contributors
+* @license MIT
+**/let js;const Mn=typeof window<"u"&&window.trustedTypes;if(Mn)try{js=Mn.createPolicy("vue",{createHTML:t=>t})}catch{}const ei=js?t=>js.createHTML(t):t=>t,fl="http://www.w3.org/2000/svg",ul="http://www.w3.org/1998/Math/MathML",Mt=typeof document<"u"?document:null,Rn=Mt&&Mt.createElement("template"),al={insert:(t,e,s)=>{e.insertBefore(t,s||null)},remove:t=>{const e=t.parentNode;e&&e.removeChild(t)},createElement:(t,e,s,n)=>{const r=e==="svg"?Mt.createElementNS(fl,t):e==="mathml"?Mt.createElementNS(ul,t):s?Mt.createElement(t,{is:s}):Mt.createElement(t);return t==="select"&&n&&n.multiple!=null&&r.setAttribute("multiple",n.multiple),r},createText:t=>Mt.createTextNode(t),createComment:t=>Mt.createComment(t),setText:(t,e)=>{t.nodeValue=e},setElementText:(t,e)=>{t.textContent=e},parentNode:t=>t.parentNode,nextSibling:t=>t.nextSibling,querySelector:t=>Mt.querySelector(t),setScopeId(t,e){t.setAttribute(e,"")},insertStaticContent(t,e,s,n,r,i){const o=s?s.previousSibling:e.lastChild;if(r&&(r===i||r.nextSibling))for(;e.insertBefore(r.cloneNode(!0),s),!(r===i||!(r=r.nextSibling)););else{Rn.innerHTML=ei(n==="svg"?`${t} `:n==="mathml"?`${t} `:t);const l=Rn.content;if(n==="svg"||n==="mathml"){const f=l.firstChild;for(;f.firstChild;)l.appendChild(f.firstChild);l.removeChild(f)}e.insertBefore(l,s)}return[o?o.nextSibling:e.firstChild,s?s.previousSibling:e.lastChild]}},hl=Symbol("_vtc");function dl(t,e,s){const n=t[hl];n&&(e=(e?[e,...n]:[...n]).join(" ")),e==null?t.removeAttribute("class"):s?t.setAttribute("class",e):t.className=e}const In=Symbol("_vod"),pl=Symbol("_vsh"),gl=Symbol(""),_l=/(^|;)\s*display\s*:/;function ml(t,e,s){const n=t.style,r=k(s);let i=!1;if(s&&!r){if(e)if(k(e))for(const o of e.split(";")){const l=o.slice(0,o.indexOf(":")).trim();s[l]==null&&We(n,l,"")}else for(const o in e)s[o]==null&&We(n,o,"");for(const o in s)o==="display"&&(i=!0),We(n,o,s[o])}else if(r){if(e!==s){const o=n[gl];o&&(s+=";"+o),n.cssText=s,i=_l.test(s)}}else e&&t.removeAttribute("style");In in t&&(t[In]=i?n.display:"",t[pl]&&(n.display="none"))}const Fn=/\s*!important$/;function We(t,e,s){if(M(s))s.forEach(n=>We(t,e,n));else if(s==null&&(s=""),e.startsWith("--"))t.setProperty(e,s);else{const n=bl(t,e);Fn.test(s)?t.setProperty(Jt(n),s.replace(Fn,""),"important"):t[n]=s}}const Dn=["Webkit","Moz","ms"],xs={};function bl(t,e){const s=xs[e];if(s)return s;let n=Bt(e);if(n!=="filter"&&n in t)return xs[e]=n;n=Xn(n);for(let r=0;rvs||(Sl.then(()=>vs=0),vs=Date.now());function Tl(t,e){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;Ot(Cl(n,s.value),e,5,[n])};return s.value=t,s.attached=wl(),s}function Cl(t,e){if(M(e)){const s=t.stopImmediatePropagation;return t.stopImmediatePropagation=()=>{s.call(t),t._stopped=!0},e.map(n=>r=>!r._stopped&&n&&n(r))}else return e}const Kn=t=>t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&t.charCodeAt(2)>96&&t.charCodeAt(2)<123,El=(t,e,s,n,r,i)=>{const o=r==="svg";e==="class"?dl(t,n,o):e==="style"?ml(t,s,n):ke(e)?$s(e)||xl(t,e,s,n,i):(e[0]==="."?(e=e.slice(1),!0):e[0]==="^"?(e=e.slice(1),!1):Al(t,e,n,o))?(Nn(t,e,n),!t.tagName.includes("-")&&(e==="value"||e==="checked"||e==="selected")&&Hn(t,e,n,o,i,e!=="value")):t._isVueCE&&(/[A-Z]/.test(e)||!k(n))?Nn(t,Bt(e),n,i,e):(e==="true-value"?t._trueValue=n:e==="false-value"&&(t._falseValue=n),Hn(t,e,n,o))};function Al(t,e,s,n){if(n)return!!(e==="innerHTML"||e==="textContent"||e in t&&Kn(e)&&D(s));if(e==="spellcheck"||e==="draggable"||e==="translate"||e==="autocorrect"||e==="form"||e==="list"&&t.tagName==="INPUT"||e==="type"&&t.tagName==="TEXTAREA")return!1;if(e==="width"||e==="height"){const r=t.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return Kn(e)&&k(s)?!1:e in t}const Vn=t=>{const e=t.props["onUpdate:modelValue"]||!1;return M(e)?s=>Ke(e,s):e};function Ol(t){t.target.composing=!0}function Un(t){const e=t.target;e.composing&&(e.composing=!1,e.dispatchEvent(new Event("input")))}const Ss=Symbol("_assign"),Ql={created(t,{modifiers:{lazy:e,trim:s,number:n}},r){t[Ss]=Vn(r);const i=n||r.props&&r.props.type==="number";re(t,e?"change":"input",o=>{if(o.target.composing)return;let l=t.value;s&&(l=l.trim()),i&&(l=Cs(l)),t[Ss](l)}),s&&re(t,"change",()=>{t.value=t.value.trim()}),e||(re(t,"compositionstart",Ol),re(t,"compositionend",Un),re(t,"change",Un))},mounted(t,{value:e}){t.value=e??""},beforeUpdate(t,{value:e,oldValue:s,modifiers:{lazy:n,trim:r,number:i}},o){if(t[Ss]=Vn(o),t.composing)return;const l=(i||t.type==="number")&&!/^0\d/.test(t.value)?Cs(t.value):t.value,f=e??"";l!==f&&(document.activeElement===t&&t.type!=="range"&&(n&&e===s||r&&t.value.trim()===f)||(t.value=f))}},Pl=["ctrl","shift","alt","meta"],Ml={stop:t=>t.stopPropagation(),prevent:t=>t.preventDefault(),self:t=>t.target!==t.currentTarget,ctrl:t=>!t.ctrlKey,shift:t=>!t.shiftKey,alt:t=>!t.altKey,meta:t=>!t.metaKey,left:t=>"button"in t&&t.button!==0,middle:t=>"button"in t&&t.button!==1,right:t=>"button"in t&&t.button!==2,exact:(t,e)=>Pl.some(s=>t[`${s}Key`]&&!e.includes(s))},kl=(t,e)=>{const s=t._withMods||(t._withMods={}),n=e.join(".");return s[n]||(s[n]=(r,...i)=>{for(let o=0;o{const s=t._withKeys||(t._withKeys={}),n=e.join(".");return s[n]||(s[n]=r=>{if(!("key"in r))return;const i=Jt(r.key);if(e.some(o=>o===i||Rl[o]===i))return t(r)})},Il=it({patchProp:El},al);let Bn;function Fl(){return Bn||(Bn=Fo(Il))}const ec=(...t)=>{const e=Fl().createApp(...t),{mount:s}=e;return e.mount=n=>{const r=jl(n);if(!r)return;const i=e._component;!D(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=s(r,!1,Dl(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},e};function Dl(t){if(t instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&t instanceof MathMLElement)return"mathml"}function jl(t){return k(t)?document.querySelector(t):t}/*!
+ * pinia v2.3.1
+ * (c) 2025 Eduardo San Martin Morote
+ * @license MIT
+ */let si;const us=t=>si=t,ni=Symbol();function Hs(t){return t&&typeof t=="object"&&Object.prototype.toString.call(t)==="[object Object]"&&typeof t.toJSON!="function"}var Ce;(function(t){t.direct="direct",t.patchObject="patch object",t.patchFunction="patch function"})(Ce||(Ce={}));function sc(){const t=er(!0),e=t.run(()=>br({}));let s=[],n=[];const r=Zs({install(i){us(r),r._a=i,i.provide(ni,r),i.config.globalProperties.$pinia=r,n.forEach(o=>s.push(o)),n=[]},use(i){return this._a?s.push(i):n.push(i),this},_p:s,_a:null,_e:t,_s:new Map,state:e});return r}const ri=()=>{};function Wn(t,e,s,n=ri){t.push(e);const r=()=>{const i=t.indexOf(e);i>-1&&(t.splice(i,1),n())};return!s&&sr()&&xi(r),r}function se(t,...e){t.slice().forEach(s=>{s(...e)})}const Hl=t=>t(),Gn=Symbol(),ws=Symbol();function Ns(t,e){t instanceof Map&&e instanceof Map?e.forEach((s,n)=>t.set(n,s)):t instanceof Set&&e instanceof Set&&e.forEach(t.add,t);for(const s in e){if(!e.hasOwnProperty(s))continue;const n=e[s],r=t[s];Hs(r)&&Hs(n)&&t.hasOwnProperty(s)&&!Q(n)&&!Ut(n)?t[s]=Ns(r,n):t[s]=n}return t}const Nl=Symbol();function Ll(t){return!Hs(t)||!t.hasOwnProperty(Nl)}const{assign:Lt}=Object;function $l(t){return!!(Q(t)&&t.effect)}function Kl(t,e,s,n){const{state:r,actions:i,getters:o}=e,l=s.state.value[t];let f;function h(){l||(s.state.value[t]=r?r():{});const a=Wi(s.state.value[t]);return Lt(a,i,Object.keys(o||{}).reduce((p,y)=>(p[y]=Zs(ti(()=>{us(s);const S=s._s.get(t);return o[y].call(S,S)})),p),{}))}return f=ii(t,h,e,s,n,!0),f}function ii(t,e,s={},n,r,i){let o;const l=Lt({actions:{}},s),f={deep:!0};let h,a,p=[],y=[],S;const E=n.state.value[t];!i&&!E&&(n.state.value[t]={}),br({});let A;function tt(F){let I;h=a=!1,typeof F=="function"?(F(n.state.value[t]),I={type:Ce.patchFunction,storeId:t,events:S}):(Ns(n.state.value[t],F),I={type:Ce.patchObject,payload:F,storeId:t,events:S});const G=A=Symbol();Sr().then(()=>{A===G&&(h=!0)}),a=!0,se(p,I,n.state.value[t])}const N=i?function(){const{state:I}=s,G=I?I():{};this.$patch(ot=>{Lt(ot,G)})}:ri;function W(){o.stop(),p=[],y=[],n._s.delete(t)}const U=(F,I="")=>{if(Gn in F)return F[ws]=I,F;const G=function(){us(n);const ot=Array.from(arguments),yt=[],Nt=[];function fe(j){yt.push(j)}function Fe(j){Nt.push(j)}se(y,{args:ot,name:G[ws],store:H,after:fe,onError:Fe});let Z;try{Z=F.apply(this&&this.$id===t?this:H,ot)}catch(j){throw se(Nt,j),j}return Z instanceof Promise?Z.then(j=>(se(yt,j),j)).catch(j=>(se(Nt,j),Promise.reject(j))):(se(yt,Z),Z)};return G[Gn]=!0,G[ws]=I,G},P={_p:n,$id:t,$onAction:Wn.bind(null,y),$patch:tt,$reset:N,$subscribe(F,I={}){const G=Wn(p,F,I.detached,()=>ot()),ot=o.run(()=>Ue(()=>n.state.value[t],yt=>{(I.flush==="sync"?a:h)&&F({storeId:t,type:Ce.direct,events:S},yt)},Lt({},f,I)));return G},$dispose:W},H=rs(P);n._s.set(t,H);const X=(n._a&&n._a.runWithContext||Hl)(()=>n._e.run(()=>(o=er()).run(()=>e({action:U}))));for(const F in X){const I=X[F];if(Q(I)&&!$l(I)||Ut(I))i||(E&&Ll(I)&&(Q(I)?I.value=E[F]:Ns(I,E[F])),n.state.value[t][F]=I);else if(typeof I=="function"){const G=U(I,F);X[F]=G,l.actions[F]=I}}return Lt(H,X),Lt($(H),X),Object.defineProperty(H,"$state",{get:()=>n.state.value[t],set:F=>{tt(I=>{Lt(I,F)})}}),n._p.forEach(F=>{Lt(H,o.run(()=>F({store:H,app:n._a,pinia:n,options:l})))}),E&&i&&s.hydrate&&s.hydrate(H.$state,E),h=!0,a=!0,H}/*! #__NO_SIDE_EFFECTS__ */function nc(t,e,s){let n,r;const i=typeof e=="function";typeof t=="string"?(n=t,r=i?s:e):(r=t,n=t.id);function o(l,f){const h=Eo();return l=l||(h?we(ni,null):null),l&&us(l),l=si,l._s.has(n)||(i?ii(n,e,r,l):Kl(n,r,l)),l._s.get(n)}return o.$id=n,o}export{kl as A,gt as B,Qo as C,Bl as D,Ql as E,Rt as F,tc as G,to as H,ec as I,sc as J,Wl as T,ce as a,Fr as b,ti as c,Gl as d,Ue as e,rs as f,on as g,Zl as h,we as i,Bs as j,nc as k,zl as l,Jo as m,Sr as n,lo as o,Co as p,Zr as q,br as r,Ul as s,yi as t,ql as u,zo as v,Yl as w,Ui as x,Xl as y,Jl as z};
diff --git a/mcphawk/web/static/index.html b/mcphawk/web/static/index.html
new file mode 100644
index 0000000..1b0f692
--- /dev/null
+++ b/mcphawk/web/static/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ MCPHawk - Model Context Protocol Debugger
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mcphawk/web/static/mcphawk_logo.png b/mcphawk/web/static/mcphawk_logo.png
new file mode 100644
index 0000000..12b4f65
Binary files /dev/null and b/mcphawk/web/static/mcphawk_logo.png differ
diff --git a/pyproject.toml b/pyproject.toml
index 7e161ea..2b6370b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "mcphawk"
-version = "0.3.0"
+version = "0.4.0"
description = "A passive MCP (Model Context Protocol) traffic sniffer for WebSocket-based MCP servers."
authors = [
{ name = "Your Name", email = "you@example.com" }
@@ -29,7 +29,11 @@ dependencies = [
mcphawk = "mcphawk.cli:app"
[tool.setuptools]
-packages = ["mcphawk", "mcphawk.web"]
+packages = {find = {where = ["."], include = ["mcphawk*"]}}
+include-package-data = true
+
+[tool.setuptools.package-data]
+"mcphawk.web" = ["static/**/*", "static/*", "static/assets/*"]
[tool.ruff]
# Exclude a variety of commonly ignored directories
diff --git a/tests/integration/cli/test_cli.py b/tests/integration/cli/test_cli.py
index 82fe703..d0d7f4a 100644
--- a/tests/integration/cli/test_cli.py
+++ b/tests/integration/cli/test_cli.py
@@ -145,7 +145,7 @@ def test_sniff_with_mcp_http():
])
# Check MCP server startup message
- assert "[MCPHawk] Starting MCP HTTP server on http://localhost:8765/mcp" in result.stdout
+ assert "Starting MCP HTTP server on http://localhost:8765/mcp" in result.stdout
# Verify thread was started for MCP server
mock_thread.assert_called_once()
@@ -154,7 +154,7 @@ def test_sniff_with_mcp_http():
# Verify sniffer was called with excluded ports
mock_start_sniffer.assert_called_once()
call_args = mock_start_sniffer.call_args[1]
- assert call_args['excluded_ports'] == [8765]
+ assert call_args['excluded_ports'] == []
def test_sniff_with_mcp_stdio():
@@ -171,7 +171,7 @@ def test_sniff_with_mcp_stdio():
])
# Check MCP server startup message
- assert "[MCPHawk] Starting MCP server on stdio" in result.stdout
+ assert "Starting MCP server on stdio" in result.stdout
# Verify sniffer was called with empty excluded ports
mock_start_sniffer.assert_called_once()
@@ -194,12 +194,12 @@ def test_web_with_mcp_http():
])
# Check MCP server startup message
- assert "[MCPHawk] Starting MCP HTTP server on http://localhost:8766/mcp" in result.stdout
+ assert "Starting MCP HTTP server on http://localhost:8766/mcp" in result.stdout
# Verify web was called with excluded ports
mock_run_web.assert_called_once()
call_args = mock_run_web.call_args[1]
- assert call_args['excluded_ports'] == [8766]
+ assert call_args['excluded_ports'] == []
def test_mcp_command_custom_port():
@@ -241,7 +241,7 @@ def test_sniff_with_mcp_custom_port():
])
# Check MCP server startup message with custom port
- assert "[MCPHawk] Starting MCP HTTP server on http://localhost:7777/mcp" in result.stdout
+ assert "Starting MCP HTTP server on http://localhost:7777/mcp" in result.stdout
# Verify thread was started for MCP server
mock_thread.assert_called_once()
@@ -250,7 +250,7 @@ def test_sniff_with_mcp_custom_port():
# Verify sniffer was called with custom port excluded
mock_start_sniffer.assert_called_once()
call_args = mock_start_sniffer.call_args[1]
- assert call_args['excluded_ports'] == [7777]
+ assert call_args['excluded_ports'] == []
def test_mcp_stdio_ignores_port():
@@ -287,9 +287,9 @@ def test_web_with_mcp_default_vs_custom_port():
"--mcp-transport", "http"
])
- assert "[MCPHawk] Starting MCP HTTP server on http://localhost:8765/mcp" in result.stdout
+ assert "Starting MCP HTTP server on http://localhost:8765/mcp" in result.stdout
call_args = mock_run_web.call_args[1]
- assert call_args['excluded_ports'] == [8765]
+ assert call_args['excluded_ports'] == []
# Reset mocks
mock_run_web.reset_mock()
@@ -305,9 +305,9 @@ def test_web_with_mcp_default_vs_custom_port():
"--mcp-port", "5555"
])
- assert "[MCPHawk] Starting MCP HTTP server on http://localhost:5555/mcp" in result.stdout
+ assert "Starting MCP HTTP server on http://localhost:5555/mcp" in result.stdout
call_args = mock_run_web.call_args[1]
- assert call_args['excluded_ports'] == [5555]
+ assert call_args['excluded_ports'] == []
@patch('mcphawk.cli.start_sniffer')
@@ -317,9 +317,9 @@ def test_sniff_command_with_port(mock_start_sniffer):
result = runner.invoke(app, ["sniff", "--port", "3000"])
assert result.exit_code == 0
- assert "[MCPHawk] Starting sniffer with filter: tcp port 3000" in result.stdout
- assert "[MCPHawk] Sniffer stopped." in result.stdout
- mock_start_sniffer.assert_called_once_with(filter_expr="tcp port 3000", auto_detect=False, debug=False, excluded_ports=[], mcphawk_mcp_ports=[])
+ assert "Starting sniffer with filter: tcp port 3000" in result.stdout
+ assert "Sniffer stopped." in result.stdout
+ mock_start_sniffer.assert_called_once_with(filter_expr="tcp port 3000", auto_detect=False, debug=False, excluded_ports=[])
@patch('mcphawk.cli.start_sniffer')
@@ -329,8 +329,8 @@ def test_sniff_command_custom_filter(mock_start_sniffer):
result = runner.invoke(app, ["sniff", "--filter", "tcp port 8080"])
assert result.exit_code == 0
- assert "[MCPHawk] Starting sniffer with filter: tcp port 8080" in result.stdout
- mock_start_sniffer.assert_called_once_with(filter_expr="tcp port 8080", auto_detect=False, debug=False, excluded_ports=[], mcphawk_mcp_ports=[])
+ assert "Starting sniffer with filter: tcp port 8080" in result.stdout
+ mock_start_sniffer.assert_called_once_with(filter_expr="tcp port 8080", auto_detect=False, debug=False, excluded_ports=[])
@patch('mcphawk.cli.start_sniffer')
@@ -340,9 +340,9 @@ def test_sniff_command_auto_detect(mock_start_sniffer):
result = runner.invoke(app, ["sniff", "--auto-detect"])
assert result.exit_code == 0
- assert "[MCPHawk] Auto-detect mode: monitoring all TCP traffic for MCP messages" in result.stdout
- assert "[MCPHawk] Starting sniffer with filter: tcp" in result.stdout
- mock_start_sniffer.assert_called_once_with(filter_expr="tcp", auto_detect=True, debug=False, excluded_ports=[], mcphawk_mcp_ports=[])
+ assert "Auto-detect mode: monitoring all TCP traffic for MCP messages" in result.stdout
+ assert "Starting sniffer with filter: tcp" in result.stdout
+ mock_start_sniffer.assert_called_once_with(filter_expr="tcp", auto_detect=True, debug=False, excluded_ports=[])
def test_web_command_requires_flags():
@@ -361,7 +361,7 @@ def test_web_command_with_port(mock_run_web):
"""Test web command with port option."""
result = runner.invoke(app, ["web", "--port", "3000"])
assert result.exit_code == 0
- mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 3000", auto_detect=False, debug=False, excluded_ports=[], with_mcp=False, mcphawk_mcp_ports=[])
+ mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 3000", auto_detect=False, debug=False, excluded_ports=[], with_mcp=False)
@patch('mcphawk.cli.run_web')
@@ -369,7 +369,7 @@ def test_web_command_no_sniffer(mock_run_web):
"""Test web command with --no-sniffer."""
result = runner.invoke(app, ["web", "--no-sniffer"])
assert result.exit_code == 0
- mock_run_web.assert_called_once_with(sniffer=False, host="127.0.0.1", port=8000, filter_expr=None, auto_detect=False, debug=False, excluded_ports=[], with_mcp=False, mcphawk_mcp_ports=[])
+ mock_run_web.assert_called_once_with(sniffer=False, host="127.0.0.1", port=8000, filter_expr=None, auto_detect=False, debug=False, excluded_ports=[], with_mcp=False)
@patch('mcphawk.cli.run_web')
@@ -377,7 +377,7 @@ def test_web_command_custom_host_web_port(mock_run_web):
"""Test web command with custom host and web-port."""
result = runner.invoke(app, ["web", "--port", "3000", "--host", "0.0.0.0", "--web-port", "9000"])
assert result.exit_code == 0
- mock_run_web.assert_called_once_with(sniffer=True, host="0.0.0.0", port=9000, filter_expr="tcp port 3000", auto_detect=False, debug=False, excluded_ports=[], with_mcp=False, mcphawk_mcp_ports=[])
+ mock_run_web.assert_called_once_with(sniffer=True, host="0.0.0.0", port=9000, filter_expr="tcp port 3000", auto_detect=False, debug=False, excluded_ports=[], with_mcp=False)
@patch('mcphawk.cli.run_web')
@@ -385,7 +385,7 @@ def test_web_command_with_filter(mock_run_web):
"""Test web command with custom filter."""
result = runner.invoke(app, ["web", "--filter", "tcp port 8080 or tcp port 8081"])
assert result.exit_code == 0
- mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 8080 or tcp port 8081", auto_detect=False, debug=False, excluded_ports=[], with_mcp=False, mcphawk_mcp_ports=[])
+ mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 8080 or tcp port 8081", auto_detect=False, debug=False, excluded_ports=[], with_mcp=False)
@patch('mcphawk.cli.run_web')
@@ -393,7 +393,7 @@ def test_web_command_auto_detect(mock_run_web):
"""Test web command with auto-detect mode."""
result = runner.invoke(app, ["web", "--auto-detect"])
assert result.exit_code == 0
- mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp", auto_detect=True, debug=False, excluded_ports=[], with_mcp=False, mcphawk_mcp_ports=[])
+ mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp", auto_detect=True, debug=False, excluded_ports=[], with_mcp=False)
def test_scapy_warnings_suppressed():
@@ -421,7 +421,7 @@ def test_sniff_command_with_debug_flag(mock_start_sniffer):
result = runner.invoke(app, ["sniff", "--port", "3000", "--debug"])
assert result.exit_code == 0
- mock_start_sniffer.assert_called_once_with(filter_expr="tcp port 3000", auto_detect=False, debug=True, excluded_ports=[], mcphawk_mcp_ports=[])
+ mock_start_sniffer.assert_called_once_with(filter_expr="tcp port 3000", auto_detect=False, debug=True, excluded_ports=[])
@patch('mcphawk.cli.run_web')
@@ -429,7 +429,7 @@ def test_web_command_with_debug_flag(mock_run_web):
"""Test web command with debug flag."""
result = runner.invoke(app, ["web", "--port", "3000", "--debug"])
assert result.exit_code == 0
- mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 3000", auto_detect=False, debug=True, excluded_ports=[], with_mcp=False, mcphawk_mcp_ports=[])
+ mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 3000", auto_detect=False, debug=True, excluded_ports=[], with_mcp=False)
@patch('mcphawk.cli.run_web')
@@ -449,7 +449,7 @@ def test_web_command_with_mcp(mock_thread, mock_mcp_server, mock_run_web):
# Check run_web was called with excluded ports
# Default MCP transport is HTTP on port 8765
- # In non-debug mode, mcphawk_mcp_ports is empty
+ # MCPHawk's own MCP traffic is always captured
mock_run_web.assert_called_once_with(
sniffer=True,
host="127.0.0.1",
@@ -457,9 +457,8 @@ def test_web_command_with_mcp(mock_thread, mock_mcp_server, mock_run_web):
filter_expr="tcp port 3000",
auto_detect=False,
debug=False,
- excluded_ports=[8765], # Default HTTP MCP port is excluded
+ excluded_ports=[], # No longer excluding MCP port
with_mcp=True,
- mcphawk_mcp_ports=[], # Empty in non-debug mode
)
diff --git a/tests/integration/mcp/test_mcp_stdio_integration.py b/tests/integration/mcp/test_mcp_stdio_integration.py
index 9387312..170199f 100644
--- a/tests/integration/mcp/test_mcp_stdio_integration.py
+++ b/tests/integration/mcp/test_mcp_stdio_integration.py
@@ -213,7 +213,6 @@ def test_stdio_logging_to_stderr(self):
assert "result" in response
# Check stderr has log messages
- assert "[MCPHawk]" in stderr
assert "Starting MCP server" in stderr
@pytest.mark.parametrize("tool_name,args,expected_in_result", [
diff --git a/tests/integration/network/test_sniffer.py b/tests/integration/network/test_sniffer.py
index ca8f873..fd8e512 100644
--- a/tests/integration/network/test_sniffer.py
+++ b/tests/integration/network/test_sniffer.py
@@ -105,8 +105,8 @@ def setup_method(self):
@patch('mcphawk.sniffer.log_message')
@patch('mcphawk.sniffer._broadcast_in_any_loop')
- @patch('builtins.print')
- def test_auto_detect_prints_port_info(self, mock_print, mock_broadcast, mock_log):
+ @patch('mcphawk.sniffer.logger')
+ def test_auto_detect_prints_port_info(self, mock_logger, mock_broadcast, mock_log):
"""Test that auto-detect mode prints port information when MCP traffic is found."""
import mcphawk.sniffer
mcphawk.sniffer._auto_detect_mode = True
@@ -122,8 +122,8 @@ def test_auto_detect_prints_port_info(self, mock_print, mock_broadcast, mock_log
packet_callback(mock_pkt)
- # Check that port detection message was printed
- mock_print.assert_any_call("[MCPHawk] Detected MCP traffic on port 54321 -> 3000")
+ # Check that port detection message was logged
+ mock_logger.info.assert_any_call("Detected MCP traffic on port 54321 -> 3000")
# Verify log_message was called
assert mock_log.called
@@ -134,8 +134,8 @@ def test_auto_detect_prints_port_info(self, mock_print, mock_broadcast, mock_log
@patch('mcphawk.sniffer.log_message')
@patch('mcphawk.sniffer._broadcast_in_any_loop')
- @patch('builtins.print')
- def test_non_auto_detect_no_port_print(self, mock_print, mock_broadcast, mock_log):
+ @patch('mcphawk.sniffer.logger')
+ def test_non_auto_detect_no_port_print(self, mock_logger, mock_broadcast, mock_log):
"""Test that port info is not printed when not in auto-detect mode."""
import mcphawk.sniffer
mcphawk.sniffer._auto_detect_mode = False
@@ -150,9 +150,9 @@ def test_non_auto_detect_no_port_print(self, mock_print, mock_broadcast, mock_lo
packet_callback(mock_pkt)
- # Should not print port detection message
- for call_args in mock_print.call_args_list:
- assert "[MCPHawk] Detected MCP traffic on port" not in str(call_args)
+ # Should not log port detection message
+ for call in mock_logger.info.call_args_list:
+ assert "Detected MCP traffic on port" not in str(call)
@patch('mcphawk.sniffer.sniff')
def test_start_sniffer_auto_detect_flag(self, mock_sniff):
@@ -174,9 +174,8 @@ class TestHTTPParsing:
def setup_method(self):
"""Reset global state before each test."""
- import mcphawk.sniffer
- # Clear MCPHawk MCP ports
- mcphawk.sniffer._mcphawk_mcp_ports.clear()
+ # Reset any global state if needed
+ pass
@patch('mcphawk.sniffer.log_message')
@patch('mcphawk.sniffer._broadcast_in_any_loop')
@@ -269,10 +268,6 @@ def test_http_without_jsonrpc_ignored(self, mock_broadcast, mock_log):
@patch('mcphawk.sniffer._broadcast_in_any_loop')
def test_mcphawk_mcp_traffic_server_info(self, mock_broadcast, mock_log):
"""Test that MCPHawk's own MCP traffic uses server info tracking."""
- import mcphawk.sniffer
- # Set up MCPHawk MCP ports for this test
- mcphawk.sniffer._mcphawk_mcp_ports = {8765}
-
# Simulate an initialize response with serverInfo
http_response = (
b'HTTP/1.1 200 OK\r\n'
@@ -299,19 +294,15 @@ def test_mcphawk_mcp_traffic_server_info(self, mock_broadcast, mock_log):
packet_callback(mock_pkt)
- # The test now verifies that server info tracking works for MCPHawk's own server
- # This happens through the normal server registry mechanism, not special metadata
+ # Verify the server info was logged
+ assert mock_log.called
+ # The test verifies that server info tracking works through the normal server registry mechanism
def test_state_isolation_between_tests(self):
"""Test that state is properly isolated between tests."""
- import mcphawk.sniffer
- # Verify state is clean at the start of the test
- assert len(mcphawk.sniffer._mcphawk_mcp_ports) == 0
-
- # Modify state
- mcphawk.sniffer._mcphawk_mcp_ports.add(9999)
-
- # State will be cleaned up by setup_method before next test
+ # MCPHawk ports no longer tracked separately
+ pass
+ # State isolation is maintained through other global variables
@patch('mcphawk.sniffer.log_message')
@patch('mcphawk.sniffer._broadcast_in_any_loop')
diff --git a/tests/integration/web/test_web_server.py b/tests/integration/web/test_web_server.py
index 89bc655..2af82b3 100644
--- a/tests/integration/web/test_web_server.py
+++ b/tests/integration/web/test_web_server.py
@@ -132,7 +132,7 @@ def test_run_web_with_sniffer():
)
# Verify sniffer was started
- mock_start_sniffer.assert_called_once_with("tcp port 3000", False, True, None, None)
+ mock_start_sniffer.assert_called_once_with("tcp port 3000", False, True, None)
# Verify uvicorn was started with correct params
mock_uvicorn.assert_called_once()