commit 3360252d06b5f66e528587dcd85534c071464687 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue Apr 18 02:45:52 2023 +0000 Deploy to GitHub pages diff --git a/404.html b/404.html new file mode 100644 index 0000000..f394121 --- /dev/null +++ b/404.html @@ -0,0 +1,33 @@ + + + + + + + + + ChatGPT UI + + + + +

404

How did we get here?
Take me home
+ + + diff --git a/assets/404.html-60b35caa.js b/assets/404.html-60b35caa.js new file mode 100644 index 0000000..7a25b17 --- /dev/null +++ b/assets/404.html-60b35caa.js @@ -0,0 +1 @@ +const t=JSON.parse('{"key":"v-3706649a","path":"/404.html","title":"","lang":"en-US","frontmatter":{"layout":"NotFound"},"headers":[],"git":{},"filePathRelative":null}');export{t as data}; diff --git a/assets/404.html-87d54bd8.js b/assets/404.html-87d54bd8.js new file mode 100644 index 0000000..64c1936 --- /dev/null +++ b/assets/404.html-87d54bd8.js @@ -0,0 +1 @@ +import{_ as e,p as t,q as _}from"./framework-5866ffd3.js";const c={};function r(n,o){return t(),_("div")}const a=e(c,[["render",r],["__file","404.html.vue"]]);export{a as default}; diff --git a/assets/app-525ee8ad.js b/assets/app-525ee8ad.js new file mode 100644 index 0000000..5f4c96c --- /dev/null +++ b/assets/app-525ee8ad.js @@ -0,0 +1,6 @@ +import{d as J,r as M,a as $t,b as gn,c as C,i as ne,e as De,f as _n,g as Ct,o as te,h,j as D,k as ie,l as Se,m as Pt,u as we,n as It,T as We,p,q as _,s as z,t as ye,v as j,w as ee,x as zt,_ as R,y as bn,z as m,A as pe,B as yn,C as Ue,D as wn,E as Ln,F as En,G as kn,H as Ge,I as At,J as Sn,K as Ke,L as fe,M as se,N,O as Z,P as ce,Q as F,R as $,S as Qe,U as q,V as U,W as st,X as Tn,Y as On,Z as Ie,$ as ze,a0 as xt,a1 as $n,a2 as Cn,a3 as Pn,a4 as In,a5 as zn,a6 as An,a7 as xn}from"./framework-5866ffd3.js";const Dn="modulepreload",Nn=function(e){return"/chatgpt-ui/"+e},it={},I=function(t,n,o){if(!n||n.length===0)return t();const r=document.getElementsByTagName("link");return Promise.all(n.map(s=>{if(s=Nn(s),s in it)return;it[s]=!0;const i=s.endsWith(".css"),a=i?'[rel="stylesheet"]':"";if(!!o)for(let c=r.length-1;c>=0;c--){const v=r[c];if(v.href===s&&(!i||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${s}"]${a}`))return;const d=document.createElement("link");if(d.rel=i?"stylesheet":Dn,i||(d.as="script",d.crossOrigin=""),d.href=s,document.head.appendChild(d),i)return new Promise((c,v)=>{d.addEventListener("load",c),d.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${s}`)))})})).then(()=>t())},Hn={"v-8daa1a0e":()=>I(()=>import("./index.html-f32af385.js"),[]).then(({data:e})=>e),"v-eb956884":()=>I(()=>import("./buymeacoffee.html-f20ec2fb.js"),[]).then(({data:e})=>e),"v-4f4ccb8f":()=>I(()=>import("./configuration.html-ed512da6.js"),[]).then(({data:e})=>e),"v-531add2c":()=>I(()=>import("./development.html-117eb2b5.js"),[]).then(({data:e})=>e),"v-7f374639":()=>I(()=>import("./problems.html-3485ea96.js"),[]).then(({data:e})=>e),"v-47700a83":()=>I(()=>import("./quick-start.html-5d24620c.js"),[]).then(({data:e})=>e),"v-2d0ad528":()=>I(()=>import("./index.html-a9203641.js"),[]).then(({data:e})=>e),"v-603f36a2":()=>I(()=>import("./buymeacoffee.html-22a781eb.js"),[]).then(({data:e})=>e),"v-81f65e84":()=>I(()=>import("./configuration.html-0ef661b4.js"),[]).then(({data:e})=>e),"v-1d0fd34e":()=>I(()=>import("./development.html-b8d21bb5.js"),[]).then(({data:e})=>e),"v-4eee7faa":()=>I(()=>import("./problems.html-f1039fc4.js"),[]).then(({data:e})=>e),"v-62758f72":()=>I(()=>import("./quick-start.html-91a3ce5d.js"),[]).then(({data:e})=>e),"v-3706649a":()=>I(()=>import("./404.html-60b35caa.js"),[]).then(({data:e})=>e)},Rn=JSON.parse('{"base":"/chatgpt-ui/","lang":"en-US","title":"ChatGPT UI","description":"A ChatGPT web client","head":[],"locales":{"/":{"lang":"en-US","description":"A ChatGPT web client"},"/zh/":{"lang":"zh-CN","description":"一个 ChatGPT 的 Web 客户端"}}}'),Dt={"v-8daa1a0e":J(()=>I(()=>import("./index.html-18d42ac0.js"),["assets/index.html-18d42ac0.js","assets/framework-5866ffd3.js"])),"v-eb956884":J(()=>I(()=>import("./buymeacoffee.html-138309cb.js"),["assets/buymeacoffee.html-138309cb.js","assets/bmc_qr-9db17e16.js","assets/framework-5866ffd3.js"])),"v-4f4ccb8f":J(()=>I(()=>import("./configuration.html-a7684ba6.js"),["assets/configuration.html-a7684ba6.js","assets/framework-5866ffd3.js"])),"v-531add2c":J(()=>I(()=>import("./development.html-df5e9336.js"),["assets/development.html-df5e9336.js","assets/framework-5866ffd3.js"])),"v-7f374639":J(()=>I(()=>import("./problems.html-84e6145b.js"),["assets/problems.html-84e6145b.js","assets/framework-5866ffd3.js"])),"v-47700a83":J(()=>I(()=>import("./quick-start.html-b336d0c1.js"),["assets/quick-start.html-b336d0c1.js","assets/framework-5866ffd3.js"])),"v-2d0ad528":J(()=>I(()=>import("./index.html-d042d854.js"),["assets/index.html-d042d854.js","assets/framework-5866ffd3.js"])),"v-603f36a2":J(()=>I(()=>import("./buymeacoffee.html-5158290f.js"),["assets/buymeacoffee.html-5158290f.js","assets/bmc_qr-9db17e16.js","assets/framework-5866ffd3.js"])),"v-81f65e84":J(()=>I(()=>import("./configuration.html-99825d43.js"),["assets/configuration.html-99825d43.js","assets/framework-5866ffd3.js"])),"v-1d0fd34e":J(()=>I(()=>import("./development.html-989a2b06.js"),["assets/development.html-989a2b06.js","assets/framework-5866ffd3.js"])),"v-4eee7faa":J(()=>I(()=>import("./problems.html-dabd58d0.js"),["assets/problems.html-dabd58d0.js","assets/framework-5866ffd3.js"])),"v-62758f72":J(()=>I(()=>import("./quick-start.html-fc1bc91c.js"),["assets/quick-start.html-fc1bc91c.js","assets/framework-5866ffd3.js"])),"v-3706649a":J(()=>I(()=>import("./404.html-87d54bd8.js"),["assets/404.html-87d54bd8.js","assets/framework-5866ffd3.js"]))};var Mn=Symbol(""),Bn=M(Hn),Nt=$t({key:"",path:"",title:"",lang:"",frontmatter:{},headers:[]}),ue=M(Nt),ve=()=>ue,Ht=Symbol(""),re=()=>{const e=ie(Ht);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},Rt=Symbol(""),Fn=()=>{const e=ie(Rt);if(!e)throw new Error("usePageHead() is called without provider.");return e},Vn=Symbol(""),Mt=Symbol(""),jn=()=>{const e=ie(Mt);if(!e)throw new Error("usePageLang() is called without provider.");return e},Bt=Symbol(""),qn=()=>{const e=ie(Bt);if(!e)throw new Error("usePageLayout() is called without provider.");return e},Ye=Symbol(""),Ne=()=>{const e=ie(Ye);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},be=M(Rn),Wn=()=>be,Ft=Symbol(""),Je=()=>{const e=ie(Ft);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},Un=Symbol(""),Gn="Layout",Kn="NotFound",oe=gn({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageData:async e=>{const t=Bn.value[e];return await(t==null?void 0:t())??Nt},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const o=ne(t.description)?t.description:n.description,r=[...De(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:o}]];return _n(r)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:e=>e.lang||"en",resolvePageLayout:(e,t)=>{let n;if(e.path){const o=e.frontmatter.layout;ne(o)?n=o:n=Gn}else n=Kn;return t[n]},resolveRouteLocale:(e,t)=>Ct(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),Ze=C({name:"ClientOnly",setup(e,t){const n=M(!1);return te(()=>{n.value=!0}),()=>{var o,r;return n.value?(r=(o=t.slots).default)==null?void 0:r.call(o):null}}}),Qn=C({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=ve(),n=h(()=>Dt[e.pageKey||t.value.key]);return()=>n.value?D(n.value):D("div","404 Not Found")}}),he=(e={})=>e,Xe=e=>Se(e)?e:`/chatgpt-ui/${Pt(e)}`;function Vt(e,t,n){var o,r,s;t===void 0&&(t=50),n===void 0&&(n={});var i=(o=n.isImmediate)!=null&&o,a=(r=n.callback)!=null&&r,l=n.maxWait,d=Date.now(),c=[];function v(){if(l!==void 0){var g=Date.now()-d;if(g+t>=l)return l-g}return t}var f=function(){var g=[].slice.call(arguments),b=this;return new Promise(function(k,y){var T=i&&s===void 0;if(s!==void 0&&clearTimeout(s),s=setTimeout(function(){if(s=void 0,d=Date.now(),!i){var x=e.apply(b,g);a&&a(x),c.forEach(function(Q){return(0,Q.resolve)(x)}),c=[]}},v()),T){var B=e.apply(b,g);return a&&a(B),k(B)}c.push({resolve:k,reject:y})})};return f.cancel=function(g){s!==void 0&&clearTimeout(s),c.forEach(function(b){return(0,b.reject)(g)}),c=[]},f}const Yn=({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:o=5})=>{const r=we(),i=Vt(()=>{var k,y;const a=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(a-0)f.some(B=>B.hash===T.hash));for(let T=0;T=(((k=B.parentElement)==null?void 0:k.offsetTop)??0)-o,Y=!x||a<(((y=x.parentElement)==null?void 0:y.offsetTop)??0)-o;if(!(Q&&Y))continue;const L=decodeURIComponent(r.currentRoute.value.hash),u=decodeURIComponent(B.hash);if(L===u)return;if(v){for(let A=T+1;A{window.addEventListener("scroll",i)}),It(()=>{window.removeEventListener("scroll",i)})},lt=async(e,t)=>{const{scrollBehavior:n}=e.options;e.options.scrollBehavior=void 0,await e.replace({query:e.currentRoute.value.query,hash:t,force:!0}).finally(()=>e.options.scrollBehavior=n)},Jn="a.sidebar-item",Zn=".header-anchor",Xn=300,eo=5,to=he({setup(){Yn({headerLinkSelector:Jn,headerAnchorSelector:Zn,delay:Xn,offset:eo})}}),ut=()=>window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,no=()=>window.scrollTo({top:0,behavior:"smooth"});const oo=C({name:"BackToTop",setup(){const e=M(0),t=h(()=>e.value>300),n=Vt(()=>{e.value=ut()},100);te(()=>{e.value=ut(),window.addEventListener("scroll",()=>n())});const o=D("div",{class:"back-to-top",onClick:no});return()=>D(We,{name:"back-to-top"},()=>t.value?o:null)}}),ro=he({rootComponents:[oo]});const ao=D("svg",{class:"external-link-icon",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"},[D("path",{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}),D("polygon",{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"})]),so=C({name:"ExternalLinkIcon",props:{locales:{type:Object,required:!1,default:()=>({})}},setup(e){const t=Ne(),n=h(()=>e.locales[t.value]??{openInNewWindow:"open in new window"});return()=>D("span",[ao,D("span",{class:"external-link-icon-sr-only"},n.value.openInNewWindow)])}}),io={"/":{openInNewWindow:"open in new window"},"/zh/":{openInNewWindow:"在新窗口打开"}},lo=he({enhance({app:e}){e.component("ExternalLinkIcon",D(so,{locales:io}))}});/*! medium-zoom 1.0.8 | MIT License | https://github.com/francoischalifour/medium-zoom */var me=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==void 0?arguments[1]:{},o=window.Promise||function(w){function E(){}w(E,E)},r=function(w){var E=w.target;if(E===A){b();return}x.indexOf(E)!==-1&&k({target:E})},s=function(){if(!(Y||!u.original)){var w=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(de-w)>L.scrollOffset&&setTimeout(b,150)}},i=function(w){var E=w.key||w.keyCode;(E==="Escape"||E==="Esc"||E===27)&&b()},a=function(){var w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=w;if(w.background&&(A.style.background=w.background),w.container&&w.container instanceof Object&&(E.container=me({},L.container,w.container)),w.template){var H=Pe(w.template)?w.template:document.querySelector(w.template);E.template=H}return L=me({},L,E),x.forEach(function(V){V.dispatchEvent(_e("medium-zoom:update",{detail:{zoom:P}}))}),P},l=function(){var w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return e(me({},L,w))},d=function(){for(var w=arguments.length,E=Array(w),H=0;H0?E.reduce(function(S,G){return[].concat(S,dt(G))},[]):x;return V.forEach(function(S){S.classList.remove("medium-zoom-image"),S.dispatchEvent(_e("medium-zoom:detach",{detail:{zoom:P}}))}),x=x.filter(function(S){return V.indexOf(S)===-1}),P},v=function(w,E){var H=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return x.forEach(function(V){V.addEventListener("medium-zoom:"+w,E,H)}),Q.push({type:"medium-zoom:"+w,listener:E,options:H}),P},f=function(w,E){var H=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return x.forEach(function(V){V.removeEventListener("medium-zoom:"+w,E,H)}),Q=Q.filter(function(V){return!(V.type==="medium-zoom:"+w&&V.listener.toString()===E.toString())}),P},g=function(){var w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=w.target,H=function(){var S={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},G=void 0,X=void 0;if(L.container)if(L.container instanceof Object)S=me({},S,L.container),G=S.width-S.left-S.right-L.margin*2,X=S.height-S.top-S.bottom-L.margin*2;else{var ge=Pe(L.container)?L.container:document.querySelector(L.container),le=ge.getBoundingClientRect(),He=le.width,an=le.height,sn=le.left,ln=le.top;S=me({},S,{width:He,height:an,left:sn,top:ln})}G=G||S.width-L.margin*2,X=X||S.height-L.margin*2;var Le=u.zoomedHd||u.original,un=ct(Le)?G:Le.naturalWidth||G,cn=ct(Le)?X:Le.naturalHeight||X,Te=Le.getBoundingClientRect(),dn=Te.top,mn=Te.left,Re=Te.width,Me=Te.height,vn=Math.min(Math.max(Re,un),G)/Re,pn=Math.min(Math.max(Me,cn),X)/Me,Be=Math.min(vn,pn),fn=(-mn+(G-Re)/2+L.margin+S.left)/Be,hn=(-dn+(X-Me)/2+L.margin+S.top)/Be,at="scale("+Be+") translate3d("+fn+"px, "+hn+"px, 0)";u.zoomed.style.transform=at,u.zoomedHd&&(u.zoomedHd.style.transform=at)};return new o(function(V){if(E&&x.indexOf(E)===-1){V(P);return}var S=function He(){Y=!1,u.zoomed.removeEventListener("transitionend",He),u.original.dispatchEvent(_e("medium-zoom:opened",{detail:{zoom:P}})),V(P)};if(u.zoomed){V(P);return}if(E)u.original=E;else if(x.length>0){var G=x;u.original=G[0]}else{V(P);return}if(u.original.dispatchEvent(_e("medium-zoom:open",{detail:{zoom:P}})),de=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,Y=!0,u.zoomed=mo(u.original),document.body.appendChild(A),L.template){var X=Pe(L.template)?L.template:document.querySelector(L.template);u.template=document.createElement("div"),u.template.appendChild(X.content.cloneNode(!0)),document.body.appendChild(u.template)}if(u.original.parentElement&&u.original.parentElement.tagName==="PICTURE"&&u.original.currentSrc&&(u.zoomed.src=u.original.currentSrc),document.body.appendChild(u.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),u.original.classList.add("medium-zoom-image--hidden"),u.zoomed.classList.add("medium-zoom-image--opened"),u.zoomed.addEventListener("click",b),u.zoomed.addEventListener("transitionend",S),u.original.getAttribute("data-zoom-src")){u.zoomedHd=u.zoomed.cloneNode(),u.zoomedHd.removeAttribute("srcset"),u.zoomedHd.removeAttribute("sizes"),u.zoomedHd.removeAttribute("loading"),u.zoomedHd.src=u.zoomed.getAttribute("data-zoom-src"),u.zoomedHd.onerror=function(){clearInterval(ge),console.warn("Unable to reach the zoom image target "+u.zoomedHd.src),u.zoomedHd=null,H()};var ge=setInterval(function(){u.zoomedHd.complete&&(clearInterval(ge),u.zoomedHd.classList.add("medium-zoom-image--opened"),u.zoomedHd.addEventListener("click",b),document.body.appendChild(u.zoomedHd),H())},10)}else if(u.original.hasAttribute("srcset")){u.zoomedHd=u.zoomed.cloneNode(),u.zoomedHd.removeAttribute("sizes"),u.zoomedHd.removeAttribute("loading");var le=u.zoomedHd.addEventListener("load",function(){u.zoomedHd.removeEventListener("load",le),u.zoomedHd.classList.add("medium-zoom-image--opened"),u.zoomedHd.addEventListener("click",b),document.body.appendChild(u.zoomedHd),H()})}else H()})},b=function(){return new o(function(w){if(Y||!u.original){w(P);return}var E=function H(){u.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(u.zoomed),u.zoomedHd&&document.body.removeChild(u.zoomedHd),document.body.removeChild(A),u.zoomed.classList.remove("medium-zoom-image--opened"),u.template&&document.body.removeChild(u.template),Y=!1,u.zoomed.removeEventListener("transitionend",H),u.original.dispatchEvent(_e("medium-zoom:closed",{detail:{zoom:P}})),u.original=null,u.zoomed=null,u.zoomedHd=null,u.template=null,w(P)};Y=!0,document.body.classList.remove("medium-zoom--opened"),u.zoomed.style.transform="",u.zoomedHd&&(u.zoomedHd.style.transform=""),u.template&&(u.template.style.transition="opacity 150ms",u.template.style.opacity=0),u.original.dispatchEvent(_e("medium-zoom:close",{detail:{zoom:P}})),u.zoomed.addEventListener("transitionend",E)})},k=function(){var w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=w.target;return u.original?b():g({target:E})},y=function(){return L},T=function(){return x},B=function(){return u.original},x=[],Q=[],Y=!1,de=0,L=n,u={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(t)==="[object Object]"?L=t:(t||typeof t=="string")&&d(t),L=me({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},L);var A=co(L.background);document.addEventListener("click",r),document.addEventListener("keyup",i),document.addEventListener("scroll",s),window.addEventListener("resize",b);var P={open:g,close:b,toggle:k,update:a,clone:l,attach:d,detach:c,on:v,off:f,getOptions:y,getImages:T,getZoomedImage:B};return P};function po(e,t){t===void 0&&(t={});var n=t.insertAt;if(!(!e||typeof document>"u")){var o=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",n==="top"&&o.firstChild?o.insertBefore(r,o.firstChild):o.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}}var fo=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";po(fo);const ho=vo,go=Symbol("mediumZoom");const _o=".theme-default-content > img, .theme-default-content :not(a) > img",bo={},yo=300,wo=he({enhance({app:e,router:t}){const n=ho(bo);n.refresh=(o=_o)=>{n.detach(),n.attach(o)},e.provide(go,n),t.afterEach(()=>{setTimeout(()=>n.refresh(),yo)})}});/** + * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT + */const O={settings:{minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
'},status:null,set:e=>{const t=O.isStarted();e=Fe(e,O.settings.minimum,1),O.status=e===1?null:e;const n=O.render(!t),o=n.querySelector(O.settings.barSelector),r=O.settings.speed,s=O.settings.easing;return n.offsetWidth,Lo(i=>{$e(o,{transform:"translate3d("+mt(e)+"%,0,0)",transition:"all "+r+"ms "+s}),e===1?($e(n,{transition:"none",opacity:"1"}),n.offsetWidth,setTimeout(function(){$e(n,{transition:"all "+r+"ms linear",opacity:"0"}),setTimeout(function(){O.remove(),i()},r)},r)):setTimeout(()=>i(),r)}),O},isStarted:()=>typeof O.status=="number",start:()=>{O.status||O.set(0);const e=()=>{setTimeout(()=>{O.status&&(O.trickle(),e())},O.settings.trickleSpeed)};return O.settings.trickle&&e(),O},done:e=>!e&&!O.status?O:O.inc(.3+.5*Math.random()).set(1),inc:e=>{let t=O.status;return t?(typeof e!="number"&&(e=(1-t)*Fe(Math.random()*t,.1,.95)),t=Fe(t+e,0,.994),O.set(t)):O.start()},trickle:()=>O.inc(Math.random()*O.settings.trickleRate),render:e=>{if(O.isRendered())return document.getElementById("nprogress");vt(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=O.settings.template;const n=t.querySelector(O.settings.barSelector),o=e?"-100":mt(O.status||0),r=document.querySelector(O.settings.parent);return $e(n,{transition:"all 0 linear",transform:"translate3d("+o+"%,0,0)"}),r!==document.body&&vt(r,"nprogress-custom-parent"),r==null||r.appendChild(t),t},remove:()=>{pt(document.documentElement,"nprogress-busy"),pt(document.querySelector(O.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&Eo(e)},isRendered:()=>!!document.getElementById("nprogress")},Fe=(e,t,n)=>en?n:e,mt=e=>(-1+e)*100,Lo=function(){const e=[];function t(){const n=e.shift();n&&n(t)}return function(n){e.push(n),e.length===1&&t()}}(),$e=function(){const e=["Webkit","O","Moz","ms"],t={};function n(i){return i.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(a,l){return l.toUpperCase()})}function o(i){const a=document.body.style;if(i in a)return i;let l=e.length;const d=i.charAt(0).toUpperCase()+i.slice(1);let c;for(;l--;)if(c=e[l]+d,c in a)return c;return i}function r(i){return i=n(i),t[i]||(t[i]=o(i))}function s(i,a,l){a=r(a),i.style[a]=l}return function(i,a){for(const l in a){const d=a[l];d!==void 0&&Object.prototype.hasOwnProperty.call(a,l)&&s(i,l,d)}}}(),jt=(e,t)=>(typeof e=="string"?e:et(e)).indexOf(" "+t+" ")>=0,vt=(e,t)=>{const n=et(e),o=n+t;jt(n,t)||(e.className=o.substring(1))},pt=(e,t)=>{const n=et(e);if(!jt(e,t))return;const o=n.replace(" "+t+" "," ");e.className=o.substring(1,o.length-1)},et=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),Eo=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)};const ko=()=>{te(()=>{const e=we(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||O.start()}),e.afterEach(n=>{t.add(n.path),O.done()})})},So=he({setup(){ko()}}),To=JSON.parse(`{"locales":{"/":{"navbar":[{"text":"Guide","link":"/"},{"text":"Changelog","link":"https://github.com/WongSaang/chatgpt-ui/releases"}],"sidebar":{"/":[{"text":"Guide","children":["/README.md","/guide/quick-start.md","/guide/configuration.md","/guide/problems.md","/guide/development.md","/guide/buymeacoffee.md"]}]},"selectLanguageName":"English"},"/zh/":{"navbar":[{"text":"指南","link":"/zh/"},{"text":"更新日志","link":"https://github.com/WongSaang/chatgpt-ui/releases"}],"selectLanguageName":"简体中文","selectLanguageText":"选择语言","selectLanguageAriaLabel":"选择语言","sidebar":{"/zh/":[{"text":"指南","children":["/zh/README.md","/zh/guide/quick-start.md","/zh/guide/configuration.md","/zh/guide/problems.md","/zh/guide/development.md","/zh/guide/buymeacoffee.md"]}]},"notFound":["这里什么都没有","我们怎么到这来了?","这是一个 404 页面","看起来我们进入了错误的链接"],"backToHome":"返回首页","openInNewWindow":"在新窗口打开","toggleColorMode":"切换颜色模式","toggleSidebar":"切换侧边栏"}},"colorMode":"auto","colorModeSwitch":true,"navbar":[],"logo":null,"repo":null,"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","sidebar":"auto","sidebarDepth":2,"editLink":true,"editLinkText":"Edit this page","lastUpdated":true,"lastUpdatedText":"Last Updated","contributors":true,"contributorsText":"Contributors","notFound":["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],"backToHome":"Take me home","openInNewWindow":"open in new window","toggleColorMode":"toggle color mode","toggleSidebar":"toggle sidebar"}`),Oo=M(To),$o=()=>Oo,qt=Symbol(""),Co=()=>{const e=ie(qt);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},Po=(e,t)=>{var n;return{...e,...(n=e.locales)==null?void 0:n[t]}},Io=he({enhance({app:e}){const t=$o(),n=e._context.provides[Ye],o=h(()=>Po(t.value,n.value));e.provide(qt,o),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return o.value}}})}}),zo=C({__name:"Badge",props:{type:{type:String,required:!1,default:"tip"},text:{type:String,required:!1,default:""},vertical:{type:String,required:!1,default:void 0}},setup(e){return(t,n)=>(p(),_("span",{class:ee(["badge",e.type]),style:zt({verticalAlign:e.vertical})},[z(t.$slots,"default",{},()=>[ye(j(e.text),1)])],6))}}),Ao=R(zo,[["__file","Badge.vue"]]),xo=C({name:"CodeGroup",setup(e,{slots:t}){const n=M(-1),o=M([]),r=(a=n.value)=>{a{a>0?n.value=a-1:n.value=o.value.length-1,o.value[n.value].focus()},i=(a,l)=>{a.key===" "||a.key==="Enter"?(a.preventDefault(),n.value=l):a.key==="ArrowRight"?(a.preventDefault(),r(l)):a.key==="ArrowLeft"&&(a.preventDefault(),s(l))};return()=>{var l;const a=(((l=t.default)==null?void 0:l.call(t))||[]).filter(d=>d.type.name==="CodeGroupItem").map(d=>(d.props===null&&(d.props={}),d));return a.length===0?null:(n.value<0||n.value>a.length-1?(n.value=a.findIndex(d=>d.props.active===""||d.props.active===!0),n.value===-1&&(n.value=0)):a.forEach((d,c)=>{d.props.active=c===n.value}),D("div",{class:"code-group"},[D("div",{class:"code-group__nav"},D("ul",{class:"code-group__ul"},a.map((d,c)=>{const v=c===n.value;return D("li",{class:"code-group__li"},D("button",{ref:f=>{f&&(o.value[c]=f)},class:{"code-group__nav-tab":!0,"code-group__nav-tab-active":v},ariaPressed:v,ariaExpanded:v,onClick:()=>n.value=c,onKeydown:f=>i(f,c)},d.props.title))}))),a]))}}}),Do=["aria-selected"],No=C({name:"CodeGroupItem"}),Ho=C({...No,props:{title:{type:String,required:!0},active:{type:Boolean,required:!1,default:!1}},setup(e){return(t,n)=>(p(),_("div",{class:ee(["code-group-item",{"code-group-item__active":e.active}]),"aria-selected":e.active},[z(t.$slots,"default")],10,Do))}}),Ro=R(Ho,[["__file","CodeGroupItem.vue"]]);var ft;const Wt=typeof window<"u",Mo=e=>typeof e=="function",Bo=e=>typeof e=="string",Fo=()=>{};Wt&&((ft=window==null?void 0:window.navigator)!=null&&ft.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function ke(e){return typeof e=="function"?e():m(e)}function Vo(e,t){function n(...o){return new Promise((r,s)=>{Promise.resolve(e(()=>t.apply(this,o),{fn:t,thisArg:this,args:o})).then(r).catch(s)})}return n}const Ut=e=>e();function jo(e=Ut){const t=M(!0);function n(){t.value=!1}function o(){t.value=!0}const r=(...s)=>{t.value&&e(...s)};return{isActive:$t(t),pause:n,resume:o,eventFilter:r}}function qo(e){return e}function Gt(e){return wn()?(Ln(e),!0):!1}function Wo(e){return typeof e=="function"?h(e):M(e)}function Uo(e,t=!0){yn()?te(e):t?e():Ue(e)}function Go(e=!1,t={}){const{truthyValue:n=!0,falsyValue:o=!1}=t,r=bn(e),s=M(e);function i(a){if(arguments.length)return s.value=a,s.value;{const l=ke(n);return s.value=s.value===l?ke(o):l,s.value}}return r?i:[s,i]}var ht=Object.getOwnPropertySymbols,Ko=Object.prototype.hasOwnProperty,Qo=Object.prototype.propertyIsEnumerable,Yo=(e,t)=>{var n={};for(var o in e)Ko.call(e,o)&&t.indexOf(o)<0&&(n[o]=e[o]);if(e!=null&&ht)for(var o of ht(e))t.indexOf(o)<0&&Qo.call(e,o)&&(n[o]=e[o]);return n};function Jo(e,t,n={}){const o=n,{eventFilter:r=Ut}=o,s=Yo(o,["eventFilter"]);return pe(e,Vo(r,t),s)}var Zo=Object.defineProperty,Xo=Object.defineProperties,er=Object.getOwnPropertyDescriptors,Ae=Object.getOwnPropertySymbols,Kt=Object.prototype.hasOwnProperty,Qt=Object.prototype.propertyIsEnumerable,gt=(e,t,n)=>t in e?Zo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,tr=(e,t)=>{for(var n in t||(t={}))Kt.call(t,n)&>(e,n,t[n]);if(Ae)for(var n of Ae(t))Qt.call(t,n)&>(e,n,t[n]);return e},nr=(e,t)=>Xo(e,er(t)),or=(e,t)=>{var n={};for(var o in e)Kt.call(e,o)&&t.indexOf(o)<0&&(n[o]=e[o]);if(e!=null&&Ae)for(var o of Ae(e))t.indexOf(o)<0&&Qt.call(e,o)&&(n[o]=e[o]);return n};function rr(e,t,n={}){const o=n,{eventFilter:r}=o,s=or(o,["eventFilter"]),{eventFilter:i,pause:a,resume:l,isActive:d}=jo(r);return{stop:Jo(e,t,nr(tr({},s),{eventFilter:i})),pause:a,resume:l,isActive:d}}function ar(e){var t;const n=ke(e);return(t=n==null?void 0:n.$el)!=null?t:n}const xe=Wt?window:void 0;function _t(...e){let t,n,o,r;if(Bo(e[0])||Array.isArray(e[0])?([n,o,r]=e,t=xe):[t,n,o,r]=e,!t)return Fo;Array.isArray(n)||(n=[n]),Array.isArray(o)||(o=[o]);const s=[],i=()=>{s.forEach(c=>c()),s.length=0},a=(c,v,f,g)=>(c.addEventListener(v,f,g),()=>c.removeEventListener(v,f,g)),l=pe(()=>[ar(t),ke(r)],([c,v])=>{i(),c&&s.push(...n.flatMap(f=>o.map(g=>a(c,f,g,v))))},{immediate:!0,flush:"post"}),d=()=>{l(),i()};return Gt(d),d}function sr(e,t=!1){const n=M(),o=()=>n.value=Boolean(e());return o(),Uo(o,t),n}function ir(e,t={}){const{window:n=xe}=t,o=sr(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let r;const s=M(!1),i=()=>{r&&("removeEventListener"in r?r.removeEventListener("change",a):r.removeListener(a))},a=()=>{o.value&&(i(),r=n.matchMedia(Wo(e).value),s.value=r.matches,"addEventListener"in r?r.addEventListener("change",a):r.addListener(a))};return kn(a),Gt(()=>i()),s}const je=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},qe="__vueuse_ssr_handlers__";je[qe]=je[qe]||{};const lr=je[qe];function ur(e,t){return lr[e]||t}function cr(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}var dr=Object.defineProperty,bt=Object.getOwnPropertySymbols,mr=Object.prototype.hasOwnProperty,vr=Object.prototype.propertyIsEnumerable,yt=(e,t,n)=>t in e?dr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,wt=(e,t)=>{for(var n in t||(t={}))mr.call(t,n)&&yt(e,n,t[n]);if(bt)for(var n of bt(t))vr.call(t,n)&&yt(e,n,t[n]);return e};const pr={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Lt="vueuse-storage";function fr(e,t,n,o={}){var r;const{flush:s="pre",deep:i=!0,listenToStorageChanges:a=!0,writeDefaults:l=!0,mergeDefaults:d=!1,shallow:c,window:v=xe,eventFilter:f,onError:g=u=>{console.error(u)}}=o,b=(c?En:M)(t);if(!n)try{n=ur("getDefaultStorage",()=>{var u;return(u=xe)==null?void 0:u.localStorage})()}catch(u){g(u)}if(!n)return b;const k=ke(t),y=cr(k),T=(r=o.serializer)!=null?r:pr[y],{pause:B,resume:x}=rr(b,()=>Q(b.value),{flush:s,deep:i,eventFilter:f});return v&&a&&(_t(v,"storage",L),_t(v,Lt,de)),L(),b;function Q(u){try{if(u==null)n.removeItem(e);else{const A=T.write(u),P=n.getItem(e);P!==A&&(n.setItem(e,A),v&&v.dispatchEvent(new CustomEvent(Lt,{detail:{key:e,oldValue:P,newValue:A,storageArea:n}})))}}catch(A){g(A)}}function Y(u){const A=u?u.newValue:n.getItem(e);if(A==null)return l&&k!==null&&n.setItem(e,T.write(k)),k;if(!u&&d){const P=T.read(A);return Mo(d)?d(P,k):y==="object"&&!Array.isArray(P)?wt(wt({},k),P):P}else return typeof A!="string"?A:T.read(A)}function de(u){L(u.detail)}function L(u){if(!(u&&u.storageArea!==n)){if(u&&u.key==null){b.value=k;return}if(!(u&&u.key!==e)){B();try{b.value=Y(u)}catch(A){g(A)}finally{u?Ue(x):x()}}}}}function hr(e){return ir("(prefers-color-scheme: dark)",e)}var Et;(function(e){e.UP="UP",e.RIGHT="RIGHT",e.DOWN="DOWN",e.LEFT="LEFT",e.NONE="NONE"})(Et||(Et={}));var gr=Object.defineProperty,kt=Object.getOwnPropertySymbols,_r=Object.prototype.hasOwnProperty,br=Object.prototype.propertyIsEnumerable,St=(e,t,n)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,yr=(e,t)=>{for(var n in t||(t={}))_r.call(t,n)&&St(e,n,t[n]);if(kt)for(var n of kt(t))br.call(t,n)&&St(e,n,t[n]);return e};const wr={easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]};yr({linear:qo},wr);const K=()=>Co(),Yt=Symbol(""),tt=()=>{const e=ie(Yt);if(!e)throw new Error("useDarkMode() is called without provider.");return e},Lr=()=>{const e=K(),t=hr(),n=fr("vuepress-color-scheme",e.value.colorMode),o=h({get(){return e.value.colorModeSwitch?n.value==="auto"?t.value:n.value==="dark":e.value.colorMode==="dark"},set(r){r===t.value?n.value="auto":n.value=r?"dark":"light"}});Ge(Yt,o),Er(o)},Er=e=>{const t=(n=e.value)=>{const o=window==null?void 0:window.document.querySelector("html");o==null||o.classList.toggle("dark",n)};te(()=>{pe(e,t,{immediate:!0})}),At(()=>t())},Jt=(...e)=>{const n=we().resolve(...e),o=n.matched[n.matched.length-1];if(!(o!=null&&o.redirect))return n;const{redirect:r}=o,s=Sn(r)?r(n):r,i=ne(s)?{path:s}:s;return Jt({hash:n.hash,query:n.query,params:n.params,...i})},nt=e=>{const t=Jt(encodeURI(e));return{text:t.meta.title||e,link:t.name==="404"?e:t.fullPath}};let Ve=null,Ee=null;const kr={wait:()=>Ve,pending:()=>{Ve=new Promise(e=>Ee=e)},resolve:()=>{Ee==null||Ee(),Ve=null,Ee=null}},Zt=()=>kr,Xt=Symbol("sidebarItems"),ot=()=>{const e=ie(Xt);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},Sr=()=>{const e=K(),t=re(),n=h(()=>Tr(t.value,e.value));Ge(Xt,n)},Tr=(e,t)=>{const n=e.sidebar??t.sidebar??"auto",o=e.sidebarDepth??t.sidebarDepth??2;return e.home||n===!1?[]:n==="auto"?$r(o):De(n)?en(n,o):Ke(n)?Cr(n,o):[]},Or=(e,t)=>({text:e.title,link:e.link,children:rt(e.children,t)}),rt=(e,t)=>t>0?e.map(n=>Or(n,t-1)):[],$r=e=>{const t=ve();return[{text:t.value.title,children:rt(t.value.headers,e)}]},en=(e,t)=>{const n=fe(),o=ve(),r=s=>{var a;let i;if(ne(s)?i=nt(s):i=s,i.children)return{...i,children:i.children.map(l=>r(l))};if(i.link===n.path){const l=((a=o.value.headers[0])==null?void 0:a.level)===1?o.value.headers[0].children:o.value.headers;return{...i,children:rt(l,t)}}return i};return e.map(s=>r(s))},Cr=(e,t)=>{const n=fe(),o=Ct(e,n.path),r=e[o]??[];return en(r,t)},Pr={},Ir={class:"theme-default-content"};function zr(e,t){const n=se("Content");return p(),_("div",Ir,[N(n)])}const Ar=R(Pr,[["render",zr],["__file","HomeContent.vue"]]),xr={key:0,class:"features"},Dr=C({__name:"HomeFeatures",setup(e){const t=re(),n=h(()=>De(t.value.features)?t.value.features:[]);return(o,r)=>m(n).length?(p(),_("div",xr,[(p(!0),_(Z,null,ce(m(n),s=>(p(),_("div",{key:s.title,class:"feature"},[$("h2",null,j(s.title),1),$("p",null,j(s.details),1)]))),128))])):F("v-if",!0)}}),Nr=R(Dr,[["__file","HomeFeatures.vue"]]),Hr=["innerHTML"],Rr=["textContent"],Mr=C({__name:"HomeFooter",setup(e){const t=re(),n=h(()=>t.value.footer),o=h(()=>t.value.footerHtml);return(r,s)=>m(n)?(p(),_(Z,{key:0},[F(" eslint-disable-next-line vue/no-v-html "),m(o)?(p(),_("div",{key:0,class:"footer",innerHTML:m(n)},null,8,Hr)):(p(),_("div",{key:1,class:"footer",textContent:j(m(n))},null,8,Rr))],64)):F("v-if",!0)}}),Br=R(Mr,[["__file","HomeFooter.vue"]]),Fr=["href","rel","target","aria-label"],Vr=C({inheritAttrs:!1}),jr=C({...Vr,__name:"AutoLink",props:{item:{type:Object,required:!0}},setup(e){const t=e,n=fe(),o=Wn(),{item:r}=Qe(t),s=h(()=>Se(r.value.link)),i=h(()=>Tn(r.value.link)||On(r.value.link)),a=h(()=>{if(!i.value){if(r.value.target)return r.value.target;if(s.value)return"_blank"}}),l=h(()=>a.value==="_blank"),d=h(()=>!s.value&&!i.value&&!l.value),c=h(()=>{if(!i.value){if(r.value.rel)return r.value.rel;if(l.value)return"noopener noreferrer"}}),v=h(()=>r.value.ariaLabel||r.value.text),f=h(()=>{const k=Object.keys(o.value.locales);return k.length?!k.some(y=>y===r.value.link):r.value.link!=="/"}),g=h(()=>f.value?n.path.startsWith(r.value.link):!1),b=h(()=>d.value?r.value.activeMatch?new RegExp(r.value.activeMatch).test(n.path):g.value:!1);return(k,y)=>{const T=se("RouterLink"),B=se("AutoLinkExternalIcon");return m(d)?(p(),q(T,st({key:0,class:{"router-link-active":m(b)},to:m(r).link,"aria-label":m(v)},k.$attrs),{default:U(()=>[z(k.$slots,"before"),ye(" "+j(m(r).text)+" ",1),z(k.$slots,"after")]),_:3},16,["class","to","aria-label"])):(p(),_("a",st({key:1,class:"external-link",href:m(r).link,rel:m(c),target:m(a),"aria-label":m(v)},k.$attrs),[z(k.$slots,"before"),ye(" "+j(m(r).text)+" ",1),m(l)?(p(),q(B,{key:0})):F("v-if",!0),z(k.$slots,"after")],16,Fr))}}}),ae=R(jr,[["__file","AutoLink.vue"]]),qr={class:"hero"},Wr={key:0,id:"main-title"},Ur={key:1,class:"description"},Gr={key:2,class:"actions"},Kr=C({__name:"HomeHero",setup(e){const t=re(),n=Je(),o=tt(),r=h(()=>o.value&&t.value.heroImageDark!==void 0?t.value.heroImageDark:t.value.heroImage),s=h(()=>t.value.heroAlt||a.value||"hero"),i=h(()=>t.value.heroHeight||280),a=h(()=>t.value.heroText===null?null:t.value.heroText||n.value.title||"Hello"),l=h(()=>t.value.tagline===null?null:t.value.tagline||n.value.description||"Welcome to your VuePress site"),d=h(()=>De(t.value.actions)?t.value.actions.map(({text:v,link:f,type:g="primary"})=>({text:v,link:f,type:g})):[]),c=()=>{if(!r.value)return null;const v=D("img",{src:Xe(r.value),alt:s.value,height:i.value});return t.value.heroImageDark===void 0?v:D(Ze,()=>v)};return(v,f)=>(p(),_("header",qr,[N(c),m(a)?(p(),_("h1",Wr,j(m(a)),1)):F("v-if",!0),m(l)?(p(),_("p",Ur,j(m(l)),1)):F("v-if",!0),m(d).length?(p(),_("p",Gr,[(p(!0),_(Z,null,ce(m(d),g=>(p(),q(ae,{key:g.text,class:ee(["action-button",[g.type]]),item:g},null,8,["class","item"]))),128))])):F("v-if",!0)]))}}),Qr=R(Kr,[["__file","HomeHero.vue"]]),Yr={class:"home"},Jr=C({__name:"Home",setup(e){return(t,n)=>(p(),_("main",Yr,[N(Qr),N(Nr),N(Ar),N(Br)]))}}),Zr=R(Jr,[["__file","Home.vue"]]),Xr=C({__name:"NavbarBrand",setup(e){const t=Ne(),n=Je(),o=K(),r=tt(),s=h(()=>o.value.home||t.value),i=h(()=>n.value.title),a=h(()=>r.value&&o.value.logoDark!==void 0?o.value.logoDark:o.value.logo),l=()=>{if(!a.value)return null;const d=D("img",{class:"logo",src:Xe(a.value),alt:i.value});return o.value.logoDark===void 0?d:D(Ze,()=>d)};return(d,c)=>{const v=se("RouterLink");return p(),q(v,{to:m(s)},{default:U(()=>[N(l),m(i)?(p(),_("span",{key:0,class:ee(["site-name",{"can-hide":m(a)}])},j(m(i)),3)):F("v-if",!0)]),_:1},8,["to"])}}}),ea=R(Xr,[["__file","NavbarBrand.vue"]]),ta=C({__name:"DropdownTransition",setup(e){const t=o=>{o.style.height=o.scrollHeight+"px"},n=o=>{o.style.height=""};return(o,r)=>(p(),q(We,{name:"dropdown",onEnter:t,onAfterEnter:n,onBeforeLeave:t},{default:U(()=>[z(o.$slots,"default")]),_:3}))}}),tn=R(ta,[["__file","DropdownTransition.vue"]]),na=["aria-label"],oa={class:"title"},ra=$("span",{class:"arrow down"},null,-1),aa=["aria-label"],sa={class:"title"},ia={class:"navbar-dropdown"},la={class:"navbar-dropdown-subtitle"},ua={key:1},ca={class:"navbar-dropdown-subitem-wrapper"},da=C({__name:"NavbarDropdown",props:{item:{type:Object,required:!0}},setup(e){const t=e,{item:n}=Qe(t),o=h(()=>n.value.ariaLabel||n.value.text),r=M(!1),s=fe();pe(()=>s.path,()=>{r.value=!1});const i=l=>{l.detail===0?r.value=!r.value:r.value=!1},a=(l,d)=>d[d.length-1]===l;return(l,d)=>(p(),_("div",{class:ee(["navbar-dropdown-wrapper",{open:r.value}])},[$("button",{class:"navbar-dropdown-title",type:"button","aria-label":m(o),onClick:i},[$("span",oa,j(m(n).text),1),ra],8,na),$("button",{class:"navbar-dropdown-title-mobile",type:"button","aria-label":m(o),onClick:d[0]||(d[0]=c=>r.value=!r.value)},[$("span",sa,j(m(n).text),1),$("span",{class:ee(["arrow",r.value?"down":"right"])},null,2)],8,aa),N(tn,null,{default:U(()=>[Ie($("ul",ia,[(p(!0),_(Z,null,ce(m(n).children,c=>(p(),_("li",{key:c.text,class:"navbar-dropdown-item"},[c.children?(p(),_(Z,{key:0},[$("h4",la,[c.link?(p(),q(ae,{key:0,item:c,onFocusout:v=>a(c,m(n).children)&&c.children.length===0&&(r.value=!1)},null,8,["item","onFocusout"])):(p(),_("span",ua,j(c.text),1))]),$("ul",ca,[(p(!0),_(Z,null,ce(c.children,v=>(p(),_("li",{key:v.link,class:"navbar-dropdown-subitem"},[N(ae,{item:v,onFocusout:f=>a(v,c.children)&&a(c,m(n).children)&&(r.value=!1)},null,8,["item","onFocusout"])]))),128))])],64)):(p(),q(ae,{key:1,item:c,onFocusout:v=>a(c,m(n).children)&&(r.value=!1)},null,8,["item","onFocusout"]))]))),128))],512),[[ze,r.value]])]),_:1})],2))}}),ma=R(da,[["__file","NavbarDropdown.vue"]]),Tt=e=>decodeURI(e).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),va=(e,t)=>{if(t.hash===e)return!0;const n=Tt(t.path),o=Tt(e);return n===o},nn=(e,t)=>e.link&&va(e.link,t)?!0:e.children?e.children.some(n=>nn(n,t)):!1,on=e=>!Se(e)||/github\.com/.test(e)?"GitHub":/bitbucket\.org/.test(e)?"Bitbucket":/gitlab\.com/.test(e)?"GitLab":/gitee\.com/.test(e)?"Gitee":null,pa={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},fa=({docsRepo:e,editLinkPattern:t})=>{if(t)return t;const n=on(e);return n!==null?pa[n]:null},ha=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:o,editLinkPattern:r})=>{if(!o)return null;const s=fa({docsRepo:e,editLinkPattern:r});return s?s.replace(/:repo/,Se(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,Pt(`${xt(n)}/${o}`)):null},ga={key:0,class:"navbar-items"},_a=C({__name:"NavbarItems",setup(e){const t=()=>{const c=we(),v=Ne(),f=Je(),g=K();return h(()=>{const b=Object.keys(f.value.locales);if(b.length<2)return[];const k=c.currentRoute.value.path,y=c.currentRoute.value.fullPath;return[{text:g.value.selectLanguageText??"unknown language",ariaLabel:g.value.selectLanguageAriaLabel??g.value.selectLanguageText??"unknown language",children:b.map(B=>{var u,A;const x=((u=f.value.locales)==null?void 0:u[B])??{},Q=((A=g.value.locales)==null?void 0:A[B])??{},Y=`${x.lang}`,de=Q.selectLanguageName??Y;let L;if(Y===f.value.lang)L=y;else{const P=k.replace(v.value,B);c.getRoutes().some(W=>W.path===P)?L=y.replace(k,P):L=Q.home??B}return{text:de,link:L}})}]})},n=()=>{const c=K(),v=h(()=>c.value.repo),f=h(()=>v.value?on(v.value):null),g=h(()=>v.value&&!Se(v.value)?`https://github.com/${v.value}`:v.value),b=h(()=>g.value?c.value.repoLabel?c.value.repoLabel:f.value===null?"Source":f.value:null);return h(()=>!g.value||!b.value?[]:[{text:b.value,link:g.value}])},o=c=>ne(c)?nt(c):c.children?{...c,children:c.children.map(o)}:c,r=()=>{const c=K();return h(()=>(c.value.navbar||[]).map(o))},s=M(!1),i=r(),a=t(),l=n(),d=h(()=>[...i.value,...a.value,...l.value]);return te(()=>{const v=()=>{window.innerWidth<719?s.value=!0:s.value=!1};v(),window.addEventListener("resize",v,!1),window.addEventListener("orientationchange",v,!1)}),(c,v)=>m(d).length?(p(),_("nav",ga,[(p(!0),_(Z,null,ce(m(d),f=>(p(),_("div",{key:f.text,class:"navbar-item"},[f.children?(p(),q(ma,{key:0,item:f,class:ee(s.value?"mobile":"")},null,8,["item","class"])):(p(),q(ae,{key:1,item:f},null,8,["item"]))]))),128))])):F("v-if",!0)}}),rn=R(_a,[["__file","NavbarItems.vue"]]),ba=["title"],ya={class:"icon",focusable:"false",viewBox:"0 0 32 32"},wa=$n('',9),La=[wa],Ea={class:"icon",focusable:"false",viewBox:"0 0 32 32"},ka=$("path",{d:"M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z",fill:"currentColor"},null,-1),Sa=[ka],Ta=C({__name:"ToggleColorModeButton",setup(e){const t=K(),n=tt(),o=()=>{n.value=!n.value};return(r,s)=>(p(),_("button",{class:"toggle-color-mode-button",title:m(t).toggleColorMode,onClick:o},[Ie((p(),_("svg",ya,La,512)),[[ze,!m(n)]]),Ie((p(),_("svg",Ea,Sa,512)),[[ze,m(n)]])],8,ba))}}),Oa=R(Ta,[["__file","ToggleColorModeButton.vue"]]),$a=["title"],Ca=$("div",{class:"icon","aria-hidden":"true"},[$("span"),$("span"),$("span")],-1),Pa=[Ca],Ia=C({__name:"ToggleSidebarButton",emits:["toggle"],setup(e){const t=K();return(n,o)=>(p(),_("div",{class:"toggle-sidebar-button",title:m(t).toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:o[0]||(o[0]=r=>n.$emit("toggle"))},Pa,8,$a))}}),za=R(Ia,[["__file","ToggleSidebarButton.vue"]]),Aa=C({__name:"Navbar",emits:["toggle-sidebar"],setup(e){const t=K(),n=M(null),o=M(null),r=M(0),s=h(()=>r.value?{maxWidth:r.value+"px"}:{});te(()=>{const l=i(n.value,"paddingLeft")+i(n.value,"paddingRight"),d=()=>{var c;window.innerWidth<719?r.value=0:r.value=n.value.offsetWidth-l-(((c=o.value)==null?void 0:c.offsetWidth)||0)};d(),window.addEventListener("resize",d,!1),window.addEventListener("orientationchange",d,!1)});function i(a,l){var v,f,g;const d=(g=(f=(v=a==null?void 0:a.ownerDocument)==null?void 0:v.defaultView)==null?void 0:f.getComputedStyle(a,null))==null?void 0:g[l],c=Number.parseInt(d,10);return Number.isNaN(c)?0:c}return(a,l)=>{const d=se("NavbarSearch");return p(),_("header",{ref_key:"navbar",ref:n,class:"navbar"},[N(za,{onToggle:l[0]||(l[0]=c=>a.$emit("toggle-sidebar"))}),$("span",{ref_key:"navbarBrand",ref:o},[N(ea)],512),$("div",{class:"navbar-items-wrapper",style:zt(m(s))},[z(a.$slots,"before"),N(rn,{class:"can-hide"}),z(a.$slots,"after"),m(t).colorModeSwitch?(p(),q(Oa,{key:0})):F("v-if",!0),N(d)],4)],512)}}}),xa=R(Aa,[["__file","Navbar.vue"]]),Da={class:"page-meta"},Na={key:0,class:"meta-item edit-link"},Ha={key:1,class:"meta-item last-updated"},Ra={class:"meta-item-label"},Ma={class:"meta-item-info"},Ba={key:2,class:"meta-item contributors"},Fa={class:"meta-item-label"},Va={class:"meta-item-info"},ja=["title"],qa=C({__name:"PageMeta",setup(e){const t=()=>{const l=K(),d=ve(),c=re();return h(()=>{if(!(c.value.editLink??l.value.editLink??!0))return null;const{repo:f,docsRepo:g=f,docsBranch:b="main",docsDir:k="",editLinkText:y}=l.value;if(!g)return null;const T=ha({docsRepo:g,docsBranch:b,docsDir:k,filePathRelative:d.value.filePathRelative,editLinkPattern:c.value.editLinkPattern??l.value.editLinkPattern});return T?{text:y??"Edit this page",link:T}:null})},n=()=>{const l=K(),d=ve(),c=re();return h(()=>{var g,b;return!(c.value.lastUpdated??l.value.lastUpdated??!0)||!((g=d.value.git)!=null&&g.updatedTime)?null:new Date((b=d.value.git)==null?void 0:b.updatedTime).toLocaleString()})},o=()=>{const l=K(),d=ve(),c=re();return h(()=>{var f;return c.value.contributors??l.value.contributors??!0?((f=d.value.git)==null?void 0:f.contributors)??null:null})},r=K(),s=t(),i=n(),a=o();return(l,d)=>{const c=se("ClientOnly");return p(),_("footer",Da,[m(s)?(p(),_("div",Na,[N(ae,{class:"meta-item-label",item:m(s)},null,8,["item"])])):F("v-if",!0),m(i)?(p(),_("div",Ha,[$("span",Ra,j(m(r).lastUpdatedText)+": ",1),N(c,null,{default:U(()=>[$("span",Ma,j(m(i)),1)]),_:1})])):F("v-if",!0),m(a)&&m(a).length?(p(),_("div",Ba,[$("span",Fa,j(m(r).contributorsText)+": ",1),$("span",Va,[(p(!0),_(Z,null,ce(m(a),(v,f)=>(p(),_(Z,{key:f},[$("span",{class:"contributor",title:`email: ${v.email}`},j(v.name),9,ja),f!==m(a).length-1?(p(),_(Z,{key:0},[ye(", ")],64)):F("v-if",!0)],64))),128))])])):F("v-if",!0)])}}}),Wa=R(qa,[["__file","PageMeta.vue"]]),Ua={key:0,class:"page-nav"},Ga={class:"inner"},Ka={key:0,class:"prev"},Qa={key:1,class:"next"},Ya=C({__name:"PageNav",setup(e){const t=l=>l===!1?null:ne(l)?nt(l):Ke(l)?l:!1,n=(l,d,c)=>{const v=l.findIndex(f=>f.link===d);if(v!==-1){const f=l[v+c];return f!=null&&f.link?f:null}for(const f of l)if(f.children){const g=n(f.children,d,c);if(g)return g}return null},o=re(),r=ot(),s=fe(),i=h(()=>{const l=t(o.value.prev);return l!==!1?l:n(r.value,s.path,-1)}),a=h(()=>{const l=t(o.value.next);return l!==!1?l:n(r.value,s.path,1)});return(l,d)=>m(i)||m(a)?(p(),_("nav",Ua,[$("p",Ga,[m(i)?(p(),_("span",Ka,[N(ae,{item:m(i)},null,8,["item"])])):F("v-if",!0),m(a)?(p(),_("span",Qa,[N(ae,{item:m(a)},null,8,["item"])])):F("v-if",!0)])])):F("v-if",!0)}}),Ja=R(Ya,[["__file","PageNav.vue"]]),Za={class:"page"},Xa={class:"theme-default-content"},es=C({__name:"Page",setup(e){return(t,n)=>{const o=se("Content");return p(),_("main",Za,[z(t.$slots,"top"),$("div",Xa,[z(t.$slots,"content-top"),N(o),z(t.$slots,"content-bottom")]),N(Wa),N(Ja),z(t.$slots,"bottom")])}}}),ts=R(es,[["__file","Page.vue"]]),ns=["onKeydown"],os={class:"sidebar-item-children"},rs=C({__name:"SidebarItem",props:{item:{type:Object,required:!0},depth:{type:Number,required:!1,default:0}},setup(e){const t=e,{item:n,depth:o}=Qe(t),r=fe(),s=we(),i=h(()=>nn(n.value,r)),a=h(()=>({"sidebar-item":!0,"sidebar-heading":o.value===0,active:i.value,collapsible:n.value.collapsible})),l=h(()=>n.value.collapsible?i.value:!0),[d,c]=Go(l.value),v=g=>{n.value.collapsible&&(g.preventDefault(),c())},f=s.afterEach(g=>{Ue(()=>{d.value=l.value})});return It(()=>{f()}),(g,b)=>{var y;const k=se("SidebarItem",!0);return p(),_("li",null,[m(n).link?(p(),q(ae,{key:0,class:ee(m(a)),item:m(n)},null,8,["class","item"])):(p(),_("p",{key:1,tabindex:"0",class:ee(m(a)),onClick:v,onKeydown:Cn(v,["enter"])},[ye(j(m(n).text)+" ",1),m(n).collapsible?(p(),_("span",{key:0,class:ee(["arrow",m(d)?"down":"right"])},null,2)):F("v-if",!0)],42,ns)),(y=m(n).children)!=null&&y.length?(p(),q(tn,{key:2},{default:U(()=>[Ie($("ul",os,[(p(!0),_(Z,null,ce(m(n).children,T=>(p(),q(k,{key:`${m(o)}${T.text}${T.link}`,item:T,depth:m(o)+1},null,8,["item","depth"]))),128))],512),[[ze,m(d)]])]),_:1})):F("v-if",!0)])}}}),as=R(rs,[["__file","SidebarItem.vue"]]),ss={key:0,class:"sidebar-items"},is=C({__name:"SidebarItems",setup(e){const t=fe(),n=ot();return te(()=>{pe(()=>t.hash,o=>{const r=document.querySelector(".sidebar");if(!r)return;const s=document.querySelector(`.sidebar a.sidebar-item[href="${t.path}${o}"]`);if(!s)return;const{top:i,height:a}=r.getBoundingClientRect(),{top:l,height:d}=s.getBoundingClientRect();li+a&&s.scrollIntoView(!1)})}),(o,r)=>m(n).length?(p(),_("ul",ss,[(p(!0),_(Z,null,ce(m(n),s=>(p(),q(as,{key:`${s.text}${s.link}`,item:s},null,8,["item"]))),128))])):F("v-if",!0)}}),ls=R(is,[["__file","SidebarItems.vue"]]),us={class:"sidebar"},cs=C({__name:"Sidebar",setup(e){return(t,n)=>(p(),_("aside",us,[N(rn),z(t.$slots,"top"),N(ls),z(t.$slots,"bottom")]))}}),ds=R(cs,[["__file","Sidebar.vue"]]),ms=C({__name:"Layout",setup(e){const t=ve(),n=re(),o=K(),r=h(()=>n.value.navbar!==!1&&o.value.navbar!==!1),s=ot(),i=M(!1),a=y=>{i.value=typeof y=="boolean"?y:!i.value},l={x:0,y:0},d=y=>{l.x=y.changedTouches[0].clientX,l.y=y.changedTouches[0].clientY},c=y=>{const T=y.changedTouches[0].clientX-l.x,B=y.changedTouches[0].clientY-l.y;Math.abs(T)>Math.abs(B)&&Math.abs(T)>40&&(T>0&&l.x<=80?a(!0):a(!1))},v=h(()=>[{"no-navbar":!r.value,"no-sidebar":!s.value.length,"sidebar-open":i.value},n.value.pageClass]);let f;te(()=>{f=we().afterEach(()=>{a(!1)})}),At(()=>{f()});const g=Zt(),b=g.resolve,k=g.pending;return(y,T)=>(p(),_("div",{class:ee(["theme-container",m(v)]),onTouchstart:d,onTouchend:c},[z(y.$slots,"navbar",{},()=>[m(r)?(p(),q(xa,{key:0,onToggleSidebar:a},{before:U(()=>[z(y.$slots,"navbar-before")]),after:U(()=>[z(y.$slots,"navbar-after")]),_:3})):F("v-if",!0)]),$("div",{class:"sidebar-mask",onClick:T[0]||(T[0]=B=>a(!1))}),z(y.$slots,"sidebar",{},()=>[N(ds,null,{top:U(()=>[z(y.$slots,"sidebar-top")]),bottom:U(()=>[z(y.$slots,"sidebar-bottom")]),_:3})]),z(y.$slots,"page",{},()=>[m(n).home?(p(),q(Zr,{key:0})):(p(),q(We,{key:1,name:"fade-slide-y",mode:"out-in",onBeforeEnter:m(b),onBeforeLeave:m(k)},{default:U(()=>[(p(),q(ts,{key:m(t).path},{top:U(()=>[z(y.$slots,"page-top")]),"content-top":U(()=>[z(y.$slots,"page-content-top")]),"content-bottom":U(()=>[z(y.$slots,"page-content-bottom")]),bottom:U(()=>[z(y.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"]))])],34))}}),vs=R(ms,[["__file","Layout.vue"]]),ps={class:"theme-container"},fs={class:"page"},hs={class:"theme-default-content"},gs=$("h1",null,"404",-1),_s=C({__name:"NotFound",setup(e){const t=Ne(),n=K(),o=n.value.notFound??["Not Found"],r=()=>o[Math.floor(Math.random()*o.length)],s=n.value.home??t.value,i=n.value.backToHome??"Back to home";return(a,l)=>{const d=se("RouterLink");return p(),_("div",ps,[$("main",fs,[$("div",hs,[gs,$("blockquote",null,j(r()),1),N(d,{to:m(s)},{default:U(()=>[ye(j(m(i)),1)]),_:1},8,["to"])])])])}}}),bs=R(_s,[["__file","NotFound.vue"]]);const ys=he({enhance({app:e,router:t}){e.component("Badge",Ao),e.component("CodeGroup",xo),e.component("CodeGroupItem",Ro),e.component("AutoLinkExternalIcon",()=>{const o=e.component("ExternalLinkIcon");return o?D(o):null}),e.component("NavbarSearch",()=>{const o=e.component("Docsearch")||e.component("SearchBox");return o?D(o):null});const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...o)=>(await Zt().wait(),n(...o))},setup(){Lr(),Sr()},layouts:{Layout:vs,NotFound:bs}}),Ce=[to,ro,lo,wo,So,Io,ys],ws=[["v-8daa1a0e","/",{title:"Introduction"},["/index.html","/README.md"]],["v-eb956884","/guide/buymeacoffee.html",{title:"Donation"},["/guide/buymeacoffee","/guide/buymeacoffee.md"]],["v-4f4ccb8f","/guide/configuration.html",{title:"Configuration Reference"},["/guide/configuration","/guide/configuration.md"]],["v-531add2c","/guide/development.html",{title:"Development Guide"},["/guide/development","/guide/development.md"]],["v-7f374639","/guide/problems.html",{title:"Encountering Issues"},["/guide/problems","/guide/problems.md"]],["v-47700a83","/guide/quick-start.html",{title:"Quick Start"},["/guide/quick-start","/guide/quick-start.md"]],["v-2d0ad528","/zh/",{title:"介绍"},["/zh/index.html","/zh/README.md"]],["v-603f36a2","/zh/guide/buymeacoffee.html",{title:"续杯咖啡"},["/zh/guide/buymeacoffee","/zh/guide/buymeacoffee.md"]],["v-81f65e84","/zh/guide/configuration.html",{title:"配置参考"},["/zh/guide/configuration","/zh/guide/configuration.md"]],["v-1d0fd34e","/zh/guide/development.html",{title:"开发指南"},["/zh/guide/development","/zh/guide/development.md"]],["v-4eee7faa","/zh/guide/problems.html",{title:"遇到问题"},["/zh/guide/problems","/zh/guide/problems.md"]],["v-62758f72","/zh/guide/quick-start.html",{title:"快速开始"},["/zh/guide/quick-start","/zh/guide/quick-start.md"]],["v-3706649a","/404.html",{title:""},["/404"]]];var Ot=C({name:"Vuepress",setup(){const e=qn();return()=>D(e.value)}}),Ls=()=>ws.reduce((e,[t,n,o,r])=>(e.push({name:t,path:n,component:Ot,meta:o},...r.map(s=>({path:s,redirect:n}))),e),[{name:"404",path:"/:catchAll(.*)",component:Ot}]),Es=An,ks=()=>{const e=Pn({history:Es(xt("/chatgpt-ui/")),routes:Ls(),scrollBehavior:(t,n,o)=>o||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{var o;(t.path!==n.path||n===In)&&([ue.value]=await Promise.all([oe.resolvePageData(t.name),(o=Dt[t.name])==null?void 0:o.__asyncLoader()]))}),e},Ss=e=>{e.component("ClientOnly",Ze),e.component("Content",Qn)},Ts=(e,t,n)=>{const o=M(t.currentRoute.value.path);pe(()=>t.currentRoute.value.path,f=>o.value=f);const r=h(()=>oe.resolveLayouts(n)),s=h(()=>oe.resolveRouteLocale(be.value.locales,o.value)),i=h(()=>oe.resolveSiteLocaleData(be.value,s.value)),a=h(()=>oe.resolvePageFrontmatter(ue.value)),l=h(()=>oe.resolvePageHeadTitle(ue.value,i.value)),d=h(()=>oe.resolvePageHead(l.value,a.value,i.value)),c=h(()=>oe.resolvePageLang(ue.value)),v=h(()=>oe.resolvePageLayout(ue.value,r.value));return e.provide(Mn,r),e.provide(Ht,a),e.provide(Vn,l),e.provide(Rt,d),e.provide(Mt,c),e.provide(Bt,v),e.provide(Ye,s),e.provide(Ft,i),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>a.value},$head:{get:()=>d.value},$headTitle:{get:()=>l.value},$lang:{get:()=>c.value},$page:{get:()=>ue.value},$routeLocale:{get:()=>s.value},$site:{get:()=>be.value},$siteLocale:{get:()=>i.value},$withBase:{get:()=>Xe}}),{layouts:r,pageData:ue,pageFrontmatter:a,pageHead:d,pageHeadTitle:l,pageLang:c,pageLayout:v,routeLocale:s,siteData:be,siteLocaleData:i}},Os=()=>{const e=Fn(),t=jn(),n=M([]),o=()=>{e.value.forEach(s=>{const i=$s(s);i&&n.value.push(i)})},r=()=>{document.documentElement.lang=t.value,n.value.forEach(s=>{s.parentNode===document.head&&document.head.removeChild(s)}),n.value.splice(0,n.value.length),e.value.forEach(s=>{const i=Cs(s);i!==null&&(document.head.appendChild(i),n.value.push(i))})};Ge(Un,r),te(()=>{o(),r(),pe(()=>e.value,()=>r())})},$s=([e,t,n=""])=>{const o=Object.entries(t).map(([a,l])=>ne(l)?`[${a}=${JSON.stringify(l)}]`:l===!0?`[${a}]`:"").join(""),r=`head > ${e}${o}`;return Array.from(document.querySelectorAll(r)).find(a=>a.innerText===n)||null},Cs=([e,t,n])=>{if(!ne(e))return null;const o=document.createElement(e);return Ke(t)&&Object.entries(t).forEach(([r,s])=>{ne(s)?o.setAttribute(r,s):s===!0&&o.setAttribute(r,"")}),ne(n)&&o.appendChild(document.createTextNode(n)),o},Ps=zn,Is=async()=>{var n;const e=Ps({name:"VuepressApp",setup(){var o;Os();for(const r of Ce)(o=r.setup)==null||o.call(r);return()=>[D(xn),...Ce.flatMap(({rootComponents:r=[]})=>r.map(s=>D(s)))]}}),t=ks();Ss(e),Ts(e,t,Ce);for(const o of Ce)await((n=o.enhance)==null?void 0:n.call(o,{app:e,router:t,siteData:be}));return e.use(t),{app:e,router:t}};Is().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{Is as createVueApp}; diff --git a/assets/back-to-top-8efcbe56.svg b/assets/back-to-top-8efcbe56.svg new file mode 100644 index 0000000..8323678 --- /dev/null +++ b/assets/back-to-top-8efcbe56.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/bmc_qr-9db17e16.js b/assets/bmc_qr-9db17e16.js new file mode 100644 index 0000000..0643161 --- /dev/null +++ b/assets/bmc_qr-9db17e16.js @@ -0,0 +1 @@ +const t="/chatgpt-ui/images/bmc_qr.png";export{t as _}; diff --git a/assets/buymeacoffee.html-138309cb.js b/assets/buymeacoffee.html-138309cb.js new file mode 100644 index 0000000..c255d4c --- /dev/null +++ b/assets/buymeacoffee.html-138309cb.js @@ -0,0 +1 @@ +import{_ as n}from"./bmc_qr-9db17e16.js";import{_ as a,M as r,p as s,q as c,R as e,t as o,N as l}from"./framework-5866ffd3.js";const f={},i=e("h1",{id:"donation",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#donation","aria-hidden":"true"},"#"),o(" Donation")],-1),_=e("blockquote",null,[e("p",null,"If this project is helpful to you, it is also helping me.")],-1),m={href:"https://www.buymeacoffee.com/WongSaang",target:"_blank",rel:"noopener noreferrer"},u=e("p",null,[e("img",{src:n,alt:"Buy Me A Coffee"})],-1);function p(d,h){const t=r("ExternalLinkIcon");return s(),c("div",null,[i,_,e("p",null,[o("If you want to support me, Buy me a coffee ❤️ "),e("a",m,[o("https://www.buymeacoffee.com/WongSaang"),l(t)])]),u])}const g=a(f,[["render",p],["__file","buymeacoffee.html.vue"]]);export{g as default}; diff --git a/assets/buymeacoffee.html-22a781eb.js b/assets/buymeacoffee.html-22a781eb.js new file mode 100644 index 0000000..ac93318 --- /dev/null +++ b/assets/buymeacoffee.html-22a781eb.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-603f36a2","path":"/zh/guide/buymeacoffee.html","title":"续杯咖啡","lang":"zh-CN","frontmatter":{},"headers":[],"git":{"updatedTime":1681222096000,"contributors":[{"name":"Rafi","email":"rafiwx@gmail.com","commits":1}]},"filePathRelative":"zh/guide/buymeacoffee.md"}');export{e as data}; diff --git a/assets/buymeacoffee.html-5158290f.js b/assets/buymeacoffee.html-5158290f.js new file mode 100644 index 0000000..4f508ad --- /dev/null +++ b/assets/buymeacoffee.html-5158290f.js @@ -0,0 +1 @@ +import{_ as n}from"./bmc_qr-9db17e16.js";import{_ as a,M as r,p as c,q as s,R as e,t as o,N as _}from"./framework-5866ffd3.js";const l={},f=e("h1",{id:"续杯咖啡",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#续杯咖啡","aria-hidden":"true"},"#"),o(" 续杯咖啡")],-1),i=e("blockquote",null,[e("p",null,"如果这个项目对您有帮助,这也是在帮助我自己。")],-1),m={href:"https://www.buymeacoffee.com/WongSaang",target:"_blank",rel:"noopener noreferrer"},d=e("p",null,[e("img",{src:n,alt:"Buy Me A Coffee"})],-1);function u(h,p){const t=r("ExternalLinkIcon");return c(),s("div",null,[f,i,e("p",null,[o("如果你想支持我,给我续杯咖啡吧 ❤️ "),e("a",m,[o("https://www.buymeacoffee.com/WongSaang"),_(t)])]),d])}const g=a(l,[["render",u],["__file","buymeacoffee.html.vue"]]);export{g as default}; diff --git a/assets/buymeacoffee.html-f20ec2fb.js b/assets/buymeacoffee.html-f20ec2fb.js new file mode 100644 index 0000000..6cbc60c --- /dev/null +++ b/assets/buymeacoffee.html-f20ec2fb.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-eb956884","path":"/guide/buymeacoffee.html","title":"Donation","lang":"en-US","frontmatter":{},"headers":[],"git":{"updatedTime":1681222096000,"contributors":[{"name":"Rafi","email":"rafiwx@gmail.com","commits":1}]},"filePathRelative":"guide/buymeacoffee.md"}');export{e as data}; diff --git a/assets/configuration.html-0ef661b4.js b/assets/configuration.html-0ef661b4.js new file mode 100644 index 0000000..1247491 --- /dev/null +++ b/assets/configuration.html-0ef661b4.js @@ -0,0 +1 @@ +const l=JSON.parse('{"key":"v-81f65e84","path":"/zh/guide/configuration.html","title":"配置参考","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"数据库","slug":"数据库","link":"#数据库","children":[]},{"level":2,"title":"邮箱验证","slug":"邮箱验证","link":"#邮箱验证","children":[]},{"level":2,"title":"API 代理","slug":"api-代理","link":"#api-代理","children":[]},{"level":2,"title":"后端 CSRF 白名单","slug":"后端-csrf-白名单","link":"#后端-csrf-白名单","children":[]},{"level":2,"title":"客户端配置","slug":"客户端配置","link":"#客户端配置","children":[]},{"level":2,"title":"用户注册控制","slug":"用户注册控制","link":"#用户注册控制","children":[]},{"level":2,"title":"网页搜索功能控制","slug":"网页搜索功能控制","link":"#网页搜索功能控制","children":[]},{"level":2,"title":"节俭模式控制","slug":"节俭模式控制","link":"#节俭模式控制","children":[]}],"git":{"updatedTime":1681785875000,"contributors":[{"name":"Rafi","email":"rafiwx@gmail.com","commits":2},{"name":"AI&I","email":"iluozan@126.com","commits":1}]},"filePathRelative":"zh/guide/configuration.md"}');export{l as data}; diff --git a/assets/configuration.html-99825d43.js b/assets/configuration.html-99825d43.js new file mode 100644 index 0000000..984a2a2 --- /dev/null +++ b/assets/configuration.html-99825d43.js @@ -0,0 +1,13 @@ +import{_ as e,p as t,q as d,a1 as a}from"./framework-5866ffd3.js";const r={},i=a(`

配置参考

数据库

后端默认使用内置的 Sqlite 来存储数据,如果不连接外部数据库,数据将在容器销毁后丢失。

chatgpt-ui-wsgi-server 镜像提供环境变量 DB_URL 来配置与外部数据库的连接,以下是 DB_URL 的链接格式对照表。

数据库链接
PostgreSQLpostgres://USER:PASSWORD@HOST:PORT/DATABASE_NAME
MySQLmysql://USER:PASSWORD@HOST:PORT/DATABASE_NAME
SQLitesqlite:///PATH

例如我使用 PostgreSQL,则配置如下:

backend-wsgi-server:
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - DB_URL=postgres://postgres:postgrespw@localhost:49153/chatgpt
+

邮箱验证

如果你开放用户注册功能,并需要向用户发送邮箱激活链接,需要在 wsgi-server 服务中配置以下环境变量:

参数说明默认值
ACCOUNT_EMAIL_VERIFICATION邮箱验证方式,可选值: none, optional, mandatoryoptional
EMAIL_HOSTSMTP 服务器地址smtp.mailgun.org
EMAIL_PORTSMTP 服务器端口号587
EMAIL_HOST_USER用户名-
EMAIL_HOST_PASSWORD密码-
EMAIL_USE_TLS是否加密True
EMAIL_FROM发件邮箱webmaster@localhost

API 代理

如果您的网络无法请求 OpenAI 的 API 地址,您可以在 wsgi-server 服务中配置代理,如何搭建代理服务,需要您自行搜索。

例如:

backend-wsgi-server:
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - OPENAI_API_PROXY=https://openai.proxy.com/v1 # 注意,域名后面需要带上 v1
+

后端 CSRF 白名单

如果你在访问管理后台的时候遇到 CSRF verification failed,可能你的 APP_DOMAIN 没有配置对。在 wsgi-server 服务下有个环境变量 wsgi-server。 它的值应该是 backend-web-server 的地址+端口, 默认: localhost:9000

假如我把 chagpt.com 这个域名解析到了服务器,并且我的 backend-web-server 服务绑定了 9000 这个端口。正确的配置如下:

backend-wsgi-server:
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - APP_DOMAIN=chagpt.com:9000
+

客户端配置

参数说明默认值
SERVER_DOMAIN服务端地址http://backend-web-server
DEFAULT_LOCALE默认语言en
NUXT_PUBLIC_APP_NAME应用名称ChatGPT UI
NUXT_PUBLIC_TYPEWRITER是否开启 打字机 效果[true/false]true
NUXT_PUBLIC_TYPEWRITER_DELAY打字机效果的延迟时间,单位:毫秒50

用户注册控制

部署完整后,在管理后台的 Chat->Setting 下面有 open_registration 设置项,用于控制是否开放用户注册。默认是 True (允许用户注册),如果不需要,请改成 False

网页搜索功能控制

该功能默认处于关闭状态,你可以在管理后台的 Chat->Settings 中开启它,在 Settings 中有一个 open_web_search 的设置项,把它的值设置为 True

节俭模式控制

该功能默认处于开启状态,你可以在管理后台的 Chat->Settings 中关闭它,在 Settings 中有一个 open_frugal_mode_control 的设置项,把它的值设置为 False

`,26),n=[i];function s(c,o){return t(),d("div",null,n)}const l=e(r,[["render",s],["__file","configuration.html.vue"]]);export{l as default}; diff --git a/assets/configuration.html-a7684ba6.js b/assets/configuration.html-a7684ba6.js new file mode 100644 index 0000000..8c5eda0 --- /dev/null +++ b/assets/configuration.html-a7684ba6.js @@ -0,0 +1,13 @@ +import{_ as e,p as t,q as a,a1 as d}from"./framework-5866ffd3.js";const r={},n=d(`

Configuration Reference

Database

By default, the backend uses the built-in Sqlite to store data. If an external database is not connected, the data will be lost after the container is destroyed.

The chatgpt-ui-wsgi-server image provides the environment variable DB_URL to configure the connection to an external database. The following table shows the link format of the DB_URL.

DBLINK
PostgreSQLpostgres://USER:PASSWORD@HOST:PORT/DATABASE_NAME
MySQLmysql://USER:PASSWORD@HOST:PORT/DATABASE_NAME
SQLitesqlite:///PATH

For example, if I am using PostgreSQL, the configuration is as follows:

backend-wsgi-server:
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - DB_URL=postgres://postgres:postgrespw@localhost:49153/chatgpt
+

Email verification

If you open the user registration feature and need to send email activation links to users, you need to configure the following environment variables in the wsgi-server service:

ParametersDescriptionDefault
ACCOUNT_EMAIL_VERIFICATIONE-mail authentication method, optional value: none, optional, mandatoryoptional
EMAIL_HOSTSMTP server addresssmtp.mailgun.org
EMAIL_PORTSMTP server port587
EMAIL_HOST_USERUser name-
EMAIL_HOST_PASSWORDPassword-
EMAIL_USE_TLSWhether to encryptTrue
EMAIL_FROMFrom emailwebmaster@localhost

API Proxy

If you are unable to request the OpenAI API address due to network restrictions, you can configure a proxy in the wsgi-server service. You will need to search for how to set up a proxy server on your own.

For example:

backend-wsgi-server:
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - OPENAI_API_PROXY=https://openai.proxy.com/v1
+

Backend CSRF whitelist

If you encounter CSRF verification failed while accessing the management background, your APP_DOMAIN may not be configured correctly. Under the wsgi-server service, there is an environment variable wsgi-server. Its value should be the address and port of backend-web-server, default: localhost:9000.

Suppose I have resolved the domain name chagpt.com to the server, and my backend-web-server service is bound to port 9000. The correct configuration is as follows:

backend-wsgi-server:
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - APP_DOMAIN=chagpt.com:9000
+

Client Configuration

ParameterDescriptionDefault Value
SERVER_DOMAINServer Addresshttp://backend-web-server
DEFAULT_LOCALEDefault Languageen
NUXT_PUBLIC_APP_NAMEApplication NameChatGPT UI
NUXT_PUBLIC_TYPEWRITEREnable Typewriter Effect [true/false]true
NUXT_PUBLIC_TYPEWRITER_DELAYTypewriter Effect Delay in milliseconds50

User Registration Control

After deployment, there is an open_registration setting under Chat->Settings in the admin panel to control whether user registration is allowed. The default value is True (allowing user registration). If not needed, please change it to False.

Web Search Function Control

This feature is disabled by default. You can enable it in the admin panel under Chat->Settings. There is a setting called open_web_search, set its value to True.

Frugal Mode Control

This feature is enabled by default. You can disable it in the Chat->Settings section of the management backend. There is a setting called open_frugal_mode_control in Settings. Set its value to False.

`,26),i=[n];function o(s,c){return t(),a("div",null,i)}const h=e(r,[["render",o],["__file","configuration.html.vue"]]);export{h as default}; diff --git a/assets/configuration.html-ed512da6.js b/assets/configuration.html-ed512da6.js new file mode 100644 index 0000000..5c12019 --- /dev/null +++ b/assets/configuration.html-ed512da6.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-4f4ccb8f","path":"/guide/configuration.html","title":"Configuration Reference","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Database","slug":"database","link":"#database","children":[]},{"level":2,"title":"Email verification","slug":"email-verification","link":"#email-verification","children":[]},{"level":2,"title":"API Proxy","slug":"api-proxy","link":"#api-proxy","children":[]},{"level":2,"title":"Backend CSRF whitelist","slug":"backend-csrf-whitelist","link":"#backend-csrf-whitelist","children":[]},{"level":2,"title":"Client Configuration","slug":"client-configuration","link":"#client-configuration","children":[]},{"level":2,"title":"User Registration Control","slug":"user-registration-control","link":"#user-registration-control","children":[]},{"level":2,"title":"Web Search Function Control","slug":"web-search-function-control","link":"#web-search-function-control","children":[]},{"level":2,"title":"Frugal Mode Control","slug":"frugal-mode-control","link":"#frugal-mode-control","children":[]}],"git":{"updatedTime":1681785875000,"contributors":[{"name":"Rafi","email":"rafiwx@gmail.com","commits":2},{"name":"AI&I","email":"iluozan@126.com","commits":1}]},"filePathRelative":"guide/configuration.md"}');export{e as data}; diff --git a/assets/development.html-117eb2b5.js b/assets/development.html-117eb2b5.js new file mode 100644 index 0000000..deba35c --- /dev/null +++ b/assets/development.html-117eb2b5.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-531add2c","path":"/guide/development.html","title":"Development Guide","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Front-end","slug":"front-end","link":"#front-end","children":[{"level":3,"title":"Environment Setup","slug":"environment-setup","link":"#environment-setup","children":[]},{"level":3,"title":"Install dependencies","slug":"install-dependencies","link":"#install-dependencies","children":[]},{"level":3,"title":"Start development server","slug":"start-development-server","link":"#start-development-server","children":[]},{"level":3,"title":"Build","slug":"build","link":"#build","children":[]},{"level":3,"title":"Package as a docker image","slug":"package-as-a-docker-image","link":"#package-as-a-docker-image","children":[]}]},{"level":2,"title":"Back-end","slug":"back-end","link":"#back-end","children":[{"level":3,"title":"Environment Setup","slug":"environment-setup-1","link":"#environment-setup-1","children":[]},{"level":3,"title":"Install dependencies","slug":"install-dependencies-1","link":"#install-dependencies-1","children":[]},{"level":3,"title":"Start development server","slug":"start-development-server-1","link":"#start-development-server-1","children":[]},{"level":3,"title":"Package as a docker image","slug":"package-as-a-docker-image-1","link":"#package-as-a-docker-image-1","children":[]}]}],"git":{"updatedTime":1681222096000,"contributors":[{"name":"Rafi","email":"rafiwx@gmail.com","commits":1}]},"filePathRelative":"guide/development.md"}');export{e as data}; diff --git a/assets/development.html-989a2b06.js b/assets/development.html-989a2b06.js new file mode 100644 index 0000000..4fa7313 --- /dev/null +++ b/assets/development.html-989a2b06.js @@ -0,0 +1,8 @@ +import{_ as d,M as i,p as s,q as o,R as a,t as e,N as n,a1 as t}from"./framework-5866ffd3.js";const c={},l=a("h1",{id:"开发指南",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#开发指南","aria-hidden":"true"},"#"),e(" 开发指南")],-1),h=a("h2",{id:"前端",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#前端","aria-hidden":"true"},"#"),e(" 前端")],-1),u={href:"https://vuejs.org/",target:"_blank",rel:"noopener noreferrer"},p={href:"https://nuxt.com/",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/WongSaang/chatgpt-ui",target:"_blank",rel:"noopener noreferrer"},v=t(`

环境准备

安装最新稳定版 node.js,如果需要打包成 docker 镜像,还需要安装 docker。

安装依赖

yarn install
+

启动开发服务

yarn dev
+

构建

yarn build
+

打包成 docker 镜像

docker build -t image-name:latest .
+

后端

`,11),m={href:"https://www.python.org/",target:"_blank",rel:"noopener noreferrer"},x={href:"https://djangoproject.com/",target:"_blank",rel:"noopener noreferrer"},b={href:"https://github.com/WongSaang/chatgpt-ui-server",target:"_blank",rel:"noopener noreferrer"},_=t(`

环境准备

安装Python、pip/pipenv,如果需要打包成 docker 镜像,还需要安装 docker。

安装依赖

pip install -r requirements.txt
+

启动开发服务

python manage.py runserver
+

打包成 docker 镜像

docker build -t image-name:latest .
+
`,8);function f(k,y){const r=i("ExternalLinkIcon");return s(),o("div",null,[l,h,a("p",null,[e("所需技能:"),a("a",u,[e("Vue"),n(r)]),e("、"),a("a",p,[e("Nuxt"),n(r)])]),a("p",null,[e("项目地址:"),a("a",g,[e("https://github.com/WongSaang/chatgpt-ui"),n(r)])]),v,a("p",null,[e("所需技能:"),a("a",m,[e("Python"),n(r)]),e("、"),a("a",x,[e("Django"),n(r)])]),a("p",null,[e("项目地址:"),a("a",b,[e("https://github.com/WongSaang/chatgpt-ui-server"),n(r)])]),_])}const j=d(c,[["render",f],["__file","development.html.vue"]]);export{j as default}; diff --git a/assets/development.html-b8d21bb5.js b/assets/development.html-b8d21bb5.js new file mode 100644 index 0000000..08efeb0 --- /dev/null +++ b/assets/development.html-b8d21bb5.js @@ -0,0 +1 @@ +const l=JSON.parse('{"key":"v-1d0fd34e","path":"/zh/guide/development.html","title":"开发指南","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"前端","slug":"前端","link":"#前端","children":[{"level":3,"title":"环境准备","slug":"环境准备","link":"#环境准备","children":[]},{"level":3,"title":"安装依赖","slug":"安装依赖","link":"#安装依赖","children":[]},{"level":3,"title":"启动开发服务","slug":"启动开发服务","link":"#启动开发服务","children":[]},{"level":3,"title":"构建","slug":"构建","link":"#构建","children":[]},{"level":3,"title":"打包成 docker 镜像","slug":"打包成-docker-镜像","link":"#打包成-docker-镜像","children":[]}]},{"level":2,"title":"后端","slug":"后端","link":"#后端","children":[{"level":3,"title":"环境准备","slug":"环境准备-1","link":"#环境准备-1","children":[]},{"level":3,"title":"安装依赖","slug":"安装依赖-1","link":"#安装依赖-1","children":[]},{"level":3,"title":"启动开发服务","slug":"启动开发服务-1","link":"#启动开发服务-1","children":[]},{"level":3,"title":"打包成 docker 镜像","slug":"打包成-docker-镜像-1","link":"#打包成-docker-镜像-1","children":[]}]}],"git":{"updatedTime":1681222096000,"contributors":[{"name":"Rafi","email":"rafiwx@gmail.com","commits":1}]},"filePathRelative":"zh/guide/development.md"}');export{l as data}; diff --git a/assets/development.html-df5e9336.js b/assets/development.html-df5e9336.js new file mode 100644 index 0000000..10035f7 --- /dev/null +++ b/assets/development.html-df5e9336.js @@ -0,0 +1,8 @@ +import{_ as d,M as i,p as s,q as o,R as a,t as e,N as t,a1 as r}from"./framework-5866ffd3.js";const l={},c=a("h1",{id:"development-guide",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#development-guide","aria-hidden":"true"},"#"),e(" Development Guide")],-1),h=a("h2",{id:"front-end",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#front-end","aria-hidden":"true"},"#"),e(" Front-end")],-1),u={href:"https://vuejs.org/",target:"_blank",rel:"noopener noreferrer"},p={href:"https://nuxt.com/",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/WongSaang/chatgpt-ui",target:"_blank",rel:"noopener noreferrer"},v=r(`

Environment Setup

Install the latest stable version of node.js. If you need to package it as a docker image, you also need to install docker.

Install dependencies

yarn install
+

Start development server

yarn dev
+

Build

yarn build
+

Package as a docker image

docker build -t image-name:latest .
+

Back-end

`,11),m={href:"https://www.python.org/",target:"_blank",rel:"noopener noreferrer"},b={href:"https://djangoproject.com/",target:"_blank",rel:"noopener noreferrer"},x={href:"https://github.com/WongSaang/chatgpt-ui-server",target:"_blank",rel:"noopener noreferrer"},_=r(`

Environment Setup

Install Python, pip/pipenv. If you need to package it as a docker image, you also need to install docker.

Install dependencies

pip install -r requirements.txt
+

Start development server

python manage.py runserver
+

Package as a docker image

docker build -t image-name:latest .
+
`,8);function f(k,y){const n=i("ExternalLinkIcon");return s(),o("div",null,[c,h,a("p",null,[e("Required skills: "),a("a",u,[e("Vue"),t(n)]),e(", "),a("a",p,[e("Nuxt"),t(n)])]),a("p",null,[e("Project address: "),a("a",g,[e("https://github.com/WongSaang/chatgpt-ui"),t(n)])]),v,a("p",null,[e("Required skills: "),a("a",m,[e("Python"),t(n)]),e(", "),a("a",b,[e("Django"),t(n)])]),a("p",null,[e("Project address: "),a("a",x,[e("https://github.com/WongSaang/chatgpt-ui-server"),t(n)])]),_])}const I=d(l,[["render",f],["__file","development.html.vue"]]);export{I as default}; diff --git a/assets/framework-5866ffd3.js b/assets/framework-5866ffd3.js new file mode 100644 index 0000000..843872a --- /dev/null +++ b/assets/framework-5866ffd3.js @@ -0,0 +1,5 @@ +function fs(e,t){const n=Object.create(null),s=e.split(",");for(let r=0;r!!n[r.toLowerCase()]:r=>!!n[r]}function as(e){if(D(e)){const t={};for(let n=0;n{if(n){const s=n.split(zi);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function ds(e){let t="";if(pe(e))t=e;else if(D(e))for(let n=0;npe(e)?e:e==null?"":D(e)||ue(e)&&(e.toString===Lr||!V(e.toString))?JSON.stringify(e,Ir,2):String(e),Ir=(e,t)=>t&&t.__v_isRef?Ir(e,t.value):wt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r])=>(n[`${s} =>`]=r,n),{})}:Nr(t)?{[`Set(${t.size})`]:[...t.values()]}:ue(t)&&!D(t)&&!kr(t)?String(t):t,ce={},Ct=[],He=()=>{},Zi=()=>!1,Gi=/^on[^a-z]/,Gt=e=>Gi.test(e),hs=e=>e.startsWith("onUpdate:"),_e=Object.assign,ps=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},eo=Object.prototype.hasOwnProperty,te=(e,t)=>eo.call(e,t),D=Array.isArray,wt=e=>Pn(e)==="[object Map]",Nr=e=>Pn(e)==="[object Set]",V=e=>typeof e=="function",pe=e=>typeof e=="string",gs=e=>typeof e=="symbol",ue=e=>e!==null&&typeof e=="object",Fr=e=>ue(e)&&V(e.then)&&V(e.catch),Lr=Object.prototype.toString,Pn=e=>Lr.call(e),to=e=>Pn(e).slice(8,-1),kr=e=>Pn(e)==="[object Object]",ms=e=>pe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Dt=fs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),An=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},no=/-(\w)/g,We=An(e=>e.replace(no,(t,n)=>n?n.toUpperCase():"")),so=/\B([A-Z])/g,_t=An(e=>e.replace(so,"-$1").toLowerCase()),Tn=An(e=>e.charAt(0).toUpperCase()+e.slice(1)),$n=An(e=>e?`on${Tn(e)}`:""),zt=(e,t)=>!Object.is(e,t),Hn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},ro=e=>{const t=parseFloat(e);return isNaN(t)?e:t},io=e=>{const t=pe(e)?Number(e):NaN;return isNaN(t)?e:t};let ks;const oo=()=>ks||(ks=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});let Pe;class lo{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Pe,!t&&Pe&&(this.index=(Pe.scopes||(Pe.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Pe;try{return Pe=this,t()}finally{Pe=n}}}on(){Pe=this}off(){Pe=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},$r=e=>(e.w&rt)>0,Hr=e=>(e.n&rt)>0,fo=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(f==="length"||f>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(o.get(n)),t){case"add":D(e)?ms(n)&&l.push(o.get("length")):(l.push(o.get(gt)),wt(e)&&l.push(o.get(Xn)));break;case"delete":D(e)||(l.push(o.get(gt)),wt(e)&&l.push(o.get(Xn)));break;case"set":wt(e)&&l.push(o.get(gt));break}if(l.length===1)l[0]&&Zn(l[0]);else{const c=[];for(const a of l)a&&c.push(...a);Zn(_s(c))}}function Zn(e,t){const n=D(e)?e:[...e];for(const s of n)s.computed&&Hs(s);for(const s of n)s.computed||Hs(s)}function Hs(e,t){(e!==ke||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function ho(e,t){var n;return(n=yn.get(e))===null||n===void 0?void 0:n.get(t)}const po=fs("__proto__,__v_isRef,__isVue"),Dr=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(gs)),go=bs(),mo=bs(!1,!0),_o=bs(!0),js=yo();function yo(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=ne(this);for(let i=0,o=this.length;i{e[t]=function(...n){Ft();const s=ne(this)[t].apply(this,n);return Lt(),s}}),e}function bo(e){const t=ne(this);return xe(t,"has",e),t.hasOwnProperty(e)}function bs(e=!1,t=!1){return function(s,r,i){if(r==="__v_isReactive")return!e;if(r==="__v_isReadonly")return e;if(r==="__v_isShallow")return t;if(r==="__v_raw"&&i===(e?t?Lo:Vr:t?qr:Wr).get(s))return s;const o=D(s);if(!e){if(o&&te(js,r))return Reflect.get(js,r,i);if(r==="hasOwnProperty")return bo}const l=Reflect.get(s,r,i);return(gs(r)?Dr.has(r):po(r))||(e||xe(s,"get",r),t)?l:ge(l)?o&&ms(r)?l:l.value:ue(l)?e?zr(l):en(l):l}}const vo=Ur(),Eo=Ur(!0);function Ur(e=!1){return function(n,s,r,i){let o=n[s];if(Tt(o)&&ge(o)&&!ge(r))return!1;if(!e&&(!bn(r)&&!Tt(r)&&(o=ne(o),r=ne(r)),!D(n)&&ge(o)&&!ge(r)))return o.value=r,!0;const l=D(n)&&ms(s)?Number(s)e,On=e=>Reflect.getPrototypeOf(e);function rn(e,t,n=!1,s=!1){e=e.__v_raw;const r=ne(e),i=ne(t);n||(t!==i&&xe(r,"get",t),xe(r,"get",i));const{has:o}=On(r),l=s?vs:n?ws:Qt;if(o.call(r,t))return l(e.get(t));if(o.call(r,i))return l(e.get(i));e!==r&&e.get(t)}function on(e,t=!1){const n=this.__v_raw,s=ne(n),r=ne(e);return t||(e!==r&&xe(s,"has",e),xe(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function ln(e,t=!1){return e=e.__v_raw,!t&&xe(ne(e),"iterate",gt),Reflect.get(e,"size",e)}function Bs(e){e=ne(e);const t=ne(this);return On(t).has.call(t,e)||(t.add(e),ze(t,"add",e,e)),this}function Ds(e,t){t=ne(t);const n=ne(this),{has:s,get:r}=On(n);let i=s.call(n,e);i||(e=ne(e),i=s.call(n,e));const o=r.call(n,e);return n.set(e,t),i?zt(t,o)&&ze(n,"set",e,t):ze(n,"add",e,t),this}function Us(e){const t=ne(this),{has:n,get:s}=On(t);let r=n.call(t,e);r||(e=ne(e),r=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return r&&ze(t,"delete",e,void 0),i}function Ks(){const e=ne(this),t=e.size!==0,n=e.clear();return t&&ze(e,"clear",void 0,void 0),n}function cn(e,t){return function(s,r){const i=this,o=i.__v_raw,l=ne(o),c=t?vs:e?ws:Qt;return!e&&xe(l,"iterate",gt),o.forEach((a,f)=>s.call(r,c(a),c(f),i))}}function un(e,t,n){return function(...s){const r=this.__v_raw,i=ne(r),o=wt(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,a=r[e](...s),f=n?vs:t?ws:Qt;return!t&&xe(i,"iterate",c?Xn:gt),{next(){const{value:h,done:p}=a.next();return p?{value:h,done:p}:{value:l?[f(h[0]),f(h[1])]:f(h),done:p}},[Symbol.iterator](){return this}}}}function Ye(e){return function(...t){return e==="delete"?!1:this}}function Ao(){const e={get(i){return rn(this,i)},get size(){return ln(this)},has:on,add:Bs,set:Ds,delete:Us,clear:Ks,forEach:cn(!1,!1)},t={get(i){return rn(this,i,!1,!0)},get size(){return ln(this)},has:on,add:Bs,set:Ds,delete:Us,clear:Ks,forEach:cn(!1,!0)},n={get(i){return rn(this,i,!0)},get size(){return ln(this,!0)},has(i){return on.call(this,i,!0)},add:Ye("add"),set:Ye("set"),delete:Ye("delete"),clear:Ye("clear"),forEach:cn(!0,!1)},s={get(i){return rn(this,i,!0,!0)},get size(){return ln(this,!0)},has(i){return on.call(this,i,!0)},add:Ye("add"),set:Ye("set"),delete:Ye("delete"),clear:Ye("clear"),forEach:cn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=un(i,!1,!1),n[i]=un(i,!0,!1),t[i]=un(i,!1,!0),s[i]=un(i,!0,!0)}),[e,n,t,s]}const[To,Oo,So,Mo]=Ao();function Es(e,t){const n=t?e?Mo:So:e?Oo:To;return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(te(n,r)&&r in s?n:s,r,i)}const Io={get:Es(!1,!1)},No={get:Es(!1,!0)},Fo={get:Es(!0,!1)},Wr=new WeakMap,qr=new WeakMap,Vr=new WeakMap,Lo=new WeakMap;function ko(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function $o(e){return e.__v_skip||!Object.isExtensible(e)?0:ko(to(e))}function en(e){return Tt(e)?e:Cs(e,!1,Kr,Io,Wr)}function Ho(e){return Cs(e,!1,Po,No,qr)}function zr(e){return Cs(e,!0,Ro,Fo,Vr)}function Cs(e,t,n,s,r){if(!ue(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=$o(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function xt(e){return Tt(e)?xt(e.__v_raw):!!(e&&e.__v_isReactive)}function Tt(e){return!!(e&&e.__v_isReadonly)}function bn(e){return!!(e&&e.__v_isShallow)}function Qr(e){return xt(e)||Tt(e)}function ne(e){const t=e&&e.__v_raw;return t?ne(t):e}function Yr(e){return _n(e,"__v_skip",!0),e}const Qt=e=>ue(e)?en(e):e,ws=e=>ue(e)?zr(e):e;function Jr(e){nt&&ke&&(e=ne(e),Br(e.dep||(e.dep=_s())))}function Xr(e,t){e=ne(e);const n=e.dep;n&&Zn(n)}function ge(e){return!!(e&&e.__v_isRef===!0)}function hn(e){return Zr(e,!1)}function jo(e){return Zr(e,!0)}function Zr(e,t){return ge(e)?e:new Bo(e,t)}class Bo{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:ne(t),this._value=n?t:Qt(t)}get value(){return Jr(this),this._value}set value(t){const n=this.__v_isShallow||bn(t)||Tt(t);t=n?t:ne(t),zt(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Qt(t),Xr(this))}}function Rt(e){return ge(e)?e.value:e}const Do={get:(e,t,n)=>Rt(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ge(r)&&!ge(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Gr(e){return xt(e)?e:new Proxy(e,Do)}function Su(e){const t=D(e)?new Array(e.length):{};for(const n in e)t[n]=Ko(e,n);return t}class Uo{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return ho(ne(this._object),this._key)}}function Ko(e,t,n){const s=e[t];return ge(s)?s:new Uo(e,t,n)}var ei;class Wo{constructor(t,n,s,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this[ei]=!1,this._dirty=!0,this.effect=new ys(t,()=>{this._dirty||(this._dirty=!0,Xr(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=ne(this);return Jr(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}ei="__v_isReadonly";function qo(e,t,n=!1){let s,r;const i=V(e);return i?(s=e,r=He):(s=e.get,r=e.set),new Wo(s,r,i||!r,n)}function st(e,t,n,s){let r;try{r=s?e(...s):e()}catch(i){tn(i,t,n)}return r}function Me(e,t,n,s){if(V(e)){const i=st(e,t,n,s);return i&&Fr(i)&&i.catch(o=>{tn(o,t,n)}),i}const r=[];for(let i=0;i>>1;Jt(be[s])Ke&&be.splice(t,1)}function Yo(e){D(e)?Pt.push(...e):(!Ve||!Ve.includes(e,e.allowRecurse?at+1:at))&&Pt.push(e),si()}function Ws(e,t=Yt?Ke+1:0){for(;tJt(n)-Jt(s)),at=0;ate.id==null?1/0:e.id,Jo=(e,t)=>{const n=Jt(e)-Jt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function ri(e){Gn=!1,Yt=!0,be.sort(Jo);const t=He;try{for(Ke=0;Kepe(_)?_.trim():_)),h&&(r=n.map(ro))}let l,c=s[l=$n(t)]||s[l=$n(We(t))];!c&&i&&(c=s[l=$n(_t(t))]),c&&Me(c,e,6,r);const a=s[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Me(a,e,6,r)}}function ii(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!V(e)){const c=a=>{const f=ii(a,t,!0);f&&(l=!0,_e(o,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ue(e)&&s.set(e,null),null):(D(i)?i.forEach(c=>o[c]=null):_e(o,i),ue(e)&&s.set(e,o),o)}function Mn(e,t){return!e||!Gt(t)?!1:(t=t.slice(2).replace(/Once$/,""),te(e,t[0].toLowerCase()+t.slice(1))||te(e,_t(t))||te(e,t))}let me=null,oi=null;function En(e){const t=me;return me=e,oi=e&&e.type.__scopeId||null,t}function Zo(e,t=me,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&er(-1);const i=En(t);let o;try{o=e(...r)}finally{En(i),s._d&&er(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function jn(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:i,propsOptions:[o],slots:l,attrs:c,emit:a,render:f,renderCache:h,data:p,setupState:_,ctx:C,inheritAttrs:A}=e;let k,g;const y=En(e);try{if(n.shapeFlag&4){const $=r||s;k=Le(f.call($,$,h,i,_,p,C)),g=c}else{const $=t;k=Le($.length>1?$(i,{attrs:c,slots:l,emit:a}):$(i,null)),g=t.props?c:Go(c)}}catch($){Wt.length=0,tn($,e,1),k=de(Ae)}let P=k;if(g&&A!==!1){const $=Object.keys(g),{shapeFlag:U}=P;$.length&&U&7&&(o&&$.some(hs)&&(g=el(g,o)),P=it(P,g))}return n.dirs&&(P=it(P),P.dirs=P.dirs?P.dirs.concat(n.dirs):n.dirs),n.transition&&(P.transition=n.transition),k=P,En(y),k}const Go=e=>{let t;for(const n in e)(n==="class"||n==="style"||Gt(n))&&((t||(t={}))[n]=e[n]);return t},el=(e,t)=>{const n={};for(const s in e)(!hs(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function tl(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,a=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?qs(s,o,a):!!o;if(c&8){const f=t.dynamicProps;for(let h=0;he.__isSuspense;function li(e,t){t&&t.pendingBranch?D(e)?t.effects.push(...e):t.effects.push(e):Yo(e)}function pn(e,t){if(ae){let n=ae.provides;const s=ae.parent&&ae.parent.provides;s===n&&(n=ae.provides=Object.create(s)),n[e]=t}}function je(e,t,n=!1){const s=ae||me;if(s){const r=s.parent==null?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides;if(r&&e in r)return r[e];if(arguments.length>1)return n&&V(t)?t.call(s.proxy):t}}function Mu(e,t){return Rs(e,null,t)}const fn={};function gn(e,t,n){return Rs(e,t,n)}function Rs(e,t,{immediate:n,deep:s,flush:r,onTrack:i,onTrigger:o}=ce){const l=uo()===(ae==null?void 0:ae.scope)?ae:null;let c,a=!1,f=!1;if(ge(e)?(c=()=>e.value,a=bn(e)):xt(e)?(c=()=>e,s=!0):D(e)?(f=!0,a=e.some(P=>xt(P)||bn(P)),c=()=>e.map(P=>{if(ge(P))return P.value;if(xt(P))return pt(P);if(V(P))return st(P,l,2)})):V(e)?t?c=()=>st(e,l,2):c=()=>{if(!(l&&l.isUnmounted))return h&&h(),Me(e,l,3,[p])}:c=He,t&&s){const P=c;c=()=>pt(P())}let h,p=P=>{h=g.onStop=()=>{st(P,l,4)}},_;if(Mt)if(p=He,t?n&&Me(t,l,3,[c(),f?[]:void 0,p]):c(),r==="sync"){const P=Zl();_=P.__watcherHandles||(P.__watcherHandles=[])}else return He;let C=f?new Array(e.length).fill(fn):fn;const A=()=>{if(g.active)if(t){const P=g.run();(s||a||(f?P.some(($,U)=>zt($,C[U])):zt(P,C)))&&(h&&h(),Me(t,l,3,[P,C===fn?void 0:f&&C[0]===fn?[]:C,p]),C=P)}else g.run()};A.allowRecurse=!!t;let k;r==="sync"?k=A:r==="post"?k=()=>Ce(A,l&&l.suspense):(A.pre=!0,l&&(A.id=l.uid),k=()=>Sn(A));const g=new ys(c,k);t?n?A():C=g.run():r==="post"?Ce(g.run.bind(g),l&&l.suspense):g.run();const y=()=>{g.stop(),l&&l.scope&&ps(l.scope.effects,g)};return _&&_.push(y),y}function rl(e,t,n){const s=this.proxy,r=pe(e)?e.includes(".")?ci(s,e):()=>s[e]:e.bind(s,s);let i;V(t)?i=t:(i=t.handler,n=t);const o=ae;St(this);const l=Rs(r,i.bind(s),n);return o?St(o):mt(),l}function ci(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r{pt(n,t)});else if(kr(e))for(const n in e)pt(e[n],t);return e}function il(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return hi(()=>{e.isMounted=!0}),pi(()=>{e.isUnmounting=!0}),e}const Te=[Function,Array],ol={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Te,onEnter:Te,onAfterEnter:Te,onEnterCancelled:Te,onBeforeLeave:Te,onLeave:Te,onAfterLeave:Te,onLeaveCancelled:Te,onBeforeAppear:Te,onAppear:Te,onAfterAppear:Te,onAppearCancelled:Te},setup(e,{slots:t}){const n=Wl(),s=il();let r;return()=>{const i=t.default&&ai(t.default(),!0);if(!i||!i.length)return;let o=i[0];if(i.length>1){for(const A of i)if(A.type!==Ae){o=A;break}}const l=ne(e),{mode:c}=l;if(s.isLeaving)return Bn(o);const a=Vs(o);if(!a)return Bn(o);const f=es(a,l,s,n);ts(a,f);const h=n.subTree,p=h&&Vs(h);let _=!1;const{getTransitionKey:C}=a.type;if(C){const A=C();r===void 0?r=A:A!==r&&(r=A,_=!0)}if(p&&p.type!==Ae&&(!dt(a,p)||_)){const A=es(p,l,s,n);if(ts(p,A),c==="out-in")return s.isLeaving=!0,A.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},Bn(o);c==="in-out"&&a.type!==Ae&&(A.delayLeave=(k,g,y)=>{const P=fi(s,p);P[String(p.key)]=p,k._leaveCb=()=>{g(),k._leaveCb=void 0,delete f.delayedLeave},f.delayedLeave=y})}return o}}},ui=ol;function fi(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function es(e,t,n,s){const{appear:r,mode:i,persisted:o=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:f,onBeforeLeave:h,onLeave:p,onAfterLeave:_,onLeaveCancelled:C,onBeforeAppear:A,onAppear:k,onAfterAppear:g,onAppearCancelled:y}=t,P=String(e.key),$=fi(n,e),U=(S,q)=>{S&&Me(S,s,9,q)},J=(S,q)=>{const K=q[1];U(S,q),D(S)?S.every(Z=>Z.length<=1)&&K():S.length<=1&&K()},z={mode:i,persisted:o,beforeEnter(S){let q=l;if(!n.isMounted)if(r)q=A||l;else return;S._leaveCb&&S._leaveCb(!0);const K=$[P];K&&dt(e,K)&&K.el._leaveCb&&K.el._leaveCb(),U(q,[S])},enter(S){let q=c,K=a,Z=f;if(!n.isMounted)if(r)q=k||c,K=g||a,Z=y||f;else return;let N=!1;const Q=S._enterCb=L=>{N||(N=!0,L?U(Z,[S]):U(K,[S]),z.delayedLeave&&z.delayedLeave(),S._enterCb=void 0)};q?J(q,[S,Q]):Q()},leave(S,q){const K=String(e.key);if(S._enterCb&&S._enterCb(!0),n.isUnmounting)return q();U(h,[S]);let Z=!1;const N=S._leaveCb=Q=>{Z||(Z=!0,q(),Q?U(C,[S]):U(_,[S]),S._leaveCb=void 0,$[K]===e&&delete $[K])};$[K]=e,p?J(p,[S,N]):N()},clone(S){return es(S,t,n,s)}};return z}function Bn(e){if(nn(e))return e=it(e),e.children=null,e}function Vs(e){return nn(e)?e.children?e.children[0]:void 0:e}function ts(e,t){e.shapeFlag&6&&e.component?ts(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 ai(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;i!!e.type.__asyncLoader;function Iu(e){V(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,timeout:i,suspensible:o=!0,onError:l}=e;let c=null,a,f=0;const h=()=>(f++,c=null,p()),p=()=>{let _;return c||(_=c=t().catch(C=>{if(C=C instanceof Error?C:new Error(String(C)),l)return new Promise((A,k)=>{l(C,()=>A(h()),()=>k(C),f+1)});throw C}).then(C=>_!==c&&c?c:(C&&(C.__esModule||C[Symbol.toStringTag]==="Module")&&(C=C.default),a=C,C)))};return Ps({name:"AsyncComponentWrapper",__asyncLoader:p,get __asyncResolved(){return a},setup(){const _=ae;if(a)return()=>Dn(a,_);const C=y=>{c=null,tn(y,_,13,!s)};if(o&&_.suspense||Mt)return p().then(y=>()=>Dn(y,_)).catch(y=>(C(y),()=>s?de(s,{error:y}):null));const A=hn(!1),k=hn(),g=hn(!!r);return r&&setTimeout(()=>{g.value=!1},r),i!=null&&setTimeout(()=>{if(!A.value&&!k.value){const y=new Error(`Async component timed out after ${i}ms.`);C(y),k.value=y}},i),p().then(()=>{A.value=!0,_.parent&&nn(_.parent.vnode)&&Sn(_.parent.update)}).catch(y=>{C(y),k.value=y}),()=>{if(A.value&&a)return Dn(a,_);if(k.value&&s)return de(s,{error:k.value});if(n&&!g.value)return de(n)}}})}function Dn(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=de(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const nn=e=>e.type.__isKeepAlive;function ll(e,t){di(e,"a",t)}function cl(e,t){di(e,"da",t)}function di(e,t,n=ae){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(In(t,s,n),n){let r=n.parent;for(;r&&r.parent;)nn(r.parent.vnode)&&ul(s,t,n,r),r=r.parent}}function ul(e,t,n,s){const r=In(t,e,s,!0);gi(()=>{ps(s[t],r)},n)}function In(e,t,n=ae,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;Ft(),St(n);const l=Me(t,n,e,o);return mt(),Lt(),l});return s?r.unshift(i):r.push(i),i}}const Qe=e=>(t,n=ae)=>(!Mt||e==="sp")&&In(e,(...s)=>t(...s),n),fl=Qe("bm"),hi=Qe("m"),al=Qe("bu"),dl=Qe("u"),pi=Qe("bum"),gi=Qe("um"),hl=Qe("sp"),pl=Qe("rtg"),gl=Qe("rtc");function ml(e,t=ae){In("ec",e,t)}function Nu(e,t){const n=me;if(n===null)return e;const s=Fn(n)||n.proxy,r=e.dirs||(e.dirs=[]);for(let i=0;it(o,l,void 0,i&&i[l]));else{const o=Object.keys(e);r=new Array(o.length);for(let l=0,c=o.length;lxn(t)?!(t.type===Ae||t.type===we&&!_i(t.children)):!0)?e:null}const ns=e=>e?Ii(e)?Fn(e)||e.proxy:ns(e.parent):null,Ut=_e(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=>ns(e.parent),$root:e=>ns(e.root),$emit:e=>e.emit,$options:e=>As(e),$forceUpdate:e=>e.f||(e.f=()=>Sn(e.update)),$nextTick:e=>e.n||(e.n=ni.bind(e.proxy)),$watch:e=>rl.bind(e)}),Un=(e,t)=>e!==ce&&!e.__isScriptSetup&&te(e,t),bl={get({_:e},t){const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const _=o[t];if(_!==void 0)switch(_){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(Un(s,t))return o[t]=1,s[t];if(r!==ce&&te(r,t))return o[t]=2,r[t];if((a=e.propsOptions[0])&&te(a,t))return o[t]=3,i[t];if(n!==ce&&te(n,t))return o[t]=4,n[t];ss&&(o[t]=0)}}const f=Ut[t];let h,p;if(f)return t==="$attrs"&&xe(e,"get",t),f(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==ce&&te(n,t))return o[t]=4,n[t];if(p=c.config.globalProperties,te(p,t))return p[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return Un(r,t)?(r[t]=n,!0):s!==ce&&te(s,t)?(s[t]=n,!0):te(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}},o){let l;return!!n[o]||e!==ce&&te(e,o)||Un(t,o)||(l=i[0])&&te(l,o)||te(s,o)||te(Ut,o)||te(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:te(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};let ss=!0;function vl(e){const t=As(e),n=e.proxy,s=e.ctx;ss=!1,t.beforeCreate&&Qs(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:a,created:f,beforeMount:h,mounted:p,beforeUpdate:_,updated:C,activated:A,deactivated:k,beforeDestroy:g,beforeUnmount:y,destroyed:P,unmounted:$,render:U,renderTracked:J,renderTriggered:z,errorCaptured:S,serverPrefetch:q,expose:K,inheritAttrs:Z,components:N,directives:Q,filters:L}=t;if(a&&El(a,s,null,e.appContext.config.unwrapInjectedRef),o)for(const oe in o){const re=o[oe];V(re)&&(s[oe]=re.bind(n))}if(r){const oe=r.call(n,n);ue(oe)&&(e.data=en(oe))}if(ss=!0,i)for(const oe in i){const re=i[oe],Ie=V(re)?re.bind(n,n):V(re.get)?re.get.bind(n,n):He,ot=!V(re)&&V(re.set)?re.set.bind(n):He,Ne=Se({get:Ie,set:ot});Object.defineProperty(s,oe,{enumerable:!0,configurable:!0,get:()=>Ne.value,set:Ee=>Ne.value=Ee})}if(l)for(const oe in l)yi(l[oe],s,n,oe);if(c){const oe=V(c)?c.call(n):c;Reflect.ownKeys(oe).forEach(re=>{pn(re,oe[re])})}f&&Qs(f,e,"c");function G(oe,re){D(re)?re.forEach(Ie=>oe(Ie.bind(n))):re&&oe(re.bind(n))}if(G(fl,h),G(hi,p),G(al,_),G(dl,C),G(ll,A),G(cl,k),G(ml,S),G(gl,J),G(pl,z),G(pi,y),G(gi,$),G(hl,q),D(K))if(K.length){const oe=e.exposed||(e.exposed={});K.forEach(re=>{Object.defineProperty(oe,re,{get:()=>n[re],set:Ie=>n[re]=Ie})})}else e.exposed||(e.exposed={});U&&e.render===He&&(e.render=U),Z!=null&&(e.inheritAttrs=Z),N&&(e.components=N),Q&&(e.directives=Q)}function El(e,t,n=He,s=!1){D(e)&&(e=rs(e));for(const r in e){const i=e[r];let o;ue(i)?"default"in i?o=je(i.from||r,i.default,!0):o=je(i.from||r):o=je(i),ge(o)&&s?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:l=>o.value=l}):t[r]=o}}function Qs(e,t,n){Me(D(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function yi(e,t,n,s){const r=s.includes(".")?ci(n,s):()=>n[s];if(pe(e)){const i=t[e];V(i)&&gn(r,i)}else if(V(e))gn(r,e.bind(n));else if(ue(e))if(D(e))e.forEach(i=>yi(i,t,n,s));else{const i=V(e.handler)?e.handler.bind(n):t[e.handler];V(i)&&gn(r,i,e)}}function As(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(a=>Cn(c,a,o,!0)),Cn(c,t,o)),ue(t)&&i.set(t,c),c}function Cn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Cn(e,i,n,!0),r&&r.forEach(o=>Cn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Cl[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Cl={data:Ys,props:ft,emits:ft,methods:ft,computed:ft,beforeCreate:ve,created:ve,beforeMount:ve,mounted:ve,beforeUpdate:ve,updated:ve,beforeDestroy:ve,beforeUnmount:ve,destroyed:ve,unmounted:ve,activated:ve,deactivated:ve,errorCaptured:ve,serverPrefetch:ve,components:ft,directives:ft,watch:xl,provide:Ys,inject:wl};function Ys(e,t){return t?e?function(){return _e(V(e)?e.call(this,this):e,V(t)?t.call(this,this):t)}:t:e}function wl(e,t){return ft(rs(e),rs(t))}function rs(e){if(D(e)){const t={};for(let n=0;n0)&&!(o&16)){if(o&8){const f=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[p,_]=vi(h,t,!0);_e(o,p),_&&l.push(..._)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!i&&!c)return ue(e)&&s.set(e,Ct),Ct;if(D(i))for(let f=0;f-1,_[1]=A<0||C-1||te(_,"default"))&&l.push(h)}}}const a=[o,l];return ue(e)&&s.set(e,a),a}function Js(e){return e[0]!=="$"}function Xs(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function Zs(e,t){return Xs(e)===Xs(t)}function Gs(e,t){return D(t)?t.findIndex(n=>Zs(n,e)):V(t)&&Zs(t,e)?0:-1}const Ei=e=>e[0]==="_"||e==="$stable",Ts=e=>D(e)?e.map(Le):[Le(e)],Al=(e,t,n)=>{if(t._n)return t;const s=Zo((...r)=>Ts(t(...r)),n);return s._c=!1,s},Ci=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Ei(r))continue;const i=e[r];if(V(i))t[r]=Al(r,i,s);else if(i!=null){const o=Ts(i);t[r]=()=>o}}},wi=(e,t)=>{const n=Ts(t);e.slots.default=()=>n},Tl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=ne(t),_n(t,"_",n)):Ci(t,e.slots={})}else e.slots={},t&&wi(e,t);_n(e.slots,Nn,1)},Ol=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=ce;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(_e(r,t),!n&&l===1&&delete r._):(i=!t.$stable,Ci(t,r)),o=t}else t&&(wi(e,t),o={default:1});if(i)for(const l in r)!Ei(l)&&!(l in o)&&delete r[l]};function xi(){return{app:null,config:{isNativeTag:Zi,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 Sl=0;function Ml(e,t){return function(s,r=null){V(s)||(s=Object.assign({},s)),r!=null&&!ue(r)&&(r=null);const i=xi(),o=new Set;let l=!1;const c=i.app={_uid:Sl++,_component:s,_props:r,_container:null,_context:i,_instance:null,version:Gl,get config(){return i.config},set config(a){},use(a,...f){return o.has(a)||(a&&V(a.install)?(o.add(a),a.install(c,...f)):V(a)&&(o.add(a),a(c,...f))),c},mixin(a){return i.mixins.includes(a)||i.mixins.push(a),c},component(a,f){return f?(i.components[a]=f,c):i.components[a]},directive(a,f){return f?(i.directives[a]=f,c):i.directives[a]},mount(a,f,h){if(!l){const p=de(s,r);return p.appContext=i,f&&t?t(p,a):e(p,a,h),l=!0,c._container=a,a.__vue_app__=c,Fn(p.component)||p.component.proxy}},unmount(){l&&(e(null,c._container),delete c._container.__vue_app__)},provide(a,f){return i.provides[a]=f,c}};return c}}function wn(e,t,n,s,r=!1){if(D(e)){e.forEach((p,_)=>wn(p,t&&(D(t)?t[_]:t),n,s,r));return}if(At(s)&&!r)return;const i=s.shapeFlag&4?Fn(s.component)||s.component.proxy:s.el,o=r?null:i,{i:l,r:c}=e,a=t&&t.r,f=l.refs===ce?l.refs={}:l.refs,h=l.setupState;if(a!=null&&a!==c&&(pe(a)?(f[a]=null,te(h,a)&&(h[a]=null)):ge(a)&&(a.value=null)),V(c))st(c,l,12,[o,f]);else{const p=pe(c),_=ge(c);if(p||_){const C=()=>{if(e.f){const A=p?te(h,c)?h[c]:f[c]:c.value;r?D(A)&&ps(A,i):D(A)?A.includes(i)||A.push(i):p?(f[c]=[i],te(h,c)&&(h[c]=f[c])):(c.value=[i],e.k&&(f[e.k]=c.value))}else p?(f[c]=o,te(h,c)&&(h[c]=o)):_&&(c.value=o,e.k&&(f[e.k]=o))};o?(C.id=-1,Ce(C,n)):C()}}}let Je=!1;const an=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",dn=e=>e.nodeType===8;function Il(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:a}}=e,f=(g,y)=>{if(!y.hasChildNodes()){n(null,g,y),vn(),y._vnode=g;return}Je=!1,h(y.firstChild,g,null,null,null),vn(),y._vnode=g,Je&&console.error("Hydration completed but contains mismatches.")},h=(g,y,P,$,U,J=!1)=>{const z=dn(g)&&g.data==="[",S=()=>A(g,y,P,$,U,z),{type:q,ref:K,shapeFlag:Z,patchFlag:N}=y;let Q=g.nodeType;y.el=g,N===-2&&(J=!1,y.dynamicChildren=null);let L=null;switch(q){case Ot:Q!==3?y.children===""?(c(y.el=r(""),o(g),g),L=g):L=S():(g.data!==y.children&&(Je=!0,g.data=y.children),L=i(g));break;case Ae:Q!==8||z?L=S():L=i(g);break;case Kt:if(z&&(g=i(g),Q=g.nodeType),Q===1||Q===3){L=g;const ye=!y.children.length;for(let G=0;G{J=J||!!y.dynamicChildren;const{type:z,props:S,patchFlag:q,shapeFlag:K,dirs:Z}=y,N=z==="input"&&Z||z==="option";if(N||q!==-1){if(Z&&Ue(y,null,P,"created"),S)if(N||!J||q&48)for(const L in S)(N&&L.endsWith("value")||Gt(L)&&!Dt(L))&&s(g,L,null,S[L],!1,void 0,P);else S.onClick&&s(g,"onClick",null,S.onClick,!1,void 0,P);let Q;if((Q=S&&S.onVnodeBeforeMount)&&Oe(Q,P,y),Z&&Ue(y,null,P,"beforeMount"),((Q=S&&S.onVnodeMounted)||Z)&&li(()=>{Q&&Oe(Q,P,y),Z&&Ue(y,null,P,"mounted")},$),K&16&&!(S&&(S.innerHTML||S.textContent))){let L=_(g.firstChild,y,g,P,$,U,J);for(;L;){Je=!0;const ye=L;L=L.nextSibling,l(ye)}}else K&8&&g.textContent!==y.children&&(Je=!0,g.textContent=y.children)}return g.nextSibling},_=(g,y,P,$,U,J,z)=>{z=z||!!y.dynamicChildren;const S=y.children,q=S.length;for(let K=0;K{const{slotScopeIds:z}=y;z&&(U=U?U.concat(z):z);const S=o(g),q=_(i(g),y,S,P,$,U,J);return q&&dn(q)&&q.data==="]"?i(y.anchor=q):(Je=!0,c(y.anchor=a("]"),S,q),q)},A=(g,y,P,$,U,J)=>{if(Je=!0,y.el=null,J){const q=k(g);for(;;){const K=i(g);if(K&&K!==q)l(K);else break}}const z=i(g),S=o(g);return l(g),n(null,y,S,z,P,$,an(S),U),z},k=g=>{let y=0;for(;g;)if(g=i(g),g&&dn(g)&&(g.data==="["&&y++,g.data==="]")){if(y===0)return i(g);y--}return g};return[f,h]}const Ce=li;function Nl(e){return Fl(e,Il)}function Fl(e,t){const n=oo();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:a,setElementText:f,parentNode:h,nextSibling:p,setScopeId:_=He,insertStaticContent:C}=e,A=(u,d,m,b=null,E=null,R=null,M=!1,x=null,T=!!d.dynamicChildren)=>{if(u===d)return;u&&!dt(u,d)&&(b=O(u),Ee(u,E,R,!0),u=null),d.patchFlag===-2&&(T=!1,d.dynamicChildren=null);const{type:w,ref:j,shapeFlag:F}=d;switch(w){case Ot:k(u,d,m,b);break;case Ae:g(u,d,m,b);break;case Kt:u==null&&y(d,m,b,M);break;case we:N(u,d,m,b,E,R,M,x,T);break;default:F&1?U(u,d,m,b,E,R,M,x,T):F&6?Q(u,d,m,b,E,R,M,x,T):(F&64||F&128)&&w.process(u,d,m,b,E,R,M,x,T,ee)}j!=null&&E&&wn(j,u&&u.ref,R,d||u,!d)},k=(u,d,m,b)=>{if(u==null)s(d.el=l(d.children),m,b);else{const E=d.el=u.el;d.children!==u.children&&a(E,d.children)}},g=(u,d,m,b)=>{u==null?s(d.el=c(d.children||""),m,b):d.el=u.el},y=(u,d,m,b)=>{[u.el,u.anchor]=C(u.children,d,m,b,u.el,u.anchor)},P=({el:u,anchor:d},m,b)=>{let E;for(;u&&u!==d;)E=p(u),s(u,m,b),u=E;s(d,m,b)},$=({el:u,anchor:d})=>{let m;for(;u&&u!==d;)m=p(u),r(u),u=m;r(d)},U=(u,d,m,b,E,R,M,x,T)=>{M=M||d.type==="svg",u==null?J(d,m,b,E,R,M,x,T):q(u,d,E,R,M,x,T)},J=(u,d,m,b,E,R,M,x)=>{let T,w;const{type:j,props:F,shapeFlag:B,transition:W,dirs:X}=u;if(T=u.el=o(u.type,R,F&&F.is,F),B&8?f(T,u.children):B&16&&S(u.children,T,null,b,E,R&&j!=="foreignObject",M,x),X&&Ue(u,null,b,"created"),z(T,u,u.scopeId,M,b),F){for(const ie in F)ie!=="value"&&!Dt(ie)&&i(T,ie,null,F[ie],R,u.children,b,E,I);"value"in F&&i(T,"value",null,F.value),(w=F.onVnodeBeforeMount)&&Oe(w,b,u)}X&&Ue(u,null,b,"beforeMount");const le=(!E||E&&!E.pendingBranch)&&W&&!W.persisted;le&&W.beforeEnter(T),s(T,d,m),((w=F&&F.onVnodeMounted)||le||X)&&Ce(()=>{w&&Oe(w,b,u),le&&W.enter(T),X&&Ue(u,null,b,"mounted")},E)},z=(u,d,m,b,E)=>{if(m&&_(u,m),b)for(let R=0;R{for(let w=T;w{const x=d.el=u.el;let{patchFlag:T,dynamicChildren:w,dirs:j}=d;T|=u.patchFlag&16;const F=u.props||ce,B=d.props||ce;let W;m&<(m,!1),(W=B.onVnodeBeforeUpdate)&&Oe(W,m,d,u),j&&Ue(d,u,m,"beforeUpdate"),m&<(m,!0);const X=E&&d.type!=="foreignObject";if(w?K(u.dynamicChildren,w,x,m,b,X,R):M||re(u,d,x,null,m,b,X,R,!1),T>0){if(T&16)Z(x,d,F,B,m,b,E);else if(T&2&&F.class!==B.class&&i(x,"class",null,B.class,E),T&4&&i(x,"style",F.style,B.style,E),T&8){const le=d.dynamicProps;for(let ie=0;ie{W&&Oe(W,m,d,u),j&&Ue(d,u,m,"updated")},b)},K=(u,d,m,b,E,R,M)=>{for(let x=0;x{if(m!==b){if(m!==ce)for(const x in m)!Dt(x)&&!(x in b)&&i(u,x,m[x],null,M,d.children,E,R,I);for(const x in b){if(Dt(x))continue;const T=b[x],w=m[x];T!==w&&x!=="value"&&i(u,x,w,T,M,d.children,E,R,I)}"value"in b&&i(u,"value",m.value,b.value)}},N=(u,d,m,b,E,R,M,x,T)=>{const w=d.el=u?u.el:l(""),j=d.anchor=u?u.anchor:l("");let{patchFlag:F,dynamicChildren:B,slotScopeIds:W}=d;W&&(x=x?x.concat(W):W),u==null?(s(w,m,b),s(j,m,b),S(d.children,m,j,E,R,M,x,T)):F>0&&F&64&&B&&u.dynamicChildren?(K(u.dynamicChildren,B,m,E,R,M,x),(d.key!=null||E&&d===E.subTree)&&Ri(u,d,!0)):re(u,d,m,j,E,R,M,x,T)},Q=(u,d,m,b,E,R,M,x,T)=>{d.slotScopeIds=x,u==null?d.shapeFlag&512?E.ctx.activate(d,m,b,M,T):L(d,m,b,E,R,M,T):ye(u,d,T)},L=(u,d,m,b,E,R,M)=>{const x=u.component=Kl(u,b,E);if(nn(u)&&(x.ctx.renderer=ee),ql(x),x.asyncDep){if(E&&E.registerDep(x,G),!u.el){const T=x.subTree=de(Ae);g(null,T,d,m)}return}G(x,u,d,m,E,R,M)},ye=(u,d,m)=>{const b=d.component=u.component;if(tl(u,d,m))if(b.asyncDep&&!b.asyncResolved){oe(b,d,m);return}else b.next=d,Qo(b.update),b.update();else d.el=u.el,b.vnode=d},G=(u,d,m,b,E,R,M)=>{const x=()=>{if(u.isMounted){let{next:j,bu:F,u:B,parent:W,vnode:X}=u,le=j,ie;lt(u,!1),j?(j.el=X.el,oe(u,j,M)):j=X,F&&Hn(F),(ie=j.props&&j.props.onVnodeBeforeUpdate)&&Oe(ie,W,j,X),lt(u,!0);const he=jn(u),Fe=u.subTree;u.subTree=he,A(Fe,he,h(Fe.el),O(Fe),u,E,R),j.el=he.el,le===null&&nl(u,he.el),B&&Ce(B,E),(ie=j.props&&j.props.onVnodeUpdated)&&Ce(()=>Oe(ie,W,j,X),E)}else{let j;const{el:F,props:B}=d,{bm:W,m:X,parent:le}=u,ie=At(d);if(lt(u,!1),W&&Hn(W),!ie&&(j=B&&B.onVnodeBeforeMount)&&Oe(j,le,d),lt(u,!0),F&&Y){const he=()=>{u.subTree=jn(u),Y(F,u.subTree,u,E,null)};ie?d.type.__asyncLoader().then(()=>!u.isUnmounted&&he()):he()}else{const he=u.subTree=jn(u);A(null,he,m,b,u,E,R),d.el=he.el}if(X&&Ce(X,E),!ie&&(j=B&&B.onVnodeMounted)){const he=d;Ce(()=>Oe(j,le,he),E)}(d.shapeFlag&256||le&&At(le.vnode)&&le.vnode.shapeFlag&256)&&u.a&&Ce(u.a,E),u.isMounted=!0,d=m=b=null}},T=u.effect=new ys(x,()=>Sn(w),u.scope),w=u.update=()=>T.run();w.id=u.uid,lt(u,!0),w()},oe=(u,d,m)=>{d.component=u;const b=u.vnode.props;u.vnode=d,u.next=null,Pl(u,d.props,b,m),Ol(u,d.children,m),Ft(),Ws(),Lt()},re=(u,d,m,b,E,R,M,x,T=!1)=>{const w=u&&u.children,j=u?u.shapeFlag:0,F=d.children,{patchFlag:B,shapeFlag:W}=d;if(B>0){if(B&128){ot(w,F,m,b,E,R,M,x,T);return}else if(B&256){Ie(w,F,m,b,E,R,M,x,T);return}}W&8?(j&16&&I(w,E,R),F!==w&&f(m,F)):j&16?W&16?ot(w,F,m,b,E,R,M,x,T):I(w,E,R,!0):(j&8&&f(m,""),W&16&&S(F,m,b,E,R,M,x,T))},Ie=(u,d,m,b,E,R,M,x,T)=>{u=u||Ct,d=d||Ct;const w=u.length,j=d.length,F=Math.min(w,j);let B;for(B=0;Bj?I(u,E,R,!0,!1,F):S(d,m,b,E,R,M,x,T,F)},ot=(u,d,m,b,E,R,M,x,T)=>{let w=0;const j=d.length;let F=u.length-1,B=j-1;for(;w<=F&&w<=B;){const W=u[w],X=d[w]=T?et(d[w]):Le(d[w]);if(dt(W,X))A(W,X,m,null,E,R,M,x,T);else break;w++}for(;w<=F&&w<=B;){const W=u[F],X=d[B]=T?et(d[B]):Le(d[B]);if(dt(W,X))A(W,X,m,null,E,R,M,x,T);else break;F--,B--}if(w>F){if(w<=B){const W=B+1,X=WB)for(;w<=F;)Ee(u[w],E,R,!0),w++;else{const W=w,X=w,le=new Map;for(w=X;w<=B;w++){const Re=d[w]=T?et(d[w]):Le(d[w]);Re.key!=null&&le.set(Re.key,w)}let ie,he=0;const Fe=B-X+1;let bt=!1,Ns=0;const kt=new Array(Fe);for(w=0;w=Fe){Ee(Re,E,R,!0);continue}let De;if(Re.key!=null)De=le.get(Re.key);else for(ie=X;ie<=B;ie++)if(kt[ie-X]===0&&dt(Re,d[ie])){De=ie;break}De===void 0?Ee(Re,E,R,!0):(kt[De-X]=w+1,De>=Ns?Ns=De:bt=!0,A(Re,d[De],m,null,E,R,M,x,T),he++)}const Fs=bt?Ll(kt):Ct;for(ie=Fs.length-1,w=Fe-1;w>=0;w--){const Re=X+w,De=d[Re],Ls=Re+1{const{el:R,type:M,transition:x,children:T,shapeFlag:w}=u;if(w&6){Ne(u.component.subTree,d,m,b);return}if(w&128){u.suspense.move(d,m,b);return}if(w&64){M.move(u,d,m,ee);return}if(M===we){s(R,d,m);for(let F=0;Fx.enter(R),E);else{const{leave:F,delayLeave:B,afterLeave:W}=x,X=()=>s(R,d,m),le=()=>{F(R,()=>{X(),W&&W()})};B?B(R,X,le):le()}else s(R,d,m)},Ee=(u,d,m,b=!1,E=!1)=>{const{type:R,props:M,ref:x,children:T,dynamicChildren:w,shapeFlag:j,patchFlag:F,dirs:B}=u;if(x!=null&&wn(x,null,m,u,!0),j&256){d.ctx.deactivate(u);return}const W=j&1&&B,X=!At(u);let le;if(X&&(le=M&&M.onVnodeBeforeUnmount)&&Oe(le,d,u),j&6)v(u.component,m,b);else{if(j&128){u.suspense.unmount(m,b);return}W&&Ue(u,null,d,"beforeUnmount"),j&64?u.type.remove(u,d,m,E,ee,b):w&&(R!==we||F>0&&F&64)?I(w,d,m,!1,!0):(R===we&&F&384||!E&&j&16)&&I(T,d,m),b&&yt(u)}(X&&(le=M&&M.onVnodeUnmounted)||W)&&Ce(()=>{le&&Oe(le,d,u),W&&Ue(u,null,d,"unmounted")},m)},yt=u=>{const{type:d,el:m,anchor:b,transition:E}=u;if(d===we){sn(m,b);return}if(d===Kt){$(u);return}const R=()=>{r(m),E&&!E.persisted&&E.afterLeave&&E.afterLeave()};if(u.shapeFlag&1&&E&&!E.persisted){const{leave:M,delayLeave:x}=E,T=()=>M(m,R);x?x(u.el,R,T):T()}else R()},sn=(u,d)=>{let m;for(;u!==d;)m=p(u),r(u),u=m;r(d)},v=(u,d,m)=>{const{bum:b,scope:E,update:R,subTree:M,um:x}=u;b&&Hn(b),E.stop(),R&&(R.active=!1,Ee(M,u,d,m)),x&&Ce(x,d),Ce(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},I=(u,d,m,b=!1,E=!1,R=0)=>{for(let M=R;Mu.shapeFlag&6?O(u.component.subTree):u.shapeFlag&128?u.suspense.next():p(u.anchor||u.el),H=(u,d,m)=>{u==null?d._vnode&&Ee(d._vnode,null,null,!0):A(d._vnode||null,u,d,null,null,null,m),Ws(),vn(),d._vnode=u},ee={p:A,um:Ee,m:Ne,r:yt,mt:L,mc:S,pc:re,pbc:K,n:O,o:e};let fe,Y;return t&&([fe,Y]=t(ee)),{render:H,hydrate:fe,createApp:Ml(H,fe)}}function lt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Ri(e,t,n=!1){const s=e.children,r=t.children;if(D(s)&&D(r))for(let i=0;i>1,e[n[l]]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}const kl=e=>e.__isTeleport,we=Symbol(void 0),Ot=Symbol(void 0),Ae=Symbol(void 0),Kt=Symbol(void 0),Wt=[];let $e=null;function Pi(e=!1){Wt.push($e=e?null:[])}function $l(){Wt.pop(),$e=Wt[Wt.length-1]||null}let Xt=1;function er(e){Xt+=e}function Ai(e){return e.dynamicChildren=Xt>0?$e||Ct:null,$l(),Xt>0&&$e&&$e.push(e),e}function $u(e,t,n,s,r,i){return Ai(Si(e,t,n,s,r,i,!0))}function Ti(e,t,n,s,r){return Ai(de(e,t,n,s,r,!0))}function xn(e){return e?e.__v_isVNode===!0:!1}function dt(e,t){return e.type===t.type&&e.key===t.key}const Nn="__vInternal",Oi=({key:e})=>e??null,mn=({ref:e,ref_key:t,ref_for:n})=>e!=null?pe(e)||ge(e)||V(e)?{i:me,r:e,k:t,f:!!n}:e:null;function Si(e,t=null,n=null,s=0,r=null,i=e===we?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Oi(t),ref:t&&mn(t),scopeId:oi,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:me};return l?(Os(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=pe(n)?8:16),Xt>0&&!o&&$e&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&$e.push(c),c}const de=Hl;function Hl(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===_l)&&(e=Ae),xn(e)){const l=it(e,t,!0);return n&&Os(l,n),Xt>0&&!i&&$e&&(l.shapeFlag&6?$e[$e.indexOf(e)]=l:$e.push(l)),l.patchFlag|=-2,l}if(Jl(e)&&(e=e.__vccOpts),t){t=jl(t);let{class:l,style:c}=t;l&&!pe(l)&&(t.class=ds(l)),ue(c)&&(Qr(c)&&!D(c)&&(c=_e({},c)),t.style=as(c))}const o=pe(e)?1:sl(e)?128:kl(e)?64:ue(e)?4:V(e)?2:0;return Si(e,t,n,s,r,o,i,!0)}function jl(e){return e?Qr(e)||Nn in e?_e({},e):e:null}function it(e,t,n=!1){const{props:s,ref:r,patchFlag:i,children:o}=e,l=t?Bl(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Oi(l),ref:t&&t.ref?n&&r?D(r)?r.concat(mn(t)):[r,mn(t)]:mn(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==we?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&it(e.ssContent),ssFallback:e.ssFallback&&it(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Mi(e=" ",t=0){return de(Ot,null,e,t)}function Hu(e,t){const n=de(Kt,null,e);return n.staticCount=t,n}function ju(e="",t=!1){return t?(Pi(),Ti(Ae,null,e)):de(Ae,null,e)}function Le(e){return e==null||typeof e=="boolean"?de(Ae):D(e)?de(we,null,e.slice()):typeof e=="object"?et(e):de(Ot,null,String(e))}function et(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:it(e)}function Os(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(D(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Os(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(Nn in t)?t._ctx=me:r===3&&me&&(me.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else V(t)?(t={default:t,_ctx:me},n=32):(t=String(t),s&64?(n=16,t=[Mi(t)]):n=8);e.children=t,e.shapeFlag|=n}function Bl(...e){const t={};for(let n=0;nae||me,St=e=>{ae=e,e.scope.on()},mt=()=>{ae&&ae.scope.off(),ae=null};function Ii(e){return e.vnode.shapeFlag&4}let Mt=!1;function ql(e,t=!1){Mt=t;const{props:n,children:s}=e.vnode,r=Ii(e);Rl(e,n,r,t),Tl(e,s);const i=r?Vl(e,t):void 0;return Mt=!1,i}function Vl(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Yr(new Proxy(e.ctx,bl));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?Ql(e):null;St(e),Ft();const i=st(s,e,0,[e.props,r]);if(Lt(),mt(),Fr(i)){if(i.then(mt,mt),t)return i.then(o=>{tr(e,o,t)}).catch(o=>{tn(o,e,0)});e.asyncDep=i}else tr(e,i,t)}else Ni(e,t)}function tr(e,t,n){V(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ue(t)&&(e.setupState=Gr(t)),Ni(e,n)}let nr;function Ni(e,t,n){const s=e.type;if(!e.render){if(!t&&nr&&!s.render){const r=s.template||As(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,a=_e(_e({isCustomElement:i,delimiters:l},o),c);s.render=nr(r,a)}}e.render=s.render||He}St(e),Ft(),vl(e),Lt(),mt()}function zl(e){return new Proxy(e.attrs,{get(t,n){return xe(e,"get","$attrs"),t[n]}})}function Ql(e){const t=s=>{e.exposed=s||{}};let n;return{get attrs(){return n||(n=zl(e))},slots:e.slots,emit:e.emit,expose:t}}function Fn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Gr(Yr(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ut)return Ut[n](e)},has(t,n){return n in t||n in Ut}}))}function Yl(e,t=!0){return V(e)?e.displayName||e.name:e.name||t&&e.__name}function Jl(e){return V(e)&&"__vccOpts"in e}const Se=(e,t)=>qo(e,t,Mt);function Ss(e,t,n){const s=arguments.length;return s===2?ue(t)&&!D(t)?xn(t)?de(e,null,[t]):de(e,t):de(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&xn(n)&&(n=[n]),de(e,t,n))}const Xl=Symbol(""),Zl=()=>je(Xl),Gl="3.2.47",ec="http://www.w3.org/2000/svg",ht=typeof document<"u"?document:null,sr=ht&&ht.createElement("template"),tc={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?ht.createElementNS(ec,e):ht.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>ht.createTextNode(e),createComment:e=>ht.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ht.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{sr.innerHTML=s?`${e}`:e;const l=sr.content;if(s){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]}};function nc(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function sc(e,t,n){const s=e.style,r=pe(n);if(n&&!r){if(t&&!pe(t))for(const i in t)n[i]==null&&os(s,i,"");for(const i in n)os(s,i,n[i])}else{const i=s.display;r?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=i)}}const rr=/\s*!important$/;function os(e,t,n){if(D(n))n.forEach(s=>os(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=rc(e,t);rr.test(n)?e.setProperty(_t(s),n.replace(rr,""),"important"):e[s]=n}}const ir=["Webkit","Moz","ms"],Kn={};function rc(e,t){const n=Kn[t];if(n)return n;let s=We(t);if(s!=="filter"&&s in e)return Kn[t]=s;s=Tn(s);for(let r=0;rWn||(ac.then(()=>Wn=0),Wn=Date.now());function hc(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Me(pc(s,n.value),t,5,[s])};return n.value=e,n.attached=dc(),n}function pc(e,t){if(D(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 cr=/^on[a-z]/,gc=(e,t,n,s,r=!1,i,o,l,c)=>{t==="class"?nc(e,s,r):t==="style"?sc(e,n,s):Gt(t)?hs(t)||uc(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):mc(e,t,s,r))?oc(e,t,s,i,o,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),ic(e,t,s,r))};function mc(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&cr.test(t)&&V(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||cr.test(t)&&pe(n)?!1:t in e}const Xe="transition",$t="animation",Fi=(e,{slots:t})=>Ss(ui,_c(e),t);Fi.displayName="Transition";const Li={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Fi.props=_e({},ui.props,Li);const ct=(e,t=[])=>{D(e)?e.forEach(n=>n(...t)):e&&e(...t)},ur=e=>e?D(e)?e.some(t=>t.length>1):e.length>1:!1;function _c(e){const t={};for(const N in e)N in Li||(t[N]=e[N]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:a=o,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:_=`${n}-leave-to`}=e,C=yc(r),A=C&&C[0],k=C&&C[1],{onBeforeEnter:g,onEnter:y,onEnterCancelled:P,onLeave:$,onLeaveCancelled:U,onBeforeAppear:J=g,onAppear:z=y,onAppearCancelled:S=P}=t,q=(N,Q,L)=>{ut(N,Q?f:l),ut(N,Q?a:o),L&&L()},K=(N,Q)=>{N._isLeaving=!1,ut(N,h),ut(N,_),ut(N,p),Q&&Q()},Z=N=>(Q,L)=>{const ye=N?z:y,G=()=>q(Q,N,L);ct(ye,[Q,G]),fr(()=>{ut(Q,N?c:i),Ze(Q,N?f:l),ur(ye)||ar(Q,s,A,G)})};return _e(t,{onBeforeEnter(N){ct(g,[N]),Ze(N,i),Ze(N,o)},onBeforeAppear(N){ct(J,[N]),Ze(N,c),Ze(N,a)},onEnter:Z(!1),onAppear:Z(!0),onLeave(N,Q){N._isLeaving=!0;const L=()=>K(N,Q);Ze(N,h),Ec(),Ze(N,p),fr(()=>{N._isLeaving&&(ut(N,h),Ze(N,_),ur($)||ar(N,s,k,L))}),ct($,[N,L])},onEnterCancelled(N){q(N,!1),ct(P,[N])},onAppearCancelled(N){q(N,!0),ct(S,[N])},onLeaveCancelled(N){K(N),ct(U,[N])}})}function yc(e){if(e==null)return null;if(ue(e))return[qn(e.enter),qn(e.leave)];{const t=qn(e);return[t,t]}}function qn(e){return io(e)}function Ze(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function ut(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function fr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let bc=0;function ar(e,t,n,s){const r=e._endId=++bc,i=()=>{r===e._endId&&s()};if(n)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=vc(e,t);if(!o)return s();const a=o+"end";let f=0;const h=()=>{e.removeEventListener(a,p),i()},p=_=>{_.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[C]||"").split(", "),r=s(`${Xe}Delay`),i=s(`${Xe}Duration`),o=dr(r,i),l=s(`${$t}Delay`),c=s(`${$t}Duration`),a=dr(l,c);let f=null,h=0,p=0;t===Xe?o>0&&(f=Xe,h=o,p=i.length):t===$t?a>0&&(f=$t,h=a,p=c.length):(h=Math.max(o,a),f=h>0?o>a?Xe:$t:null,p=f?f===Xe?i.length:c.length:0);const _=f===Xe&&/\b(transform|all)(,|$)/.test(s(`${Xe}Property`).toString());return{type:f,timeout:h,propCount:p,hasTransform:_}}function dr(e,t){for(;e.lengthhr(n)+hr(e[s])))}function hr(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function Ec(){return document.body.offsetHeight}const Cc={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Bu=(e,t)=>n=>{if(!("key"in n))return;const s=_t(n.key);if(t.some(r=>r===s||Cc[r]===s))return e(n)},Du={beforeMount(e,{value:t},{transition:n}){e._vod=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Ht(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),Ht(e,!0),s.enter(e)):s.leave(e,()=>{Ht(e,!1)}):Ht(e,t))},beforeUnmount(e,{value:t}){Ht(e,t)}};function Ht(e,t){e.style.display=t?e._vod:"none"}const wc=_e({patchProp:gc},tc);let Vn,pr=!1;function xc(){return Vn=pr?Vn:Nl(wc),pr=!0,Vn}const Uu=(...e)=>{const t=xc().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Rc(s);if(r)return n(r,!0,r instanceof SVGElement)},t};function Rc(e){return pe(e)?document.querySelector(e):e}var Pc=([e,t,n])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,n]),Ku=e=>{const t=new Set,n=[];return e.forEach(s=>{const r=Pc(s);t.has(r)||(t.add(r),n.push(s))}),n},Wu=e=>/^(https?:)?\/\//.test(e),qu=e=>/^mailto:/.test(e),Vu=e=>/^tel:/.test(e),zu=e=>Object.prototype.toString.call(e)==="[object Object]",Qu=e=>e.replace(/\/$/,""),Yu=e=>e.replace(/^\//,""),Ju=(e,t)=>{const n=Object.keys(e).sort((s,r)=>{const i=r.split("/").length-s.split("/").length;return i!==0?i:r.length-s.length});for(const s of n)if(t.startsWith(s))return s;return"/"};/*! + * vue-router v4.1.6 + * (c) 2022 Eduardo San Martin Morote + * @license MIT + */const Et=typeof window<"u";function Ac(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const se=Object.assign;function zn(e,t){const n={};for(const s in t){const r=t[s];n[s]=Be(r)?r.map(e):e(r)}return n}const qt=()=>{},Be=Array.isArray,Tc=/\/$/,Oc=e=>e.replace(Tc,"");function Qn(e,t,n="/"){let s,r={},i="",o="";const l=t.indexOf("#");let c=t.indexOf("?");return l=0&&(c=-1),c>-1&&(s=t.slice(0,c),i=t.slice(c+1,l>-1?l:t.length),r=e(i)),l>-1&&(s=s||t.slice(0,l),o=t.slice(l,t.length)),s=Nc(s??t,n),{fullPath:s+(i&&"?")+i+o,path:s,query:r,hash:o}}function Sc(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function gr(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Mc(e,t,n){const s=t.matched.length-1,r=n.matched.length-1;return s>-1&&s===r&&It(t.matched[s],n.matched[r])&&ki(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function It(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function ki(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!Ic(e[n],t[n]))return!1;return!0}function Ic(e,t){return Be(e)?mr(e,t):Be(t)?mr(t,e):e===t}function mr(e,t){return Be(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function Nc(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/");let r=n.length-1,i,o;for(i=0;i1&&r--;else break;return n.slice(0,r).join("/")+"/"+s.slice(i-(i===s.length?1:0)).join("/")}var Zt;(function(e){e.pop="pop",e.push="push"})(Zt||(Zt={}));var Vt;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Vt||(Vt={}));function Fc(e){if(!e)if(Et){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Oc(e)}const Lc=/^[^#]+#/;function kc(e,t){return e.replace(Lc,"#")+t}function $c(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const Ln=()=>({left:window.pageXOffset,top:window.pageYOffset});function Hc(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),r=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!r)return;t=$c(r,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function _r(e,t){return(history.state?history.state.position-t:-1)+e}const ls=new Map;function jc(e,t){ls.set(e,t)}function Bc(e){const t=ls.get(e);return ls.delete(e),t}let Dc=()=>location.protocol+"//"+location.host;function $i(e,t){const{pathname:n,search:s,hash:r}=t,i=e.indexOf("#");if(i>-1){let l=r.includes(e.slice(i))?e.slice(i).length:1,c=r.slice(l);return c[0]!=="/"&&(c="/"+c),gr(c,"")}return gr(n,e)+s+r}function Uc(e,t,n,s){let r=[],i=[],o=null;const l=({state:p})=>{const _=$i(e,location),C=n.value,A=t.value;let k=0;if(p){if(n.value=_,t.value=p,o&&o===C){o=null;return}k=A?p.position-A.position:0}else s(_);r.forEach(g=>{g(n.value,C,{delta:k,type:Zt.pop,direction:k?k>0?Vt.forward:Vt.back:Vt.unknown})})};function c(){o=n.value}function a(p){r.push(p);const _=()=>{const C=r.indexOf(p);C>-1&&r.splice(C,1)};return i.push(_),_}function f(){const{history:p}=window;p.state&&p.replaceState(se({},p.state,{scroll:Ln()}),"")}function h(){for(const p of i)p();i=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",f)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",f),{pauseListeners:c,listen:a,destroy:h}}function yr(e,t,n,s=!1,r=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:r?Ln():null}}function Kc(e){const{history:t,location:n}=window,s={value:$i(e,n)},r={value:t.state};r.value||i(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function i(c,a,f){const h=e.indexOf("#"),p=h>-1?(n.host&&document.querySelector("base")?e:e.slice(h))+c:Dc()+e+c;try{t[f?"replaceState":"pushState"](a,"",p),r.value=a}catch(_){console.error(_),n[f?"replace":"assign"](p)}}function o(c,a){const f=se({},t.state,yr(r.value.back,c,r.value.forward,!0),a,{position:r.value.position});i(c,f,!0),s.value=c}function l(c,a){const f=se({},r.value,t.state,{forward:c,scroll:Ln()});i(f.current,f,!0);const h=se({},yr(s.value,c,null),{position:f.position+1},a);i(c,h,!1),s.value=c}return{location:s,state:r,push:l,replace:o}}function Xu(e){e=Fc(e);const t=Kc(e),n=Uc(e,t.state,t.location,t.replace);function s(i,o=!0){o||n.pauseListeners(),history.go(i)}const r=se({location:"",base:e,go:s,createHref:kc.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}function Wc(e){return typeof e=="string"||e&&typeof e=="object"}function Hi(e){return typeof e=="string"||typeof e=="symbol"}const Ge={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},ji=Symbol("");var br;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(br||(br={}));function Nt(e,t){return se(new Error,{type:e,[ji]:!0},t)}function qe(e,t){return e instanceof Error&&ji in e&&(t==null||!!(e.type&t))}const vr="[^/]+?",qc={sensitive:!1,strict:!1,start:!0,end:!0},Vc=/[.+*?^${}()[\]/\\]/g;function zc(e,t){const n=se({},qc,t),s=[];let r=n.start?"^":"";const i=[];for(const a of e){const f=a.length?[]:[90];n.strict&&!a.length&&(r+="/");for(let h=0;ht.length?t.length===1&&t[0]===40+40?1:-1:0}function Yc(e,t){let n=0;const s=e.score,r=t.score;for(;n0&&t[t.length-1]<0}const Jc={type:0,value:""},Xc=/[a-zA-Z0-9_]/;function Zc(e){if(!e)return[[]];if(e==="/")return[[Jc]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(_){throw new Error(`ERR (${n})/"${a}": ${_}`)}let n=0,s=n;const r=[];let i;function o(){i&&r.push(i),i=[]}let l=0,c,a="",f="";function h(){a&&(n===0?i.push({type:0,value:a}):n===1||n===2||n===3?(i.length>1&&(c==="*"||c==="+")&&t(`A repeatable param (${a}) must be alone in its segment. eg: '/:ids+.`),i.push({type:1,value:a,regexp:f,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),a="")}function p(){a+=c}for(;l{o(y)}:qt}function o(f){if(Hi(f)){const h=s.get(f);h&&(s.delete(f),n.splice(n.indexOf(h),1),h.children.forEach(o),h.alias.forEach(o))}else{const h=n.indexOf(f);h>-1&&(n.splice(h,1),f.record.name&&s.delete(f.record.name),f.children.forEach(o),f.alias.forEach(o))}}function l(){return n}function c(f){let h=0;for(;h=0&&(f.record.path!==n[h].record.path||!Bi(f,n[h]));)h++;n.splice(h,0,f),f.record.name&&!wr(f)&&s.set(f.record.name,f)}function a(f,h){let p,_={},C,A;if("name"in f&&f.name){if(p=s.get(f.name),!p)throw Nt(1,{location:f});A=p.record.name,_=se(Cr(h.params,p.keys.filter(y=>!y.optional).map(y=>y.name)),f.params&&Cr(f.params,p.keys.map(y=>y.name))),C=p.stringify(_)}else if("path"in f)C=f.path,p=n.find(y=>y.re.test(C)),p&&(_=p.parse(C),A=p.record.name);else{if(p=h.name?s.get(h.name):n.find(y=>y.re.test(h.path)),!p)throw Nt(1,{location:f,currentLocation:h});A=p.record.name,_=se({},h.params,f.params),C=p.stringify(_)}const k=[];let g=p;for(;g;)k.unshift(g.record),g=g.parent;return{name:A,path:C,params:_,matched:k,meta:su(k)}}return e.forEach(f=>i(f)),{addRoute:i,resolve:a,removeRoute:o,getRoutes:l,getRecordMatcher:r}}function Cr(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function tu(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:nu(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function nu(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="boolean"?n:n[s];return t}function wr(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function su(e){return e.reduce((t,n)=>se(t,n.meta),{})}function xr(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}function Bi(e,t){return t.children.some(n=>n===e||Bi(e,n))}const Di=/#/g,ru=/&/g,iu=/\//g,ou=/=/g,lu=/\?/g,Ui=/\+/g,cu=/%5B/g,uu=/%5D/g,Ki=/%5E/g,fu=/%60/g,Wi=/%7B/g,au=/%7C/g,qi=/%7D/g,du=/%20/g;function Ms(e){return encodeURI(""+e).replace(au,"|").replace(cu,"[").replace(uu,"]")}function hu(e){return Ms(e).replace(Wi,"{").replace(qi,"}").replace(Ki,"^")}function cs(e){return Ms(e).replace(Ui,"%2B").replace(du,"+").replace(Di,"%23").replace(ru,"%26").replace(fu,"`").replace(Wi,"{").replace(qi,"}").replace(Ki,"^")}function pu(e){return cs(e).replace(ou,"%3D")}function gu(e){return Ms(e).replace(Di,"%23").replace(lu,"%3F")}function mu(e){return e==null?"":gu(e).replace(iu,"%2F")}function Rn(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function _u(e){const t={};if(e===""||e==="?")return t;const s=(e[0]==="?"?e.slice(1):e).split("&");for(let r=0;ri&&cs(i)):[s&&cs(s)]).forEach(i=>{i!==void 0&&(t+=(t.length?"&":"")+n,i!=null&&(t+="="+i))})}return t}function yu(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=Be(s)?s.map(r=>r==null?null:""+r):s==null?s:""+s)}return t}const bu=Symbol(""),Pr=Symbol(""),kn=Symbol(""),Is=Symbol(""),us=Symbol("");function jt(){let e=[];function t(s){return e.push(s),()=>{const r=e.indexOf(s);r>-1&&e.splice(r,1)}}function n(){e=[]}return{add:t,list:()=>e,reset:n}}function tt(e,t,n,s,r){const i=s&&(s.enterCallbacks[r]=s.enterCallbacks[r]||[]);return()=>new Promise((o,l)=>{const c=h=>{h===!1?l(Nt(4,{from:n,to:t})):h instanceof Error?l(h):Wc(h)?l(Nt(2,{from:t,to:h})):(i&&s.enterCallbacks[r]===i&&typeof h=="function"&&i.push(h),o())},a=e.call(s&&s.instances[r],t,n,c);let f=Promise.resolve(a);e.length<3&&(f=f.then(c)),f.catch(h=>l(h))})}function Yn(e,t,n,s){const r=[];for(const i of e)for(const o in i.components){let l=i.components[o];if(!(t!=="beforeRouteEnter"&&!i.instances[o]))if(vu(l)){const a=(l.__vccOpts||l)[t];a&&r.push(tt(a,n,s,i,o))}else{let c=l();r.push(()=>c.then(a=>{if(!a)return Promise.reject(new Error(`Couldn't resolve component "${o}" at "${i.path}"`));const f=Ac(a)?a.default:a;i.components[o]=f;const p=(f.__vccOpts||f)[t];return p&&tt(p,n,s,i,o)()}))}}return r}function vu(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Ar(e){const t=je(kn),n=je(Is),s=Se(()=>t.resolve(Rt(e.to))),r=Se(()=>{const{matched:c}=s.value,{length:a}=c,f=c[a-1],h=n.matched;if(!f||!h.length)return-1;const p=h.findIndex(It.bind(null,f));if(p>-1)return p;const _=Tr(c[a-2]);return a>1&&Tr(f)===_&&h[h.length-1].path!==_?h.findIndex(It.bind(null,c[a-2])):p}),i=Se(()=>r.value>-1&&xu(n.params,s.value.params)),o=Se(()=>r.value>-1&&r.value===n.matched.length-1&&ki(n.params,s.value.params));function l(c={}){return wu(c)?t[Rt(e.replace)?"replace":"push"](Rt(e.to)).catch(qt):Promise.resolve()}return{route:s,href:Se(()=>s.value.href),isActive:i,isExactActive:o,navigate:l}}const Eu=Ps({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Ar,setup(e,{slots:t}){const n=en(Ar(e)),{options:s}=je(kn),r=Se(()=>({[Or(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[Or(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const i=t.default&&t.default(n);return e.custom?i:Ss("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:r.value},i)}}}),Cu=Eu;function wu(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function xu(e,t){for(const n in t){const s=t[n],r=e[n];if(typeof s=="string"){if(s!==r)return!1}else if(!Be(r)||r.length!==s.length||s.some((i,o)=>i!==r[o]))return!1}return!0}function Tr(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Or=(e,t,n)=>e??t??n,Ru=Ps({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=je(us),r=Se(()=>e.route||s.value),i=je(Pr,0),o=Se(()=>{let a=Rt(i);const{matched:f}=r.value;let h;for(;(h=f[a])&&!h.components;)a++;return a}),l=Se(()=>r.value.matched[o.value]);pn(Pr,Se(()=>o.value+1)),pn(bu,l),pn(us,r);const c=hn();return gn(()=>[c.value,l.value,e.name],([a,f,h],[p,_,C])=>{f&&(f.instances[h]=a,_&&_!==f&&a&&a===p&&(f.leaveGuards.size||(f.leaveGuards=_.leaveGuards),f.updateGuards.size||(f.updateGuards=_.updateGuards))),a&&f&&(!_||!It(f,_)||!p)&&(f.enterCallbacks[h]||[]).forEach(A=>A(a))},{flush:"post"}),()=>{const a=r.value,f=e.name,h=l.value,p=h&&h.components[f];if(!p)return Sr(n.default,{Component:p,route:a});const _=h.props[f],C=_?_===!0?a.params:typeof _=="function"?_(a):_:null,k=Ss(p,se({},C,t,{onVnodeUnmounted:g=>{g.component.isUnmounted&&(h.instances[f]=null)},ref:c}));return Sr(n.default,{Component:k,route:a})||k}}});function Sr(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Pu=Ru;function Zu(e){const t=eu(e.routes,e),n=e.parseQuery||_u,s=e.stringifyQuery||Rr,r=e.history,i=jt(),o=jt(),l=jt(),c=jo(Ge);let a=Ge;Et&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const f=zn.bind(null,v=>""+v),h=zn.bind(null,mu),p=zn.bind(null,Rn);function _(v,I){let O,H;return Hi(v)?(O=t.getRecordMatcher(v),H=I):H=v,t.addRoute(H,O)}function C(v){const I=t.getRecordMatcher(v);I&&t.removeRoute(I)}function A(){return t.getRoutes().map(v=>v.record)}function k(v){return!!t.getRecordMatcher(v)}function g(v,I){if(I=se({},I||c.value),typeof v=="string"){const u=Qn(n,v,I.path),d=t.resolve({path:u.path},I),m=r.createHref(u.fullPath);return se(u,d,{params:p(d.params),hash:Rn(u.hash),redirectedFrom:void 0,href:m})}let O;if("path"in v)O=se({},v,{path:Qn(n,v.path,I.path).path});else{const u=se({},v.params);for(const d in u)u[d]==null&&delete u[d];O=se({},v,{params:h(v.params)}),I.params=h(I.params)}const H=t.resolve(O,I),ee=v.hash||"";H.params=f(p(H.params));const fe=Sc(s,se({},v,{hash:hu(ee),path:H.path})),Y=r.createHref(fe);return se({fullPath:fe,hash:ee,query:s===Rr?yu(v.query):v.query||{}},H,{redirectedFrom:void 0,href:Y})}function y(v){return typeof v=="string"?Qn(n,v,c.value.path):se({},v)}function P(v,I){if(a!==v)return Nt(8,{from:I,to:v})}function $(v){return z(v)}function U(v){return $(se(y(v),{replace:!0}))}function J(v){const I=v.matched[v.matched.length-1];if(I&&I.redirect){const{redirect:O}=I;let H=typeof O=="function"?O(v):O;return typeof H=="string"&&(H=H.includes("?")||H.includes("#")?H=y(H):{path:H},H.params={}),se({query:v.query,hash:v.hash,params:"path"in H?{}:v.params},H)}}function z(v,I){const O=a=g(v),H=c.value,ee=v.state,fe=v.force,Y=v.replace===!0,u=J(O);if(u)return z(se(y(u),{state:typeof u=="object"?se({},ee,u.state):ee,force:fe,replace:Y}),I||O);const d=O;d.redirectedFrom=I;let m;return!fe&&Mc(s,H,O)&&(m=Nt(16,{to:d,from:H}),ot(H,H,!0,!1)),(m?Promise.resolve(m):q(d,H)).catch(b=>qe(b)?qe(b,2)?b:Ie(b):oe(b,d,H)).then(b=>{if(b){if(qe(b,2))return z(se({replace:Y},y(b.to),{state:typeof b.to=="object"?se({},ee,b.to.state):ee,force:fe}),I||d)}else b=Z(d,H,!0,Y,ee);return K(d,H,b),b})}function S(v,I){const O=P(v,I);return O?Promise.reject(O):Promise.resolve()}function q(v,I){let O;const[H,ee,fe]=Au(v,I);O=Yn(H.reverse(),"beforeRouteLeave",v,I);for(const u of H)u.leaveGuards.forEach(d=>{O.push(tt(d,v,I))});const Y=S.bind(null,v,I);return O.push(Y),vt(O).then(()=>{O=[];for(const u of i.list())O.push(tt(u,v,I));return O.push(Y),vt(O)}).then(()=>{O=Yn(ee,"beforeRouteUpdate",v,I);for(const u of ee)u.updateGuards.forEach(d=>{O.push(tt(d,v,I))});return O.push(Y),vt(O)}).then(()=>{O=[];for(const u of v.matched)if(u.beforeEnter&&!I.matched.includes(u))if(Be(u.beforeEnter))for(const d of u.beforeEnter)O.push(tt(d,v,I));else O.push(tt(u.beforeEnter,v,I));return O.push(Y),vt(O)}).then(()=>(v.matched.forEach(u=>u.enterCallbacks={}),O=Yn(fe,"beforeRouteEnter",v,I),O.push(Y),vt(O))).then(()=>{O=[];for(const u of o.list())O.push(tt(u,v,I));return O.push(Y),vt(O)}).catch(u=>qe(u,8)?u:Promise.reject(u))}function K(v,I,O){for(const H of l.list())H(v,I,O)}function Z(v,I,O,H,ee){const fe=P(v,I);if(fe)return fe;const Y=I===Ge,u=Et?history.state:{};O&&(H||Y?r.replace(v.fullPath,se({scroll:Y&&u&&u.scroll},ee)):r.push(v.fullPath,ee)),c.value=v,ot(v,I,O,Y),Ie()}let N;function Q(){N||(N=r.listen((v,I,O)=>{if(!sn.listening)return;const H=g(v),ee=J(H);if(ee){z(se(ee,{replace:!0}),H).catch(qt);return}a=H;const fe=c.value;Et&&jc(_r(fe.fullPath,O.delta),Ln()),q(H,fe).catch(Y=>qe(Y,12)?Y:qe(Y,2)?(z(Y.to,H).then(u=>{qe(u,20)&&!O.delta&&O.type===Zt.pop&&r.go(-1,!1)}).catch(qt),Promise.reject()):(O.delta&&r.go(-O.delta,!1),oe(Y,H,fe))).then(Y=>{Y=Y||Z(H,fe,!1),Y&&(O.delta&&!qe(Y,8)?r.go(-O.delta,!1):O.type===Zt.pop&&qe(Y,20)&&r.go(-1,!1)),K(H,fe,Y)}).catch(qt)}))}let L=jt(),ye=jt(),G;function oe(v,I,O){Ie(v);const H=ye.list();return H.length?H.forEach(ee=>ee(v,I,O)):console.error(v),Promise.reject(v)}function re(){return G&&c.value!==Ge?Promise.resolve():new Promise((v,I)=>{L.add([v,I])})}function Ie(v){return G||(G=!v,Q(),L.list().forEach(([I,O])=>v?O(v):I()),L.reset()),v}function ot(v,I,O,H){const{scrollBehavior:ee}=e;if(!Et||!ee)return Promise.resolve();const fe=!O&&Bc(_r(v.fullPath,0))||(H||!O)&&history.state&&history.state.scroll||null;return ni().then(()=>ee(v,I,fe)).then(Y=>Y&&Hc(Y)).catch(Y=>oe(Y,v,I))}const Ne=v=>r.go(v);let Ee;const yt=new Set,sn={currentRoute:c,listening:!0,addRoute:_,removeRoute:C,hasRoute:k,getRoutes:A,resolve:g,options:e,push:$,replace:U,go:Ne,back:()=>Ne(-1),forward:()=>Ne(1),beforeEach:i.add,beforeResolve:o.add,afterEach:l.add,onError:ye.add,isReady:re,install(v){const I=this;v.component("RouterLink",Cu),v.component("RouterView",Pu),v.config.globalProperties.$router=I,Object.defineProperty(v.config.globalProperties,"$route",{enumerable:!0,get:()=>Rt(c)}),Et&&!Ee&&c.value===Ge&&(Ee=!0,$(r.location).catch(ee=>{}));const O={};for(const ee in Ge)O[ee]=Se(()=>c.value[ee]);v.provide(kn,I),v.provide(Is,en(O)),v.provide(us,c);const H=v.unmount;yt.add(v),v.unmount=function(){yt.delete(v),yt.size<1&&(a=Ge,N&&N(),N=null,c.value=Ge,Ee=!1,G=!1),H()}}};return sn}function vt(e){return e.reduce((t,n)=>t.then(()=>n()),Promise.resolve())}function Au(e,t){const n=[],s=[],r=[],i=Math.max(t.matched.length,e.matched.length);for(let o=0;oIt(a,l))?s.push(l):n.push(l));const c=e.matched[o];c&&(t.matched.find(a=>It(a,c))||r.push(c))}return[n,s,r]}function Gu(){return je(kn)}function ef(){return je(Is)}const tf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n};export{Du as $,gn as A,Wl as B,ni as C,uo as D,Ou as E,jo as F,Mu as G,pn as H,gi as I,V as J,zu as K,ef as L,Fu as M,de as N,we as O,Lu as P,ju as Q,Si as R,Su as S,Fi as T,Ti as U,Zo as V,Bl as W,qu as X,Vu as Y,Nu as Z,tf as _,zr as a,Qu as a0,Hu as a1,Bu as a2,Zu as a3,Ge as a4,Uu as a5,Xu as a6,Pu as a7,en as b,Ps as c,Iu as d,D as e,Ku as f,Ju as g,Se as h,pe as i,Ss as j,je as k,Wu as l,Yu as m,pi as n,hi as o,Pi as p,$u as q,hn as r,ku as s,Mi as t,Gu as u,Tu as v,ds as w,as as x,ge as y,Rt as z}; diff --git a/assets/index.html-18d42ac0.js b/assets/index.html-18d42ac0.js new file mode 100644 index 0000000..37e6eb2 --- /dev/null +++ b/assets/index.html-18d42ac0.js @@ -0,0 +1 @@ +import{_ as i,M as s,p as o,q as r,R as e,t,N as n,a1 as l}from"./framework-5866ffd3.js";const d={},c=e("h1",{id:"introduction",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#introduction","aria-hidden":"true"},"#"),t(" Introduction")],-1),h=e("p",null,"ChatGPT UI is an unofficial ChatGPT web client. It supports multiple users, multiple languages, and multiple database connections for persistent data storage, such as Mysql, PostgreSQL, and Sqlite.",-1),u=e("p",null,"This project consists of two parts, the client-side and the server-side:",-1),p={href:"https://nuxt.com/",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/WongSaang/chatgpt-ui",target:"_blank",rel:"noopener noreferrer"},m={href:"https://djangoproject.com/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/WongSaang/chatgpt-ui-server",target:"_blank",rel:"noopener noreferrer"},_=l('

Features

Client-side

  • User system, supporting user registration, login, password modification, and more.
  • Multi-language user interface, supporting multiple languages.
  • Persistent data storage, supporting Mysql, PostgreSQL, and Sqlite databases.
  • Asynchronous conversation, supporting multiple conversations simultaneously.
  • Management of historical conversations.
  • Continuous chat, allowing ChatGPT clients to answer questions based on their historical chat records, resulting in better answers.
  • Web search capability, allowing ChatGPT to retrieve the latest information.
  • Convenient tools, supporting one-click message and code block copying, as well as message editing.
  • Common command management, allowing users to store and edit their own common commands.
  • PWA, supporting installation to the desktop.
  • User Token Usage Statistics.
  • Supports configuring multiple API Keys.

Server-side

  • The server-side has an administrative panel.
  • User management.
  • Conversation and message management.
  • Common configurations.

Original Intention

Since using ChatGPT, it has become a good helper in work. Unfortunately, as we all know, it cannot be accessed in some places. But fortunately, OpenAI has opened up its API, so I started to write a user interface for myself.

Nothing is difficult if you put your heart into it.

Later, several friends asked me how to use ChatGPT because they didn't have the technical skills. So I started to develop a multi-user system, which can not only be used by myself but also help my family and friends around me.

After the project was open-sourced, many people raised issues and some even submitted PRs, and the project has developed to its current state. I also learned a lot during this process, as I have always believed that helping others is also helping oneself.

',10);function b(v,y){const a=s("ExternalLinkIcon");return o(),r("div",null,[c,h,u,e("ul",null,[e("li",null,[t("Client-side, based on "),e("a",p,[t("Nuxt"),n(a)]),t(", project address: "),e("a",g,[t("https://github.com/WongSaang/chatgpt-ui"),n(a)])]),e("li",null,[t("Server-side, based on "),e("a",m,[t("Django"),n(a)]),t(", project address: "),e("a",f,[t("https://github.com/WongSaang/chatgpt-ui-server"),n(a)])])]),_])}const w=i(d,[["render",b],["__file","index.html.vue"]]);export{w as default}; diff --git a/assets/index.html-a9203641.js b/assets/index.html-a9203641.js new file mode 100644 index 0000000..b0aae9c --- /dev/null +++ b/assets/index.html-a9203641.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-2d0ad528","path":"/zh/","title":"介绍","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"功能与特性","slug":"功能与特性","link":"#功能与特性","children":[{"level":3,"title":"客户端","slug":"客户端","link":"#客户端","children":[]},{"level":3,"title":"服务端","slug":"服务端","link":"#服务端","children":[]}]},{"level":2,"title":"初衷","slug":"初衷","link":"#初衷","children":[]}],"git":{"updatedTime":1681536689000,"contributors":[{"name":"Rafi","email":"rafiwx@gmail.com","commits":23},{"name":"Wong Saang","email":"46235412+WongSaang@users.noreply.github.com","commits":1}]},"filePathRelative":"zh/README.md"}');export{e as data}; diff --git a/assets/index.html-d042d854.js b/assets/index.html-d042d854.js new file mode 100644 index 0000000..7937f3b --- /dev/null +++ b/assets/index.html-d042d854.js @@ -0,0 +1 @@ +import{_ as r,M as n,p as l,q as o,R as e,t,N as i,a1 as h}from"./framework-5866ffd3.js";const s={},c=e("h1",{id:"介绍",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#介绍","aria-hidden":"true"},"#"),t(" 介绍")],-1),d=e("p",null,"ChatGPT UI 是一个非官方的 ChatGPT Web 客户端。它支持多用户,多语言,多种数据库连接进行数据持久化存储,例如:Mysql、PostgreSQL 和 Sqlite 等。",-1),_=e("p",null,"本项目项目包括客户端和服务端两部分。",-1),p={href:"https://nuxt.com/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/WongSaang/chatgpt-ui",target:"_blank",rel:"noopener noreferrer"},g={href:"https://djangoproject.com/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/WongSaang/chatgpt-ui-server",target:"_blank",rel:"noopener noreferrer"},b=h('

功能与特性

客户端

  • 用户系统,支持用户注册、登录、修改密码等。
  • 用户界面多语言,支持多种语言。
  • 数据持久化,支持 Mysql、PostgreSQL 和 Sqlite 等数据库。
  • 异步对话,支持多个对话同时进行。
  • 历史对话管理。
  • 持续聊天,让 ChatGPT 客户历史聊天记录回答问题,得出更好的答案。
  • 网页搜索能力,让 ChatGPT 获取最新信息。
  • 便捷的工具,支持一键复制消息和代码块,以及重新编辑消息等。
  • 常用指令管理,用户可存储和编辑自己的常用指令。
  • PWA,支持安装到桌面。
  • 用户 Token 使用量统计
  • 支持配置多个 API Key

服务端

  • 服务端拥有一个管理面板
  • 用户管理
  • 对话和消息管理
  • 常用配置

初衷

自从使用 ChatGPT ,它已经成为工作中的好帮手。可惜的是,就像大家知道的,它在有些地方无法访问。但好在 OpenAI 开放了 API,于是我开始为自己写用户界面。

世上无难事,只怕有心人。

后来,有多位朋友询问我怎么样才能使用 ChatGPT,因为他们没有技术能力。于是我又着手于多用户系统的开发,这样除了自己用,还能帮助到身边的亲朋好友。

项目开源后,有很多人提了 issue,也有人提了 PR,项目就发展到如今的样子。我在这个过程中也学到了很多,正如我一直坚信的,帮助他人也是帮助自己。

',10);function x(m,P){const a=n("ExternalLinkIcon");return l(),o("div",null,[c,d,_,e("ul",null,[e("li",null,[t("客户端,基于 "),e("a",p,[t("Nuxt"),i(a)]),t(",项目地址:"),e("a",u,[t("https://github.com/WongSaang/chatgpt-ui"),i(a)])]),e("li",null,[t("服务端,基于 "),e("a",g,[t("Django"),i(a)]),t(",项目地址:"),e("a",f,[t("https://github.com/WongSaang/chatgpt-ui-server"),i(a)])])]),b])}const S=r(s,[["render",x],["__file","index.html.vue"]]);export{S as default}; diff --git a/assets/index.html-f32af385.js b/assets/index.html-f32af385.js new file mode 100644 index 0000000..40b26ce --- /dev/null +++ b/assets/index.html-f32af385.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-8daa1a0e","path":"/","title":"Introduction","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Features","slug":"features","link":"#features","children":[{"level":3,"title":"Client-side","slug":"client-side","link":"#client-side","children":[]},{"level":3,"title":"Server-side","slug":"server-side","link":"#server-side","children":[]}]},{"level":2,"title":"Original Intention","slug":"original-intention","link":"#original-intention","children":[]}],"git":{"updatedTime":1681536689000,"contributors":[{"name":"Rafi","email":"rafiwx@gmail.com","commits":3}]},"filePathRelative":"README.md"}');export{e as data}; diff --git a/assets/problems.html-3485ea96.js b/assets/problems.html-3485ea96.js new file mode 100644 index 0000000..392d7ad --- /dev/null +++ b/assets/problems.html-3485ea96.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-7f374639","path":"/guide/problems.html","title":"Encountering Issues","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Searching for Issues","slug":"searching-for-issues","link":"#searching-for-issues","children":[]},{"level":2,"title":"Submitting an Issue","slug":"submitting-an-issue","link":"#submitting-an-issue","children":[]}],"git":{"updatedTime":1681222096000,"contributors":[{"name":"Rafi","email":"rafiwx@gmail.com","commits":1}]},"filePathRelative":"guide/problems.md"}');export{e as data}; diff --git a/assets/problems.html-84e6145b.js b/assets/problems.html-84e6145b.js new file mode 100644 index 0000000..4a59351 --- /dev/null +++ b/assets/problems.html-84e6145b.js @@ -0,0 +1 @@ +import{_ as o,M as a,p as i,q as r,R as e,t as s,N as t}from"./framework-5866ffd3.js";const c={},u=e("h1",{id:"encountering-issues",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#encountering-issues","aria-hidden":"true"},"#"),s(" Encountering Issues")],-1),h=e("h2",{id:"searching-for-issues",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#searching-for-issues","aria-hidden":"true"},"#"),s(" Searching for Issues")],-1),l={href:"https://github.com/WongSaang/chatgpt-ui/issues",target:"_blank",rel:"noopener noreferrer"},d=e("h2",{id:"submitting-an-issue",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#submitting-an-issue","aria-hidden":"true"},"#"),s(" Submitting an Issue")],-1),p={href:"https://github.com/WongSaang/chatgpt-ui/issues/new",target:"_blank",rel:"noopener noreferrer"},_=e("p",null,[e("strong",null,"Note")],-1),f=e("p",null,"The title should be clear and concise, and the description should provide as much detail as possible about the issue or suggestion. If possible, it is best to provide reproducible steps and screenshots.",-1);function g(b,m){const n=a("ExternalLinkIcon");return i(),r("div",null,[u,h,e("p",null,[s("If you encounter any issues while using the project, you can search for related keywords on the project's "),e("a",l,[s("Issues"),t(n)]),s(" page to see if others have faced similar issues and if there are any solutions available.")]),d,e("p",null,[s("If you cannot find a solution, you can communicate with the project maintainers by submitting an issue. "),e("a",p,[s("Submit an Issue"),t(n)])]),_,f])}const x=o(c,[["render",g],["__file","problems.html.vue"]]);export{x as default}; diff --git a/assets/problems.html-dabd58d0.js b/assets/problems.html-dabd58d0.js new file mode 100644 index 0000000..1834bbc --- /dev/null +++ b/assets/problems.html-dabd58d0.js @@ -0,0 +1 @@ +import{_ as a,M as o,p as r,q as c,R as e,t as s,N as n}from"./framework-5866ffd3.js";const i={},h=e("h1",{id:"遇到问题",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#遇到问题","aria-hidden":"true"},"#"),s(" 遇到问题")],-1),l=e("h2",{id:"搜索问题",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#搜索问题","aria-hidden":"true"},"#"),s(" 搜索问题")],-1),_={href:"https://github.com/WongSaang/chatgpt-ui/issues",target:"_blank",rel:"noopener noreferrer"},d=e("h2",{id:"提-issue",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#提-issue","aria-hidden":"true"},"#"),s(" 提 issue")],-1),u={href:"https://github.com/WongSaang/chatgpt-ui/issues/new",target:"_blank",rel:"noopener noreferrer"},p=e("p",null,[e("strong",null,"注意")],-1),f=e("p",null,"标题应该简单明了,描述应该尽可能详细地描述问题或者建议。如果可能,最好提供复现步骤和截图。",-1);function m(g,b){const t=o("ExternalLinkIcon");return r(),c("div",null,[h,l,e("p",null,[s("当你在使用项目时,如果遇到了问题,可以在项目的 "),e("a",_,[s("Issues"),n(t)]),s(" 页面搜索相关的关键词,看看其他人是否遇到过相同的问题以及解决方案。")]),d,e("p",null,[s("如果没有找到解决方案,可以通过提交 Issue 来与项目维护者交流。"),e("a",u,[s("提交Issue"),n(t)])]),p,f])}const k=a(i,[["render",m],["__file","problems.html.vue"]]);export{k as default}; diff --git a/assets/problems.html-f1039fc4.js b/assets/problems.html-f1039fc4.js new file mode 100644 index 0000000..786da6a --- /dev/null +++ b/assets/problems.html-f1039fc4.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-4eee7faa","path":"/zh/guide/problems.html","title":"遇到问题","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"搜索问题","slug":"搜索问题","link":"#搜索问题","children":[]},{"level":2,"title":"提 issue","slug":"提-issue","link":"#提-issue","children":[]}],"git":{"updatedTime":1681222096000,"contributors":[{"name":"Rafi","email":"rafiwx@gmail.com","commits":1}]},"filePathRelative":"zh/guide/problems.md"}');export{e as data}; diff --git a/assets/quick-start.html-5d24620c.js b/assets/quick-start.html-5d24620c.js new file mode 100644 index 0000000..ce3f1ed --- /dev/null +++ b/assets/quick-start.html-5d24620c.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-47700a83","path":"/guide/quick-start.html","title":"Quick Start","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Deploying","slug":"deploying","link":"#deploying","children":[{"level":3,"title":"Quickly deploy script","slug":"quickly-deploy-script","link":"#quickly-deploy-script","children":[]},{"level":3,"title":"Docker Compose","slug":"docker-compose","link":"#docker-compose","children":[]}]},{"level":2,"title":"After Deployment","slug":"after-deployment","link":"#after-deployment","children":[]}],"git":{"updatedTime":1681674749000,"contributors":[{"name":"Rafi","email":"rafiwx@gmail.com","commits":3},{"name":"AI&I","email":"iluozan@126.com","commits":1}]},"filePathRelative":"guide/quick-start.md"}');export{e as data}; diff --git a/assets/quick-start.html-91a3ce5d.js b/assets/quick-start.html-91a3ce5d.js new file mode 100644 index 0000000..c43fbc2 --- /dev/null +++ b/assets/quick-start.html-91a3ce5d.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-62758f72","path":"/zh/guide/quick-start.html","title":"快速开始","lang":"zh-CN","frontmatter":{},"headers":[{"level":2,"title":"部署","slug":"部署","link":"#部署","children":[{"level":3,"title":"快速部署脚本","slug":"快速部署脚本","link":"#快速部署脚本","children":[]},{"level":3,"title":"Docker Compose","slug":"docker-compose","link":"#docker-compose","children":[]}]},{"level":2,"title":"部署完成之后","slug":"部署完成之后","link":"#部署完成之后","children":[]}],"git":{"updatedTime":1681674749000,"contributors":[{"name":"Rafi","email":"rafiwx@gmail.com","commits":3},{"name":"AI&I","email":"iluozan@126.com","commits":1}]},"filePathRelative":"zh/guide/quick-start.md"}');export{e as data}; diff --git a/assets/quick-start.html-b336d0c1.js b/assets/quick-start.html-b336d0c1.js new file mode 100644 index 0000000..80f3b05 --- /dev/null +++ b/assets/quick-start.html-b336d0c1.js @@ -0,0 +1,60 @@ +import{_ as s,M as r,p as o,q as d,R as n,t as e,N as t,a1 as a}from"./framework-5866ffd3.js";const l={},c=a(`

Quick Start

This project provides related docker images for deployment on a VPS or your local computer. Please note that if your network is unable to request the OpenAI API address, you need to configure a proxy. If you want to make it available to other users, it's best to have a domain name and resolve it to the server.

You also need an OpenAI API Key, and there are multiple ways to obtain it online, please search for it yourself.

Deploying

Quickly deploy script

Note: This script has only been verified on Ubuntu Server 22.04 LTS.

bash <(curl -Ls https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/deployment.sh)
+

Docker Compose

Prepare docker-compose.yml

`,9),u=n("code",null,"docker-compose.yml",-1),m={href:"/en/guide/configuration",target:"_blank",rel:"noopener noreferrer"},v=n("p",null,[e("You can download the "),n("code",null,"docker-compose.yml"),e(" template to your local machine or server by clicking on the link below:")],-1),h={href:"https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"},p=a(`

You can also manually create the docker-compose.yml file and copy the following content into the file:

version: '3'
+services:
+  client:
+    platform: linux/x86_64
+    image: wongsaang/chatgpt-ui-client:latest
+    environment:
+      - SERVER_DOMAIN=http://backend-web-server
+      - DEFAULT_LOCALE=en
+#      - NUXT_PUBLIC_APP_NAME='ChatGPT UI' # The name of the application
+#      - NUXT_PUBLIC_TYPEWRITER=true # Whether to enable the typewriter effect, default false
+#      - NUXT_PUBLIC_TYPEWRITER_DELAY=50 # The delay time of the typewriter effect, default 50ms
+    depends_on:
+      - backend-web-server
+    ports:
+      - '\${CLIENT_PORT:-80}:80'
+    networks:
+      - chatgpt_ui_network
+    restart: always
+  backend-wsgi-server:
+    platform: linux/x86_64
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - APP_DOMAIN=\${APP_DOMAIN:-localhost:9000}
+      - SERVER_WORKERS=3 # The number of worker processes for handling requests.
+      #      - DB_URL=postgres://postgres:postgrespw@localhost:49153/chatgpt # If this parameter is not set, the built-in Sqlite will be used by default. It should be noted that if you do not connect to an external database, the data will be lost after the container is destroyed.
+      - DJANGO_SUPERUSER_USERNAME=admin # default superuser name
+      - DJANGO_SUPERUSER_PASSWORD=password # default superuser password
+      - DJANGO_SUPERUSER_EMAIL=admin@example.com # default superuser email
+      - ACCOUNT_EMAIL_VERIFICATION=\${ACCOUNT_EMAIL_VERIFICATION:-none} # Determines the e-mail verification method during signup – choose one of "none", "optional", or "mandatory". Default is "optional". If you don't need to verify the email, you can set it to "none".
+      # If you want to use the email verification function, you need to configure the following parameters
+#      - EMAIL_HOST=SMTP server address
+#      - EMAIL_PORT=SMTP server port
+#      - EMAIL_HOST_USER=
+#      - EMAIL_HOST_PASSWORD=
+#      - EMAIL_USE_TLS=True
+#      - EMAIL_FROM=no-reply@example.com  #Default sender email address
+    ports:
+      - '\${WSGI_PORT:-8000}:8000'
+    networks:
+      - chatgpt_ui_network
+    restart: always
+  backend-web-server:
+    platform: linux/x86_64
+    image: wongsaang/chatgpt-ui-web-server:latest
+    environment:
+      - BACKEND_URL=http://backend-wsgi-server:8000
+    ports:
+      - '\${SERVER_PORT:-9000}:80'
+    depends_on:
+      - backend-wsgi-server
+    networks:
+      - chatgpt_ui_network
+    restart: always
+
+networks:
+  chatgpt_ui_network:
+    driver: bridge
+

Starting the Service

After modifying the configuration as needed, you can start the service by running the following command:

docker-compose up --pull always -d
+

This command is used to start the services specified in the Docker Compose configuration. The specific meanings of the parameters are as follows:

  • up: start the services specified in the Docker Compose configuration.
  • --pull always: before starting the service each time, the latest version of the image will be pulled from the Docker image repository. This ensures that the image used is always up to date.
  • -d: run the service in the background. If this parameter is not added, the service will run in the current terminal window until the user manually stops it.

After Deployment

Access the management panel at http(s)://your.domain:9000/admin or http(s)://123.123.123.123:9000/admin using the default superuser account:

  • username: admin
  • password: password

Before starting a chat, you need to add an OpenAI API key. In the management panel, in the "Settings" section, there is a record named openai_api_key. Set the value to your API key.

In the latest version, a separate API Key management has been added to the admin panel, located under "Provider/Api keys". You can add multiple API Keys here, and the backend program will track the usage of each key's token and balance the usage based on token usage. To enable this feature, you need to delete the previous "openai_api_key" setting.

Now you can access the client at http(s)://your.domain or http://123.123.123.123 to start chatting.

🎉🎉🎉 Have fun!

`,14);function b(g,f){const i=r("ExternalLinkIcon");return o(),d("div",null,[c,n("p",null,[e("The project provides a sample "),u,e(". If you want to customize the configuration, please refer to the "),n("a",m,[e("configuration reference"),t(i)]),e(" section.")]),v,n("p",null,[n("a",h,[e("https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/docker-compose.yml"),t(i)])]),p])}const y=s(l,[["render",b],["__file","quick-start.html.vue"]]);export{y as default}; diff --git a/assets/quick-start.html-fc1bc91c.js b/assets/quick-start.html-fc1bc91c.js new file mode 100644 index 0000000..ef6d3be --- /dev/null +++ b/assets/quick-start.html-fc1bc91c.js @@ -0,0 +1,55 @@ +import{_ as a,M as r,p as o,q as l,R as e,t as n,N as s,a1 as d}from"./framework-5866ffd3.js";const c={},t=d('

快速开始

本项目提供了相关的 docker 镜像,你需要一个 vps 来部署,当然你也可以在本地的电脑上部署。需要注意的是,如果你的网络无法请求 OpenAI 的 API 地址,您需要配置代理。如果你想开放给其他用户使用,最好还需要一个域名,并将域名解析到服务器。

您还需要一个 OpenAI 的API Key,网上有获取多种方案,请自行搜索。

部署

快速部署脚本

',5),v={href:"https://wongsnotes.com/p/deploying-your-own-chatgpt-client-with-one-line-of-command/",target:"_blank",rel:"noopener noreferrer"},m=d(`

注意:此脚本目前仅在 Ubuntu Server 22.04 LTS 上验证过。

bash <(curl -Ls https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/deployment.sh)
+

Docker Compose

准备 docker-compose.yml

`,4),u=e("code",null,"docker-compose.yml",-1),p={href:"/zh/guide/configuration",target:"_blank",rel:"noopener noreferrer"},h=e("p",null,[n("你可以通过下方链接下载 "),e("code",null,"docker-compose.yml"),n(" 模板到本地或服务器:")],-1),b={href:"https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"},_=d(`

也可以手动创建 docker-compose.yml 文件,然后复制下面的内容到文件中:

version: '3'
+services:
+  client:
+    image: wongsaang/chatgpt-ui-client:latest
+    environment:
+      - SERVER_DOMAIN=http://backend-web-server
+      - DEFAULT_LOCALE=zh
+    #      - NUXT_PUBLIC_APP_NAME='ChatGPT UI' # APP 名称
+    #      - NUXT_PUBLIC_TYPEWRITER=true # 是否开启 打字机 效果
+    #      - NUXT_PUBLIC_TYPEWRITER_DELAY=50 # 打字机效果的延迟时间,单位:毫秒,默认:50
+    depends_on:
+      - backend-web-server
+    ports:
+      - '80:80'
+    networks:
+      - chatgpt_ui_network
+  backend-wsgi-server:
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - APP_DOMAIN=\${APP_DOMAIN:-localhost:9000} # CSRF 白名单,在这里设置为 chatgpt-ui-web-server 的地址+端口, 默认: localhost:9000
+      - SERVER_WORKERS=3 # gunicorn 的工作进程数,默认为 3
+      #- DB_URL=postgres://postgres:postgrespw@localhost:49153/chatgpt # 连接外部数据库,如果不设置这个参数,则默认使用内置的 Sqlite。需要注意的是,如果不连接外部数据库,数据将在容器销毁后丢失。链接格式请看下面的 DB_URL 格式对照表
+      #- OPENAI_API_PROXY=https://openai.proxy.com/v1 # https://api.openai.com/v1 的代理地址
+      - DJANGO_SUPERUSER_USERNAME=admin # 默认超级用户
+      - DJANGO_SUPERUSER_PASSWORD=password # 默认超级用户的密码
+      - DJANGO_SUPERUSER_EMAIL=admin@example.com # 默认超级用户邮箱
+      - ACCOUNT_EMAIL_VERIFICATION=none # 邮箱验证方式,可选值: none, optional, mandatory. 默认为 optional。如果你不需要验证用户的邮箱,可以设置为 none。
+      # 如果您想使用电子邮件验证功能,需要配置以下参数:
+    #      - EMAIL_HOST=SMTP server address
+    #      - EMAIL_PORT=SMTP server port
+    #      - EMAIL_HOST_USER=
+    #      - EMAIL_HOST_PASSWORD=
+    #      - EMAIL_USE_TLS=True
+    #      - EMAIL_FROM=no-reply@example.com  #默认发件邮箱地址
+    ports:
+      - '8000:8000'
+    networks:
+      - chatgpt_ui_network
+  backend-web-server:
+    image: wongsaang/chatgpt-ui-web-server:latest
+    environment:
+      - BACKEND_URL=http://backend-wsgi-server:8000
+    ports:
+      - '9000:80'
+    depends_on:
+      - backend-wsgi-server
+    networks:
+      - chatgpt_ui_network
+
+networks:
+  chatgpt_ui_network:
+    driver: bridge
+

启动服务

你可以自行修改配置后,运行下面的命令来启动服务。

docker-compose up --pull always -d
+

这个命令用于启动 Docker Compose 配置中的服务。具体的参数含义如下:

  • up:启动 Docker Compose 配置中的服务。
  • --pull always:每次启动服务前,都会从 Docker 镜像仓库中拉取最新版本的镜像。这样可以确保使用的镜像始终是最新的。
  • -d:在后台运行服务。如果不加这个参数,服务会在当前终端窗口中运行,直到用户手动停止服务。

部署完成之后

访问 http(s)://your.domain:9000/admin 或 IP http(s)://123.123.123.123:9000/admin 登录管理面板。

默认超级用户: admin

默认密码: password

在可以开始聊天之前,您需要添加一个 OpenAI 的 API 密钥。在管理面板的设置模型中,有一个名称为 openai_api_key 的记录,将值设置为您的 API 密钥。

在最新版本中,管理面板增加了一个独立的 API Key 的管理,位于管理面板的 Provider/ Api keys。你可以在这里添加多个 API Key,后端程序会统计每个 Key 的 token 使用量,并根据 token 使用量来平衡使用 Key。想要这个功能生效,需要删除之前的openai_api_key设置

现在可以访问客户端地址 http(s)://your.domain 或 IP http://123.123.123.123 开始聊天。

🎉🎉🎉 祝开心!

`,15);function g(k,A){const i=r("ExternalLinkIcon");return o(),l("div",null,[t,e("p",null,[e("em",null,[n("对于技术知识了解不多的选手,如果你看不懂下面的内容,可以看我之前写的博客文章"),e("a",v,[n("《一行命令部署自己的ChatGPT客户端》"),s(i)])])]),m,e("p",null,[n("项目中提供了一个 "),u,n(" 示例,如果你想自定义配置,请看 "),e("a",p,[n("配置参考"),s(i)]),n(" 部分。")]),h,e("p",null,[e("a",b,[n("https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/docker-compose.yml"),s(i)])]),_])}const I=a(c,[["render",g],["__file","quick-start.html.vue"]]);export{I as default}; diff --git a/assets/style-ad6949cb.css b/assets/style-ad6949cb.css new file mode 100644 index 0000000..dc8c806 --- /dev/null +++ b/assets/style-ad6949cb.css @@ -0,0 +1 @@ +:root{--back-to-top-z-index: 5;--back-to-top-color: #3eaf7c;--back-to-top-color-hover: #71cda3}.back-to-top{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;height:1.2rem;background-color:var(--back-to-top-color);-webkit-mask:url(/chatgpt-ui/assets/back-to-top-8efcbe56.svg) no-repeat;mask:url(/chatgpt-ui/assets/back-to-top-8efcbe56.svg) no-repeat;z-index:var(--back-to-top-z-index)}.back-to-top:hover{background-color:var(--back-to-top-color-hover)}@media (max-width: 959px){.back-to-top{display:none}}@media print{.back-to-top{display:none}}.back-to-top-enter-active,.back-to-top-leave-active{transition:opacity .3s}.back-to-top-enter-from,.back-to-top-leave-to{opacity:0}:root{--external-link-icon-color: #aaa}.external-link-icon{position:relative;display:inline-block;color:var(--external-link-icon-color);vertical-align:middle;top:-1px}@media print{.external-link-icon{display:none}}.external-link-icon-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}:root{--medium-zoom-z-index: 100;--medium-zoom-bg-color: #ffffff;--medium-zoom-opacity: 1}.medium-zoom-overlay{background-color:var(--medium-zoom-bg-color)!important;z-index:var(--medium-zoom-z-index)}.medium-zoom-overlay~img{z-index:calc(var(--medium-zoom-z-index) + 1)}.medium-zoom--opened .medium-zoom-overlay{opacity:var(--medium-zoom-opacity)}:root{--nprogress-color: #29d;--nprogress-z-index: 1031}#nprogress{pointer-events:none}#nprogress .bar{background:var(--nprogress-color);position:fixed;z-index:var(--nprogress-z-index);top:0;left:0;width:100%;height:2px}:root{--c-brand: #3eaf7c;--c-brand-light: #4abf8a;--c-bg: #ffffff;--c-bg-light: #f3f4f5;--c-bg-lighter: #eeeeee;--c-bg-dark: #ebebec;--c-bg-darker: #e6e6e6;--c-bg-navbar: var(--c-bg);--c-bg-sidebar: var(--c-bg);--c-bg-arrow: #cccccc;--c-text: #2c3e50;--c-text-accent: var(--c-brand);--c-text-light: #3a5169;--c-text-lighter: #4e6e8e;--c-text-lightest: #6a8bad;--c-text-quote: #999999;--c-border: #eaecef;--c-border-dark: #dfe2e5;--c-tip: #42b983;--c-tip-bg: var(--c-bg-light);--c-tip-title: var(--c-text);--c-tip-text: var(--c-text);--c-tip-text-accent: var(--c-text-accent);--c-warning: #ffc310;--c-warning-bg: #fffae3;--c-warning-bg-light: #fff3ba;--c-warning-bg-lighter: #fff0b0;--c-warning-border-dark: #f7dc91;--c-warning-details-bg: #fff5ca;--c-warning-title: #f1b300;--c-warning-text: #746000;--c-warning-text-accent: #edb100;--c-warning-text-light: #c1971c;--c-warning-text-quote: #ccab49;--c-danger: #f11e37;--c-danger-bg: #ffe0e0;--c-danger-bg-light: #ffcfde;--c-danger-bg-lighter: #ffc9c9;--c-danger-border-dark: #f1abab;--c-danger-details-bg: #ffd4d4;--c-danger-title: #ed1e2c;--c-danger-text: #660000;--c-danger-text-accent: #bd1a1a;--c-danger-text-light: #b5474d;--c-danger-text-quote: #c15b5b;--c-details-bg: #eeeeee;--c-badge-tip: var(--c-tip);--c-badge-warning: #ecc808;--c-badge-warning-text: var(--c-bg);--c-badge-danger: #dc2626;--c-badge-danger-text: var(--c-bg);--t-color: .3s ease;--t-transform: .3s ease;--code-bg-color: #282c34;--code-hl-bg-color: rgba(0, 0, 0, .66);--code-ln-color: #9e9e9e;--code-ln-wrapper-width: 3.5rem;--font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--font-family-code: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;--navbar-height: 3.6rem;--navbar-padding-v: .7rem;--navbar-padding-h: 1.5rem;--sidebar-width: 20rem;--sidebar-width-mobile: calc(var(--sidebar-width) * .82);--content-width: 740px;--homepage-width: 960px}.back-to-top{--back-to-top-color: var(--c-brand);--back-to-top-color-hover: var(--c-brand-light)}.DocSearch{--docsearch-primary-color: var(--c-brand);--docsearch-text-color: var(--c-text);--docsearch-highlight-color: var(--c-brand);--docsearch-muted-color: var(--c-text-quote);--docsearch-container-background: rgba(9, 10, 17, .8);--docsearch-modal-background: var(--c-bg-light);--docsearch-searchbox-background: var(--c-bg-lighter);--docsearch-searchbox-focus-background: var(--c-bg);--docsearch-searchbox-shadow: inset 0 0 0 2px var(--c-brand);--docsearch-hit-color: var(--c-text-light);--docsearch-hit-active-color: var(--c-bg);--docsearch-hit-background: var(--c-bg);--docsearch-hit-shadow: 0 1px 3px 0 var(--c-border-dark);--docsearch-footer-background: var(--c-bg)}.external-link-icon{--external-link-icon-color: var(--c-text-quote)}.medium-zoom-overlay{--medium-zoom-bg-color: var(--c-bg)}#nprogress{--nprogress-color: var(--c-brand)}.pwa-popup{--pwa-popup-text-color: var(--c-text);--pwa-popup-bg-color: var(--c-bg);--pwa-popup-border-color: var(--c-brand);--pwa-popup-shadow: 0 4px 16px var(--c-brand);--pwa-popup-btn-text-color: var(--c-bg);--pwa-popup-btn-bg-color: var(--c-brand);--pwa-popup-btn-hover-bg-color: var(--c-brand-light)}.search-box{--search-bg-color: var(--c-bg);--search-accent-color: var(--c-brand);--search-text-color: var(--c-text);--search-border-color: var(--c-border);--search-item-text-color: var(--c-text-lighter);--search-item-focus-bg-color: var(--c-bg-light)}html.dark{--c-brand: #3aa675;--c-brand-light: #349469;--c-bg: #22272e;--c-bg-light: #2b313a;--c-bg-lighter: #262c34;--c-bg-dark: #343b44;--c-bg-darker: #37404c;--c-text: #adbac7;--c-text-light: #96a7b7;--c-text-lighter: #8b9eb0;--c-text-lightest: #8094a8;--c-border: #3e4c5a;--c-border-dark: #34404c;--c-tip: #318a62;--c-warning: #e0ad15;--c-warning-bg: #2d2f2d;--c-warning-bg-light: #423e2a;--c-warning-bg-lighter: #44442f;--c-warning-border-dark: #957c35;--c-warning-details-bg: #39392d;--c-warning-title: #fdca31;--c-warning-text: #d8d96d;--c-warning-text-accent: #ffbf00;--c-warning-text-light: #ddb84b;--c-warning-text-quote: #ccab49;--c-danger: #fc1e38;--c-danger-bg: #39232c;--c-danger-bg-light: #4b2b35;--c-danger-bg-lighter: #553040;--c-danger-border-dark: #a25151;--c-danger-details-bg: #482936;--c-danger-title: #fc2d3b;--c-danger-text: #ea9ca0;--c-danger-text-accent: #fd3636;--c-danger-text-light: #d9777c;--c-danger-text-quote: #d56b6b;--c-details-bg: #323843;--c-badge-warning: var(--c-warning);--c-badge-warning-text: #3c2e05;--c-badge-danger: var(--c-danger);--c-badge-danger-text: #401416;--code-hl-bg-color: #363b46}html.dark .DocSearch{--docsearch-logo-color: var(--c-text);--docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;--docsearch-key-shadow: inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px #51577d, 0 2px 2px 0 rgba(3, 4, 9, .3);--docsearch-key-gradient: linear-gradient(-225deg, #444950, #1c1e21);--docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, .5), 0 -4px 8px 0 rgba(0, 0, 0, .2)}html,body{padding:0;margin:0;background-color:var(--c-bg);transition:background-color var(--t-color)}html.dark{color-scheme:dark}html{font-size:16px}body{font-family:var(--font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:1rem;color:var(--c-text)}a{font-weight:500;color:var(--c-text-accent);text-decoration:none;overflow-wrap:break-word}p a code{font-weight:400;color:var(--c-text-accent)}kbd{font-family:var(--font-family-code);color:var(--c-text);background:var(--c-bg-lighter);border:solid .15rem var(--c-border-dark);border-bottom:solid .25rem var(--c-border-dark);border-radius:.15rem;padding:0 .15em}code{font-family:var(--font-family-code);color:var(--c-text-lighter);padding:.25rem .5rem;margin:0;font-size:.85em;background-color:var(--c-bg-light);border-radius:3px;overflow-wrap:break-word;transition:background-color var(--t-color)}blockquote{font-size:1rem;color:var(--c-text-quote);border-left:.2rem solid var(--c-border-dark);margin:1rem 0;padding:.25rem 0 .25rem 1rem;overflow-wrap:break-word}blockquote>p{margin:0}ul,ol{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25;overflow-wrap:break-word}h1:focus-visible,h2:focus-visible,h3:focus-visible,h4:focus-visible,h5:focus-visible,h6:focus-visible{outline:none}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid var(--c-border);transition:border-color var(--t-color)}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media print{a.header-anchor{display:none}}a.header-anchor:hover{text-decoration:none}a.header-anchor:focus-visible{opacity:1}@media print{a[href^="http://"]:after,a[href^="https://"]:after{content:" (" attr(href) ") "}}p,ul,ol{line-height:1.7;overflow-wrap:break-word}hr{border:0;border-top:1px solid var(--c-border)}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto;transition:border-color var(--t-color)}tr{border-top:1px solid var(--c-border-dark);transition:border-color var(--t-color)}tr:nth-child(2n){background-color:var(--c-bg-light);transition:background-color var(--t-color)}tr:nth-child(2n) code{background-color:var(--c-bg-dark)}th,td{padding:.6em 1em;border:1px solid var(--c-border-dark);transition:border-color var(--t-color)}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:6px solid var(--c-bg-arrow)}.arrow.down{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid var(--c-bg-arrow)}.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:6px solid var(--c-bg-arrow)}.arrow.left{border-top:4px solid transparent;border-bottom:4px solid transparent;border-right:6px solid var(--c-bg-arrow)}.badge{display:inline-block;font-size:14px;font-weight:600;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:var(--c-bg);vertical-align:top;transition:color var(--t-color),background-color var(--t-color)}.badge.tip{background-color:var(--c-badge-tip)}.badge.warning{background-color:var(--c-badge-warning);color:var(--c-badge-warning-text)}.badge.danger{background-color:var(--c-badge-danger);color:var(--c-badge-danger-text)}.badge+.badge{margin-left:5px}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:var(--font-family-code);font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999}.token.punctuation{color:#ccc}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#ec5975}.token.function-name{color:#6196cc}.token.boolean,.token.number,.token.function{color:#f08d49}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699}.token.operator,.token.entity,.token.url{color:#67cdcc}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.375;padding:1.3rem 1.5rem;margin:.85rem 0;border-radius:6px;overflow:auto}.theme-default-content pre code,.theme-default-content pre[class*=language-] code{color:#fff;padding:0;background-color:transparent!important;border-radius:0;overflow-wrap:unset;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.theme-default-content .line-number{font-family:var(--font-family-code)}div[class*=language-]{position:relative;background-color:var(--code-bg-color);border-radius:6px}div[class*=language-]:before{content:attr(data-ext);position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:var(--code-ln-color)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent!important;position:relative;z-index:1}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.375}div[class*=language-] .highlight-lines .highlight-line{background-color:var(--code-hl-bg-color)}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlight-line{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlight-line:before{content:" ";position:absolute;z-index:2;left:0;top:0;display:block;width:var(--code-ln-wrapper-width);height:100%}div[class*=language-].line-numbers-mode pre{margin-left:var(--code-ln-wrapper-width);padding-left:1rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers{position:absolute;top:0;width:var(--code-ln-wrapper-width);text-align:center;color:var(--code-ln-color);padding-top:1.25rem;line-height:1.375;counter-reset:line-number}div[class*=language-].line-numbers-mode .line-numbers .line-number{position:relative;z-index:3;-webkit-user-select:none;-moz-user-select:none;user-select:none;height:1.375em}div[class*=language-].line-numbers-mode .line-numbers .line-number:before{counter-increment:line-number;content:counter(line-number);font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;top:0;left:0;width:var(--code-ln-wrapper-width);height:100%;border-radius:6px 0 0 6px;border-right:1px solid var(--code-hl-bg-color)}@media (max-width: 419px){.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.code-group__nav{margin-top:.85rem;margin-bottom:calc(-1.7rem - 6px);padding-bottom:calc(1.7rem - 6px);padding-left:10px;padding-top:10px;border-top-left-radius:6px;border-top-right-radius:6px;background-color:var(--code-bg-color)}.code-group__ul{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.code-group__nav-tab{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:#ffffffe6;font-weight:600}.code-group__nav-tab:focus{outline:none}.code-group__nav-tab:focus-visible{outline:1px solid rgba(255,255,255,.9)}.code-group__nav-tab-active{border-bottom:var(--c-brand) 1px solid}@media (max-width: 419px){.code-group__nav{margin-left:-1.5rem;margin-right:-1.5rem;border-radius:0}}.code-group-item{display:none}.code-group-item__active{display:block}.code-group-item>pre{background-color:orange}.custom-container{transition:color var(--t-color),border-color var(--t-color),background-color var(--t-color)}.custom-container .custom-container-title{font-weight:600}.custom-container .custom-container-title:not(:only-child){margin-bottom:-.4rem}.custom-container.tip,.custom-container.warning,.custom-container.danger{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-container.tip{border-color:var(--c-tip);background-color:var(--c-tip-bg);color:var(--c-tip-text)}.custom-container.tip .custom-container-title{color:var(--c-tip-title)}.custom-container.tip a{color:var(--c-tip-text-accent)}.custom-container.tip code{background-color:var(--c-bg-dark)}.custom-container.warning{border-color:var(--c-warning);background-color:var(--c-warning-bg);color:var(--c-warning-text)}.custom-container.warning .custom-container-title{color:var(--c-warning-title)}.custom-container.warning a{color:var(--c-warning-text-accent)}.custom-container.warning blockquote{border-left-color:var(--c-warning-border-dark);color:var(--c-warning-text-quote)}.custom-container.warning code{color:var(--c-warning-text-light);background-color:var(--c-warning-bg-light)}.custom-container.warning details{background-color:var(--c-warning-details-bg)}.custom-container.warning details code{background-color:var(--c-warning-bg-lighter)}.custom-container.warning .external-link-icon{--external-link-icon-color: var(--c-warning-text-quote)}.custom-container.danger{border-color:var(--c-danger);background-color:var(--c-danger-bg);color:var(--c-danger-text)}.custom-container.danger .custom-container-title{color:var(--c-danger-title)}.custom-container.danger a{color:var(--c-danger-text-accent)}.custom-container.danger blockquote{border-left-color:var(--c-danger-border-dark);color:var(--c-danger-text-quote)}.custom-container.danger code{color:var(--c-danger-text-light);background-color:var(--c-danger-bg-light)}.custom-container.danger details{background-color:var(--c-danger-details-bg)}.custom-container.danger details code{background-color:var(--c-danger-bg-lighter)}.custom-container.danger .external-link-icon{--external-link-icon-color: var(--c-danger-text-quote)}.custom-container.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:var(--c-details-bg)}.custom-container.details code{background-color:var(--c-bg-darker)}.custom-container.details h4{margin-top:0}.custom-container.details figure:last-child,.custom-container.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-container.details summary{outline:none;cursor:pointer}.home{padding:var(--navbar-height) 2rem 0;max-width:var(--homepage-width);margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero h1,.home .hero .description,.home .hero .actions{margin:1.8rem auto}.home .hero .actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:var(--c-text-lightest)}.home .hero .action-button{display:inline-block;font-size:1.2rem;padding:.8rem 1.6rem;border-width:2px;border-style:solid;border-radius:4px;transition:background-color var(--t-color);box-sizing:border-box}.home .hero .action-button.primary{color:var(--c-bg);background-color:var(--c-brand);border-color:var(--c-brand)}.home .hero .action-button.primary:hover{background-color:var(--c-brand-light)}.home .hero .action-button.secondary{color:var(--c-brand);background-color:var(--c-bg);border-color:var(--c-brand)}.home .hero .action-button.secondary:hover{color:var(--c-bg);background-color:var(--c-brand-light)}.home .features{border-top:1px solid var(--c-border);transition:border-color var(--t-color);padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:var(--c-text-light)}.home .feature p{color:var(--c-text-lighter)}.home .theme-default-content{padding:0;margin:0}.home .footer{padding:2.5rem;border-top:1px solid var(--c-border);text-align:center;color:var(--c-text-lighter);transition:border-color var(--t-color)}@media (max-width: 719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width: 419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero h1,.home .hero .description,.home .hero .actions{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.page{padding-top:var(--navbar-height);padding-left:var(--sidebar-width)}.navbar{position:fixed;z-index:20;top:0;left:0;right:0;height:var(--navbar-height);box-sizing:border-box;border-bottom:1px solid var(--c-border);background-color:var(--c-bg-navbar);transition:background-color var(--t-color),border-color var(--t-color)}.sidebar{font-size:16px;width:var(--sidebar-width);position:fixed;z-index:10;margin:0;top:var(--navbar-height);left:0;bottom:0;box-sizing:border-box;border-right:1px solid var(--c-border);overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--c-brand) var(--c-border);background-color:var(--c-bg-sidebar);transition:transform var(--t-transform),background-color var(--t-color),border-color var(--t-color)}.sidebar::-webkit-scrollbar{width:7px}.sidebar::-webkit-scrollbar-track{background-color:var(--c-border)}.sidebar::-webkit-scrollbar-thumb{background-color:var(--c-brand)}.sidebar-mask{position:fixed;z-index:9;top:0;left:0;width:100vw;height:100vh;display:none}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(1){transform:rotate(45deg) translate3d(5.5px,5.5px,0)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(2){transform:scale3d(0,1,1)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(3){transform:rotate(-45deg) translate3d(6px,-6px,0)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(1),.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(3){transform-origin:center}.theme-container.no-navbar .theme-default-content h1,.theme-container.no-navbar .theme-default-content h2,.theme-container.no-navbar .theme-default-content h3,.theme-container.no-navbar .theme-default-content h4,.theme-container.no-navbar .theme-default-content h5,.theme-container.no-navbar .theme-default-content h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .page{padding-top:0}.theme-container.no-navbar .sidebar{top:0}.theme-container.no-sidebar .sidebar{display:none}@media (max-width: 719px){.theme-container.no-sidebar .sidebar{display:block}}.theme-container.no-sidebar .page{padding-left:0}.theme-default-content a:hover{text-decoration:underline}.theme-default-content img{max-width:100%}.theme-default-content h1,.theme-default-content h2,.theme-default-content h3,.theme-default-content h4,.theme-default-content h5,.theme-default-content h6{margin-top:calc(.5rem - var(--navbar-height));padding-top:calc(1rem + var(--navbar-height));margin-bottom:0}.theme-default-content h1:first-child,.theme-default-content h2:first-child,.theme-default-content h3:first-child,.theme-default-content h4:first-child,.theme-default-content h5:first-child,.theme-default-content h6:first-child{margin-bottom:1rem}.theme-default-content h1:first-child+p,.theme-default-content h1:first-child+pre,.theme-default-content h1:first-child+.custom-container,.theme-default-content h2:first-child+p,.theme-default-content h2:first-child+pre,.theme-default-content h2:first-child+.custom-container,.theme-default-content h3:first-child+p,.theme-default-content h3:first-child+pre,.theme-default-content h3:first-child+.custom-container,.theme-default-content h4:first-child+p,.theme-default-content h4:first-child+pre,.theme-default-content h4:first-child+.custom-container,.theme-default-content h5:first-child+p,.theme-default-content h5:first-child+pre,.theme-default-content h5:first-child+.custom-container,.theme-default-content h6:first-child+p,.theme-default-content h6:first-child+pre,.theme-default-content h6:first-child+.custom-container{margin-top:2rem}@media (max-width: 959px){.sidebar{font-size:15px;width:var(--sidebar-width-mobile)}.page{padding-left:var(--sidebar-width-mobile)}}@media (max-width: 719px){.sidebar{top:0;padding-top:var(--navbar-height);transform:translate(-100%)}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translate(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width: 419px){h1{font-size:1.9rem}}.navbar{--navbar-line-height: calc( var(--navbar-height) - 2 * var(--navbar-padding-v) );padding:var(--navbar-padding-v) var(--navbar-padding-h);line-height:var(--navbar-line-height)}.navbar .logo{height:var(--navbar-line-height);margin-right:var(--navbar-padding-v);vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:var(--c-text);position:relative}.navbar .navbar-items-wrapper{display:flex;position:absolute;box-sizing:border-box;top:var(--navbar-padding-v);right:var(--navbar-padding-h);height:var(--navbar-line-height);padding-left:var(--navbar-padding-h);white-space:nowrap;font-size:.9rem}.navbar .navbar-items-wrapper .search-box{flex:0 0 auto;vertical-align:top}@media screen and (max-width: 719px){.navbar{padding-left:4rem}.navbar .site-name{display:block;width:calc(100vw - 11rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.navbar .can-hide{display:none}}.navbar-items{display:inline-block}@media print{.navbar-items{display:none}}.navbar-items a{display:inline-block;line-height:1.4rem;color:inherit}.navbar-items a:hover,.navbar-items a.router-link-active{color:var(--c-text)}.navbar-items .navbar-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:var(--navbar-line-height)}.navbar-items .navbar-item:first-child{margin-left:0}.navbar-items .navbar-item>a:hover,.navbar-items .navbar-item>a.router-link-active{margin-bottom:-2px;border-bottom:2px solid var(--c-text-accent)}@media (max-width: 719px){.navbar-items .navbar-item{margin-left:0}.navbar-items .navbar-item>a:hover,.navbar-items .navbar-item>a.router-link-active{margin-bottom:0;border-bottom:none}.navbar-items a:hover,.navbar-items a.router-link-active{color:var(--c-text-accent)}}.toggle-sidebar-button{position:absolute;top:.6rem;left:1rem;display:none;padding:.6rem;cursor:pointer}.toggle-sidebar-button .icon{display:flex;flex-direction:column;justify-content:center;align-items:center;width:1.25rem;height:1.25rem;cursor:inherit}.toggle-sidebar-button .icon span{display:inline-block;width:100%;height:2px;border-radius:2px;background-color:var(--c-text);transition:transform var(--t-transform)}.toggle-sidebar-button .icon span:nth-child(2){margin:6px 0}@media screen and (max-width: 719px){.toggle-sidebar-button{display:block}}.toggle-color-mode-button{display:flex;margin:auto;margin-left:1rem;border:0;background:none;color:var(--c-text);opacity:.8;cursor:pointer}@media print{.toggle-color-mode-button{display:none}}.toggle-color-mode-button:hover{opacity:1}.toggle-color-mode-button .icon{width:1.25rem;height:1.25rem}.DocSearch{transition:background-color var(--t-color)}.navbar-dropdown-wrapper{cursor:pointer}.navbar-dropdown-wrapper .navbar-dropdown-title,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:var(--c-text)}.navbar-dropdown-wrapper .navbar-dropdown-title:hover,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile:hover{border-color:transparent}.navbar-dropdown-wrapper .navbar-dropdown-title .arrow,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:none;font-weight:600;font-size:inherit}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile:hover{color:var(--c-text-accent)}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item{color:inherit;line-height:1.7rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle{margin:.45rem 0 0;border-top:1px solid var(--c-border);padding:1rem 0 .45rem;font-size:.9rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>span{padding:0 1.5rem 0 1.25rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>a{font-weight:inherit}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>a.router-link-active:after{display:none}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem-wrapper{padding:0;list-style:none}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem-wrapper .navbar-dropdown-subitem{font-size:.9em}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a:hover,.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active{color:var(--c-text-accent)}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid var(--c-text-accent);border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item:first-child .navbar-dropdown-subtitle{margin-top:0;padding-top:0;border-top:0}.navbar-dropdown-wrapper.mobile.open .navbar-dropdown-title,.navbar-dropdown-wrapper.mobile.open .navbar-dropdown-title-mobile{margin-bottom:.5rem}.navbar-dropdown-wrapper.mobile .navbar-dropdown-title,.navbar-dropdown-wrapper.mobile .navbar-dropdown-title-mobile{display:none}.navbar-dropdown-wrapper.mobile .navbar-dropdown-title-mobile{display:block}.navbar-dropdown-wrapper.mobile .navbar-dropdown{transition:height .1s ease-out;overflow:hidden}.navbar-dropdown-wrapper.mobile .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle{border-top:0;margin-top:0;padding-top:0;padding-bottom:0}.navbar-dropdown-wrapper.mobile .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle,.navbar-dropdown-wrapper.mobile .navbar-dropdown .navbar-dropdown-item>a{font-size:15px;line-height:2rem}.navbar-dropdown-wrapper.mobile .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem{font-size:14px;padding-left:1rem}.navbar-dropdown-wrapper:not(.mobile){height:1.8rem}.navbar-dropdown-wrapper:not(.mobile):hover .navbar-dropdown,.navbar-dropdown-wrapper:not(.mobile).open .navbar-dropdown{display:block!important}.navbar-dropdown-wrapper:not(.mobile).open:blur{display:none}.navbar-dropdown-wrapper:not(.mobile) .navbar-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:var(--c-bg-navbar);padding:.6rem 0;border:1px solid var(--c-border);border-bottom-color:var(--c-border-dark);text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}.page{padding-bottom:2rem;display:block}.page .theme-default-content{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem;padding-top:0}@media (max-width: 959px){.page .theme-default-content{padding:2rem}}@media (max-width: 419px){.page .theme-default-content{padding:1.5rem}}.page-meta{max-width:var(--content-width);margin:0 auto;padding:1rem 2.5rem;overflow:auto}@media (max-width: 959px){.page-meta{padding:2rem}}@media (max-width: 419px){.page-meta{padding:1.5rem}}.page-meta .meta-item{cursor:default;margin-top:.8rem}.page-meta .meta-item .meta-item-label{font-weight:500;color:var(--c-text-lighter)}.page-meta .meta-item .meta-item-info{font-weight:400;color:var(--c-text-quote)}.page-meta .edit-link{display:inline-block;margin-right:.25rem}@media print{.page-meta .edit-link{display:none}}.page-meta .last-updated{float:right}@media (max-width: 719px){.page-meta .last-updated{font-size:.8em;float:none}.page-meta .contributors{font-size:.8em}}.page-nav{max-width:var(--content-width);margin:0 auto;padding:1rem 2.5rem 2rem;padding-bottom:0}@media (max-width: 959px){.page-nav{padding:2rem}}@media (max-width: 419px){.page-nav{padding:1.5rem}}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid var(--c-border);transition:border-color var(--t-color);padding-top:1rem;overflow:auto}.page-nav .prev a:before{content:"\2190"}.page-nav .next{float:right}.page-nav .next a:after{content:"\2192"}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .navbar-items{display:none;border-bottom:1px solid var(--c-border);transition:border-color var(--t-color);padding:.5rem 0 .75rem}.sidebar .navbar-items a{font-weight:600}.sidebar .navbar-items .navbar-item{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar .sidebar-items{padding:1.5rem 0}@media (max-width: 719px){.sidebar .navbar-items{display:block}.sidebar .navbar-items .navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar .sidebar-items{padding:1rem 0}}.sidebar-item{cursor:default;border-left:.25rem solid transparent;color:var(--c-text)}.sidebar-item:focus-visible{outline-width:1px;outline-offset:-1px}.sidebar-item.active:not(p.sidebar-heading){font-weight:600;color:var(--c-text-accent);border-left-color:var(--c-text-accent)}.sidebar-item.sidebar-heading{transition:color .15s ease;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0}.sidebar-item.sidebar-heading+.sidebar-item-children{transition:height .1s ease-out;overflow:hidden;margin-bottom:.75rem}.sidebar-item.collapsible{cursor:pointer}.sidebar-item.collapsible .arrow{position:relative;top:-.12em;left:.5em}.sidebar-item:not(.sidebar-heading){font-size:1em;font-weight:400;display:inline-block;margin:0;padding:.35rem 1rem .35rem 2rem;line-height:1.4;width:100%;box-sizing:border-box}.sidebar-item:not(.sidebar-heading)+.sidebar-item-children{padding-left:1rem;font-size:.95em}.sidebar-item-children .sidebar-item-children .sidebar-item:not(.sidebar-heading){padding:.25rem 1rem .25rem 1.75rem}.sidebar-item-children .sidebar-item-children .sidebar-item:not(.sidebar-heading).active{font-weight:500;border-left-color:transparent}a.sidebar-heading+.sidebar-item-children .sidebar-item:not(.sidebar-heading).active{border-left-color:transparent}a.sidebar-item{cursor:pointer}a.sidebar-item:hover{color:var(--c-text-accent)}.table-of-contents .badge{vertical-align:middle}.dropdown-enter-from,.dropdown-leave-to{height:0!important}.fade-slide-y-enter-active{transition:all .2s ease}.fade-slide-y-leave-active{transition:all .2s cubic-bezier(1,.5,.8,1)}.fade-slide-y-enter-from,.fade-slide-y-leave-to{transform:translateY(10px);opacity:0} diff --git a/guide/buymeacoffee.html b/guide/buymeacoffee.html new file mode 100644 index 0000000..204c08d --- /dev/null +++ b/guide/buymeacoffee.html @@ -0,0 +1,33 @@ + + + + + + + + + Donation | ChatGPT UI + + + + + + + + diff --git a/guide/configuration.html b/guide/configuration.html new file mode 100644 index 0000000..8e7855b --- /dev/null +++ b/guide/configuration.html @@ -0,0 +1,45 @@ + + + + + + + + + Configuration Reference | ChatGPT UI + + + + +

Configuration Reference

Database

By default, the backend uses the built-in Sqlite to store data. If an external database is not connected, the data will be lost after the container is destroyed.

The chatgpt-ui-wsgi-server image provides the environment variable DB_URL to configure the connection to an external database. The following table shows the link format of the DB_URL.

DBLINK
PostgreSQLpostgres://USER:PASSWORD@HOST:PORT/DATABASE_NAME
MySQLmysql://USER:PASSWORD@HOST:PORT/DATABASE_NAME
SQLitesqlite:///PATH

For example, if I am using PostgreSQL, the configuration is as follows:

backend-wsgi-server:
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - DB_URL=postgres://postgres:postgrespw@localhost:49153/chatgpt
+

Email verification

If you open the user registration feature and need to send email activation links to users, you need to configure the following environment variables in the wsgi-server service:

ParametersDescriptionDefault
ACCOUNT_EMAIL_VERIFICATIONE-mail authentication method, optional value: none, optional, mandatoryoptional
EMAIL_HOSTSMTP server addresssmtp.mailgun.org
EMAIL_PORTSMTP server port587
EMAIL_HOST_USERUser name-
EMAIL_HOST_PASSWORDPassword-
EMAIL_USE_TLSWhether to encryptTrue
EMAIL_FROMFrom emailwebmaster@localhost

API Proxy

If you are unable to request the OpenAI API address due to network restrictions, you can configure a proxy in the wsgi-server service. You will need to search for how to set up a proxy server on your own.

For example:

backend-wsgi-server:
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - OPENAI_API_PROXY=https://openai.proxy.com/v1
+

Backend CSRF whitelist

If you encounter CSRF verification failed while accessing the management background, your APP_DOMAIN may not be configured correctly. Under the wsgi-server service, there is an environment variable wsgi-server. Its value should be the address and port of backend-web-server, default: localhost:9000.

Suppose I have resolved the domain name chagpt.com to the server, and my backend-web-server service is bound to port 9000. The correct configuration is as follows:

backend-wsgi-server:
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - APP_DOMAIN=chagpt.com:9000
+

Client Configuration

ParameterDescriptionDefault Value
SERVER_DOMAINServer Addresshttp://backend-web-server
DEFAULT_LOCALEDefault Languageen
NUXT_PUBLIC_APP_NAMEApplication NameChatGPT UI
NUXT_PUBLIC_TYPEWRITEREnable Typewriter Effect [true/false]true
NUXT_PUBLIC_TYPEWRITER_DELAYTypewriter Effect Delay in milliseconds50

User Registration Control

After deployment, there is an open_registration setting under Chat->Settings in the admin panel to control whether user registration is allowed. The default value is True (allowing user registration). If not needed, please change it to False.

Web Search Function Control

This feature is disabled by default. You can enable it in the admin panel under Chat->Settings. There is a setting called open_web_search, set its value to True.

Frugal Mode Control

This feature is enabled by default. You can disable it in the Chat->Settings section of the management backend. There is a setting called open_frugal_mode_control in Settings. Set its value to False.

Last Updated:
Contributors: Rafi, AI&I
+ + + diff --git a/guide/development.html b/guide/development.html new file mode 100644 index 0000000..5973bcc --- /dev/null +++ b/guide/development.html @@ -0,0 +1,40 @@ + + + + + + + + + Development Guide | ChatGPT UI + + + + +

Development Guide

Front-end

Required skills: Vueopen in new window, Nuxtopen in new window

Project address: https://github.com/WongSaang/chatgpt-uiopen in new window

Environment Setup

Install the latest stable version of node.js. If you need to package it as a docker image, you also need to install docker.

Install dependencies

yarn install
+

Start development server

yarn dev
+

Build

yarn build
+

Package as a docker image

docker build -t image-name:latest .
+

Back-end

Required skills: Pythonopen in new window, Djangoopen in new window

Project address: https://github.com/WongSaang/chatgpt-ui-serveropen in new window

Environment Setup

Install Python, pip/pipenv. If you need to package it as a docker image, you also need to install docker.

Install dependencies

pip install -r requirements.txt
+

Start development server

python manage.py runserver
+

Package as a docker image

docker build -t image-name:latest .
+
Last Updated:
Contributors: Rafi
+ + + diff --git a/guide/problems.html b/guide/problems.html new file mode 100644 index 0000000..dd1253a --- /dev/null +++ b/guide/problems.html @@ -0,0 +1,33 @@ + + + + + + + + + Encountering Issues | ChatGPT UI + + + + +

Encountering Issues

Searching for Issues

If you encounter any issues while using the project, you can search for related keywords on the project's Issuesopen in new window page to see if others have faced similar issues and if there are any solutions available.

Submitting an Issue

If you cannot find a solution, you can communicate with the project maintainers by submitting an issue. Submit an Issueopen in new window

Note

The title should be clear and concise, and the description should provide as much detail as possible about the issue or suggestion. If possible, it is best to provide reproducible steps and screenshots.

Last Updated:
Contributors: Rafi
+ + + diff --git a/guide/quick-start.html b/guide/quick-start.html new file mode 100644 index 0000000..c1aead0 --- /dev/null +++ b/guide/quick-start.html @@ -0,0 +1,92 @@ + + + + + + + + + Quick Start | ChatGPT UI + + + + +

Quick Start

This project provides related docker images for deployment on a VPS or your local computer. Please note that if your network is unable to request the OpenAI API address, you need to configure a proxy. If you want to make it available to other users, it's best to have a domain name and resolve it to the server.

You also need an OpenAI API Key, and there are multiple ways to obtain it online, please search for it yourself.

Deploying

Quickly deploy script

Note: This script has only been verified on Ubuntu Server 22.04 LTS.

bash <(curl -Ls https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/deployment.sh)
+

Docker Compose

Prepare docker-compose.yml

The project provides a sample docker-compose.yml. If you want to customize the configuration, please refer to the configuration referenceopen in new window section.

You can download the docker-compose.yml template to your local machine or server by clicking on the link below:

https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/docker-compose.ymlopen in new window

You can also manually create the docker-compose.yml file and copy the following content into the file:

version: '3'
+services:
+  client:
+    platform: linux/x86_64
+    image: wongsaang/chatgpt-ui-client:latest
+    environment:
+      - SERVER_DOMAIN=http://backend-web-server
+      - DEFAULT_LOCALE=en
+#      - NUXT_PUBLIC_APP_NAME='ChatGPT UI' # The name of the application
+#      - NUXT_PUBLIC_TYPEWRITER=true # Whether to enable the typewriter effect, default false
+#      - NUXT_PUBLIC_TYPEWRITER_DELAY=50 # The delay time of the typewriter effect, default 50ms
+    depends_on:
+      - backend-web-server
+    ports:
+      - '${CLIENT_PORT:-80}:80'
+    networks:
+      - chatgpt_ui_network
+    restart: always
+  backend-wsgi-server:
+    platform: linux/x86_64
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - APP_DOMAIN=${APP_DOMAIN:-localhost:9000}
+      - SERVER_WORKERS=3 # The number of worker processes for handling requests.
+      #      - DB_URL=postgres://postgres:postgrespw@localhost:49153/chatgpt # If this parameter is not set, the built-in Sqlite will be used by default. It should be noted that if you do not connect to an external database, the data will be lost after the container is destroyed.
+      - DJANGO_SUPERUSER_USERNAME=admin # default superuser name
+      - DJANGO_SUPERUSER_PASSWORD=password # default superuser password
+      - DJANGO_SUPERUSER_EMAIL=admin@example.com # default superuser email
+      - ACCOUNT_EMAIL_VERIFICATION=${ACCOUNT_EMAIL_VERIFICATION:-none} # Determines the e-mail verification method during signup – choose one of "none", "optional", or "mandatory". Default is "optional". If you don't need to verify the email, you can set it to "none".
+      # If you want to use the email verification function, you need to configure the following parameters
+#      - EMAIL_HOST=SMTP server address
+#      - EMAIL_PORT=SMTP server port
+#      - EMAIL_HOST_USER=
+#      - EMAIL_HOST_PASSWORD=
+#      - EMAIL_USE_TLS=True
+#      - EMAIL_FROM=no-reply@example.com  #Default sender email address
+    ports:
+      - '${WSGI_PORT:-8000}:8000'
+    networks:
+      - chatgpt_ui_network
+    restart: always
+  backend-web-server:
+    platform: linux/x86_64
+    image: wongsaang/chatgpt-ui-web-server:latest
+    environment:
+      - BACKEND_URL=http://backend-wsgi-server:8000
+    ports:
+      - '${SERVER_PORT:-9000}:80'
+    depends_on:
+      - backend-wsgi-server
+    networks:
+      - chatgpt_ui_network
+    restart: always
+
+networks:
+  chatgpt_ui_network:
+    driver: bridge
+

Starting the Service

After modifying the configuration as needed, you can start the service by running the following command:

docker-compose up --pull always -d
+

This command is used to start the services specified in the Docker Compose configuration. The specific meanings of the parameters are as follows:

  • up: start the services specified in the Docker Compose configuration.
  • --pull always: before starting the service each time, the latest version of the image will be pulled from the Docker image repository. This ensures that the image used is always up to date.
  • -d: run the service in the background. If this parameter is not added, the service will run in the current terminal window until the user manually stops it.

After Deployment

Access the management panel at http(s)://your.domain:9000/admin or http(s)://123.123.123.123:9000/admin using the default superuser account:

  • username: admin
  • password: password

Before starting a chat, you need to add an OpenAI API key. In the management panel, in the "Settings" section, there is a record named openai_api_key. Set the value to your API key.

In the latest version, a separate API Key management has been added to the admin panel, located under "Provider/Api keys". You can add multiple API Keys here, and the backend program will track the usage of each key's token and balance the usage based on token usage. To enable this feature, you need to delete the previous "openai_api_key" setting.

Now you can access the client at http(s)://your.domain or http://123.123.123.123 to start chatting.

🎉🎉🎉 Have fun!

Last Updated:
Contributors: Rafi, AI&I
+ + + diff --git a/images/bmc_qr.png b/images/bmc_qr.png new file mode 100644 index 0000000..61b278a Binary files /dev/null and b/images/bmc_qr.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..dbe346e --- /dev/null +++ b/index.html @@ -0,0 +1,33 @@ + + + + + + + + + Introduction | ChatGPT UI + + + + +

Introduction

ChatGPT UI is an unofficial ChatGPT web client. It supports multiple users, multiple languages, and multiple database connections for persistent data storage, such as Mysql, PostgreSQL, and Sqlite.

This project consists of two parts, the client-side and the server-side:

Features

Client-side

  • User system, supporting user registration, login, password modification, and more.
  • Multi-language user interface, supporting multiple languages.
  • Persistent data storage, supporting Mysql, PostgreSQL, and Sqlite databases.
  • Asynchronous conversation, supporting multiple conversations simultaneously.
  • Management of historical conversations.
  • Continuous chat, allowing ChatGPT clients to answer questions based on their historical chat records, resulting in better answers.
  • Web search capability, allowing ChatGPT to retrieve the latest information.
  • Convenient tools, supporting one-click message and code block copying, as well as message editing.
  • Common command management, allowing users to store and edit their own common commands.
  • PWA, supporting installation to the desktop.
  • User Token Usage Statistics.
  • Supports configuring multiple API Keys.

Server-side

  • The server-side has an administrative panel.
  • User management.
  • Conversation and message management.
  • Common configurations.

Original Intention

Since using ChatGPT, it has become a good helper in work. Unfortunately, as we all know, it cannot be accessed in some places. But fortunately, OpenAI has opened up its API, so I started to write a user interface for myself.

Nothing is difficult if you put your heart into it.

Later, several friends asked me how to use ChatGPT because they didn't have the technical skills. So I started to develop a multi-user system, which can not only be used by myself but also help my family and friends around me.

After the project was open-sourced, many people raised issues and some even submitted PRs, and the project has developed to its current state. I also learned a lot during this process, as I have always believed that helping others is also helping oneself.

Last Updated:
Contributors: Rafi
+ + + diff --git a/zh/guide/buymeacoffee.html b/zh/guide/buymeacoffee.html new file mode 100644 index 0000000..5a5af70 --- /dev/null +++ b/zh/guide/buymeacoffee.html @@ -0,0 +1,33 @@ + + + + + + + + + 续杯咖啡 | ChatGPT UI + + + + +

续杯咖啡

如果这个项目对您有帮助,这也是在帮助我自己。

如果你想支持我,给我续杯咖啡吧 ❤️ https://www.buymeacoffee.com/WongSaang在新窗口打开

Buy Me A Coffee

Last Updated:
Contributors: Rafi
+ + + diff --git a/zh/guide/configuration.html b/zh/guide/configuration.html new file mode 100644 index 0000000..ea038f7 --- /dev/null +++ b/zh/guide/configuration.html @@ -0,0 +1,45 @@ + + + + + + + + + 配置参考 | ChatGPT UI + + + + +

配置参考

数据库

后端默认使用内置的 Sqlite 来存储数据,如果不连接外部数据库,数据将在容器销毁后丢失。

chatgpt-ui-wsgi-server 镜像提供环境变量 DB_URL 来配置与外部数据库的连接,以下是 DB_URL 的链接格式对照表。

数据库链接
PostgreSQLpostgres://USER:PASSWORD@HOST:PORT/DATABASE_NAME
MySQLmysql://USER:PASSWORD@HOST:PORT/DATABASE_NAME
SQLitesqlite:///PATH

例如我使用 PostgreSQL,则配置如下:

backend-wsgi-server:
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - DB_URL=postgres://postgres:postgrespw@localhost:49153/chatgpt
+

邮箱验证

如果你开放用户注册功能,并需要向用户发送邮箱激活链接,需要在 wsgi-server 服务中配置以下环境变量:

参数说明默认值
ACCOUNT_EMAIL_VERIFICATION邮箱验证方式,可选值: none, optional, mandatoryoptional
EMAIL_HOSTSMTP 服务器地址smtp.mailgun.org
EMAIL_PORTSMTP 服务器端口号587
EMAIL_HOST_USER用户名-
EMAIL_HOST_PASSWORD密码-
EMAIL_USE_TLS是否加密True
EMAIL_FROM发件邮箱webmaster@localhost

API 代理

如果您的网络无法请求 OpenAI 的 API 地址,您可以在 wsgi-server 服务中配置代理,如何搭建代理服务,需要您自行搜索。

例如:

backend-wsgi-server:
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - OPENAI_API_PROXY=https://openai.proxy.com/v1 # 注意,域名后面需要带上 v1
+

后端 CSRF 白名单

如果你在访问管理后台的时候遇到 CSRF verification failed,可能你的 APP_DOMAIN 没有配置对。在 wsgi-server 服务下有个环境变量 wsgi-server。 它的值应该是 backend-web-server 的地址+端口, 默认: localhost:9000

假如我把 chagpt.com 这个域名解析到了服务器,并且我的 backend-web-server 服务绑定了 9000 这个端口。正确的配置如下:

backend-wsgi-server:
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - APP_DOMAIN=chagpt.com:9000
+

客户端配置

参数说明默认值
SERVER_DOMAIN服务端地址http://backend-web-server
DEFAULT_LOCALE默认语言en
NUXT_PUBLIC_APP_NAME应用名称ChatGPT UI
NUXT_PUBLIC_TYPEWRITER是否开启 打字机 效果[true/false]true
NUXT_PUBLIC_TYPEWRITER_DELAY打字机效果的延迟时间,单位:毫秒50

用户注册控制

部署完整后,在管理后台的 Chat->Setting 下面有 open_registration 设置项,用于控制是否开放用户注册。默认是 True (允许用户注册),如果不需要,请改成 False

网页搜索功能控制

该功能默认处于关闭状态,你可以在管理后台的 Chat->Settings 中开启它,在 Settings 中有一个 open_web_search 的设置项,把它的值设置为 True

节俭模式控制

该功能默认处于开启状态,你可以在管理后台的 Chat->Settings 中关闭它,在 Settings 中有一个 open_frugal_mode_control 的设置项,把它的值设置为 False

Last Updated:
Contributors: Rafi, AI&I
+ + + diff --git a/zh/guide/development.html b/zh/guide/development.html new file mode 100644 index 0000000..7586833 --- /dev/null +++ b/zh/guide/development.html @@ -0,0 +1,40 @@ + + + + + + + + + 开发指南 | ChatGPT UI + + + + +

开发指南

前端

所需技能:Vue在新窗口打开Nuxt在新窗口打开

项目地址:https://github.com/WongSaang/chatgpt-ui在新窗口打开

环境准备

安装最新稳定版 node.js,如果需要打包成 docker 镜像,还需要安装 docker。

安装依赖

yarn install
+

启动开发服务

yarn dev
+

构建

yarn build
+

打包成 docker 镜像

docker build -t image-name:latest .
+

后端

所需技能:Python在新窗口打开Django在新窗口打开

项目地址:https://github.com/WongSaang/chatgpt-ui-server在新窗口打开

环境准备

安装Python、pip/pipenv,如果需要打包成 docker 镜像,还需要安装 docker。

安装依赖

pip install -r requirements.txt
+

启动开发服务

python manage.py runserver
+

打包成 docker 镜像

docker build -t image-name:latest .
+
Last Updated:
Contributors: Rafi
+ + + diff --git a/zh/guide/problems.html b/zh/guide/problems.html new file mode 100644 index 0000000..7f87f4c --- /dev/null +++ b/zh/guide/problems.html @@ -0,0 +1,33 @@ + + + + + + + + + 遇到问题 | ChatGPT UI + + + + +

遇到问题

搜索问题

当你在使用项目时,如果遇到了问题,可以在项目的 Issues在新窗口打开 页面搜索相关的关键词,看看其他人是否遇到过相同的问题以及解决方案。

提 issue

如果没有找到解决方案,可以通过提交 Issue 来与项目维护者交流。提交Issue在新窗口打开

注意

标题应该简单明了,描述应该尽可能详细地描述问题或者建议。如果可能,最好提供复现步骤和截图。

Last Updated:
Contributors: Rafi
+ + + diff --git a/zh/guide/quick-start.html b/zh/guide/quick-start.html new file mode 100644 index 0000000..ba03245 --- /dev/null +++ b/zh/guide/quick-start.html @@ -0,0 +1,87 @@ + + + + + + + + + 快速开始 | ChatGPT UI + + + + +

快速开始

本项目提供了相关的 docker 镜像,你需要一个 vps 来部署,当然你也可以在本地的电脑上部署。需要注意的是,如果你的网络无法请求 OpenAI 的 API 地址,您需要配置代理。如果你想开放给其他用户使用,最好还需要一个域名,并将域名解析到服务器。

您还需要一个 OpenAI 的API Key,网上有获取多种方案,请自行搜索。

部署

快速部署脚本

对于技术知识了解不多的选手,如果你看不懂下面的内容,可以看我之前写的博客文章《一行命令部署自己的ChatGPT客户端》在新窗口打开

注意:此脚本目前仅在 Ubuntu Server 22.04 LTS 上验证过。

bash <(curl -Ls https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/deployment.sh)
+

Docker Compose

准备 docker-compose.yml

项目中提供了一个 docker-compose.yml 示例,如果你想自定义配置,请看 配置参考在新窗口打开 部分。

你可以通过下方链接下载 docker-compose.yml 模板到本地或服务器:

https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/docker-compose.yml在新窗口打开

也可以手动创建 docker-compose.yml 文件,然后复制下面的内容到文件中:

version: '3'
+services:
+  client:
+    image: wongsaang/chatgpt-ui-client:latest
+    environment:
+      - SERVER_DOMAIN=http://backend-web-server
+      - DEFAULT_LOCALE=zh
+    #      - NUXT_PUBLIC_APP_NAME='ChatGPT UI' # APP 名称
+    #      - NUXT_PUBLIC_TYPEWRITER=true # 是否开启 打字机 效果
+    #      - NUXT_PUBLIC_TYPEWRITER_DELAY=50 # 打字机效果的延迟时间,单位:毫秒,默认:50
+    depends_on:
+      - backend-web-server
+    ports:
+      - '80:80'
+    networks:
+      - chatgpt_ui_network
+  backend-wsgi-server:
+    image: wongsaang/chatgpt-ui-wsgi-server:latest
+    environment:
+      - APP_DOMAIN=${APP_DOMAIN:-localhost:9000} # CSRF 白名单,在这里设置为 chatgpt-ui-web-server 的地址+端口, 默认: localhost:9000
+      - SERVER_WORKERS=3 # gunicorn 的工作进程数,默认为 3
+      #- DB_URL=postgres://postgres:postgrespw@localhost:49153/chatgpt # 连接外部数据库,如果不设置这个参数,则默认使用内置的 Sqlite。需要注意的是,如果不连接外部数据库,数据将在容器销毁后丢失。链接格式请看下面的 DB_URL 格式对照表
+      #- OPENAI_API_PROXY=https://openai.proxy.com/v1 # https://api.openai.com/v1 的代理地址
+      - DJANGO_SUPERUSER_USERNAME=admin # 默认超级用户
+      - DJANGO_SUPERUSER_PASSWORD=password # 默认超级用户的密码
+      - DJANGO_SUPERUSER_EMAIL=admin@example.com # 默认超级用户邮箱
+      - ACCOUNT_EMAIL_VERIFICATION=none # 邮箱验证方式,可选值: none, optional, mandatory. 默认为 optional。如果你不需要验证用户的邮箱,可以设置为 none。
+      # 如果您想使用电子邮件验证功能,需要配置以下参数:
+    #      - EMAIL_HOST=SMTP server address
+    #      - EMAIL_PORT=SMTP server port
+    #      - EMAIL_HOST_USER=
+    #      - EMAIL_HOST_PASSWORD=
+    #      - EMAIL_USE_TLS=True
+    #      - EMAIL_FROM=no-reply@example.com  #默认发件邮箱地址
+    ports:
+      - '8000:8000'
+    networks:
+      - chatgpt_ui_network
+  backend-web-server:
+    image: wongsaang/chatgpt-ui-web-server:latest
+    environment:
+      - BACKEND_URL=http://backend-wsgi-server:8000
+    ports:
+      - '9000:80'
+    depends_on:
+      - backend-wsgi-server
+    networks:
+      - chatgpt_ui_network
+
+networks:
+  chatgpt_ui_network:
+    driver: bridge
+

启动服务

你可以自行修改配置后,运行下面的命令来启动服务。

docker-compose up --pull always -d
+

这个命令用于启动 Docker Compose 配置中的服务。具体的参数含义如下:

  • up:启动 Docker Compose 配置中的服务。
  • --pull always:每次启动服务前,都会从 Docker 镜像仓库中拉取最新版本的镜像。这样可以确保使用的镜像始终是最新的。
  • -d:在后台运行服务。如果不加这个参数,服务会在当前终端窗口中运行,直到用户手动停止服务。

部署完成之后

访问 http(s)://your.domain:9000/admin 或 IP http(s)://123.123.123.123:9000/admin 登录管理面板。

默认超级用户: admin

默认密码: password

在可以开始聊天之前,您需要添加一个 OpenAI 的 API 密钥。在管理面板的设置模型中,有一个名称为 openai_api_key 的记录,将值设置为您的 API 密钥。

在最新版本中,管理面板增加了一个独立的 API Key 的管理,位于管理面板的 Provider/ Api keys。你可以在这里添加多个 API Key,后端程序会统计每个 Key 的 token 使用量,并根据 token 使用量来平衡使用 Key。想要这个功能生效,需要删除之前的openai_api_key设置

现在可以访问客户端地址 http(s)://your.domain 或 IP http://123.123.123.123 开始聊天。

🎉🎉🎉 祝开心!

Last Updated:
Contributors: Rafi, AI&I
+ + + diff --git a/zh/index.html b/zh/index.html new file mode 100644 index 0000000..1ad49d1 --- /dev/null +++ b/zh/index.html @@ -0,0 +1,33 @@ + + + + + + + + + 介绍 | ChatGPT UI + + + + +

介绍

ChatGPT UI 是一个非官方的 ChatGPT Web 客户端。它支持多用户,多语言,多种数据库连接进行数据持久化存储,例如:Mysql、PostgreSQL 和 Sqlite 等。

本项目项目包括客户端和服务端两部分。

功能与特性

客户端

  • 用户系统,支持用户注册、登录、修改密码等。
  • 用户界面多语言,支持多种语言。
  • 数据持久化,支持 Mysql、PostgreSQL 和 Sqlite 等数据库。
  • 异步对话,支持多个对话同时进行。
  • 历史对话管理。
  • 持续聊天,让 ChatGPT 客户历史聊天记录回答问题,得出更好的答案。
  • 网页搜索能力,让 ChatGPT 获取最新信息。
  • 便捷的工具,支持一键复制消息和代码块,以及重新编辑消息等。
  • 常用指令管理,用户可存储和编辑自己的常用指令。
  • PWA,支持安装到桌面。
  • 用户 Token 使用量统计
  • 支持配置多个 API Key

服务端

  • 服务端拥有一个管理面板
  • 用户管理
  • 对话和消息管理
  • 常用配置

初衷

自从使用 ChatGPT ,它已经成为工作中的好帮手。可惜的是,就像大家知道的,它在有些地方无法访问。但好在 OpenAI 开放了 API,于是我开始为自己写用户界面。

世上无难事,只怕有心人。

后来,有多位朋友询问我怎么样才能使用 ChatGPT,因为他们没有技术能力。于是我又着手于多用户系统的开发,这样除了自己用,还能帮助到身边的亲朋好友。

项目开源后,有很多人提了 issue,也有人提了 PR,项目就发展到如今的样子。我在这个过程中也学到了很多,正如我一直坚信的,帮助他人也是帮助自己。

Last Updated:
Contributors: Rafi, Wong Saang
+ + +